Browse Source

LookAt: add constant screen size & face axis parameters

lviguier 1 year ago
parent
commit
86e416bafc
2 changed files with 32 additions and 5 deletions
  1. 4 1
      hrt/prefab/fx/Billboard.hx
  2. 28 4
      hrt/prefab/fx/LookAt.hx

+ 4 - 1
hrt/prefab/fx/Billboard.hx

@@ -2,6 +2,7 @@ package hrt.prefab.fx;
 
 
 
 
 @:access(hrt.prefab.fx.LookAt)
 @:access(hrt.prefab.fx.LookAt)
+@:deprecated("Use LookAt instead")
 class BillboardObject extends h3d.scene.Object {
 class BillboardObject extends h3d.scene.Object {
 	var graphics:h3d.scene.Graphics;
 	var graphics:h3d.scene.Graphics;
 	public var IsAbsolute: Bool;
 	public var IsAbsolute: Bool;
@@ -71,6 +72,7 @@ class BillboardObject extends h3d.scene.Object {
 }
 }
 
 
 @:allow(hrt.prefab.fx.Billboard.BillboardInstance)
 @:allow(hrt.prefab.fx.Billboard.BillboardInstance)
+@:deprecated("Use LookAt instead")
 class Billboard extends Object3D {
 class Billboard extends Object3D {
 	@:s public var IsAbsolute: Bool;
 	@:s public var IsAbsolute: Bool;
 	@:s public var LockX: Bool;
 	@:s public var LockX: Bool;
@@ -98,7 +100,8 @@ class Billboard extends Object3D {
 	override function getHideProps():hide.prefab.HideProps {
 	override function getHideProps():hide.prefab.HideProps {
 		return {
 		return {
 			icon: "cog",
 			icon: "cog",
-			name: "Billboard"
+			name: "Billboard",
+			allowParent : (p) -> false
 		};
 		};
 	}
 	}
 
 

+ 28 - 4
hrt/prefab/fx/LookAt.hx

@@ -1,6 +1,5 @@
 package hrt.prefab.fx;
 package hrt.prefab.fx;
 
 
-
 @:access(hrt.prefab.fx.LookAt)
 @:access(hrt.prefab.fx.LookAt)
 class LookAtObject extends h3d.scene.Object {
 class LookAtObject extends h3d.scene.Object {
 	var target: h3d.scene.Object;
 	var target: h3d.scene.Object;
@@ -27,7 +26,8 @@ class LookAtObject extends h3d.scene.Object {
 			lookAtPos = target.getAbsPos().getPosition();
 			lookAtPos = target.getAbsPos().getPosition();
 		else {
 		else {
 			if(getScene() == null || getScene().camera == null) return;
 			if(getScene() == null || getScene().camera == null) return;
-			lookAtPos.load(getScene().camera.pos);
+			var cam = getScene().camera;
+			lookAtPos.load(definition.faceTargetForward ? this.getAbsPos().getPosition() + -1 * (cam.target - cam.pos) : cam.pos);
 		}
 		}
 
 
 		super.calcAbsPos();
 		super.calcAbsPos();
@@ -62,12 +62,33 @@ class LookAtObject extends h3d.scene.Object {
 			q.initRotateAxis(lockAxis.x, lockAxis.y, lockAxis.z, angle);
 			q.initRotateAxis(lockAxis.x, lockAxis.y, lockAxis.z, angle);
 			q.normalize();
 			q.normalize();
 			setRotationQuat(q);
 			setRotationQuat(q);
+
 			super.calcAbsPos();
 			super.calcAbsPos();
+
+			if (definition.constantScreenSize) {
+				var v = absPos.getPosition() - getScene().camera.pos;
+				var scaleFactor = v.length();
+				absPos._11 *= scaleFactor;
+				absPos._12 *= scaleFactor;
+				absPos._13 *= scaleFactor;
+				absPos._21 *= scaleFactor;
+				absPos._22 *= scaleFactor;
+				absPos._23 *= scaleFactor;
+				absPos._31 *= scaleFactor;
+				absPos._32 *= scaleFactor;
+				absPos._33 *= scaleFactor;
+			}
 		}
 		}
 		else
 		else
 		{
 		{
 			tmpMat.load(absPos);
 			tmpMat.load(absPos);
 			var scale = tmpMat.getScale();
 			var scale = tmpMat.getScale();
+
+			if (definition.constantScreenSize) {
+				var v = absPos.getPosition() - getScene().camera.pos;
+				scale *= v.length();
+			}
+
 			qRot.initDirection(deltaVec);
 			qRot.initDirection(deltaVec);
 			qRot.toMatrix(absPos);
 			qRot.toMatrix(absPos);
 			absPos._11 *= scale.x;
 			absPos._11 *= scale.x;
@@ -90,6 +111,8 @@ class LookAtObject extends h3d.scene.Object {
 class LookAt extends Object3D {
 class LookAt extends Object3D {
 
 
 	@:s var target(default,null) : String;
 	@:s var target(default,null) : String;
+	@:s var faceTargetForward : Bool;
+	@:s var constantScreenSize : Bool;
 	@:s var lockAxis: Array<Float> = [0,0,0];
 	@:s var lockAxis: Array<Float> = [0,0,0];
 
 
 	override function updateInstance(?propName:String) {
 	override function updateInstance(?propName:String) {
@@ -117,6 +140,8 @@ class LookAt extends Object3D {
 		<div class="group" name="LookAt">
 		<div class="group" name="LookAt">
 			<dl>
 			<dl>
 				<dt>Target</dt><dd><select field="target"><option value="">-- Choose --</option></select></dd>
 				<dt>Target</dt><dd><select field="target"><option value="">-- Choose --</option></select></dd>
+				<dt>Face target forward</dt><dd><input type="checkbox" field="faceTargetForward"/></dd>
+				<dt>Constant screen size</dt><dd><input type="checkbox" field="constantScreenSize"/></dd>
 			</dl>
 			</dl>
 		</div>');
 		</div>');
 
 
@@ -126,8 +151,6 @@ class LookAt extends Object3D {
 
 
 		var props = ctx.properties.add(group ,this);
 		var props = ctx.properties.add(group ,this);
 
 
-
-
 		var select = props.find("select");
 		var select = props.find("select");
 		var opt = new hide.Element("<option>").attr("value", "camera").html("Camera");
 		var opt = new hide.Element("<option>").attr("value", "camera").html("Camera");
 		select.append(opt);
 		select.append(opt);
@@ -137,6 +160,7 @@ class LookAt extends Object3D {
 			var opt = new hide.Element("<option>").attr("value", path).html([for( p in 1...parts.length ) "&nbsp; "].join("") + parts.pop());
 			var opt = new hide.Element("<option>").attr("value", path).html([for( p in 1...parts.length ) "&nbsp; "].join("") + parts.pop());
 			select.append(opt);
 			select.append(opt);
 		}
 		}
+
 		select.val(Reflect.field(this, select.attr("field")));
 		select.val(Reflect.field(this, select.attr("field")));
 	}
 	}
 	#end
 	#end