Explorar el Código

added Prefab.setSelected for editor support

ncannasse hace 7 años
padre
commit
cee704bc01
Se han modificado 2 ficheros con 68 adiciones y 0 borrados
  1. 36 0
      hxd/prefab/ContextShared.hx
  2. 32 0
      hxd/prefab/Prefab.hx

+ 36 - 0
hxd/prefab/ContextShared.hx

@@ -131,4 +131,40 @@ class ContextShared {
 		}
 	}
 
+	public function getObjects<T:h3d.scene.Object>( p : Prefab, c: Class<T> ) : Array<T> {
+		var childObjs = [for(c in p.children) { var ctx = contexts.get(c); if( ctx != null ) ctx.local3d; }];
+		var ret = [];
+		function rec(o : h3d.scene.Object) {
+			var m = Std.instance(o, c);
+			if(m != null) ret.push(m);
+			for( child in o )
+				if( childObjs.indexOf(child) < 0 )
+					rec(child);
+		}
+		rec(contexts.get(p).local3d);
+		return ret;
+	}
+
+	public function getMaterials( p : Prefab ) {
+		var childObjs = [for(c in p.children) { var ctx = contexts.get(c); if( ctx != null ) ctx.local3d; }];
+		var ret = [];
+		function rec(o : h3d.scene.Object) {
+			if( o.isMesh() ) {
+				var m = o.toMesh();
+				var multi = Std.instance(m, h3d.scene.MultiMaterial);
+				if( multi != null ) {
+					for( m in multi.materials )
+						if( m != null )
+							ret.push(m);
+				} else if( m.material != null )
+					ret.push(m.material);
+			}
+			for( child in o )
+				if( childObjs.indexOf(child) < 0 )
+					rec(child);
+		}
+		rec(contexts.get(p).local3d);
+		return ret;
+	}
+
 }

+ 32 - 0
hxd/prefab/Prefab.hx

@@ -40,6 +40,38 @@ class Prefab {
 	public function getHideProps() : hide.prefab.HideProps {
 		return { icon : "question-circle", name : "Unknown" };
 	}
+
+	public function setSelected( ctx : hide.prefab.Context, b : Bool ) {
+		var materials = ctx.shared.getMaterials(this);
+
+		if( !b ) {
+			for( m in materials ) {
+				m.mainPass.stencil = null;
+				m.removePass(m.getPass("outline"));
+			}
+			return;
+		}
+
+		var outlineShader = new h3d.shader.Outline();
+		outlineShader.size = 0.12;
+		outlineShader.distance = 0;
+		outlineShader.color.setColor(0xffffff);
+
+		var s1 = new h3d.mat.Stencil();
+		s1.setFunc(Always, 1);
+		s1.setOp(Keep, Keep, Replace);
+
+		var s2 = new h3d.mat.Stencil();
+		s2.setFunc(Greater, 1, 0xFF, 0);
+		for( m in materials ) {
+			m.mainPass.stencil = s1;
+			var p = m.allocPass("outline");
+			p.culling = None;
+			p.depthWrite = false;
+			p.addShader(outlineShader);
+			p.stencil = s2;
+		}
+	}
 	#end
 
 	public inline function iterator() : Iterator<Prefab> {