Răsfoiți Sursa

Add level props

trethaller 7 ani în urmă
părinte
comite
36e071a6c8
2 a modificat fișierele cu 87 adăugiri și 21 ștergeri
  1. 38 1
      hide/prefab/l3d/Level3D.hx
  2. 49 20
      hide/view/l3d/Level3D.hx

+ 38 - 1
hide/prefab/l3d/Level3D.hx

@@ -1,6 +1,43 @@
 package hide.prefab.l3d;
 
-class Level3D extends Prefab {
+class Level3D extends Library {
+
+	public var width : Int = 0;
+	public var height : Int = 0;
+
+	public function new() {
+		super();
+		type = "level3d";
+	}
+
+	override function save() {
+		var obj : Dynamic = super.save();
+		obj.width = width;
+		obj.height = height;
+		return obj;
+	}
+
+	override function load( obj : Dynamic ) {
+		super.load(obj);
+		width = obj.width == null ? 100 : obj.width;
+		height = obj.height == null ? 100 : obj.height;
+	}
+
+	override function edit( ctx : EditContext ) {
+		#if editor
+		var props = new hide.Element('
+			<div class="group" name="Level">
+					<dl>
+					<dt>Width</dt><dd><input type="number" value="0" field="width"/></dd>
+					<dt>Height</dt><dd><input type="number" value="0" field="height"/></dd>
+				</dl>
+			</div>
+		');
+		ctx.properties.add(props, this, function(_) {
+			ctx.onChange(this);
+		});
+		#end
+	}
 
 	override function getHideProps() {
 		return { icon : "cube", name : "Level3D", fileSource : ["l3d"] };

+ 49 - 20
hide/view/l3d/Level3D.hx

@@ -8,7 +8,7 @@ import h3d.scene.Object;
 
 class Level3D extends FileView {
 
-	var data : hide.prefab.Library;
+	var data : hide.prefab.l3d.Level3D;
 	var context : hide.prefab.Context;
 	var tabs : hide.comp.Tabs;
 
@@ -16,12 +16,14 @@ class Level3D extends FileView {
 	var scene : hide.comp.Scene;
 	var cameraController : h3d.scene.CameraController;
 	var properties : hide.comp.PropsEditor;
+	var levelProps : hide.comp.PropsEditor;
 	var light : h3d.scene.DirLight;
 	var lightDirection = new h3d.Vector( 1, 2, -4 );
 	var tree : hide.comp.IconTree<PrefabElement>;
 	var layerButtons : Map<PrefabElement, hide.comp.Toolbar.ToolToggle>;
 	var interactives : Map<PrefabElement, h3d.scene.Interactive>;
 
+	var grid : h3d.scene.Graphics;
 	var searchBox : Element;
 	var curEdit : LevelEditContext;
 	var gizmo : Gizmo;
@@ -43,7 +45,7 @@ class Level3D extends FileView {
 	}
 
 	override function getDefaultContent() {
-		return haxe.io.Bytes.ofString(ide.toJSON(new hide.prefab.Library().save()));
+		return haxe.io.Bytes.ofString(ide.toJSON(new hide.prefab.l3d.Level3D().save()));
 	}
 
 	override function onFileChanged(wasDeleted:Bool) {
@@ -79,6 +81,9 @@ class Level3D extends FileView {
 							</div>
 							<div class="props"></div>
 						</div>
+						<div class="tab" name="Properties" icon="cog">
+							<div class="level-props"></div>
+						</div>
 					</div>
 				</div>
 			</div>
@@ -107,6 +112,8 @@ class Level3D extends FileView {
 			tree.searchFilter(null);
 			searchBox.toggle();
 		});
+
+		levelProps = new hide.comp.PropsEditor(root.find(".level-props"), undo);
 	}
 
 	function refresh( ?callb ) {
@@ -269,6 +276,28 @@ class Level3D extends FileView {
 		}
 	}
 
+	function updateGrid() {
+		if(grid == null) {
+			grid = new h3d.scene.Graphics(scene.s3d);
+			grid.scale(10);
+		}
+		else {
+			grid.clear();
+		}
+
+		grid.lineStyle(1, 0x404040, 1.0);
+		// var offset = size/2;
+		for(ix in 0...data.width+1) {
+			grid.moveTo(ix, 0, 0);
+			grid.lineTo(ix, data.height, 0);
+		}
+		for(iy in 0...data.height+1) {
+			grid.moveTo(0, iy, 0);
+			grid.lineTo(data.width, iy, 0);
+		}
+		grid.lineStyle(0);
+	}
+
 	function resetCamera(?top = false) {
 		var targetPt = new h3d.col.Point(0, 0, 0);
 		if(curEdit != null && curEdit.rootObjects.length > 0) {
@@ -298,7 +327,7 @@ class Level3D extends FileView {
 	}
 
 	function init() {
-		data = new hide.prefab.Library();
+		data = new hide.prefab.l3d.Level3D();
 		var content = sys.io.File.getContent(getPath());
 		data.load(haxe.Json.parse(content));
 		currentSign = haxe.crypto.Md5.encode(content);
@@ -322,23 +351,6 @@ class Level3D extends FileView {
 
 
 		gizmo = new Gizmo(scene);
-		
-		{
-			var grid = new h3d.scene.Graphics(scene.s3d);
-			grid.lineStyle(1, 0x404040, 1.0);
-			var size = 40;
-			grid.scale(10);
-			var offset = size/2;
-			for(ix in 0...size+1) {
-				grid.moveTo(ix - offset, -offset, 0);
-				grid.lineTo(ix - offset, offset, 0);
-			}
-			for(iy in 0...size+1) {
-				grid.moveTo(-offset, iy - offset, 0);
-				grid.lineTo(offset, iy - offset, 0);
-			}
-			grid.lineStyle(0);
-		}
 
 		cameraController = new h3d.scene.CameraController(scene.s3d);
 		cameraController.friction = 0.9;
@@ -348,7 +360,9 @@ class Level3D extends FileView {
 
 		this.saveDisplayKey = "Scene:" + state.path;
 
+		updateGrid();
 		resetCamera();
+
 		var cam = getDisplayState("Camera");
 		if( cam != null ) {
 			scene.s3d.camera.pos.set(cam.x, cam.y, cam.z);
@@ -360,6 +374,16 @@ class Level3D extends FileView {
 		scene.init(props);
 		tools.saveDisplayKey = "SceneTools";
 
+		{
+			var edit = new LevelEditContext(context, []);
+			edit.prefabPath = state.path;
+			edit.properties = levelProps;
+			edit.scene = scene;
+			edit.view = this;
+			edit.cleanups = [];
+			data.edit(edit);
+		}
+
 		tools.addButton("video-camera", "Perspective camera", () -> resetCamera(false));
 		tools.addButton("arrow-down", "Top camera", () -> resetCamera(true));
 		tools.addToggle("sun-o", "Enable Lights/Shadows", function(v) {
@@ -924,6 +948,11 @@ class Level3D extends FileView {
 	}
 
 	public function onPrefabChange(p: PrefabElement) {
+		var level3d = p.to(hide.prefab.l3d.Level3D);
+		if(level3d != null) {
+			updateGrid();
+			return;
+		}
 		var layer = p.to(hide.prefab.l3d.Layer);
 		if(layer != null) {
 			var boxes = layer.getAll(hide.prefab.Box);