Browse Source

Fx editor camera improvements (#184)

Jed974 4 years ago
parent
commit
5fc733dae0
5 changed files with 155 additions and 129 deletions
  1. 126 0
      hide/view/CameraController.hx
  2. 12 2
      hide/view/FXEditor.hx
  3. 2 123
      hide/view/Prefab.hx
  4. 14 3
      hrt/prefab/fx/Emitter.hx
  5. 1 1
      hrt/prefab/fx/FX.hx

+ 126 - 0
hide/view/CameraController.hx

@@ -0,0 +1,126 @@
+package hide.view;
+
+import hxd.Math;
+import hxd.Key as K;
+
+class CamController extends h3d.scene.CameraController {
+	public var groundSnapAngle = hxd.Math.degToRad(30);
+	var sceneEditor : hide.comp.SceneEditor;
+	var startPush : h2d.col.Point;
+	var moveCount = 0;
+
+	public function new(parent, sceneEditor) {
+		super(null, parent);
+		this.sceneEditor = sceneEditor;
+	}
+
+	override function onEvent( e : hxd.Event ) {
+		if(curPos == null) return;
+		switch( e.kind ) {
+		case EWheel:
+			zoom(e.wheelDelta);
+		case EPush:
+			pushing = e.button;
+			pushTime = haxe.Timer.stamp();
+			pushStartX = pushX = e.relX;
+			pushStartY = pushY = e.relY;
+			startPush = new h2d.col.Point(pushX, pushY);
+			if( pushing == 2 ) {
+				var se = sceneEditor;
+				var selection = se.getSelection();
+				var angle = hxd.Math.abs(Math.PI/2 - phi);
+				if( selection.length == 0 && angle > groundSnapAngle ) {
+					var visGround = se.screenToGround(se.scene.s2d.width / 2, se.scene.s2d.height / 2);
+					var dist = se.screenDistToGround(se.scene.s2d.width / 2, se.scene.s2d.height / 2);
+					if( dist != null ) {
+						set(dist, null, null, visGround);
+					}
+				}
+			}
+			moveCount = 0;
+			@:privateAccess scene.window.mouseLock = true;
+		case ERelease, EReleaseOutside:
+			if( pushing == e.button ) {
+				pushing = -1;
+				startPush = null;
+				if( e.kind == ERelease && haxe.Timer.stamp() - pushTime < 0.2 && hxd.Math.distance(e.relX - pushStartX,e.relY - pushStartY) < 5 )
+					onClick(e);
+				@:privateAccess scene.window.mouseLock = false;
+			}
+		case EMove:
+			// Windows bug that jumps movementX/Y on all browsers
+			if( moveCount < 10 && Math.distanceSq(pushX - e.relX, pushY - e.relY) > 100000 ) {
+				pushX = e.relX;
+				pushY = e.relY;
+				return;
+			}
+			moveCount++;
+
+			switch( pushing ) {
+			case 1:
+				if(startPush != null && startPush.distance(new h2d.col.Point(e.relX, e.relY)) > 3) {
+					var angle = hxd.Math.abs(Math.PI/2 - phi);
+					if(K.isDown(K.SHIFT) || angle < groundSnapAngle) {
+						var m = 0.001 * curPos.x * panSpeed / 25;
+						pan(-(e.relX - pushX) * m, (e.relY - pushY) * m);
+					}
+					else {
+						var se = sceneEditor;
+						var fromPt = se.screenToGround(pushX, pushY);
+						var toPt = se.screenToGround(e.relX, e.relY);
+						if(fromPt == null || toPt == null)
+							return;
+						var delta = toPt.sub(fromPt).toVector();
+						delta.w = 0;
+						targetOffset = targetOffset.sub(delta);
+					}
+				}
+				pushX = e.relX;
+				pushY = e.relY;
+			case 2:
+				rot(e.relX - pushX, e.relY - pushY);
+				pushX = e.relX;
+				pushY = e.relY;
+			default:
+			}
+		case EFocus:
+			@:privateAccess scene.window.mouseLock = false;
+		default:
+		}
+	}
+
+	function moveKeys() {
+		var mov = new h3d.Vector();
+		if( K.isDown(K.UP) || K.isDown(K.Z) || K.isDown(K.W) )
+			mov.x += 1;
+		if( K.isDown(K.DOWN) || K.isDown(K.S) )
+			mov.x -= 1;
+		if( K.isDown(K.LEFT) || K.isDown(K.Q) || K.isDown(K.A) )
+			mov.y -= 1;
+		if( K.isDown(K.RIGHT) || K.isDown(K.D) )
+			mov.y += 1;
+
+		if( mov.x == 0 && mov.y == 0 )
+			return;
+		var dir = new h3d.Vector(
+			mov.x * Math.cos(theta) + mov.y * Math.cos(Math.PI / 2 + theta),
+			mov.x * Math.sin(theta) + mov.y * Math.sin(Math.PI / 2 + theta)
+		);
+		var moveSpeed = Ide.inst.currentConfig.get("sceneeditor.camera.moveSpeed", 1.5);
+
+		var delta = dir.multiply(0.01 * moveSpeed * (distance + scene.camera.zNear));
+		delta.w = 0;
+		targetOffset = targetOffset.sub(delta);
+	}
+
+	override function sync(ctx : h3d.scene.RenderContext) {
+		if( pushing == 2 ) {
+			moveKeys();
+		}
+
+		var old = ctx.elapsedTime;
+		ctx.elapsedTime = hxd.Timer.dt;
+		super.sync(ctx);
+		ctx.elapsedTime = old;
+	}
+}

+ 12 - 2
hide/view/FXEditor.hx

@@ -6,6 +6,7 @@ import hide.Element;
 import hrt.prefab.Prefab in PrefabElement;
 import hrt.prefab.Curve;
 import hrt.prefab.fx.Event;
+import hide.view.CameraController.CamController;
 
 typedef PropTrackDef = {
 	name: String,
@@ -33,6 +34,16 @@ private class FXSceneEditor extends hide.comp.SceneEditor {
 		parent = cast view;
 	}
 
+	override function makeCamController() {
+		var c = new CamController(scene.s3d, this);
+		c.friction = 0.9;
+		c.panSpeed = 0.6;
+		c.zoomAmount = 1.05;
+		c.smooth = 0.7;
+		c.minDistance = 1;
+		return c;
+	}
+
 	override function onSceneReady() {
 		super.onSceneReady();
 		parent.onSceneReady();
@@ -111,8 +122,7 @@ private class FXSceneEditor extends hide.comp.SceneEditor {
 
 			refresh(fullRefresh ? Full : Partial);
 		}));
-		//parent.data.updateInstance(getContext(parent.data));
-		
+
 	}
 
 	override function setElementSelected( p : PrefabElement, ctx : hrt.prefab.Context, b : Bool ) {

+ 2 - 123
hide/view/Prefab.hx

@@ -1,4 +1,5 @@
 package hide.view;
+import hide.view.CameraController.CamController;
 using Lambda;
 
 import hxd.Math;
@@ -10,128 +11,6 @@ import hrt.prefab.l3d.Instance;
 import hide.comp.cdb.DataFiles;
 
 
-@:access(hide.view.Prefab)
-class CamController extends h3d.scene.CameraController {
-	public var groundSnapAngle = hxd.Math.degToRad(30);
-	var prefab : Prefab;
-	var startPush : h2d.col.Point;
-	var moveCount = 0;
-
-	public function new(parent, prefab) {
-		super(null, parent);
-		this.prefab = prefab;
-	}
-
-	override function onEvent( e : hxd.Event ) {
-		if(curPos == null) return;
-		switch( e.kind ) {
-		case EWheel:
-			zoom(e.wheelDelta);
-		case EPush:
-			pushing = e.button;
-			pushTime = haxe.Timer.stamp();
-			pushStartX = pushX = e.relX;
-			pushStartY = pushY = e.relY;
-			startPush = new h2d.col.Point(pushX, pushY);
-			if( pushing == 2 ) {
-				var se = prefab.sceneEditor;
-				var selection = se.getSelection();
-				var angle = hxd.Math.abs(Math.PI/2 - phi);
-				if( selection.length == 0 && angle > groundSnapAngle ) {
-					var visGround = se.screenToGround(se.scene.s2d.width / 2, se.scene.s2d.height / 2);
-					var dist = se.screenDistToGround(se.scene.s2d.width / 2, se.scene.s2d.height / 2);
-					if( dist != null ) {
-						set(dist, null, null, visGround);
-					}
-				}
-			}
-			moveCount = 0;
-			@:privateAccess scene.window.mouseLock = true;
-		case ERelease, EReleaseOutside:
-			if( pushing == e.button ) {
-				pushing = -1;
-				startPush = null;
-				if( e.kind == ERelease && haxe.Timer.stamp() - pushTime < 0.2 && hxd.Math.distance(e.relX - pushStartX,e.relY - pushStartY) < 5 )
-					onClick(e);
-				@:privateAccess scene.window.mouseLock = false;
-			}
-		case EMove:
-			// Windows bug that jumps movementX/Y on all browsers
-			if( moveCount < 10 && Math.distanceSq(pushX - e.relX, pushY - e.relY) > 100000 ) {
-				pushX = e.relX;
-				pushY = e.relY;
-				return;
-			}
-			moveCount++;
-
-			switch( pushing ) {
-			case 1:
-				if(startPush != null && startPush.distance(new h2d.col.Point(e.relX, e.relY)) > 3) {
-					var angle = hxd.Math.abs(Math.PI/2 - phi);
-					if(K.isDown(K.SHIFT) || angle < groundSnapAngle) {
-						var m = 0.001 * curPos.x * panSpeed / 25;
-						pan(-(e.relX - pushX) * m, (e.relY - pushY) * m);
-					}
-					else {
-						var se = prefab.sceneEditor;
-						var fromPt = se.screenToGround(pushX, pushY);
-						var toPt = se.screenToGround(e.relX, e.relY);
-						if(fromPt == null || toPt == null)
-							return;
-						var delta = toPt.sub(fromPt).toVector();
-						delta.w = 0;
-						targetOffset = targetOffset.sub(delta);
-					}
-				}
-				pushX = e.relX;
-				pushY = e.relY;
-			case 2:
-				rot(e.relX - pushX, e.relY - pushY);
-				pushX = e.relX;
-				pushY = e.relY;
-			default:
-			}
-		case EFocus:
-			@:privateAccess scene.window.mouseLock = false;
-		default:
-		}
-	}
-
-	function moveKeys() {
-		var mov = new h3d.Vector();
-		if( K.isDown(K.UP) || K.isDown(K.Z) || K.isDown(K.W) )
-			mov.x += 1;
-		if( K.isDown(K.DOWN) || K.isDown(K.S) )
-			mov.x -= 1;
-		if( K.isDown(K.LEFT) || K.isDown(K.Q) || K.isDown(K.A) )
-			mov.y -= 1;
-		if( K.isDown(K.RIGHT) || K.isDown(K.D) )
-			mov.y += 1;
-
-		if( mov.x == 0 && mov.y == 0 )
-			return;
-		var dir = new h3d.Vector(
-			mov.x * Math.cos(theta) + mov.y * Math.cos(Math.PI / 2 + theta),
-			mov.x * Math.sin(theta) + mov.y * Math.sin(Math.PI / 2 + theta)
-		);
-		var moveSpeed = Ide.inst.currentConfig.get("sceneeditor.camera.moveSpeed", 1.5);
-
-		var delta = dir.multiply(0.01 * moveSpeed * (distance + scene.camera.zNear));
-		delta.w = 0;
-		targetOffset = targetOffset.sub(delta);
-	}
-
-	override function sync(ctx : h3d.scene.RenderContext) {
-		if( pushing == 2 ) {
-			moveKeys();
-		}
-
-		var old = ctx.elapsedTime;
-		ctx.elapsedTime = hxd.Timer.dt;
-		super.sync(ctx);
-		ctx.elapsedTime = old;
-	}
-}
 
 @:access(hide.view.Prefab)
 private class PrefabSceneEditor extends hide.comp.SceneEditor {
@@ -144,7 +23,7 @@ private class PrefabSceneEditor extends hide.comp.SceneEditor {
 	}
 
 	override function makeCamController() {
-		var c = new CamController(scene.s3d, parent);
+		var c = new CamController(scene.s3d, this);
 		c.friction = 0.9;
 		c.panSpeed = 0.6;
 		c.zoomAmount = 1.05;

+ 14 - 3
hrt/prefab/fx/Emitter.hx

@@ -287,7 +287,7 @@ private class ParticleInstance  {
 				tmpSpeedAccumulation.transform3x3(emitter.invTransform);
 			add(speedAccumulation, tmpSpeedAccumulation);
 		}
-		
+
 		add(tmpSpeed, speedAccumulation);
 
 		// SPEED
@@ -759,6 +759,7 @@ class EmitterObject extends h3d.scene.Object {
 				if( mesh != null ) break;
 			}
 		}
+		template.shared.contexts.remove(particleTemplate);
 
 		if( mesh != null && mesh.primitive != null ) {
 			var meshPrim = Std.downcast(mesh.primitive, h3d.prim.MeshPrimitive);
@@ -767,8 +768,10 @@ class EmitterObject extends h3d.scene.Object {
 			// Should we do this manually here or make a recursive makeInstance on the template?
 			var materials = particleTemplate.getAll(hrt.prefab.Material);
 			for(mat in materials) {
-				if(mat.enabled)
+				if(mat.enabled) {
 					mat.makeInstance(template);
+					template.shared.contexts.remove(mat);
+				}
 			}
 
 			// Setup shaders
@@ -777,6 +780,7 @@ class EmitterObject extends h3d.scene.Object {
 			for( shader in shaders ) {
 				if( !shader.enabled ) continue;
 				var shCtx = shader.makeInstance(template);
+				template.shared.contexts.remove(shader);
 				if( shCtx == null ) continue;
 				hrt.prefab.fx.BaseFX.getShaderAnims(template, shader, shaderAnims);
 			}
@@ -803,7 +807,6 @@ class EmitterObject extends h3d.scene.Object {
 				batch = new h3d.scene.MeshBatch(meshPrim, mesh.material, this);
 				batch.name = "batch";
 			}
-			template.local3d.remove();
 		}
 	}
 
@@ -1016,6 +1019,14 @@ class EmitterObject extends h3d.scene.Object {
 			tick(catchupTime / numTicks, i == (numTicks - 1));
 		}
 	}
+
+	override function getBoundsRec( b : h3d.col.Bounds ) {
+		if( posChanged ) {
+			posChanged = false;
+			calcAbsPos();
+		}
+		return b;
+	}
 }
 
 class Emitter extends Object3D {

+ 1 - 1
hrt/prefab/fx/FX.hx

@@ -409,7 +409,7 @@ class FX extends BaseFX {
 		else
 			super.make(ctx);
 		fxanim.init(ctx, this, root);
-		
+
 		if(scriptCode != null && scriptCode != ""){
 			var parser = new FXScriptParser();
 			fxanim.script = parser.createFXScript(scriptCode, fxanim);