Browse Source

Switch Std.instance to Std.downcast

Tom Spira 6 years ago
parent
commit
121bcccd5a

+ 1 - 1
hide/Ide.hx

@@ -203,7 +203,7 @@ class Ide {
 	}
 
 	public function getViews<K,T:hide.ui.View<K>>( cl : Class<T> ) {
-		return [for( v in views ) { var t = Std.instance(v,cl); if( t != null ) t; }];
+		return [for( v in views ) { var t = Std.downcast(v,cl); if( t != null ) t; }];
 	}
 
 	function getViewAt(x : Float, y : Float) {

+ 1 - 1
hide/comp/PropsEditor.hx

@@ -299,7 +299,7 @@ class PropsField extends Component {
 			};
 			return;
 		case "color":
-			var arr = Std.instance(current, Array);
+			var arr = Std.downcast(current, Array);
 			var alpha = arr != null && arr.length == 4 || f.attr("alpha") == "true";
 			var picker = new hide.comp.ColorPicker(alpha, null, f);
 

+ 9 - 9
hide/comp/SceneEditor.hx

@@ -216,7 +216,7 @@ class SceneEditor {
 
 	public function onResourceChanged(lib : hxd.fmt.hmd.Library) {
 
-		var models = sceneData.findAll(p -> Std.instance(p, PrefabElement));
+		var models = sceneData.findAll(p -> Std.downcast(p, PrefabElement));
 		var toRebuild : Array<PrefabElement> = [];
 		for(m in models) {
 			@:privateAccess if(m.source == lib.resource.entry.path) {
@@ -506,7 +506,7 @@ class SceneEditor {
 	}
 
 	function makeInteractive(elt: PrefabElement) {
-		var obj3d = Std.instance(elt, Object3D);
+		var obj3d = Std.downcast(elt, Object3D);
 		if(obj3d == null)
 			return;
 		var contexts = context.shared.contexts;
@@ -561,7 +561,7 @@ class SceneEditor {
 				if(group != null)
 					parentEl = group;
 				var newItems = getNewContextMenu(parentEl, function(newElt) {
-					var newObj3d = Std.instance(newElt, Object3D);
+					var newObj3d = Std.downcast(newElt, Object3D);
 					if(newObj3d != null) {
 						var newPos = new h3d.Matrix();
 						newPos.identity();
@@ -1364,7 +1364,7 @@ class SceneEditor {
 		var ref = new hrt.prefab.Reference(toParent);
 		ref.name = elt.name;
 		ref.refpath = elt.getAbsPath();
-		var obj3d = Std.instance(elt, Object3D);
+		var obj3d = Std.downcast(elt, Object3D);
 		if(obj3d != null) {
 			ref.x = obj3d.x;
 			ref.y = obj3d.y;
@@ -1440,7 +1440,7 @@ class SceneEditor {
 	}
 
 	function setTransform(elt: PrefabElement, ?mat: h3d.Matrix, ?position: h3d.Vector) {
-		var obj3d = Std.instance(elt, hrt.prefab.Object3D);
+		var obj3d = Std.downcast(elt, hrt.prefab.Object3D);
 		if(obj3d == null)
 			return;
 		if(mat != null)
@@ -1781,7 +1781,7 @@ class SceneEditor {
 		else {
 			var mat = new h3d.Matrix();
 			mat.identity();
-			var o = Std.instance(elt, Object3D);
+			var o = Std.downcast(elt, Object3D);
 			while(o != null) {
 				mat.multiply(mat, o.getTransform());
 				o = o.parent.to(hrt.prefab.Object3D);
@@ -1796,10 +1796,10 @@ class SceneEditor {
 			var polyColliders = new Array<PolygonBuffer>();
 			var meshes = new Array<Mesh>();
 			for (m in curEdit.rootObjects[0].getMeshes()) {
-				var hmdModel = Std.instance(m.primitive, HMDModel);
+				var hmdModel = Std.downcast(m.primitive, HMDModel);
 				if (hmdModel != null) {
-					var optiCollider = Std.instance(hmdModel.getCollider(), OptimizedCollider);
-					var polyCollider = Std.instance(optiCollider.b, PolygonBuffer);
+					var optiCollider = Std.downcast(hmdModel.getCollider(), OptimizedCollider);
+					var polyCollider = Std.downcast(optiCollider.b, PolygonBuffer);
 					if (polyCollider != null) {
 						polyColliders.push(polyCollider);
 						meshes.push(m);

+ 1 - 1
hide/comp/SceneTree.hx

@@ -49,7 +49,7 @@ class SceneTree extends IconTree<String> {
 	override function applyStyle(id: String, el: Element) {
 		var v : Dynamic = resolvePath(id);
 
-		var obj = Std.instance(v, h3d.scene.Object);
+		var obj = Std.downcast(v, h3d.scene.Object);
 
 		if (obj != null) {
 			if (el.find(".fa-eye").length == 0) {

+ 2 - 2
hide/comp/cdb/Editor.hx

@@ -82,7 +82,7 @@ class Editor extends Component {
 			});
 		keys.register("cdb.closeList", function() {
 			var c = cursor.getCell();
-			var sub = Std.instance(c == null ? cursor.table : c.table, SubTable);
+			var sub = Std.downcast(c == null ? cursor.table : c.table, SubTable);
 			if( sub != null ) {
 				sub.cell.element.click();
 				return;
@@ -363,7 +363,7 @@ class Editor extends Component {
 	}
 
 	function openReference( s : cdb.Sheet, line : Int, column : Int ) {
-		ide.open("hide.view.CdbTable", { path : s.name }, function(view) @:privateAccess Std.instance(view,hide.view.CdbTable).editor.cursor.setDefault(line,column));
+		ide.open("hide.view.CdbTable", { path : s.name }, function(view) @:privateAccess Std.downcast(view,hide.view.CdbTable).editor.cursor.setDefault(line,column));
 	}
 
 	public function syncSheet( ?base ) {

+ 1 - 1
hide/prefab/EditContext.hx

@@ -92,7 +92,7 @@ class EditContext {
 			out.push(path.join("."));
 			for( c in o )
 				getRec(path, c);
-			var sk = Std.instance(o, h3d.scene.Skin);
+			var sk = Std.downcast(o, h3d.scene.Skin);
 			if( sk != null ) {
 				var j = sk.getSkinData();
 				for( j in j.rootJoints )

+ 1 - 1
hide/prefab/PolygonEditor.hx

@@ -83,7 +83,7 @@ class MovablePoint {
 
 	public function updateText(ctx : Context){
 		inline function getText(o) : h2d.Text{
-			return Std.instance(o.getChildAt(0), h2d.Text);
+			return Std.downcast(o.getChildAt(0), h2d.Text);
 		}
 		getText(localPosText).visible = showDebug;
 		getText(worldPosText).visible = showDebug;

+ 1 - 1
hide/prefab/terrain/Brush.hx

@@ -146,6 +146,6 @@ class TilePreviewMesh extends h3d.scene.Mesh {
 	override function sync(ctx : h3d.scene.RenderContext) {
 		shader.heightMap = heightMap;
 		shader.heightMapSize = heightMap.width;
-		shader.primSize = Std.instance(parent, hrt.prefab.terrain.TerrainMesh).tileSize;
+		shader.primSize = Std.downcast(parent, hrt.prefab.terrain.TerrainMesh).tileSize;
 	}
 }

+ 7 - 7
hide/view/FXEditor.hx

@@ -359,7 +359,7 @@ class FXEditor extends FileView {
 	}
 
 	public function onSceneReady() {
-		light = sceneEditor.scene.s3d.find(function(o) return Std.instance(o, h3d.scene.fwd.DirLight));
+		light = sceneEditor.scene.s3d.find(function(o) return Std.downcast(o, h3d.scene.fwd.DirLight));
 		if( light == null ) {
 			light = new h3d.scene.fwd.DirLight(scene.s3d);
 			light.enableSpecular = true;
@@ -1014,8 +1014,8 @@ class FXEditor extends FileView {
 				<div class="tracks"></div>
 			</div>').appendTo(scrollPanel);
 			var addTrackEl = objPanel.find(".addtrack");
-			var objElt = Std.instance(sec.elt, hrt.prefab.Object3D);
-			var shaderElt = Std.instance(sec.elt, hrt.prefab.Shader);
+			var objElt = Std.downcast(sec.elt, hrt.prefab.Object3D);
+			var shaderElt = Std.downcast(sec.elt, hrt.prefab.Shader);
 
 			addTrackEl.click(function(e) {
 				var menuItems = getNewTrackMenu(sec.elt);
@@ -1099,9 +1099,9 @@ class FXEditor extends FileView {
 	}
 
 	public function getNewTrackMenu(elt: PrefabElement) : Array<hide.comp.ContextMenu.ContextMenuItem> {
-		var objElt = Std.instance(elt, hrt.prefab.Object3D);
-		var shaderElt = Std.instance(elt, hrt.prefab.Shader);
-		var emitterElt = Std.instance(elt, hrt.prefab.fx.Emitter);
+		var objElt = Std.downcast(elt, hrt.prefab.Object3D);
+		var shaderElt = Std.downcast(elt, hrt.prefab.Shader);
+		var emitterElt = Std.downcast(elt, hrt.prefab.fx.Emitter);
 		var menuItems : Array<hide.comp.ContextMenu.ContextMenuItem> = [];
 
 		inline function hasTrack(pname) {
@@ -1251,7 +1251,7 @@ class FXEditor extends FileView {
 		var anim : hrt.prefab.fx.FX.FXAnimation = null;
 		var ctx = sceneEditor.getContext(data);
 		if(ctx != null && ctx.local3d != null) {
-			anim = Std.instance(ctx.local3d,hrt.prefab.fx.FX.FXAnimation);
+			anim = Std.downcast(ctx.local3d,hrt.prefab.fx.FX.FXAnimation);
 		}
 		if(!pauseButton.isDown()) {
 			currentTime += scene.speed * dt;

+ 3 - 3
hide/view/Model.hx

@@ -230,8 +230,8 @@ class Model extends FileView {
 			var p = m.primitive;
 			triangleCount += p.triCount();
 			vertexCount += p.vertexCount();
-			var multi = Std.instance(m, h3d.scene.MultiMaterial);
-			var skin = Std.instance(m, h3d.scene.Skin);
+			var multi = Std.downcast(m, h3d.scene.MultiMaterial);
+			var skin = Std.downcast(m, h3d.scene.Skin);
 			if( skin != null )
 				bonesCount += skin.getSkinData().allJoints.length;
 			var count = if( skin != null && skin.getSkinData().splitJoints != null )
@@ -295,7 +295,7 @@ class Model extends FileView {
 			out.push(path.join("."));
 			for( c in o )
 				getRec(path, c);
-			var sk = Std.instance(o, h3d.scene.Skin);
+			var sk = Std.downcast(o, h3d.scene.Skin);
 			if( sk != null ) {
 				var j = sk.getSkinData();
 				for( j in j.rootJoints )

+ 2 - 2
hide/view/Particles3D.hx

@@ -263,7 +263,7 @@ class Particles3D extends FileView {
 					function addRec(o:h3d.scene.Object) {
 						if( o.name != null )
 							new Element('<option value="${o.name}" ${o.name == prev ? "selected='selected'" : ""}>${o.name}</option>').appendTo(attach);
-						var s = Std.instance(o, h3d.scene.Skin);
+						var s = Std.downcast(o, h3d.scene.Skin);
 						if( s != null )
 							for( j in s.getSkinData().allJoints )
 								new Element('<option value="${j.name}" ${j.name == prev ? "selected='selected'" : ""}>${j.name}</option>').appendTo(attach);
@@ -302,7 +302,7 @@ class Particles3D extends FileView {
 		var defAmbient = scene.s3d.lightSystem.ambientLight.clone();
 		extra.find(".lights").change(function(e) {
 			var ls = scene.s3d.lightSystem;
-			var lfw = Std.instance(ls, h3d.scene.fwd.LightSystem);
+			var lfw = Std.downcast(ls, h3d.scene.fwd.LightSystem);
 			var enable = e.getThis().prop("checked");
 			if( lfw != null ) lfw.maxLightsPerObject = enable ? 6 : 0;
 			if( enable ) ls.ambientLight.load(defAmbient) else ls.ambientLight.set(1, 1, 1);

+ 1 - 1
hide/view/Prefab.hx

@@ -88,7 +88,7 @@ class Prefab extends FileView {
 	}
 
 	public function onSceneReady() {
-		light = sceneEditor.scene.s3d.find(function(o) return Std.instance(o, h3d.scene.fwd.DirLight));
+		light = sceneEditor.scene.s3d.find(function(o) return Std.downcast(o, h3d.scene.fwd.DirLight));
 		if( light == null ) {
 			light = new h3d.scene.fwd.DirLight(scene.s3d);
 			light.enableSpecular = true;

+ 2 - 2
hide/view/l3d/Level3D.hx

@@ -138,7 +138,7 @@ private class Level3DSceneEditor extends hide.comp.SceneEditor {
 		var minDist = -1.;
 		for(polygon in polygons) {
 			var ctx = getContext(polygon);
-			var mesh = Std.instance(ctx.local3d, h3d.scene.Mesh);
+			var mesh = Std.downcast(ctx.local3d, h3d.scene.Mesh);
 			if(mesh == null)
 				continue;
 			var collider = mesh.getGlobalCollider();
@@ -692,7 +692,7 @@ class Level3D extends FileView {
 	}
 
 	function onSelectObjects(elts: Array<PrefabElement>) {
-		var renderProps = Std.instance(elts.find(e -> Std.is(e, hrt.prefab.RenderProps)), hrt.prefab.RenderProps);
+		var renderProps = Std.downcast(elts.find(e -> Std.is(e, hrt.prefab.RenderProps)), hrt.prefab.RenderProps);
 		if(renderProps != null)
 			lastRenderProps = renderProps;
 	}

+ 3 - 3
hide/view/l3d/LightProbeBaker.hx

@@ -94,7 +94,7 @@ class LightProbeBaker {
 		}
 		disableFaceCulling(offScreenScene);*/
 
-		var pbrRenderer = Std.instance(offScreenScene.renderer, h3d.scene.pbr.Renderer) ;
+		var pbrRenderer = Std.downcast(offScreenScene.renderer, h3d.scene.pbr.Renderer) ;
 		pbrRenderer.env = env;
 		pbrRenderer.renderMode = LightProbe;
 		offScreenScene.camera = customCamera;
@@ -192,12 +192,12 @@ class LightProbeBaker {
 			}
 			volumetricLightMap.lastBakedProbeIndex = index;
 
-			var pbrRenderer = Std.instance(offScreenScene.renderer, h3d.scene.pbr.Renderer);
+			var pbrRenderer = Std.downcast(offScreenScene.renderer, h3d.scene.pbr.Renderer);
 			if( useGPU ) {
 				drawSHIntoTexture(pbrRenderer, envMap, volumetricLightMap.shOrder, index);
 			}
 			else {
-				var pbrRenderer = Std.instance(offScreenScene.renderer, h3d.scene.pbr.Renderer);
+				var pbrRenderer = Std.downcast(offScreenScene.renderer, h3d.scene.pbr.Renderer);
 				var sh : hrt.prefab.vlm.SphericalHarmonic = convertEnvIntoSH_CPU(envMap, volumetricLightMap.shOrder);
 				for( coef in 0 ... coefCount ) {
 					var u = coords.x + volumetricLightMap.probeCount.x * coef;

+ 26 - 17
hide/view/shadereditor/ShaderEditor.hx

@@ -70,7 +70,7 @@ class ShaderEditor extends hide.view.Graph {
 						</div>)');
 		parent.on("drop", function(e) {
 			var posCursor = new Point(lX(ide.mouseX - 25), lY(ide.mouseY - 10));
-			var node = Std.instance(shaderGraph.addNode(posCursor.x, posCursor.y, ShaderParam), ShaderParam);
+			var node = Std.downcast(shaderGraph.addNode(posCursor.x, posCursor.y, ShaderParam), ShaderParam);
 			node.parameterId = draggedParamId;
 			var paramShader = shaderGraph.getParameter(draggedParamId);
 			node.variable = paramShader.variable;
@@ -231,7 +231,7 @@ class ShaderEditor extends hide.view.Graph {
 				var idBox = ev.target.closest(".box").id;
 				for (b in listOfBoxes) {
 					if (b.getId() == idBox) {
-						var subGraph = Std.instance(b.getInstance(), hrt.shgraph.nodes.SubGraph);
+						var subGraph = Std.downcast(b.getInstance(), hrt.shgraph.nodes.SubGraph);
 						if (subGraph != null) {
 							if (ev.currentTarget.getAttribute('field') != "filesubgraph") {
 								break;
@@ -348,14 +348,14 @@ class ShaderEditor extends hide.view.Graph {
 		updateMatrix();
 
 		for (node in shaderGraph.getNodes()) {
-			var shaderPreview = Std.instance(node.instance, hrt.shgraph.nodes.Preview);
+			var shaderPreview = Std.downcast(node.instance, hrt.shgraph.nodes.Preview);
 			if (shaderPreview != null) {
 				shaderPreview.config = config;
 				shaderPreview.shaderGraph = shaderGraph;
 				addBox(new Point(node.x, node.y), std.Type.getClass(node.instance), shaderPreview);
 				continue;
 			}
-			var paramNode = Std.instance(node.instance, ShaderParam);
+			var paramNode = Std.downcast(node.instance, ShaderParam);
 			if (paramNode != null) {
 				var paramShader = shaderGraph.getParameter(paramNode.parameterId);
 				paramNode.setName(paramShader.name);
@@ -546,7 +546,7 @@ class ShaderEditor extends hide.view.Graph {
 		var deleteBtn = new Element('<input type="button" value="Delete" />');
 		deleteBtn.on("click", function() {
 			for (b in listOfBoxes) {
-				var shaderParam = Std.instance(b.getInstance(), ShaderParam);
+				var shaderParam = Std.downcast(b.getInstance(), ShaderParam);
 				if (shaderParam != null && shaderParam.parameterId == id) {
 					error("This parameter is used in the graph.");
 					return;
@@ -570,7 +570,7 @@ class ShaderEditor extends hide.view.Graph {
 			var newName = inputTitle.val();
 			if (shaderGraph.setParameterTitle(id, newName)) {
 				for (b in listOfBoxes) {
-					var shaderParam = Std.instance(b.getInstance(), ShaderParam);
+					var shaderParam = Std.downcast(b.getInstance(), ShaderParam);
 					if (shaderParam != null && shaderParam.parameterId == id) {
 						beforeChange();
 						shaderParam.setName(newName);
@@ -593,7 +593,7 @@ class ShaderEditor extends hide.view.Graph {
 	function setBoxesParam(id : Int) {
 		var param = shaderGraph.getParameter(id);
 		for (b in listOfBoxes) {
-			var shaderParam = Std.instance(b.getInstance(), ShaderParam);
+			var shaderParam = Std.downcast(b.getInstance(), ShaderParam);
 			if (shaderParam != null && shaderParam.parameterId == id) {
 				setDisplayValue(shaderParam, param.type, param.defaultValue);
 				b.generateProperties(editor);
@@ -712,7 +712,7 @@ class ShaderEditor extends hide.view.Graph {
 						var nameOutput = str.split("(")[1].split(" =")[0];
 						var errorSent = false;
 						for (b in listOfBoxes) {
-							var shaderOutput = Std.instance(b.getInstance(), hrt.shgraph.ShaderOutput);
+							var shaderOutput = Std.downcast(b.getInstance(), hrt.shgraph.ShaderOutput);
 							if (shaderOutput != null) {
 								if (shaderOutput.variable.name == nameOutput) {
 									error("Compilation of shader failed > Invalid inputs", shaderOutput.id);
@@ -756,7 +756,7 @@ class ShaderEditor extends hide.view.Graph {
 		var param = shaderGraph.getParameter(id);
 		setParamValueByName(currentShader, param.name, param.defaultValue);
 		for (b in listOfBoxes) {
-			var previewBox = Std.instance(b.getInstance(), hrt.shgraph.nodes.Preview);
+			var previewBox = Std.downcast(b.getInstance(), hrt.shgraph.nodes.Preview);
 			if (previewBox != null) {
 				previewBox.setParamValueByName(param.variable.name, param.defaultValue);
 			}
@@ -796,7 +796,7 @@ class ShaderEditor extends hide.view.Graph {
 		var node = shaderGraph.addNode(p.x, p.y, nodeClass);
 		afterChange();
 
-		var shaderPreview = Std.instance(node, hrt.shgraph.nodes.Preview);
+		var shaderPreview = Std.downcast(node, hrt.shgraph.nodes.Preview);
 		if (shaderPreview != null) {
 			shaderPreview.config = config;
 			shaderPreview.shaderGraph = shaderGraph;
@@ -804,7 +804,7 @@ class ShaderEditor extends hide.view.Graph {
 			return node;
 		}
 
-		var subGraphNode = Std.instance(node, hrt.shgraph.nodes.SubGraph);
+		var subGraphNode = Std.downcast(node, hrt.shgraph.nodes.SubGraph);
 		if (subGraphNode != null) {
 			subGraphNode.loadGraphShader();
 			addBox(p, nodeClass, subGraphNode);
@@ -1097,7 +1097,7 @@ class ShaderEditor extends hide.view.Graph {
 	}
 
 	function removeEdgeSubGraphUpdate(edge : Graph.Edge) {
-		var subGraph = Std.instance(edge.to.getInstance(), hrt.shgraph.nodes.SubGraph);
+		var subGraph = Std.downcast(edge.to.getInstance(), hrt.shgraph.nodes.SubGraph);
 		if (subGraph != null) {
 			var field = "";
 			if (isCreatingLink == FromInput) {
@@ -1123,7 +1123,7 @@ class ShaderEditor extends hide.view.Graph {
 		var box = super.addBox(p, nodeClass, node);
 
 		if (nodeClass == ShaderParam) {
-			var paramId = Std.instance(node, ShaderParam).parameterId;
+			var paramId = Std.downcast(node, ShaderParam).parameterId;
 			box.getElement().on("dblclick", function(e) {
 				var parametersElements = parametersList.find(".parameter");
 				for (elt in parametersElements.elements()) {
@@ -1138,7 +1138,7 @@ class ShaderEditor extends hide.view.Graph {
 				}
 			});
 		} else if (nodeClass == SubGraph) {
-			var subGraphNode = Std.instance(node, SubGraph);
+			var subGraphNode = Std.downcast(node, SubGraph);
 			if (subGraphNode.pathShaderGraph != null) {
 				var filename = subGraphNode.pathShaderGraph.split("/").pop();
 				box.setTitle("SubGraph: " + filename.split(".")[0]);
@@ -1177,7 +1177,7 @@ class ShaderEditor extends hide.view.Graph {
 	}
 
 	override function updatePosition(box : Box) {
-		var previewBox = Std.instance(box.getInstance(), hrt.shgraph.nodes.Preview);
+		var previewBox = Std.downcast(box.getInstance(), hrt.shgraph.nodes.Preview);
 		if (previewBox != null){
 			previewBox.onMove(gX(box.getX()), gY(box.getY()), transformMatrix[0]);
 		}
@@ -1187,13 +1187,22 @@ class ShaderEditor extends hide.view.Graph {
 	override function updateMatrix() {
 		super.updateMatrix();
 		for (b in listOfBoxes) {
-			var previewBox = Std.instance(b.getInstance(), hrt.shgraph.nodes.Preview);
+			var previewBox = Std.downcast(b.getInstance(), hrt.shgraph.nodes.Preview);
 			if (previewBox != null){
 				previewBox.onMove(gX(b.getX()), gY(b.getY()), transformMatrix[0]);
 			}
 		}
 	}
+	
+	override function getDefaultContent() {
+		var p = {
+			type : "hlshader",
+			html : "",
+			json : {},
+		};
+		return haxe.io.Bytes.ofString(ide.toJSON(p));
+	}
 
-	static var _ = FileTree.registerExtension(ShaderEditor,["hlshader"],{ icon : "scribd" });
+	static var _ = FileTree.registerExtension(ShaderEditor,["hlshader"],{ icon : "scribd", createNew: "Shader Graph" });
 
 }

+ 1 - 1
hrt/prefab/Blur.hx

@@ -86,7 +86,7 @@ class Blur extends Prefab {
 	override function edit( ctx : EditContext ) {
 		var e : hide.Element;
 		function sync( bmp : h2d.Bitmap ) {
-			var k = @:privateAccess Std.instance(bmp.filter, h2d.filter.Blur).pass.getKernelSize();
+			var k = @:privateAccess Std.downcast(bmp.filter, h2d.filter.Blur).pass.getKernelSize();
 			e.find("[name=fetches]").text( (k + k) +"x" );
 		}
 		e = ctx.properties.add(new hide.Element('

+ 1 - 1
hrt/prefab/Box.hx

@@ -7,7 +7,7 @@ class Box extends Object3D {
 		#if editor
 		if(ctx.local3d == null)
 			return;
-		var mesh = Std.instance(ctx.local3d, h3d.scene.Mesh);
+		var mesh = Std.downcast(ctx.local3d, h3d.scene.Mesh);
 		if(mesh != null) {
 			setDebugColor(color, mesh.material);
 		}

+ 2 - 2
hrt/prefab/ContextShared.hx

@@ -202,7 +202,7 @@ class ContextShared {
 		var childObjs = getChildrenRoots(root, p, []);
 		var ret = [];
 		function rec(o : h3d.scene.Object) {
-			var m = Std.instance(o, c);
+			var m = Std.downcast(o, c);
 			if(m != null) ret.push(m);
 			for( child in o )
 				if( childObjs.indexOf(child) < 0 )
@@ -222,7 +222,7 @@ class ContextShared {
 		function rec(o : h3d.scene.Object) {
 			if( o.isMesh() ) {
 				var m = o.toMesh();
-				var multi = Std.instance(m, h3d.scene.MultiMaterial);
+				var multi = Std.downcast(m, h3d.scene.MultiMaterial);
 				if( multi != null ) {
 					for( m in multi.materials )
 						if( m != null )

+ 4 - 4
hrt/prefab/Light.hx

@@ -182,7 +182,7 @@ class Light extends Object3D {
 	}
 
 	function loadBaked( ctx : Context ) {
-		var light = Std.instance(ctx.local3d, h3d.scene.pbr.Light);
+		var light = Std.downcast(ctx.local3d, h3d.scene.pbr.Light);
 		if( light == null ) return;
 		if( light.shadows.mode == Static || light.shadows.mode == Mixed ){
 			var res = ctx.shared.loadPrefabDat("shadowMap", "bake", name);
@@ -207,14 +207,14 @@ class Light extends Object3D {
 
 		switch( kind ) {
 		case Spot:
-			var sl = Std.instance(light, h3d.scene.pbr.SpotLight);
+			var sl = Std.downcast(light, h3d.scene.pbr.SpotLight);
 			sl.range = range;
 			sl.maxRange = maxRange;
 			sl.angle = angle;
 			sl.fallOff = fallOff;
 			sl.cookie = cookieTex;
 		case Point:
-			var pl = Std.instance(light, h3d.scene.pbr.PointLight);
+			var pl = Std.downcast(light, h3d.scene.pbr.PointLight);
 			pl.range = range;
 			pl.size = size;
 			pl.zNear = hxd.Math.max(0.02, zNear);
@@ -345,7 +345,7 @@ class Light extends Object3D {
 					sel = g;
 				}
 				else{
-					var g : h3d.scene.Graphics = Std.instance(debugSpot.getChildAt(1), h3d.scene.Graphics);
+					var g : h3d.scene.Graphics = Std.downcast(debugSpot.getChildAt(1), h3d.scene.Graphics);
 					g.clear();
 					g.lineStyle(1, this.color);
 					g.moveTo(0,0,0); g.lineTo(1, 1, 1);

+ 1 - 1
hrt/prefab/Model.hx

@@ -38,7 +38,7 @@ class Model extends Object3D {
 				obj = root;
 			}
 			#if editor
-			for(m in obj.findAll(o -> Std.instance(o, h3d.scene.Mesh)))
+			for(m in obj.findAll(o -> Std.downcast(o, h3d.scene.Mesh)))
 				m.cullingCollider = new h3d.col.ObjectCollider(m, m.primitive.getBounds().toSphere());
 			#end
 			obj.name = name;

+ 1 - 1
hrt/prefab/Prefab.hx

@@ -373,7 +373,7 @@ class Prefab {
 		Returns null if not of this type.
 	**/
 	public function to<T:Prefab>( c : Class<T> ) : Null<T> {
-		return Std.instance(this, c);
+		return Std.downcast(this, c);
 	}
 
 	/**

+ 1 - 1
hrt/prefab/Reference.hx

@@ -117,7 +117,7 @@ class Reference extends Object3D {
 			return base;
 		var p = resolveRef(null);
 		if(p == null) return null;
-		return Std.instance(p, c);
+		return Std.downcast(p, c);
 	}
 
 

+ 1 - 1
hrt/prefab/RenderProps.hx

@@ -62,7 +62,7 @@ class RenderProps extends Prefab {
 			fx.dispose();
 		renderer.effects = [];
 		for( s in children ) {
-			var fx = Std.instance(s, hrt.prefab.rfx.RendererFX);
+			var fx = Std.downcast(s, hrt.prefab.rfx.RendererFX);
 			if( fx != null )
 				renderer.effects.push(fx);
 		}

+ 1 - 1
hrt/prefab/Shader.hx

@@ -21,7 +21,7 @@ class Shader extends Prefab {
 	}
 
 	override function updateInstance(ctx: Context, ?propName) {
-		var shader = Std.instance(ctx.custom, hxsl.DynamicShader);
+		var shader = Std.downcast(ctx.custom, hxsl.DynamicShader);
 		if(shader == null || shaderDef == null)
 			return;
 		for(v in shaderDef.shader.data.vars) {

+ 1 - 1
hrt/prefab/Trail.hx

@@ -44,7 +44,7 @@ class Trail extends Object3D {
 	override public function edit(ctx:EditContext) {
 		super.edit(ctx);
 
-		var trail = Std.instance(ctx.getContext(this).local3d, h3d.scene.Trail);
+		var trail = Std.downcast(ctx.getContext(this).local3d, h3d.scene.Trail);
 		var props = ctx.properties.add(new hide.Element('
 		<div class="group" name="Material">
 		</div>

+ 6 - 6
hrt/prefab/fx/Emitter.hx

@@ -445,16 +445,16 @@ class EmitterObject extends h3d.scene.Object {
 			return;
 
 		var template = particleTemplate.makeInstance(context);
-		var mesh = Std.instance(template.local3d, h3d.scene.Mesh);
+		var mesh = Std.downcast(template.local3d, h3d.scene.Mesh);
 		if( mesh == null ) {
 			for( i in 0...template.local3d.numChildren ) {
-				mesh = Std.instance(template.local3d.getChildAt(i), h3d.scene.Mesh);
+				mesh = Std.downcast(template.local3d.getChildAt(i), h3d.scene.Mesh);
 				if( mesh != null ) break;
 			}
 		}
 
 		if( mesh != null && mesh.primitive != null ) {
-			var meshPrim = Std.instance(mesh.primitive, h3d.prim.MeshPrimitive);
+			var meshPrim = Std.downcast(mesh.primitive, h3d.prim.MeshPrimitive);
 
 			// Setup mats.
 			// Should we do this manually here or make a recursive makeInstance on the template?
@@ -707,7 +707,7 @@ class Emitter extends Object3D {
 	}
 
 	function resetParam(param: ParamDef) {
-		var a = Std.instance(param.def, Array);
+		var a = Std.downcast(param.def, Array);
 		if(a != null)
 			Reflect.setField(props, param.name, a.copy());
 		else
@@ -716,7 +716,7 @@ class Emitter extends Object3D {
 
 	override function updateInstance( ctx: Context, ?propName : String ) {
 		super.updateInstance(ctx, propName);
-		var emitterObj = Std.instance(ctx.local3d, EmitterObject);
+		var emitterObj = Std.downcast(ctx.local3d, EmitterObject);
 
 		var randIdx = 0;
 		var template = children[0] != null ? children[0].to(Object3D) : null;
@@ -967,7 +967,7 @@ class Emitter extends Object3D {
 	}
 
 	override function setSelected( ctx : Context, b : Bool ) {
-		var emitterObj = Std.instance(ctx.local3d, EmitterObject);
+		var emitterObj = Std.downcast(ctx.local3d, EmitterObject);
 		if(emitterObj == null)
 			return;
 		var debugShape : h3d.scene.Object = emitterObj.find(c -> if(c.name == "_highlight") c else null);

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

@@ -185,9 +185,9 @@ class FXAnimation extends h3d.scene.Object {
 
 			var casterName = caster.name;
 			// Get the Model Name
-			var sk = Std.instance(caster, h3d.scene.Skin);
+			var sk = Std.downcast(caster, h3d.scene.Skin);
 			if( sk != null ) {
-				var prim = Std.instance(sk.getSkinData().primitive, h3d.prim.HMDModel);
+				var prim = Std.downcast(sk.getSkinData().primitive, h3d.prim.HMDModel);
 				casterName = @:privateAccess prim.lib.resource.entry.name.split(".")[0];
 			}
 
@@ -238,7 +238,7 @@ class FX extends hrt.prefab.Library {
 	}
 
 	static function getObjAnimations(ctx:Context, elt: PrefabElement, anims: Array<ObjectAnimation>) {
-		if(Std.instance(elt, hrt.prefab.fx.Emitter) == null) {
+		if(Std.downcast(elt, hrt.prefab.fx.Emitter) == null) {
 			// Don't extract animations for children of Emitters
 			for(c in elt.children) {
 				getObjAnimations(ctx, c, anims);
@@ -309,7 +309,7 @@ class FX extends hrt.prefab.Library {
 	}
 
 	public function refreshObjectAnims(ctx: Context) {
-		var fxanim = Std.instance(ctx.local3d, FXAnimation);
+		var fxanim = Std.downcast(ctx.local3d, FXAnimation);
 		fxanim.objects = [];
 		getObjAnimations(ctx, this, fxanim.objects);
 	}
@@ -362,7 +362,7 @@ class FX extends hrt.prefab.Library {
 	}
 
 	public static function getShaderAnims(ctx: Context, elt: PrefabElement, anims: Array<ShaderAnimation>) {
-		if(Std.instance(elt, hrt.prefab.fx.Emitter) == null) {
+		if(Std.downcast(elt, hrt.prefab.fx.Emitter) == null) {
 			for(c in elt.children) {
 				getShaderAnims(ctx, c, anims);
 			}
@@ -382,7 +382,7 @@ class FX extends hrt.prefab.Library {
 	}
 
 	function getEmitters(ctx: Context, elt: PrefabElement, emitters: Array<hrt.prefab.fx.Emitter.EmitterObject>) {
-		var em = Std.instance(elt, hrt.prefab.fx.Emitter);
+		var em = Std.downcast(elt, hrt.prefab.fx.Emitter);
 		if(em != null)  {
 			for(emCtx in ctx.shared.getContexts(elt)) {
 				if(emCtx.local3d == null) continue;
@@ -409,7 +409,7 @@ class FX extends hrt.prefab.Library {
 	}
 
 	function getConstraints( ctx : Context, elt : PrefabElement, constraints : Array<hrt.prefab.Constraint>){
-		var co = Std.instance(elt, hrt.prefab.Constraint);
+		var co = Std.downcast(elt, hrt.prefab.Constraint);
 		if(co != null)
 			constraints.push(co);
 		else
@@ -436,7 +436,7 @@ class FX extends hrt.prefab.Library {
 		var root = getFXRoot(ctx, this);
 		if(root != null){
 			for( c in root.children ){
-				var co = Std.instance(c , Constraint);
+				var co = Std.downcast(c , Constraint);
 				if(co == null) c.make(ctx);
 			}
 			getConstraints(ctx, root, fxanim.constraints);
@@ -460,7 +460,7 @@ class FX extends hrt.prefab.Library {
 
 	override function updateInstance( ctx: Context, ?propName : String ) {
 		super.updateInstance(ctx, null);
-		var fxanim = Std.instance(ctx.local3d, FXAnimation);
+		var fxanim = Std.downcast(ctx.local3d, FXAnimation);
 		fxanim.duration = duration;
 		fxanim.loopAnims = loopAnims;
 		fxanim.cullingRadius = cullingRadius;

+ 1 - 1
hrt/prefab/l3d/AdvancedDecal.hx

@@ -85,7 +85,7 @@ class AdvancedDecal extends Object3D {
 	}
 
 	public function updateRenderParams(ctx) {
-		var mesh = Std.instance(ctx.local3d, h3d.scene.Mesh);
+		var mesh = Std.downcast(ctx.local3d, h3d.scene.Mesh);
 		mesh.material.blendMode = blendMode;
 		switch (renderMode) {
 			case Decal:

+ 1 - 1
hrt/prefab/l3d/Decal.hx

@@ -33,7 +33,7 @@ class Decal extends Object3D {
 	override function updateInstance(ctx:Context,?propName:String) {
 		super.updateInstance(ctx,propName);
 
-		var mesh = Std.instance(ctx.local3d, h3d.scene.Mesh);
+		var mesh = Std.downcast(ctx.local3d, h3d.scene.Mesh);
 		mesh.material.texture = diffuseMap != null ? ctx.loadTexture(diffuseMap) : null;
 		mesh.material.normalMap = normalMap != null ? ctx.loadTexture(normalMap) : null;
 		mesh.material.specularTexture = specularMap != null ? ctx.loadTexture(specularMap) : null;

+ 1 - 1
hrt/prefab/l3d/MeshGenerator.hx

@@ -124,7 +124,7 @@ class MeshGenerator extends Object3D {
 		createMeshPart(ctx, root, ctx.local3d.getObjectByName("rootObject"));
 
 		#if editor
-		for(m in ctx.local3d.findAll(o -> Std.instance(o, h3d.scene.Mesh)))
+		for(m in ctx.local3d.findAll(o -> Std.downcast(o, h3d.scene.Mesh)))
 			m.cullingCollider = new h3d.col.ObjectCollider(m, m.primitive.getBounds().toSphere());
 		#end
 	}

+ 2 - 2
hrt/prefab/l3d/MeshSpray.hx

@@ -317,7 +317,7 @@ class MeshSpray extends Object3D {
 	public function getZ( x : Float, y : Float ) {
 		var z = this.z;
 
-		@:privateAccess var terrain = sceneEditor.sceneData.find(p -> Std.instance(p, hrt.prefab.terrain.Terrain));
+		@:privateAccess var terrain = sceneEditor.sceneData.find(p -> Std.downcast(p, hrt.prefab.terrain.Terrain));
 
 		if(terrain != null){
 			var pos = new h3d.Vector(x, y, 0);
@@ -340,7 +340,7 @@ class MeshSpray extends Object3D {
 
 	function projectToGround( ray: h3d.col.Ray ) {
 		var minDist = -1.;
-		@:privateAccess var terrainPrefab = sceneEditor.sceneData.find(p -> Std.instance(p, hrt.prefab.terrain.Terrain));
+		@:privateAccess var terrainPrefab = sceneEditor.sceneData.find(p -> Std.downcast(p, hrt.prefab.terrain.Terrain));
 		if (terrainPrefab != null) {
 			var normal = terrainPrefab.terrain.getAbsPos().up();
 			var plane = h3d.col.Plane.fromNormalPoint(normal.toPoint(), new h3d.col.Point(terrainPrefab.terrain.getAbsPos().tx, terrainPrefab.terrain.getAbsPos().ty, terrainPrefab.terrain.getAbsPos().tz));

+ 4 - 4
hrt/prefab/l3d/Polygon.hx

@@ -169,7 +169,7 @@ class Polygon extends Object3D {
 			return;
 		if(ctx.local3d == null)
 			return;
-		var mesh = Std.instance(ctx.local3d, h3d.scene.Mesh);
+		var mesh = Std.downcast(ctx.local3d, h3d.scene.Mesh);
 		if(mesh != null)
 			hrt.prefab.Box.setDebugColor(color, mesh.material);
 		#end
@@ -198,8 +198,8 @@ class Polygon extends Object3D {
 	}
 
 	public function getPrimitive( ctx : Context ) : h3d.prim.Polygon {
-		var mesh = Std.instance(ctx.local3d, h3d.scene.Mesh);
-		return Std.instance(mesh.primitive, h3d.prim.Polygon);
+		var mesh = Std.downcast(ctx.local3d, h3d.scene.Mesh);
+		return Std.downcast(mesh.primitive, h3d.prim.Polygon);
 	}
 
 	#if editor
@@ -276,7 +276,7 @@ class Polygon extends Object3D {
 					}
 				}
 				else if( prevKind == Custom ){
-					var mesh = Std.instance(ctx.getContext(this).local3d, h3d.scene.Mesh);
+					var mesh = Std.downcast(ctx.getContext(this).local3d, h3d.scene.Mesh);
 					if( mesh.primitive != null ) mesh.primitive.dispose(); // Dispose custom prim
 				}
 

+ 2 - 2
hrt/prefab/vlm/VolumetricLightmap.hx

@@ -156,7 +156,7 @@ class VolumetricLightmap extends Object3D {
 		if(propName ==  "strength" && displaySH){
 			var previewSpheres = volumetricLightmap.findAll(c -> if(c.name == "_previewSphere") c else null);
 			for(ps in previewSpheres){
-				var mesh = Std.instance(ps, h3d.scene.Mesh);
+				var mesh = Std.downcast(ps, h3d.scene.Mesh);
 				var shader = mesh.material.mainPass.getShader(hrt.shader.DisplaySH);
 				if(shader != null) shader.strength = volumetricLightmap.strength;
 			}
@@ -291,7 +291,7 @@ class VolumetricLightmap extends Object3D {
 		var s3d = @:privateAccess ctx.rootContext.local3d.getScene();
 		baker = new hide.view.l3d.ProbeBakerProcess(this, resolution, useGPU, 0.032);
 
-		var pbrRenderer = Std.instance(s3d.renderer, h3d.scene.pbr.Renderer);
+		var pbrRenderer = Std.downcast(s3d.renderer, h3d.scene.pbr.Renderer);
 		if(pbrRenderer != null) {
 			if( pbrRenderer.env == null || pbrRenderer.env.env == null || pbrRenderer.env.env.isDisposed() )
 					trace("Environment missing");

+ 6 - 6
hrt/shgraph/ShaderGraph.hx

@@ -96,7 +96,7 @@ class ShaderGraph {
 			n.instance.loadProperties(n.properties);
 			this.nodes.set(n.id, n);
 
-			var shaderParam = Std.instance(n.instance, ShaderParam);
+			var shaderParam = Std.downcast(n.instance, ShaderParam);
 			if (shaderParam != null) {
 				var paramShader = getParameter(shaderParam.parameterId);
 				shaderParam.computeOutputs();
@@ -201,14 +201,14 @@ class ShaderGraph {
 		}
 		var build = nodeVar.getExpr();
 
-		var shaderInput = Std.instance(node, ShaderInput);
+		var shaderInput = Std.downcast(node, ShaderInput);
 		if (shaderInput != null) {
 			var variable = shaderInput.variable;
 			if ((variable.kind == Param || variable.kind == Global || variable.kind == Input) && !alreadyAddVariable(variable)) {
 				allVariables.push(variable);
 			}
 		}
-		var shaderParam = Std.instance(node, ShaderParam);
+		var shaderParam = Std.downcast(node, ShaderParam);
 		if (shaderParam != null && !alreadyAddVariable(shaderParam.variable)) {
 			if (shaderParam.variable == null) {
 				shaderParam.variable = generateParameter(shaderParam.variable.name, shaderParam.variable.type);
@@ -218,7 +218,7 @@ class ShaderGraph {
 			allParamDefaultValue.push(getParameter(shaderParam.parameterId).defaultValue);
 		}
 		if (isSubGraph) {
-			var subGraph = Std.instance(node, hrt.shgraph.nodes.SubGraph);
+			var subGraph = Std.downcast(node, hrt.shgraph.nodes.SubGraph);
 			var params = subGraph.subShaderGraph.parametersAvailable;
 			for (subVar in subGraph.varsSubGraph) {
 				if (subVar.kind == Param) {
@@ -306,9 +306,9 @@ class ShaderGraph {
 			if (specificOutput != null) {
 				if (n.instance != specificOutput) continue;
 				shaderNode = specificOutput;
-				variable = Std.instance(specificOutput, hrt.shgraph.nodes.Preview).variable;
+				variable = Std.downcast(specificOutput, hrt.shgraph.nodes.Preview).variable;
 			} else {
-				var shaderOutput = Std.instance(n.instance, ShaderOutput);
+				var shaderOutput = Std.downcast(n.instance, ShaderOutput);
 
 				if (shaderOutput != null) {
 					variable = shaderOutput.variable;

+ 25 - 0
hrt/shgraph/nodes/Clamp.hx

@@ -0,0 +1,25 @@
+package hrt.shgraph.nodes;
+
+using hxsl.Ast;
+
+@name("Clamp")
+@description("Limits value between min and max")
+@width(80)
+@group("Math")
+class Clamp extends ShaderFunction {
+
+	@input("X") var x = SType.Number;
+	@input("min", true) var min = SType.Number;
+	@input("max", true) var max = SType.Number;
+
+	public function new() {
+		super(Saturate);
+	}
+
+	override public function computeOutputs() {
+		if (x != null && !x.isEmpty())
+			addOutput("output", x.getType());
+		else
+			removeOutput("output");
+	}
+}

+ 7 - 7
hrt/shgraph/nodes/SubGraph.hx

@@ -41,25 +41,25 @@ class SubGraph extends ShaderNode {
 			for (node in subShaderGraph.getNodes()) {
 				switch (node.type.split(".").pop()) {
 					case "ShaderParam": // params become inputs
-						var shaderParam = Std.instance(node.instance, ShaderParam);
+						var shaderParam = Std.downcast(node.instance, ShaderParam);
 						var paramName = subShaderGraph.getParameter(shaderParam.parameterId).name;
 
 						inputsInfo.set(prefixSubGraph+node.id, { name : paramName , type: ShaderType.getSType(shaderParam.variable.type), hasProperty: false, isRequired : false, id : node.id });
 						inputInfoKeys.push(prefixSubGraph+node.id);
 					case "ShaderInput":
-						var shaderInput = Std.instance(node.instance, ShaderInput);
+						var shaderInput = Std.downcast(node.instance, ShaderInput);
 
 						inputsInfo.set(prefixSubGraph+node.id, { name : "*" + shaderInput.variable.name , type: ShaderType.getSType(shaderInput.variable.type), hasProperty: false, isRequired : false, id : node.id });
 						inputInfoKeys.push(prefixSubGraph+node.id);
 					case "ShaderOutput":
-						var shaderOutput = Std.instance(node.instance, ShaderOutput);
+						var shaderOutput = Std.downcast(node.instance, ShaderOutput);
 
 						outputsInfo.set(prefixSubGraph+node.id, { name : shaderOutput.variable.name , type: ShaderType.getSType(shaderOutput.variable.type), id : node.id });
 						outputInfoKeys.push(prefixSubGraph+node.id);
 
 						addOutput(prefixSubGraph+node.id, shaderOutput.variable.type);
 					default:
-						var shaderConst = Std.instance(node.instance, ShaderConst);
+						var shaderConst = Std.downcast(node.instance, ShaderConst);
 						if (shaderConst != null) { // input static become properties
 							if (shaderConst.name.length == 0) continue;
 							if (Std.is(shaderConst, BoolConst)) {
@@ -102,10 +102,10 @@ class SubGraph extends ShaderNode {
 				var node = subShaderGraph.getNode(p.id);
 				switch (p.type) {
 					case TBool:
-						var boolConst = Std.instance(node.instance, BoolConst);
+						var boolConst = Std.downcast(node.instance, BoolConst);
 						@:privateAccess boolConst.value = p.defaultValue;
 					case TVec(4, VFloat):
-						var colorConst = Std.instance(node.instance, Color);
+						var colorConst = Std.downcast(node.instance, Color);
 						@:privateAccess {
 							colorConst.r = p.defaultValue.x;
 							colorConst.g = p.defaultValue.y;
@@ -113,7 +113,7 @@ class SubGraph extends ShaderNode {
 							colorConst.a = p.defaultValue.w;
 						}
 					case TFloat:
-						var floatConst = Std.instance(node.instance, FloatConst);
+						var floatConst = Std.downcast(node.instance, FloatConst);
 						@:privateAccess floatConst.value = p.defaultValue;
 					default:
 				}