AnimMeshBatcher.hx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package h3d.scene;
  2. class AnimMeshBatchShader extends hxsl.Shader {
  3. static var SRC = {
  4. @param var animationMatrix : Mat4;
  5. @global var global : {
  6. @perObject var modelView : Mat4;
  7. };
  8. @input var input : {
  9. var normal : Vec3;
  10. };
  11. var relativePosition : Vec3;
  12. var transformedNormal : Vec3;
  13. function vertex() {
  14. relativePosition = relativePosition * animationMatrix.mat3x4();
  15. transformedNormal = (input.normal * animationMatrix.mat3() * global.modelView.mat3()).normalize();
  16. }
  17. };
  18. }
  19. class AnimMeshBatch extends MeshBatch {
  20. var copyObject : Object;
  21. var shader : AnimMeshBatchShader;
  22. public function new(primitive, material, copyObject, ?parent) {
  23. super(primitive, material, parent);
  24. shader = new AnimMeshBatchShader();
  25. material.mainPass.addShader(shader);
  26. this.copyObject = copyObject;
  27. }
  28. override function sync(ctx : RenderContext) {
  29. super.sync(ctx);
  30. shader.animationMatrix = copyObject.defaultTransform;
  31. }
  32. }
  33. class AnimMeshBatcher extends Object {
  34. var originalObject : Object;
  35. var batches : Array<MeshBatch> = [];
  36. public function new(object : h3d.scene.Object, spawn : h3d.Matrix -> Bool, ?parent) {
  37. super(parent);
  38. originalObject = object;
  39. addChild(originalObject);
  40. originalObject.alwaysSyncAnimation = true;
  41. originalObject.visible = false;
  42. for ( m in originalObject.getMeshes() ) {
  43. var mat : h3d.mat.Material = cast m.material.clone();
  44. var batch = new AnimMeshBatch(cast(m.primitive,h3d.prim.MeshPrimitive), mat, m, this);
  45. batch.begin();
  46. batches.push(batch);
  47. }
  48. var tmp = new h3d.Matrix();
  49. while ( spawn(tmp) ) {
  50. for ( b in batches ) {
  51. b.worldPosition = tmp;
  52. b.emitInstance();
  53. }
  54. }
  55. }
  56. override function playAnimation(anim : h3d.anim.Animation) {
  57. return originalObject.playAnimation(anim);
  58. }
  59. }