瀏覽代碼

added dynamic script renderer loading

ncannasse 7 年之前
父節點
當前提交
6d35f3c604
共有 4 個文件被更改,包括 69 次插入11 次删除
  1. 3 0
      bin/defaultProps.json
  2. 2 0
      hide.hxml
  3. 44 11
      hide/Ide.hx
  4. 20 0
      hide/tools/RendererSupport.hx

+ 3 - 0
bin/defaultProps.json

@@ -1,6 +1,9 @@
 {
 	// define location of animations in HMD files
 	"hmd.animPaths" : [],
+	
+	// custom renderers in the form of { "Name" : "script.js(MatSetupClassName)" }
+	"renderers" : {},
 
 	// model names that are hidden when open in viewer
 	"scene.autoHide" : [],

+ 2 - 0
hide.hxml

@@ -9,5 +9,7 @@
 -D hscriptPos
 -D multidriver
 -D editor
+-D js-classic
+-D js-unflatten
 -dce no
 -debug

+ 44 - 11
hide/Ide.hx

@@ -1,5 +1,6 @@
 package hide;
 import hide.ui.Props;
+import hxd.inspect.Group;
 
 @:expose
 class Ide {
@@ -40,6 +41,7 @@ class Ide {
 
 	var renderers : Array<h3d.mat.MaterialSetup>;
 	var subView : { component : String, state : Dynamic, events : {} };
+	var scripts : Map<String,Array<Void->Void>> = new Map();
 
 	static var firstInit = true;
 
@@ -383,18 +385,26 @@ class Ide {
 			new hide.Renderer.MaterialSetup("Default"),
 			new hide.Renderer.PbrSetup("PBR"),
 		];
-		var path = getPath("Renderer.hx");
-		if( sys.FileSystem.exists(path) ) {
-			/*
-			var r = new hide.tools.MaterialScript();
-			try {
-				r.load(sys.io.File.getContent(path));
-				renderers.unshift(r);
-			} catch( e : Dynamic ) {
-				error(e);
+
+		var extraRenderers = props.current.get("renderers");
+		for( name in Reflect.fields(extraRenderers) ) {
+			var script = Reflect.field(extraRenderers, name);
+			var r = ~/^(.*)?\(([A-Za-z0-9_.]+)\)$/;
+			if( !r.match(script) ) {
+				error(script+" has invalid renderer format");
+				continue;
 			}
-			r.onError = function(msg) error(msg);
-			*/
+			var file = r.matched(1);
+			var clName = r.matched(2);
+			loadScript(file, function() {
+				var cl = try js.Lib.eval(clName) catch( e : Dynamic ) null;
+				if( cl == null  ) {
+					error(clName+" could not be found in "+script);
+					return;
+				}
+				renderers.push(Type.createInstance(cl,[]));
+				initMenu();
+			});
 		}
 
 		var db = getPath(props.project.get("cdb.databaseFile"));
@@ -420,6 +430,29 @@ class Ide {
 		initLayout();
 	}
 
+	function loadScript( file : String, callb : Void -> Void ) {
+		file = getPath(file);
+		var wait = scripts.get(file);
+		if( wait != null ) {
+			if( wait.length == 0 )
+				callb();
+			else
+				wait.push(callb);
+			return;
+		}
+		wait = [callb];
+		scripts.set(file, wait);
+		var e = js.Browser.document.createScriptElement();
+		e.addEventListener("load", function() {
+			scripts.set(file, []);
+			for( w in wait )
+				w();
+		});
+		e.type = "text/javascript";
+		e.src = "file://"+file.split("\\").join("/");
+		js.Browser.document.body.appendChild(e);
+	}
+
 	public function saveDatabase() {
 		sys.io.File.saveContent(databaseFile, database.save());
 	}

+ 20 - 0
hide/tools/RendererSupport.hx

@@ -0,0 +1,20 @@
+package hide.tools;
+
+class RendererSupport {
+	
+	public function getS3D() : h3d.scene.Scene {
+		throw "TODO";
+		return null;
+	}
+	
+	public function lookupShader<T:hxsl.Shader>( current : T, ?passName : String ) : T {
+		throw "TODO";
+		return null;
+	}
+	
+	public static function get() : RendererSupport {
+		throw "TODO";
+		return null;
+	}
+		
+}