소스 검색

ParticleBuffer init with cpu upload from floats.

clementlandrin 10 달 전
부모
커밋
18aa30ba46
2개의 변경된 파일27개의 추가작업 그리고 4개의 파일을 삭제
  1. 2 1
      hrt/prefab/fx/gpuemitter/BaseSpawn.hx
  2. 25 3
      hrt/prefab/fx/gpuemitter/GPUEmitter.hx

+ 2 - 1
hrt/prefab/fx/gpuemitter/BaseSpawn.hx

@@ -12,6 +12,7 @@ class BaseSpawn extends ComputeUtils {
 		@param var maxLifeTime : Float;
 		@param var minStartSpeed : Float;
 		@param var maxStartSpeed : Float;
+		@param var rate : Float;
 		@param var absPos : Mat4;
 
 		var lifeTime : Float;
@@ -27,7 +28,7 @@ class BaseSpawn extends ComputeUtils {
 
 		function main() {
 			var idx = computeVar.globalInvocation.x;
-			if ( particleBuffer[idx].lifeTime < 1e-7 ) {
+			if ( particleBuffer[idx].lifeTime < 0.0 ) {
 				batchBuffer[idx].modelView = modelView;
 				var s = vec3(0.0, 0.0, 1.0);
 				if ( SPEED_NORMAL )

+ 25 - 3
hrt/prefab/fx/gpuemitter/GPUEmitter.hx

@@ -37,6 +37,7 @@ class ParticleShader extends hxsl.Shader {
 
 typedef Data = {
 	var maxCount : Int;
+	var rate : Int;
 	var infinite : Bool;
 	var maxLifeTime : Float;
 	var minLifeTime : Float;
@@ -118,11 +119,28 @@ class GPUEmitterObject extends h3d.scene.MeshBatch {
 			{ name : "speed", type : DVec3 },
 			{ name : "lifeTime", type : DFloat },
 			{ name : "lifeRatio", type : DFloat },
-			{ name : "padding", type : DVec3 },
+			{ name : "random", type : DFloat },
+			{ name : "padding", type : DVec2 },
 		]);
 		while ( p != null ) {
-			if ( particleBuffer.buffer == null )
-				particleBuffer.buffer = alloc.allocBuffer(instanceCount, particleBufferFormat, UniformReadWrite);
+			if ( particleBuffer.buffer == null ) {
+				var stride = 4 * 2;
+				var floats = alloc.allocFloats(instanceCount * stride);
+				for ( i in 0...instanceCount ) {
+					// speed
+					// floats[i * stride] = 0.0;
+					// floats[i * stride + 1] = 0.0;
+					// floats[i * stride + 2] = 0.0;
+					floats[i * stride + 3] = -1000.0; // lifeTime warmup
+					var l = hxd.Math.random() * (data.maxLifeTime - data.minLifeTime) + data.minLifeTime;
+					floats[i * stride + 4] = 1.0 / l; // lifeRatio
+					floats[i * stride + 5] = hxd.Math.random(); // random
+					// padding
+					floats[i * stride + 6] = 0.0;
+					floats[i * stride + 7] = 0.0;
+				}
+				particleBuffer.buffer = alloc.ofFloats(floats, particleBufferFormat, UniformReadWrite);
+			}
 			p = p.next;
 			if ( p != null && particleBuffer.next == null ) {
 				particleBuffer.next = { buffer : null, next : null};
@@ -332,10 +350,12 @@ class GPUEmitterObject extends h3d.scene.MeshBatch {
 
 @:access(hrt.prefab.fx.gpuemitter.GPUEmitterObject)
 class GPUEmitter extends Object3D {
+
 	static function getDefaultPrimitive() {
 		return h3d.prim.Cube.defaultUnitCube();
 	}
 
+	@:s var rate : Int = 0;
 	@:s var maxCount : Int = 512;
 	@:s var minLifeTime : Float = 0.5;
 	@:s var maxLifeTime : Float = 1.0;
@@ -375,6 +395,7 @@ class GPUEmitter extends Object3D {
 		}
 		inline function getData(trs : h3d.Matrix) {
 			return {
+				rate : rate,
 				maxCount : maxCount,
 				minLifeTime : minLifeTime,
 				maxLifeTime : maxLifeTime,
@@ -448,6 +469,7 @@ class GPUEmitter extends Object3D {
 		ctx.properties.add(new hide.Element('
 			<div class="group" name="Emitter">
 				<dl>
+					<dt>Rate</dt><dd><input type="range" step="1" min="1" max="8192" field="rate"/></dd>
 					<dt>Max count</dt><dd><input type="range" step="1" min="1" max="8192" field="maxCount"/></dd>
 					<dt>Min life time</dt><dd><input type="range" min="0.1" max="10" field="minLifeTime"/></dd>
 					<dt>Max life time</dt><dd><input type="range" min="0.1" max="10" field="maxLifeTime"/></dd>