Browse Source

Add Shader prefab

trethaller 7 năm trước cách đây
mục cha
commit
069f690f9a
3 tập tin đã thay đổi với 97 bổ sung3 xóa
  1. 14 0
      hide/prefab/Context.hx
  2. 57 0
      hide/prefab/Shader.hx
  3. 26 3
      hide/view/FXScene.hx

+ 14 - 0
hide/prefab/Context.hx

@@ -1,5 +1,10 @@
 package hide.prefab;
 
+typedef ShaderDef = {
+	var shader : hxsl.SharedShader;
+	var inits : Array<{ v : hxsl.Ast.TVar, e : hxsl.Ast.TExpr }>;
+}
+
 class ContextShared {
 	public var root2d : h2d.Sprite;
 	public var root3d : h3d.scene.Object;
@@ -26,6 +31,7 @@ class Context {
 	public var local2d : h2d.Sprite;
 	public var local3d : h3d.scene.Object;
 	public var shared : ContextShared;
+	public var custom : Dynamic;
 
 	public function new() {
 	}
@@ -42,6 +48,7 @@ class Context {
 		c.shared = shared;
 		c.local2d = local2d;
 		c.local3d = local3d;
+		c.custom = custom;
 		if( p != null ) shared.contexts.set(p, c);
 		return c;
 	}
@@ -78,6 +85,13 @@ class Context {
 		#end
 	}
 
+	public function loadShader( name : String ) : ShaderDef {
+		#if editor
+		return hide.Ide.inst.shaderLoader.loadSharedShader(name);
+		#else
+		return null;
+		#end
+	}
 	public function locateObject( path : String ) {
 		if( path == null )
 			return null;

+ 57 - 0
hide/prefab/Shader.hx

@@ -0,0 +1,57 @@
+package hide.prefab;
+
+class Shader extends Prefab {
+
+	var shaderDef : Context.ShaderDef;
+
+	public function new(?parent) {
+		super(parent);
+		props = {};
+	}
+	
+	override function load(o:Dynamic) {
+
+	}
+
+	override function save() {
+		return {
+		};
+	}
+
+	override function makeInstance(ctx:Context):Context {
+		if(source == null)
+			return ctx;
+		if(ctx.local3d == null)
+			return ctx;
+		ctx = ctx.clone(this);
+		if(shaderDef == null)
+			shaderDef = ctx.loadShader("shaders/TestShader");
+		if(shaderDef == null)
+			return ctx;
+		var shader = new hxsl.DynamicShader(shaderDef.shader);
+		for( v in shaderDef.inits )
+			shader.hscriptSet(v.v.name, hxsl.Ast.Tools.evalConst(v.e));
+		ctx.custom = shader;
+		if(shader != null) {
+			for(m in ctx.local3d.getMaterials()) {
+				m.mainPass.addShader(shader);
+			}
+		}
+		return ctx;
+	}
+
+	override function edit( ctx : EditContext ) {
+		super.edit(ctx);
+
+		var shader = shctx.shader;
+		for(v in shaderDef.shader.data.vars) {
+			// TODO
+		}
+	}
+
+	override function getHideProps() {
+		return { icon : "cog", name : "Shader", fileSource : ["hx"] };
+	}
+
+	static var _ = Library.register("shader", Shader);
+}

+ 26 - 3
hide/view/FXScene.hx

@@ -30,7 +30,7 @@ private class FXSceneEditor extends hide.comp.SceneEditor {
 		var current = tree.getCurrentOver();
 		var registered = new Array<hide.comp.ContextMenu.ContextMenuItem>();
 		var allRegs = @:privateAccess hide.prefab.Library.registeredElements;
-		var allowed = ["model", "object"];
+		var allowed = ["model", "object", "shader"];
 		for( ptype in allowed ) {
 			var pcl = allRegs.get(ptype);
 			var props = Type.createEmptyInstance(pcl).getHideProps();
@@ -251,6 +251,25 @@ class FXScene extends FileView {
 		}, scene.speed);
 	}
 
+	override function onDragDrop(items : Array<String>, isDrop : Bool) {
+		var supported = ["fbx"];
+		var models = [];
+		for(path in items) {
+			var ext = haxe.io.Path.extension(path).toLowerCase();
+			if(supported.indexOf(ext) >= 0) {
+				models.push(path);
+			}
+		}
+		if(models.length > 0) {
+			if(isDrop) {
+				var parent : PrefabElement = data;
+				sceneEditor.dropModels(models, parent);
+			}
+			return true;
+		}
+		return false;
+	}
+
 	function onSelect(elts : Array<PrefabElement>) {
 		rebuildAnimPanel();
 	}
@@ -321,6 +340,9 @@ class FXScene extends FileView {
 							click: ()->addTrack(elt, t),
 							enabled: !hasTrack(t)});
 					}
+				}
+				else if(Std.is(elt, hide.prefab.Shader)) {
+					
 				}
 				new hide.comp.ContextMenu(menuItems);
 			});
@@ -340,7 +362,8 @@ class FXScene extends FileView {
 				var trackToggle = trackEl.find(".track-toggle");
 				tracksEl.append(trackEl);
 
-				var curveEdit = new hide.comp.CurveEditor(this.undo, trackEl.find(".curve"));
+				var curveContainer = trackEl.find(".curve");
+				var curveEdit = new hide.comp.CurveEditor(this.undo, curveContainer);
 				var cpath = curve.getAbsPath();
 				var trackKey = "trackVisible:" + cpath;
 				var expand = getDisplayState(trackKey) == true;
@@ -356,7 +379,7 @@ class FXScene extends FileView {
 						icon.removeClass("fa-angle-right").addClass("fa-angle-down");
 					else
 						icon.removeClass("fa-angle-down").addClass("fa-angle-right");
-					curveEdit.element.toggleClass("hidden", !expand);
+					curveContainer.toggleClass("hidden", !expand);
 				}
 				trackToggle.click(function(e) {
 					expand = !expand;