소스 검색

improve UI + more checks / errors for terrain add surface

Nicolas Cannasse 6 년 전
부모
커밋
454acadf43
6개의 변경된 파일85개의 추가작업 그리고 50개의 파일을 삭제
  1. 12 0
      bin/style.css
  2. 12 0
      bin/style.less
  3. 5 1
      hide/Ide.hx
  4. 1 1
      hide/comp/cdb/Cell.hx
  5. 52 44
      hide/prefab/terrain/TerrainEditor.hx
  6. 3 4
      hrt/prefab/terrain/Terrain.hx

+ 12 - 0
bin/style.css

@@ -571,6 +571,18 @@ input[type=checkbox]:checked:after {
   padding: 1px;
   position: relative;
 }
+.hide-properties .group > .title input[type=button] {
+  border: none;
+  position: absolute;
+  top: 0px;
+  right: 0px;
+  width: auto;
+  padding: 1px 5px;
+  background-color: #282828;
+}
+.hide-properties .group > .title input[type=button]:hover {
+  background-color: #464646;
+}
 .hide-properties .group > .title > .checkbox-wrapper {
   position: absolute;
   left: 5px;

+ 12 - 0
bin/style.less

@@ -620,6 +620,18 @@ input[type=checkbox] {
 			user-select:none;
 			padding : 1px;
 			position: relative;
+			input[type=button] {
+				border: none;
+				position : absolute;
+				top : 0px;
+				right : 0px;
+				width : auto;
+				padding : 1px 5px;
+				background-color: rgb(40,40,40);
+				&:hover {
+					background-color: rgb(70,70,70);
+				}
+			}
 			>.checkbox-wrapper {
 				position: absolute;
 				left: 5px;

+ 5 - 1
hide/Ide.hx

@@ -628,7 +628,11 @@ class Ide {
 		return path;
 	}
 
-	public function chooseFile( exts : Array<String>, onSelect : String -> Void ) {
+	public function chooseImage( onSelect ) {
+		chooseFile(["png","jpeg","jpg","gif"], onSelect);
+	}
+
+	public function chooseFile( exts : Array<String>, onSelect : Null<String> -> Void ) {
 		var e = new Element('<input type="file" style="visibility:hidden" value="" accept="${[for( e in exts ) "."+e].join(",")}"/>');
 		e.change(function(_) {
 			var file = makeRelative(e.val());

+ 1 - 1
hide/comp/cdb/Cell.hx

@@ -454,7 +454,7 @@ class Cell extends Component {
 			}
 
 			if( file == null ) {
-				ide.chooseFile(["png","jpeg","jpg","gif"],function(path) {
+				ide.chooseImage(function(path) {
 					file = path;
 					setVal();
 					closeEdit();

+ 52 - 44
hide/prefab/terrain/TerrainEditor.hx

@@ -39,7 +39,6 @@ class TerrainEditor {
 
 	public var currentBrush : Brush;
 	public var currentSurface : hrt.prefab.terrain.Surface;
-	public var tmpTexPath : String;
 	public var textureType = ["_Albedo", "_Normal", "_MetallicGlossAO"];
 	public var autoCreateTile = false;
 	public var editContext : hide.prefab.EditContext;
@@ -1010,8 +1009,8 @@ class TerrainEditor {
 	</div>';
 
 	var surfaceParams =
-	'<div class="group" name="Surface">
-		<dt>Add</dt><dd><input type="texturepath" field="editor.tmpTexPath"/></dd>
+	'<div class="group">
+		<div class="title">Surface <input type="button" style="font-weight:bold" id="addSurface" value="+"/></div>
 		<div class="terrain-surfaces"></div>
 		<div class="group" name="Params">
 			<dt>Tilling</dt><dd><input type="range" min="0" max="20" field="editor.currentSurface.tilling"/></dd>
@@ -1027,6 +1026,9 @@ class TerrainEditor {
 		props.append(brushMode);
 		props.append(brushParams);
 		props.append(surfaceParams);
+		props.find("#addSurface").click(function(_) {
+			ctx.ide.chooseImage(onSurfaceAdd.bind(props,ctx));
+		});
 		refreshBrushMode(props, ctx);
 
 		// Save Button
@@ -1088,50 +1090,56 @@ class TerrainEditor {
 		refreshSurfaces(props, ctx);
 	}
 
-	public function onChange( ctx : EditContext, pname : String, props : Element ) {
-		if( pname == "editor.tmpTexPath" && tmpTexPath != null ) {
-			var split : Array<String> = [];
-			var curTypeIndex = 0;
-			while( split.length <= 1 && curTypeIndex < textureType.length) {
-				split = tmpTexPath.split(textureType[curTypeIndex]);
-				curTypeIndex++;
-			}
-			if( split.length > 1 ) {
-				var name = split[0];
-				var albedo = ctx.rootContext.shared.loadTexture(name + textureType[0] + ".png");
-				var normal = ctx.rootContext.shared.loadTexture(name + textureType[1] + ".png");
-				var pbr = ctx.rootContext.shared.loadTexture(name + textureType[2] + ".png");
-				function wait() {
-					if( albedo.flags.has(Loading) || normal.flags.has(Loading)|| pbr.flags.has(Loading))
-						haxe.Timer.delay(wait, 1);
-					else{
-						if( terrainPrefab.terrain.getSurfaceFromTex(name + textureType[0] + ".png", name + textureType[1] + ".png", name + textureType[2] + ".png") == null ) {
-							terrainPrefab.terrain.addSurface(albedo, normal, pbr);
-							terrainPrefab.terrain.generateSurfaceArray();
-							refreshSurfaces(props, ctx);
-							var terrainRevertData = new TerrainRevertData();
-							terrainRevertData.surface = terrainPrefab.terrain.getSurface(terrainPrefab.terrain.surfaces.length - 1);
-							terrainRevertData.surfaceIndex = terrainPrefab.terrain.surfaces.length - 1;
-							undo.change(Custom(function(undo) {
-								if( undo ) {
-									terrainPrefab.terrain.surfaces.remove(terrainRevertData.surface);
-									if( currentSurface == terrainRevertData.surface ) currentSurface = null;
-									currentBrush.index = Std.int(hxd.Math.min(terrainPrefab.terrain.surfaces.length - 1, currentBrush.index));
-								}
-								else
-									terrainPrefab.terrain.surfaces.push(terrainRevertData.surface);
-								terrainPrefab.terrain.generateSurfaceArray();
-								refreshSurfaces(props, ctx);
-							}));
+	function onSurfaceAdd( props : Element, ctx : EditContext, path : String ) {
+		if( path == null )
+			return;
+		var split : Array<String> = [];
+		var curTypeIndex = 0;
+		while( split.length <= 1 && curTypeIndex < textureType.length) {
+			split = path.split(textureType[curTypeIndex]);
+			curTypeIndex++;
+		}
+		if( split.length <= 1 ) {
+			ctx.ide.error("Invalid file name format, should be name_Albedo");
+			return;
+		}
+		var name = split[0];
+		var ext = "."+path.split(".").pop();
+		var albedo = ctx.rootContext.shared.loadTexture(name + textureType[0] + ext);
+		var normal = ctx.rootContext.shared.loadTexture(name + textureType[1] + ext);
+		var pbr = ctx.rootContext.shared.loadTexture(name + textureType[2] + ext);
+
+		if( albedo == null || normal == null || pbr == null ) return;
+
+		function wait() {
+			if( albedo.flags.has(Loading) || normal.flags.has(Loading)|| pbr.flags.has(Loading))
+				haxe.Timer.delay(wait, 1);
+			else{
+				if( terrainPrefab.terrain.getSurfaceFromTex(name + textureType[0] + ext, name + textureType[1] + ext, name + textureType[2] + ext) == null ) {
+					terrainPrefab.terrain.addSurface(albedo, normal, pbr);
+					terrainPrefab.terrain.generateSurfaceArray();
+					refreshSurfaces(props, ctx);
+					var terrainRevertData = new TerrainRevertData();
+					terrainRevertData.surface = terrainPrefab.terrain.getSurface(terrainPrefab.terrain.surfaces.length - 1);
+					terrainRevertData.surfaceIndex = terrainPrefab.terrain.surfaces.length - 1;
+					undo.change(Custom(function(undo) {
+						if( undo ) {
+							terrainPrefab.terrain.surfaces.remove(terrainRevertData.surface);
+							if( currentSurface == terrainRevertData.surface ) currentSurface = null;
+							currentBrush.index = Std.int(hxd.Math.min(terrainPrefab.terrain.surfaces.length - 1, currentBrush.index));
 						}
-						albedo.dispose();
-						normal.dispose();
-						pbr.dispose();
-					}
+						else
+							terrainPrefab.terrain.surfaces.push(terrainRevertData.surface);
+						terrainPrefab.terrain.generateSurfaceArray();
+						refreshSurfaces(props, ctx);
+					}));
 				}
-				wait();
+				albedo.dispose();
+				normal.dispose();
+				pbr.dispose();
 			}
 		}
-		tmpTexPath = null;
+		wait();
 	}
+
 }

+ 3 - 4
hrt/prefab/terrain/Terrain.hx

@@ -94,12 +94,12 @@ class Terrain extends Object3D {
 			surfacesProps.push(surfaceProps);
 		}
 		obj.surfaces = surfacesProps;
-		obj.surfaceCount = terrain.surfaceArray.surfaceCount;
-		obj.surfaceSize = terrain.surfaceArray.albedo.width;
+		obj.surfaceCount = terrain.surfaces.length == 0 ? 0 : terrain.surfaceArray.surfaceCount;
+		obj.surfaceSize = terrain.surfaces.length == 0 ? 0 : terrain.surfaceArray.albedo.width;
 
 		#if editor
 	 	obj.showChecker = terrain.showChecker;
-		if( editor != null ) editor.saveTextures();
+		if( editor != null && terrain.surfaces.length > 0 ) editor.saveTextures();
 		#end
 
 		return obj;
@@ -501,7 +501,6 @@ class Terrain extends Object3D {
 
 		ctx.properties.add(props, this, function(pname) {
 			ctx.onChange(this, pname);
-			editor.onChange(ctx, pname, props);
 		});
 
 		// Reset values if not applied