Quellcode durchsuchen

added 3D particle support (on XZ plane instead of camera facing)

ncannasse vor 11 Jahren
Ursprung
Commit
cdf5380fdc
4 geänderte Dateien mit 34 neuen und 4 gelöschten Zeilen
  1. 2 0
      h3d/parts/Data.hx
  2. 1 0
      h3d/parts/Editor.hx
  3. 20 1
      h3d/parts/Emitter.hx
  4. 11 3
      h3d/parts/Material.hx

+ 2 - 0
h3d/parts/Data.hx

@@ -76,6 +76,7 @@ class State {
 	public var frames : Array<h2d.Tile>;
 	public var blendMode : BlendMode;
 	public var sortMode : SortMode;
+	public var is3D : Bool;
 	
 	// emit
 	public var loop	: Bool;
@@ -127,6 +128,7 @@ class State {
 		frames = null;
 		blendMode = SoftAdd;
 		sortMode = Back;
+		is3D = false;
 		// emit
 		loop = true;
 		emitRate = VConst(100);

+ 1 - 0
h3d/parts/Editor.hx

@@ -409,6 +409,7 @@ class Editor extends h2d.Sprite {
 						</div>
 						<div class="line">
 							<span class="label">Start Delay</span> <value value="${state.delay}" onchange="api.s.delay = this.value"/>
+							<checkbox checked="${state.is3D}" onchange="api.s.is3D = this.checked"/> <span>3D</span>
 						</div>
 						<div class="line">
 							<select onchange="api.s.blendMode = api.blendModes[api.parseInt(this.value)]; $(\'.ic.alpha\').toggleClass(\':disabled\', api.s.blendMode.index == 2)">

+ 20 - 1
h3d/parts/Emitter.hx

@@ -35,6 +35,19 @@ class Emitter extends h3d.scene.Object {
 		setState(state);
 	}
 	
+	/**
+		Offset all existing particles by the given values.
+	**/
+	public function offsetParticles( dx : Float, dy : Float, dz = 0. ) {
+		var p = head;
+		while( p != null ) {
+			p.x += dx;
+			p.y += dy;
+			p.z += dz;
+			p = p.next;
+		}
+	}
+	
 	public function reset() {
 		while( head != null )
 			kill(head);
@@ -540,7 +553,13 @@ class Emitter extends h3d.scene.Object {
 		
 		material.pshader.mpos = state.emitLocal ? this.absPos : h3d.Matrix.I();
 		material.pshader.mproj = ctx.camera.m;
-		material.pshader.partSize = new h3d.Vector(size, size * ctx.engine.width / ctx.engine.height);
+		if( state.is3D ) {
+			material.pshader.is3D = true;
+			material.pshader.partSize = new h3d.Vector(size, size);
+		} else {
+			material.pshader.is3D = false;
+			material.pshader.partSize = new h3d.Vector(size, size * ctx.engine.width / ctx.engine.height);
+		}
 		material.pshader.hasColor = hasColor;
 		
 		ctx.engine.selectMaterial(material);

+ 11 - 3
h3d/parts/Material.hx

@@ -19,19 +19,27 @@ private class PartShader extends h3d.impl.Shader {
 		var partSize : Float2;
 		
 		var hasColor : Bool;
+		var is3D : Bool;
 
 		function vertex( mpos : M34, mproj : Matrix ) {
 			var tpos = input.pos.xyzw;
 			tpos.xyz = input.pos.xyzw * mpos;
-			var tmp = tpos * mproj;
 			var rpos = input.delta;
 			var cr = input.rotation.cos();
 			var sr = input.rotation.sin();
 			var rtmp = rpos.x * cr + rpos.y * sr;
 			rpos.y = rpos.y * cr - rpos.x * sr;
 			rpos.x = rtmp;
-			tmp.xy += rpos * input.size * partSize;
-			out = tmp;
+			if( is3D ) {
+				rpos.xy *= input.size * partSize;
+				tpos.x += rpos.x;
+				tpos.z += rpos.y;
+				out = tpos * mproj;
+			} else {
+				var tmp = tpos * mproj;
+				tmp.xy += rpos * input.size * partSize;
+				out = tmp;
+			}
 			tuv = input.uv;
 			if( hasColor ) tcolor = input.color;
 		}