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