Kaynağa Gözat

added isInstance

Nicolas Cannasse 4 yıl önce
ebeveyn
işleme
56037eaa07
1 değiştirilmiş dosya ile 52 ekleme ve 11 silme
  1. 52 11
      hrt/prefab/DynamicShader.hx

+ 52 - 11
hrt/prefab/DynamicShader.hx

@@ -3,6 +3,8 @@ package hrt.prefab;
 class DynamicShader extends Shader {
 
 	var shaderDef : hrt.prefab.ContextShared.ShaderDef;
+	var shaderClass : Class<hxsl.Shader>;
+	@:s var isInstance : Bool;
 
 	public function new(?parent) {
 		super(parent);
@@ -15,6 +17,10 @@ class DynamicShader extends Shader {
 	}
 
 	override function setShaderParam(shader:hxsl.Shader, v:hxsl.Ast.TVar, value:Dynamic) {
+		if( isInstance ) {
+			super.setShaderParam(shader,v,value);
+			return;
+		}
 		cast(shader,hxsl.DynamicShader).setParamValue(v, value);
 	}
 
@@ -27,13 +33,19 @@ class DynamicShader extends Shader {
 	override function makeShader( ?ctx:Context ) {
 		if( getShaderDefinition(ctx) == null )
 			return null;
-		var shader = new hxsl.DynamicShader(shaderDef.shader);
-		for( v in shaderDef.inits ) {
-			#if !hscript
-			throw "hscript required";
-			#else
-			shader.hscriptSet(v.variable.name, v.value);
-			#end
+		var shader;
+		if( isInstance )
+			shader = Type.createInstance(shaderClass,[]);
+		else {
+			var dshader = new hxsl.DynamicShader(shaderDef.shader);
+			for( v in shaderDef.inits ) {
+				#if !hscript
+				throw "hscript required";
+				#else
+				dshader.hscriptSet(v.variable.name, v.value);
+				#end
+			}
+			shader = dshader;
 		}
 		syncShaderVars(shader, shaderDef.shader);
 		return shader;
@@ -58,14 +70,31 @@ class DynamicShader extends Shader {
 		#end
 	}
 
+	function loadShaderClass(opt=false) : Class<hxsl.Shader> {
+		var path = source;
+		if(StringTools.endsWith(path, ".hx")) path = path.substr(0, -3);
+		var cpath = path.split("/").join(".");
+		var cl = cast Type.resolveClass(cpath);
+		if( cl == null && !opt ) throw "Missing shader class"+cpath;
+		return cl;
+	}
+
 	public function loadShaderDef(ctx: Context) {
 		if(shaderDef == null) {
 			fixSourcePath();
-			var path = source;
-			if(StringTools.endsWith(path, ".hx")) {
-				path = path.substr(0, -3);
+			if( isInstance ) {
+				shaderClass = loadShaderClass();
+				var shared : hxsl.SharedShader = (shaderClass:Dynamic)._SHADER;
+				if( shared == null ) {
+					@:privateAccess Type.createEmptyInstance(shaderClass).initialize();
+					shared = (shaderClass:Dynamic)._SHADER;
+				}
+				shaderDef = { shader : shared, inits : [] };
+			} else {
+				var path = source;
+				if(StringTools.endsWith(path, ".hx")) path = path.substr(0, -3);
+				shaderDef = ctx.loadShader(path);
 			}
-			shaderDef = ctx.loadShader(path);
 		}
 		if(shaderDef == null)
 			return;
@@ -87,6 +116,18 @@ class DynamicShader extends Shader {
 		#end
 	}
 
+	#if editor
+	override function edit( ectx ) {
+		super.edit(ectx);
+		if( isInstance || loadShaderClass(true) != null ) {
+			ectx.properties.add(hide.comp.PropsEditor.makePropsList([{
+				name : "isInstance",
+				t : PBool,
+			}]), this);
+		}
+	}
+	#end
+
 	public static function evalConst( e : hxsl.Ast.TExpr ) : Dynamic {
 		return switch( e.e ) {
 		case TConst(c):