瀏覽代碼

export/import renderer props

ncannasse 7 年之前
父節點
當前提交
4549d53959
共有 3 個文件被更改,包括 71 次插入14 次删除
  1. 23 1
      hide/Ide.hx
  2. 16 9
      hide/comp/PropsEditor.hx
  3. 32 4
      hide/view/Model.hx

+ 23 - 1
hide/Ide.hx

@@ -486,7 +486,6 @@ class Ide {
 		}).appendTo(window.window.document.body).click();
 	}
 
-
 	public function chooseDirectory( onSelect : String -> Void ) {
 		var e = new Element('<input type="file" style="visibility:hidden" value="" nwdirectory/>');
 		e.change(function(ev) {
@@ -509,6 +508,29 @@ class Ide {
 		return str;
 	}
 
+	public function loadPrefab<T:hide.prefab.Prefab>( file : String, cl : Class<T> ) : T {
+		var l = new hide.prefab.Library();
+		try {
+			l.load(parseJSON(sys.io.File.getContent(getPath(file))));
+		} catch( e : Dynamic ) {
+			error("Invalid prefab ("+e+")");
+			throw e;
+		}
+		return l.get(cl);
+	}
+
+	public function savePrefab( file : String, f : hide.prefab.Prefab ) {
+		var content;
+		if( f.type == "library" )
+			content = f.save();
+		else {
+			var l = new hide.prefab.Library();
+			@:privateAccess l.children.push(f); // hack (don't remove f from current parent)
+			content = l.save();
+		}
+		sys.io.File.saveContent(getPath(file), toJSON(content));
+	}
+
 	function initMenu() {
 
 		if( subView != null ) return;

+ 16 - 9
hide/comp/PropsEditor.hx

@@ -110,13 +110,6 @@ class PropsEditor extends Component {
 			if( getDisplayState("section:" + StringTools.trim(h.text())) != false )
 				h.parent().addClass("open");
 
-		for( group in e.find(".group").elements() ) {
-			var s = group.closest(".section");
-			var key = (s.length == 0 ? "" : StringTools.trim(s.children("h1").text()) + "/") + group.attr("name");
-			if( getDisplayState("group:" + key) != false )
-				group.addClass("open");
-		}
-
 		// init section
 		e.find(".section").not(".open").children(".content").hide();
 		e.find(".section > h1").mousedown(function(e) {
@@ -127,12 +120,25 @@ class PropsEditor extends Component {
 			saveDisplayState("section:" + StringTools.trim(e.getThis().text()), section.hasClass("open"));
 		}).find("input").mousedown(function(e) e.stopPropagation());
 
+		// init groups
+		var gindex = 0;
 		for( g in e.find(".group").elements() ) {
+			var name = g.attr("name");
 			g.wrapInner("<div class='content'></div>");
-			if( g.attr("name") != null ) new Element("<div class='title'>" + g.attr("name") + '</div>').prependTo(g);
+			if( name != null )
+				new Element("<div class='title'>" + g.attr("name") + '</div>').prependTo(g);
+			else {
+				name = "_g"+(gindex++);
+				g.attr("name",name);
+				g.children().children(".title").prependTo(g);
+			}
+
+			var s = g.closest(".section");
+			var key = (s.length == 0 ? "" : StringTools.trim(s.children("h1").text()) + "/") + name;
+			if( getDisplayState("group:" + key) != false )
+				g.addClass("open");
 		}
 
-		// init group
 		e.find(".group").not(".open").children(".content").hide();
 		e.find(".group > .title").mousedown(function(e) {
 			if( e.button != 0 ) return;
@@ -210,6 +216,7 @@ class PropsField extends Component {
 		switch( f.attr("type") ) {
 		case "checkbox":
 			f.prop("checked", current);
+			f.mousedown(function(e) e.stopPropagation());
 			f.change(function(_) {
 				undo(function() {
 					var f = resolveField();

+ 32 - 4
hide/view/Model.hx

@@ -238,8 +238,34 @@ class Model extends FileView {
 			properties.clear();
 
 			var renderer = scene.s3d.renderer;
-			var group = new Element('<div class="group" name="Renderer"></div>');
-			renderer.editProps().appendTo(group);
+
+			var e = properties.add(new Element('<table>
+			<tr>
+			<td><input type="button" style="width:145px" value="Export"/>
+			<td><input type="button" style="width:145px" value="Import"/>
+			</tr>
+			</table>'));
+			e.find("input[value=Export]").click(function(_) {
+				ide.chooseFileSave("renderer.prefab", function(sel) {
+					var r = new hide.prefab.RenderProps();
+					r.name = h3d.mat.MaterialSetup.current.name;
+					r.setProps(renderer.props);
+					ide.savePrefab(sel, r);
+				});
+			});
+			e.find("input[value=Import]").click(function(_) {
+				ide.chooseFile(["prefab"], function(f) {
+					var r = ide.loadPrefab(f, hide.prefab.RenderProps);
+					if( r == null ) {
+						ide.error("This prefab does not have renderer properties");
+						return;
+					}
+					if( !r.applyProps(renderer) )
+						ide.error("This prefab does not contain "+h3d.mat.MaterialSetup.current.name+" renderer properties");
+				});
+			});
+
+			var group = renderer.editProps();
 			properties.add(group, renderer.props, function(_) {
 				renderer.refreshProps();
 				if( !properties.isTempChange ) renderProps();
@@ -249,11 +275,13 @@ class Model extends FileView {
 				power : Math.sqrt(light.color.r),
 				enable: true
 			};
-			var group = new Element('<div class="group" name="Light">
+			var group = new Element('
+			<div class="group" name="Light">
 				<dl>
 				<dt>Power</dt><dd><input type="range" min="0" max="4" field="power"/></dd>
 				</dl>
-			</div>');
+			</div>
+			');
 			if(!isPbr) {
 				var enable = new Element('<dt>Enable</dt><dd><input type="checkbox" field="enable"/></dd>');
 				group.find('dl').append(enable);