Răsfoiți Sursa

add render props to model view and fix button push state

lviguier 2 ani în urmă
părinte
comite
a8dfe9b8f0
4 a modificat fișierele cu 140 adăugiri și 174 ștergeri
  1. 4 0
      bin/style.css
  2. 4 0
      bin/style.less
  3. 67 55
      hide/comp/SceneEditor.hx
  4. 65 119
      hide/view/Model.hx

+ 4 - 0
bin/style.css

@@ -216,6 +216,10 @@ input[type=button]:disabled {
   color: #c0c0c0;
   background-color: #383838;
 }
+input[type=button]:active {
+  color: white;
+  background-color: #424242;
+}
 input[type=range] {
   -webkit-appearance: none;
   background: transparent;

+ 4 - 0
bin/style.less

@@ -219,6 +219,10 @@ input[type=button] {
 		color : rgb(192, 192, 192);
 		background-color : rgb(56, 56, 56);
 	}
+	&:active {
+		color : white;
+		background-color : #424242;
+	}
 }
 
 input[type=range] {

+ 67 - 55
hide/comp/SceneEditor.hx

@@ -378,7 +378,7 @@ class HelpPopup extends Popup {
 class RenderPropsPopup extends Popup {
 	var editor:SceneEditor;
 
-	public function new(?parent:Element, ?root:Element, editor:SceneEditor, isSearchable = false) {
+	public function new(?parent:Element, ?root:Element, editor:SceneEditor, isSearchable = false, canChangeCurrRp = false) {
 		super(parent, root, isSearchable);
 		this.editor = editor;
 
@@ -396,7 +396,7 @@ class RenderPropsPopup extends Popup {
 		if (lastRenderProps == null)
 			lastRenderProps = currentRenderProps[0];
 
-		if (lastRenderProps != null) {
+		if (lastRenderProps != null && !canChangeCurrRp) {
 			form_div.append(new Element('<p>A render props (${lastRenderProps.name}) is already existing in scene.</p>'));
 			return;
 		}
@@ -430,6 +430,7 @@ class RenderPropsPopup extends Popup {
 				input.change((e) -> {
 					editor.view.saveDisplayState("renderProps", rp);
 					editor.refreshScene();
+					@:privateAccess editor.refreshTree();
 				});
 
 				form_div.append(input);
@@ -500,7 +501,7 @@ class SceneEditor {
 	public var editorDisplay(default,set) : Bool;
 	public var camera2D(default,set) : Bool = false;
 	public var objectAreSelectable = true;
-
+	public var renderPropsRoot : Reference;
 
 	var updates : Array<Float -> Void> = [];
 
@@ -1186,6 +1187,58 @@ class SceneEditor {
 			ide.fileWatcher.unregister(source, w.callb);
 	}
 
+	function createRenderProps(?parent: hrt.prefab.Prefab){
+		renderPropsRoot = new Reference();
+
+		if (parent != null)
+			renderPropsRoot.parent = parent;
+
+		renderPropsRoot.name = "Render Props";
+		@:privateAccess renderPropsRoot.editMode = true;
+
+		var renderProps = view.config.getLocal("scene.renderProps");
+
+		if (renderProps is String) {
+			renderPropsRoot.source = cast renderProps;
+		}
+
+		if (renderProps is Array) {
+			var a_renderProps = Std.downcast(renderProps, Array);
+			var savedRenderProp = @:privateAccess view.getDisplayState("renderProps");
+
+			// Check if the saved render prop hasn't been deleted from json
+			var isRenderPropAvailable = false;
+			for (idx in 0...a_renderProps.length) {
+				if (savedRenderProp != null && a_renderProps[idx].value == savedRenderProp.value)
+					isRenderPropAvailable = true;
+			}
+
+			renderPropsRoot.source = view.config.getLocal("scene.renderProps")[0].value;
+			if (savedRenderProp != null && isRenderPropAvailable)
+				renderPropsRoot.source = savedRenderProp.value;
+		}
+
+		var ctx2 = renderPropsRoot.makeInstance(context);
+
+		var lights = renderPropsRoot.getAll(hrt.prefab.Light, true);
+		for (light in lights) {
+			var ctxs = ctx2.shared.getContexts(light);
+			for (ctx in ctxs) {
+				var icon = Std.downcast(ctx.custom, hrt.impl.EditorTools.EditorIcon);
+				if (icon != null) {
+					icon.remove();
+					ctx.custom = null;
+				}
+			}
+		}
+
+		if( @:privateAccess renderPropsRoot.ref != null ) {
+			var renderProps = @:privateAccess renderPropsRoot.ref.getOpt(hrt.prefab.RenderProps);
+			if( renderProps != null )
+				renderProps.applyProps(scene.s3d.renderer);
+		}
+	}
+
 	public function refreshScene() {
 
 		clearWatches();
@@ -1217,62 +1270,21 @@ class SceneEditor {
 		for(elt in all)
 			applySceneStyle(elt);
 
-		if( lastRenderProps == null ) {
-			var renderProps = getAllWithRefs(sceneData,hrt.prefab.RenderProps);
-			for( r in renderProps )
-				if( @:privateAccess r.isDefault ) {
-					lastRenderProps = r;
-					break;
-				}
-			if( lastRenderProps == null )
-				lastRenderProps = renderProps[0];
-		}
+		// Find latest existing render props in scene
+		var renderProps = getAllWithRefs(sceneData,hrt.prefab.RenderProps);
+		for( r in renderProps )
+			if( @:privateAccess r.isDefault ) {
+				lastRenderProps = r;
+				break;
+			}
 
+		if( lastRenderProps == null )
+			lastRenderProps = renderProps[0];
+		
 		if (lastRenderProps != null)
 			lastRenderProps.applyProps(scene.s3d.renderer);
 		else {
-			var refPrefab = new Reference();
-			var renderProps = view.config.getLocal("scene.renderProps");
-
-			if (renderProps is String) {
-				refPrefab.source = cast renderProps;
-			}
-
-			if (renderProps is Array) {
-				var a_renderProps = Std.downcast(renderProps, Array);
-				var savedRenderProp = @:privateAccess view.getDisplayState("renderProps");
-
-				// Check if the saved render prop hasn't been deleted from json
-				var isRenderPropAvailable = false;
-				for (idx in 0...a_renderProps.length) {
-					if (savedRenderProp != null && a_renderProps[idx].value == savedRenderProp.value)
-						isRenderPropAvailable = true;
-				}
-
-				refPrefab.source = view.config.getLocal("scene.renderProps")[0].value;
-				if (savedRenderProp != null && isRenderPropAvailable)
-					refPrefab.source = savedRenderProp.value;
-			}
-
-			var ctx2 = refPrefab.makeInstance(context);
-
-			var lights = refPrefab.getAll(hrt.prefab.Light, true);
-			for (light in lights) {
-				var ctxs = ctx2.shared.getContexts(light);
-				for (ctx in ctxs) {
-					var icon = Std.downcast(ctx.custom, hrt.impl.EditorTools.EditorIcon);
-					if (icon != null) {
-						icon.remove();
-						ctx.custom = null;
-					}
-				}
-			}
-
-			if( @:privateAccess refPrefab.ref != null ) {
-				var renderProps = @:privateAccess refPrefab.ref.get(hrt.prefab.RenderProps);
-				if( renderProps != null )
-					renderProps.applyProps(scene.s3d.renderer);
-			}
+			createRenderProps();
 		}
 
 		onRefresh();

+ 65 - 119
hide/view/Model.hx

@@ -33,8 +33,6 @@ class Model extends FileView {
 
 	var highlightSelection : Bool = true;
 
-	var viewModes : Array<String>;
-
 	override function save() {
 		if(!modified) return;
 		// Save current Anim data
@@ -87,6 +85,8 @@ class Model extends FileView {
 	}
 
 	override function onDisplay() {
+		this.saveDisplayKey = "Model:" + state.path;
+
 		element.html('
 			<div class="flex vertical">
 				<div id="toolbar"></div>
@@ -99,12 +99,7 @@ class Model extends FileView {
 					<div class="tabs">
 						<div class="tab expand" name="Model" icon="sitemap">
 							<div class="hide-block">
-								<table>
-								<tr>
-								<td><input type="button" style="width:145px" value="Export"/>
-								<td><input type="button" style="width:145px" value="Import"/>
-								</tr>
-								</table>
+							<input type="button" style="width:312px" value="Save render props"/>
 								<div class="hide-scene-tree hide-list">
 								</div>
 							</div>
@@ -119,57 +114,13 @@ class Model extends FileView {
 				</div>
 			</div>
 		');
+
 		tools = new hide.comp.Toolbar(null,element.find("#toolbar"));
 		overlay = element.find(".hide-scene-layer .tree");
 		tabs = new hide.comp.Tabs(null,element.find(".tabs"));
 		eventList = element.find(".event-editor");
 
-		if( rootPath == null )
-			{
-				var renderProps = config.getLocal("scene.renderProps");
-
-				if (renderProps is String) {
-					rootPath = cast renderProps;
-				}
-
-				if (renderProps is Array) {
-					var a_renderProps = Std.downcast(renderProps, Array);
-					var savedRenderProp = @:privateAccess getDisplayState("renderProps");
-	
-					// Check if the saved render prop hasn't been deleted from json
-					var isRenderPropAvailable = false;
-					for (idx in 0...a_renderProps.length) {
-						if (savedRenderProp != null && a_renderProps[idx].value == savedRenderProp.value)
-							isRenderPropAvailable = true;
-					}
-	
-					rootPath = config.getLocal("scene.renderProps")[0].value;
-					if (savedRenderProp != null && isRenderPropAvailable)
-						rootPath = savedRenderProp.value;
-				}
-			}
-
-		if( rootPath != null )
-			root = ide.loadPrefab(rootPath, hrt.prefab.Library);
-
-		if( root == null ) {
-			var def = new hrt.prefab.Library();
-			new hrt.prefab.RenderProps(def).name = "renderer";
-			var l = new hrt.prefab.Light(def);
-			l.name = "sunLight";
-			l.kind = Directional;
-			l.power = 1.5;
-			var q = new h3d.Quat();
-			q.initDirection(new h3d.Vector(-0.28,0.83,-0.47));
-			var a = q.toEuler();
-			l.rotationX = Math.round(a.x * 180 / Math.PI);
-			l.rotationY = Math.round(a.y * 180 / Math.PI);
-			l.rotationZ = Math.round(a.z * 180 / Math.PI);
-			l.shadows.mode = Dynamic;
-			l.shadows.size = 1024;
-			root = def;
-		}
-
+		root = new hrt.prefab.Library();
 		sceneEditor = new hide.comp.SceneEditor(this, root);
 		sceneEditor.editorDisplay = false;
 		sceneEditor.onRefresh = onRefresh;
@@ -191,19 +142,13 @@ class Model extends FileView {
 		sceneEditor.view.keys.register("sceneeditor.focus", {name: "Focus Selection", category: "Scene"},
 			function() {if (lastSelectedObject != null) refreshSelectionHighlight(lastSelectedObject);});
 		sceneEditor.tree.element.addClass("small");
+		element.find("input[value=\"Save render props\"]").click(function(_) {
+			if( !canSave() )
+				return;
+			var toSave = root.children[0];
+			@:privateAccess toSave.save();
 
-		element.find("input[value=Export]").click(function(_) {
-			ide.chooseFileSave("renderer.prefab", function(sel) if( sel != null ) ide.savePrefab(sel, root));
-		});
-		element.find("input[value=Import]").click(function(_) {
-			ide.chooseFile(["prefab"], function(f) {
-				if( ide.loadPrefab(f, hrt.prefab.RenderProps) == null ) {
-					ide.error("This prefab does not have renderer properties");
-					return;
-				}
-				rootPath = f;
-				rebuild();
-			});
+			save();			
 		});
 	}
 
@@ -590,17 +535,59 @@ class Model extends FileView {
 	function onRefresh() {
 		this.saveDisplayKey = "Model:" + state.path;
 
-		sceneEditor.loadSavedCameraController3D(true);
+		// Remove current instancied render props
+		sceneEditor.context.local3d.removeChildren();
+		
+		// Remove current library to create a new one with the actual render prop
+		root = new hrt.prefab.Library();
+		for (c in @:privateAccess sceneEditor.sceneData.children)
+			@:privateAccess sceneEditor.sceneData.children.remove(c);
+
+		@:privateAccess sceneEditor.createRenderProps(@:privateAccess sceneEditor.sceneData);
+
+		if (sceneEditor.renderPropsRoot != null && sceneEditor.renderPropsRoot.source != null)
+			root.children.push(sceneEditor.renderPropsRoot);
+		
+		// Create default render props if no render props has been created yet
+		var r = root.getOpt(hrt.prefab.RenderProps, true);
+		if( r == null) {
+			var def = new hrt.prefab.Object3D(root);
+			def.name = "Default Ligthing";
+			var render = new hrt.prefab.RenderProps(def);
+			render.name = "renderer";
+			var l = new hrt.prefab.Light(def);
+			l.name = "sunLight";
+			l.kind = Directional;
+			l.power = 1.5;
+			var q = new h3d.Quat();
+			q.initDirection(new h3d.Vector(-0.28,0.83,-0.47));
+			var a = q.toEuler();
+			l.rotationX = Math.round(a.x * 180 / Math.PI);
+			l.rotationY = Math.round(a.y * 180 / Math.PI);
+			l.rotationZ = Math.round(a.z * 180 / Math.PI);
+			l.shadows.mode = Dynamic;
+			l.shadows.size = 1024;
+
+			def.make(sceneEditor.context);
 
-		var r = root.get(hrt.prefab.RenderProps);
-		if( r != null ) r.applyProps(scene.s3d.renderer);
+			r = render;
+			r.applyProps(scene.s3d.renderer);
+		}
 
+		// Apply render props properties on scene
+		var refPrefab = new hrt.prefab.Reference();
+		if( @:privateAccess refPrefab.ref != null ) {
+			var renderProps = @:privateAccess refPrefab.ref.getOpt(hrt.prefab.RenderProps);
+			if( renderProps != null )
+				renderProps.applyProps(scene.s3d.renderer);
+		}
+		
 		plight = root.getAll(hrt.prefab.Light)[0];
 		if( plight != null ) {
 			this.light = sceneEditor.context.shared.contexts.get(plight).local3d;
 			lightDirection = this.light.getLocalDirection();
 		}
-
+		
 		undo.onChange = function() {};
 
 		if (obj != null)
@@ -695,54 +682,11 @@ class Model extends FileView {
 
 		tools.addSeparator();
 
-		var viewModesMenu = tools.addMenu(null, "View Modes");
-		var items : Array<hide.comp.ContextMenu.ContextMenuItem> = [];
-		viewModes = ["LIT", "Full", "Albedo", "Normal", "Roughness", "Metalness", "Emissive", "AO", "Shadows", "Performance"];
-		for(typeid in viewModes) {
-			items.push({label : typeid, click : function() {
-				var r = Std.downcast(scene.s3d.renderer, h3d.scene.pbr.Renderer);
-				if ( r == null )
-					return;
-				var slides = @:privateAccess r.slides;
-				if ( slides == null )
-					return;
-				switch(typeid) {
-					case "LIT":
-						r.displayMode = Pbr;
-					case "Full":
-						r.displayMode = Debug;
-						slides.shader.mode = Full;
-					case "Albedo":
-						r.displayMode = Debug;
-						slides.shader.mode = Albedo;
-					case "Normal":
-						r.displayMode = Debug;
-						slides.shader.mode = Normal;
-					case "Roughness":
-						r.displayMode = Debug;
-						slides.shader.mode = Roughness;
-					case "Metalness":
-						r.displayMode = Debug;
-						slides.shader.mode = Metalness;
-					case "Emissive":
-						r.displayMode = Debug;
-						slides.shader.mode = Emmissive;
-					case "AO":
-						r.displayMode = Debug;
-						slides.shader.mode = AO;
-					case "Shadows":
-						r.displayMode = Debug;
-						slides.shader.mode = Shadow;
-					case "Performance":
-						r.displayMode = Performance;
-					default:
-				}
-			}
-			});
-		}
-		viewModesMenu.setContent(items);//, {id: "viewModes", title : "View Modes", type : Menu(filtersToMenuItem(viewModes, "View"))});
-		var el = viewModesMenu.element;
-		el.addClass("View Modes");
+		tools.addPopup(null, "View Modes", (e) -> new hide.comp.SceneEditor.ViewModePopup(null, e, Std.downcast(@:privateAccess scene.s3d.renderer, h3d.scene.pbr.Renderer)), null);
+
+		tools.addSeparator();
+
+		tools.addPopup(null, "Render Props", (e) -> new hide.comp.SceneEditor.RenderPropsPopup(null, e, sceneEditor, true, true), null);
 
 		tools.addSeparator();
 
@@ -774,6 +718,8 @@ class Model extends FileView {
 
 		if ( displayJoints.isDown() )
 			sceneEditor.setJoints(true, null);
+
+		sceneEditor.loadSavedCameraController3D(true);
 	}
 
 	function setRetargetAnim(b:Bool) {
@@ -832,7 +778,7 @@ class Model extends FileView {
 		];
 		return menu.concat(arr);
 	}
-
+	
 	function setAnimation( file : String ) {
 
 		scene.setCurrent();