ソースを参照

Better begin and meshbatch init on ModelLibrary

clementlandrin 2 ヶ月 前
コミット
54cd0c3909

+ 6 - 2
hrt/prefab/l3d/modellibrary/Batcher.hx

@@ -8,6 +8,7 @@ import h3d.mat.PbrMaterial.PbrProps;
 class Batcher extends h3d.scene.Object {
 class Batcher extends h3d.scene.Object {
 	public var library : ModelLibrary;
 	public var library : ModelLibrary;
 	public var isStatic : Bool = false;
 	public var isStatic : Bool = false;
+	public var emitCountTip : Int = -1;
 
 
 	var batches: Array<h3d.scene.MeshBatch>;
 	var batches: Array<h3d.scene.MeshBatch>;
 
 
@@ -23,9 +24,9 @@ class Batcher extends h3d.scene.Object {
 				f(b);
 				f(b);
 	}
 	}
 
 
-	public function emitInstance(mesh : h3d.scene.Mesh, ?absPos : h3d.Matrix, emitCountTip : Int = -1, ?cb : h3d.scene.MeshBatch -> Void) {
+	public function emitInstance(mesh : h3d.scene.Mesh, ?absPos : h3d.Matrix, ?cb : h3d.scene.MeshBatch -> Void) {
 		var meshEmitter = library.getMeshEmitter(mesh);
 		var meshEmitter = library.getMeshEmitter(mesh);
-		meshEmitter.emitInstance(this, absPos, emitCountTip, cb);
+		meshEmitter.emitInstance(this, absPos, cb);
 	}
 	}
 
 
 	public function getPrimitive() {
 	public function getPrimitive() {
@@ -82,6 +83,9 @@ class Batcher extends h3d.scene.Object {
 			if ( (batch.material.props:PbrProps).alphaKill && batch.material.textureShader == null )
 			if ( (batch.material.props:PbrProps).alphaKill && batch.material.textureShader == null )
 				batch.material.mainPass.addShader(library.killAlpha);
 				batch.material.mainPass.addShader(library.killAlpha);
 		}
 		}
+
+		batch.primitiveSubParts = [new h3d.scene.MeshBatch.MeshBatchPart()];
+		batch.begin(emitCountTip);
 	}
 	}
 
 
 	override function onRemove() {
 	override function onRemove() {

+ 1 - 1
hrt/prefab/l3d/modellibrary/GPUBatcher.hx

@@ -59,7 +59,7 @@ class GPUBatcher extends Batcher {
 		return batch;
 		return batch;
 	}
 	}
 
 
-	override function emitInstance(mesh : h3d.scene.Mesh, ?absPos : h3d.Matrix, emitCountTip : Int = -1, ?cb : h3d.scene.MeshBatch -> Void) {
+	override function emitInstance(mesh : h3d.scene.Mesh, ?absPos : h3d.Matrix, ?cb : h3d.scene.MeshBatch -> Void) {
 		throw "Unit emitInstance is not compatible with GPU Batcher, use emitInstances with GPU data or use a Batcher instead";
 		throw "Unit emitInstance is not compatible with GPU Batcher, use emitInstances with GPU data or use a Batcher instead";
 	}
 	}
 
 

+ 2 - 2
hrt/prefab/l3d/modellibrary/MeshEmitter.hx

@@ -21,10 +21,10 @@ class MeshEmitter {
 		this.materials = materials;
 		this.materials = materials;
 	}
 	}
 
 
-	function emitInstance( batcher : Batcher, ?absPos : h3d.Matrix, emitCountTip : Int = -1, ?cb : h3d.scene.MeshBatch -> Void ) {
+	function emitInstance( batcher : Batcher, ?absPos : h3d.Matrix, ?cb : h3d.scene.MeshBatch -> Void ) {
 		for ( materialIndex => bakedMaterial in bakedMaterials ) {
 		for ( materialIndex => bakedMaterial in bakedMaterials ) {
 			var batch = batcher.getBatch(bakedMaterial, materialIndex, this);
 			var batch = batcher.getBatch(bakedMaterial, materialIndex, this);
-			batcher.library.emitInstance(bakedMaterial, primitive, batch, absPos, emitCountTip);
+			batcher.library.emitInstance(bakedMaterial, primitive, batch, absPos);
 			if ( cb != null )
 			if ( cb != null )
 				cb(batch);
 				cb(batch);
 		}
 		}

+ 1 - 5
hrt/prefab/l3d/modellibrary/ModelLibrary.hx

@@ -138,13 +138,9 @@ class ModelLibrary extends Prefab {
 		return @:privateAccess prim.lib.resource.entry.path;
 		return @:privateAccess prim.lib.resource.entry.path;
 	}
 	}
 
 
-	function emitInstance(bakedMaterial : BakedMaterialData, primitive : h3d.prim.HMDModel, batch : h3d.scene.MeshBatch, ?absPos : h3d.Matrix, emitCountTip = -1) {
+	function emitInstance(bakedMaterial : BakedMaterialData, primitive : h3d.prim.HMDModel, batch : h3d.scene.MeshBatch, ?absPos : h3d.Matrix) {
 		cache.shader.uvTransform.set(bakedMaterial.uvX, bakedMaterial.uvY, bakedMaterial.uvSX, bakedMaterial.uvSY);
 		cache.shader.uvTransform.set(bakedMaterial.uvX, bakedMaterial.uvY, bakedMaterial.uvSX, bakedMaterial.uvSY);
 		cache.shader.libraryParams.set(bakedMaterial.texId, 1.0 / atlasResolution / bakedMaterial.uvSX, 0.0, 0.0);
 		cache.shader.libraryParams.set(bakedMaterial.texId, 1.0 / atlasResolution / bakedMaterial.uvSX, 0.0, 0.0);
-		if ( batch.primitiveSubParts == null ) {
-			batch.primitiveSubParts = [new h3d.scene.MeshBatch.MeshBatchPart()];
-			batch.begin(emitCountTip);
-		}
 		var primitiveSubPart = batch.primitiveSubParts[0];
 		var primitiveSubPart = batch.primitiveSubParts[0];
 		primitiveSubPart.indexCount = bakedMaterial.indexCount;
 		primitiveSubPart.indexCount = bakedMaterial.indexCount;
 		primitiveSubPart.indexStart = bakedMaterial.indexStart;
 		primitiveSubPart.indexStart = bakedMaterial.indexStart;