Browse Source

added @range, @ignore for inspector (both shaders and classes meta)

ncannasse 9 năm trước cách đây
mục cha
commit
f5a656e4bd

+ 4 - 0
h3d/pass/Blur.hx

@@ -1,20 +1,24 @@
 package h3d.pass;
 
+@ignore("shader")
 class Blur extends ScreenFx<h3d.shader.Blur> {
 
 	/**
 		Gives the blur quality : 0 for disable, 1 for 3x3, 2 for 5x5, etc.
 	**/
+	@range(1, 4, 1) @inspect
 	public var quality(default, set) : Int;
 
 	/**
 		The amount of blur (gaussian blur value).
 	**/
+	@range(0, 2) @inspect
 	public var sigma(default, set) : Float;
 
 	/**
 		The number of blur passes we perform (default = 1)
 	**/
+	@range(0, 5, 1) @inspect
 	public var passes : Int;
 
 

+ 1 - 1
h3d/pass/ShadowMap.hx

@@ -8,7 +8,7 @@ class ShadowMap extends Default {
 	var shadowColorId : Int;
 	var shadowPowerId : Int;
 	var shadowBiasId : Int;
-	public var border : Border;
+	@ignore public var border : Border;
 	public var size(default,set) : Int;
 	public var color : h3d.Vector;
 	public var power = 10.0;

+ 2 - 2
h3d/shader/BaseMesh.hx

@@ -47,8 +47,8 @@ class BaseMesh extends hxsl.Shader {
 		var specColor : Vec3;
 
 		@param var color : Vec4;
-		@param var specularPower : Float;
-		@param var specularAmount : Float;
+		@range(0,100) @param var specularPower : Float;
+		@range(0,10) @param var specularAmount : Float;
 		@param var specularColor : Vec3;
 
 		// each __init__ expr is out of order dependency-based

+ 11 - 11
h3d/shader/SAO.hx

@@ -4,22 +4,22 @@ class SAO extends ScreenShader {
 
 	static var SRC = {
 
-		@const var numSamples : Int;
-		@const var numSpiralTurns : Int;
+		@range(4,30) @const var numSamples : Int;
+		@range(1,10) @const var numSpiralTurns : Int;
 
-		@param var depthTexture : Sampler2D;
-		@param var normalTexture : Sampler2D;
+		@ignore @param var depthTexture : Sampler2D;
+		@ignore @param var normalTexture : Sampler2D;
 		@param var noiseTexture : Sampler2D;
 		@param var noiseScale : Vec2;
-		@param var sampleRadius : Float;
-		@param var intensity : Float;
-		@param var bias : Float;
+		@range(0,10) @param var sampleRadius : Float;
+		@range(0,10) @param var intensity : Float;
+		@range(0,0.2) @param var bias : Float;
 
-		@param var cameraView : Mat3x4;
-		@param var cameraInverseViewProj : Mat4;
+		@ignore @param var cameraView : Mat3x4;
+		@ignore @param var cameraInverseViewProj : Mat4;
 
-		@param var screenRatio : Vec2;
-		@param var fovTan : Float;
+		@ignore @param var screenRatio : Vec2;
+		@ignore @param var fovTan : Float;
 
 		function sampleAO(uv : Vec2, position : Vec3, normal : Vec3, radiusSS : Float, tapIndex : Int, rotationAngle : Float) : Float {
 			// returns a unit vector and a screen-space radius for the tap on a unit disk

+ 1 - 1
h3d/shader/Texture.hx

@@ -9,7 +9,7 @@ class Texture extends hxsl.Shader {
 
 		@const var additive : Bool;
 		@const var killAlpha : Bool;
-		@param var killAlphaThreshold : Float;
+		@range(0,1) @param var killAlphaThreshold : Float;
 
 		@param var texture : Sampler2D;
 		var calculatedUV : Vec2;

+ 34 - 1
hxd/inspect/PropManager.hx

@@ -170,6 +170,9 @@ class PropManager extends cdb.jq.Client {
 		case PFloat(_, _, set):
 			if( !Std.is(v, Float) ) throw "Invalid float value " + v;
 			set(v);
+		case PRange(_, _, _, _, set):
+			if( !Std.is(v, Float) ) throw "Invalid float value " + v;
+			set(v);
 		case PBool(_, _, set):
 			if( !Std.is(v, Bool) ) throw "Invalid bool value " + v;
 			set(v);
@@ -209,6 +212,7 @@ class PropManager extends cdb.jq.Client {
 		switch( p ) {
 		case PInt(_, get, _): return get();
 		case PFloat(_, get, _): return get();
+		case PRange(_, _, _, get, _): return get();
 		case PString(_, get, _): return get();
 		case PBool(_, get, _): return get();
 		case PEnum(_, _, get, _): return get();
@@ -269,7 +273,7 @@ class PropManager extends cdb.jq.Client {
 
 	function getPropName( p : Property ) {
 		return switch( propFollow(p) ) {
-		case PGroup(name, _), PBool(name, _), PInt(name, _), PFloat(name, _), PFloats(name, _), PString(name, _), PColor(name, _), PTexture(name, _), PEnum(name,_,_,_), PCustom(name,_): name;
+		case PGroup(name, _), PBool(name, _), PInt(name, _), PFloat(name, _), PFloats(name, _), PString(name, _), PColor(name, _), PTexture(name, _), PEnum(name,_,_,_), PCustom(name,_), PRange(name,_): name;
 		case PPopup(_): null;
 		}
 	}
@@ -480,6 +484,35 @@ class PropManager extends cdb.jq.Client {
 					});
 				}
 			});
+		case PRange(_, min, max, get, set, incr):
+			var v = get();
+			if( incr == null ) incr = (max - min) / 400;
+			jprop.html('<input class="range" type="range" min="$min" max="$max" value="$v" step="$incr"/> <span class="range_text">$v</span>');
+			var ji = jprop.find("input.range");
+			var jt = jprop.find("span");
+			ji.bind("input",function(_) {
+				var nv = Std.parseFloat(ji.getValue());
+				set(nv);
+				jt.text("" + nv);
+			});
+			ji.bind("change", function(_) {
+				var nv = Std.parseFloat(ji.getValue());
+				if( v != nv ) {
+					addHistory(path, v, nv);
+					v = nv;
+				}
+				set(nv);
+				jt.text("" + nv);
+			});
+			jt.click(function(_) editValue(jt, function() return "" + get(), function(s) {
+				var nv = Std.parseFloat(s);
+				if( !Math.isNaN(nv) && v != nv ) {
+					addHistory(path, v, nv);
+					v = nv;
+					set(nv);
+					ji.val(nv);
+				}
+			}));
 		case PFloats(_, get, set):
 			var values = get();
 			jprop.html("<table><tr></tr></table>");

+ 1 - 0
hxd/inspect/Property.hx

@@ -4,6 +4,7 @@ enum Property {
 	PBool( name : String, get : Void -> Bool, set : Bool -> Void );
 	PInt( name : String, get : Void -> Int, set : Int -> Void );
 	PFloat( name : String, get : Void -> Float, set : Float -> Void );
+	PRange( name : String, min : Float, max : Float, get : Void -> Float, set : Float -> Void, ?incr : Float );
 	PString( name : String, get : Void -> String, set : String -> Void );
 	PEnum( name : String, e : Enum<Dynamic>, get : Void -> Dynamic, set : Dynamic -> Void );
 	PColor( name : String, hasAlpha : Bool, get : Void -> h3d.Vector, set : h3d.Vector -> Void );

+ 79 - 19
hxd/inspect/ScenePanel.hx

@@ -169,6 +169,9 @@ class ScenePanel extends Panel {
 		for( v in vars ) {
 			switch( v.kind ) {
 			case Param:
+
+				if( v.qualifiers != null && v.qualifiers.indexOf(Ignore) >= 0 ) continue;
+
 				var name = v.name+"__";
 				function set(val:Dynamic) {
 					Reflect.setField(s, name, val);
@@ -179,9 +182,31 @@ class ScenePanel extends Panel {
 				case TBool:
 					props.push(PBool(v.name, function() return Reflect.field(s,name), set ));
 				case TInt:
-					props.push(PInt(v.name, function() return Reflect.field(s,name), set ));
+					var done = false;
+					if( v.qualifiers != null )
+						for( q in v.qualifiers )
+							switch( q ) {
+							case Range(min, max):
+								done = true;
+								props.push(PRange(v.name, min, max, function() return Reflect.field(s, name), set,1));
+								break;
+							default:
+							}
+					if( !done )
+						props.push(PInt(v.name, function() return Reflect.field(s,name), set ));
 				case TFloat:
-					props.push(PFloat(v.name, function() return Reflect.field(s, name), set));
+					var done = false;
+					if( v.qualifiers != null )
+						for( q in v.qualifiers )
+							switch( q ) {
+							case Range(min, max):
+								done = true;
+								props.push(PRange(v.name, min, max, function() return Reflect.field(s, name), set));
+								break;
+							default:
+							}
+					if( !done )
+						props.push(PFloat(v.name, function() return Reflect.field(s, name), set));
 				case TVec(size = (3 | 4), VFloat) if( v.name.toLowerCase().indexOf("color") >= 0 ):
 					props.push(PColor(v.name, size == 4, function() return Reflect.field(s, name), set));
 				case TSampler2D, TSamplerCube:
@@ -284,7 +309,7 @@ class ScenePanel extends Panel {
 	function getLightProps( l : h3d.scene.Light ) {
 		var props = [];
 		props.push(PColor("color", false, function() return l.color, function(c) l.color.load(c)));
-		props.push(PInt("priority", function() return l.priority, function(p) l.priority = p));
+		props.push(PRange("priority", 0, 10, function() return l.priority, function(p) l.priority = Std.int(p),1));
 		props.push(PBool("enableSpecular", function() return l.enableSpecular, function(b) l.enableSpecular = b));
 		var dl = Std.instance(l, h3d.scene.DirLight);
 		if( dl != null )
@@ -321,10 +346,13 @@ class ScenePanel extends Panel {
 		return props;
 	}
 
-	function getDynamicProps( v : Dynamic ) {
+	function getDynamicProps( v : Dynamic ) : Array<Property> {
 		var fx = Std.instance(v,h3d.pass.ScreenFx);
-		if( fx != null )
-			return [getShaderProps(fx.shader)];
+		if( fx != null ) {
+			var props = [];
+			addDynamicProps(props, v);
+			return props;
+		}
 		var s = Std.instance(v, hxsl.Shader);
 		if( s != null )
 			return [getShaderProps(s)];
@@ -333,20 +361,52 @@ class ScenePanel extends Panel {
 
 	function addDynamicProps( props : Array<Property>, o : Dynamic ) {
 		var cl = Type.getClass(o);
+		var ignoreList = null;
+		var ccur = cl;
+		while( ccur != null ) {
+			var cmeta : Dynamic = haxe.rtti.Meta.getType(ccur);
+			var ignore : Array<String> = cmeta.ignore;
+			if( ignore != null ) {
+				if( ignoreList == null ) ignoreList = [];
+				for( i in ignore )
+					ignoreList.push(i);
+			}
+			ccur = Type.getSuperClass(ccur);
+		}
+
 		var meta = haxe.rtti.Meta.getFields(cl);
 		var fields = Type.getInstanceFields(cl);
 		fields.sort(Reflect.compare);
 		for( f in fields ) {
+
+			if( ignoreList != null && ignoreList.indexOf(f) >= 0 ) continue;
+
 			var v = Reflect.field(o, f);
-			var pl = getDynamicProps(v);
-			if( pl != null )
-				props.push(PGroup(f, pl));
-			else {
-				// @inspect metadata
-				var m = Reflect.field(meta, f);
-				if( m != null && Reflect.hasField(m, "inspect") ) {
-					if( Std.is(v, Bool) )
-						props.unshift(PBool(f, function() return Reflect.getProperty(o, f), function(v) Reflect.setProperty(o, f, v)));
+
+			// @inspect metadata
+			var m : Dynamic = Reflect.field(meta, f);
+
+			if( m != null && Reflect.hasField(m, "ignore") )
+				continue;
+
+			if( m != null && Reflect.hasField(m, "inspect") ) {
+				if( Std.is(v, Bool) )
+					props.unshift(PBool(f, function() return Reflect.getProperty(o, f), function(v) Reflect.setProperty(o, f, v)));
+				else if( Std.is(v, Float) ) {
+					var range : Array<Null<Float>> = m.range;
+					if( range != null )
+						props.unshift(PRange(f, range[0], range[1], function() return Reflect.getProperty(o, f), function(v) Reflect.setProperty(o, f, v), range[2]));
+					else
+						props.unshift(PFloat(f, function() return Reflect.getProperty(o, f), function(v) Reflect.setProperty(o, f, v)));
+				}
+			} else {
+
+				var pl = getDynamicProps(v);
+				if( pl != null ) {
+					if( pl.length == 1 && pl[0].match(PGroup(_)) )
+						props.push(pl[0]);
+					else
+						props.push(PGroup(f, pl));
 				}
 			}
 		}
@@ -369,7 +429,7 @@ class ScenePanel extends Panel {
 		var props = [];
 		var ls = scene.lightSystem;
 		props.push(PGroup("LightSystem", [
-			PInt("maxLightsPerObject", function() return ls.maxLightsPerObject, function(s) ls.maxLightsPerObject = s),
+			PRange("maxLightsPerObject", 0, 10, function() return ls.maxLightsPerObject, function(s) ls.maxLightsPerObject = Std.int(s), 1),
 			PColor("ambientLight", false, function() return ls.ambientLight, function(v) ls.ambientLight = v),
 			PBool("perPixelLighting", function() return ls.perPixelLighting, function(b) ls.perPixelLighting = b),
 		]));
@@ -377,10 +437,10 @@ class ScenePanel extends Panel {
 		var s = Std.instance(scene.renderer.getPass("shadow", false),h3d.pass.ShadowMap);
 		if( s != null ) {
 			props.push(PGroup("Shadows", [
-				PInt("size", function() return s.size, function(sz) s.size = sz),
+				PRange("size", 64, 2048, function() return s.size, function(sz) s.size = Std.int(sz), 64),
 				PColor("color", false, function() return s.color, function(v) s.color = v),
-				PFloat("power", function() return s.power, function(v) s.power = v),
-				PFloat("bias", function() return s.bias, function(v) s.bias = v),
+				PRange("power", 0, 100, function() return s.power, function(v) s.power = v),
+				PRange("bias", 0, 0.1, function() return s.bias, function(v) s.bias = v),
 			]));
 		}
 

+ 13 - 0
hxd/inspect/inspect.css

@@ -149,6 +149,19 @@
 	border : 1px solid #888;
 	width : 100%;
 }
+.jqpage table.iprops tr.prange input.range, .dialog-floating table.iprops tr.prange input.range {
+	width : auto;
+	display : inline-block;
+	zoom : 1;
+	*display : inline;
+	padding-bottom : 1px;
+}
+.jqpage table.iprops tr.prange .range_text, .dialog-floating table.iprops tr.prange .range_text {
+	width : 30px;
+	display : inline-block;
+	zoom : 1;
+	*display : inline;
+}
 .jqpage table.iprops tr.active td, .dialog-floating table.iprops tr.active td {
 	font-weight : bold;
 }

+ 12 - 0
hxd/inspect/inspect.hss

@@ -163,6 +163,18 @@
 			}
 		}
 
+		tr.prange {
+			input.range {
+				width : auto;
+				display : inline-block;
+				padding-bottom : 1px;
+			}
+			.range_text {
+				width : 30px;
+				display : inline-block;
+			}
+		}
+
 		tr.active td {
 			font-weight : bold;
 		}

+ 2 - 0
hxsl/Ast.hx

@@ -76,6 +76,8 @@ enum VarQualifier {
 	Name( n : String );
 	Shared;
 	Precision( p : Prec );
+	Range( min : Float, max : Float );
+	Ignore; // the variable is ignored in reflection (inspector)
 }
 
 enum Prec {

+ 7 - 0
hxsl/Checker.hx

@@ -629,6 +629,13 @@ class Checker {
 					default:
 						error("Precision qualifier not supported on " + v.type, pos);
 					}
+				case Range(min,max):
+					switch( v.type ) {
+					case TFloat, TInt, TVec(_, VFloat):
+					default:
+						error("Precision qualifier not supported on " + v.type, pos);
+					}
+				case Ignore:
 				}
 		}
 		if( tv.type != null )

+ 6 - 0
hxsl/MacroParser.hx

@@ -14,11 +14,15 @@ class MacroParser {
 	function applyMeta( m : MetadataEntry, v : Ast.VarDecl ) {
 		switch( m.params ) {
 		case []:
+			// fallthrough
 		case [ { expr : EConst(CString(n)), pos : pos } ] if( m.name == "var" || m.name == "global" || m.name == "input" ):
 			v.qualifiers.push(Name(n));
 		case [ { expr : EConst(CInt(n)), pos : pos } ] if( m.name == "const" ):
 			v.qualifiers.push(Const(Std.parseInt(n)));
 			return;
+		case [ { expr : EConst(CInt(a) | CFloat(a)) }, { expr : EConst(CInt(b) | CFloat(b)) } ] if( m.name == "range" ):
+			v.qualifiers.push(Range(Std.parseFloat(a),Std.parseFloat(b)));
+			return;
 		default:
 			error("Invalid meta parameter", m.pos);
 		}
@@ -47,6 +51,8 @@ class MacroParser {
 			v.qualifiers.push(Precision(Medium));
 		case "highp":
 			v.qualifiers.push(Precision(High));
+		case "ignore":
+			v.qualifiers.push(Ignore);
 		default:
 			error("Unsupported qualifier " + m.name, m.pos);
 		}

+ 2 - 0
hxsl/Printer.hx

@@ -58,6 +58,8 @@ class Printer {
 				case Name(n): "name('" + n + "')";
 				case Shared: "shared";
 				case Precision(p): p.getName().toLowerCase() + "p";
+				case Range(min, max): "range(" + min + "," + max + ")";
+				case Ignore: "ignore";
 				}) + " ");
 		}
 		if( v.kind != defKind )