Selaa lähdekoodia

New storage of cdb type per instance

trethaller 7 vuotta sitten
vanhempi
commit
7fc2e3af6f
3 muutettua tiedostoa jossa 87 lisäystä ja 43 poistoa
  1. 0 18
      hide/comp/SceneEditor.hx
  2. 14 14
      hide/prefab/l3d/Layer.hx
  3. 73 11
      hide/view/l3d/Level3D.hx

+ 0 - 18
hide/comp/SceneEditor.hx

@@ -685,29 +685,11 @@ class SceneEditor {
 		}));
 		}));
 		refresh(function() {
 		refresh(function() {
 			selectObjects([e]);
 			selectObjects([e]);
-			if( e.parent == sceneData && sceneData.children.length == 1 )
-				resetCamera();
 		});
 		});
 	}
 	}
 
 
 	function fillProps( edit, e : PrefabElement ) {
 	function fillProps( edit, e : PrefabElement ) {
 		e.edit(edit);
 		e.edit(edit);
-		var sheet = e.getCdbModel();
-		if( sheet == null ) return;
-
-		if( e.props == null ) {
-			trace("TODO : add button to init properties");
-			return;
-		}
-		var props = properties.add(new hide.Element('
-			<div class="group" name="Properties ${sheet.name.split('@').pop()}">
-			</div>
-		'),this);
-		var editor = new hide.comp.cdb.ObjEditor(sheet, e.props, props.find(".group .content"));
-		editor.undo = properties.undo;
-		editor.onChange = function(pname) {
-			edit.onChange(e, 'props.$pname');
-		}
 	}
 	}
 
 
 	public function selectObjects( elts : Array<PrefabElement>, ?includeTree=true) {
 	public function selectObjects( elts : Array<PrefabElement>, ?includeTree=true) {

+ 14 - 14
hide/prefab/l3d/Layer.hx

@@ -13,21 +13,21 @@ class Layer extends Object3D {
 	}
 	}
 
 
 	#if editor
 	#if editor
-	override function getCdbModel( ?p : Prefab ) {
-		if( p == null )
-			return null;
-		var levelSheet = getLevelSheet();
-		if(levelSheet == null) return null;
-		var lname = name.split("_")[0];
-		var col = levelSheet.columns.find(c -> c.name == lname);
-		if(col == null || col.type != TList) return null;
-		return levelSheet.getSub(col);
-	}
+	// override function getCdbModel( ?p : Prefab ) {
+	// 	if( p == null )
+	// 		return null;
+	// 	var levelSheet = getLevelSheet();
+	// 	if(levelSheet == null) return null;
+	// 	var lname = name.split("_")[0];
+	// 	var col = levelSheet.columns.find(c -> c.name == lname);
+	// 	if(col == null || col.type != TList) return null;
+	// 	return levelSheet.getSub(col);
+	// }
 
 
-	public function getLevelSheet() {
-		var ide = hide.Ide.inst;
-		return ide.database.getSheet(ide.currentProps.get("l3d.cdbLevel", "level"));
-	}
+	// public function getLevelSheet() {
+	// 	var ide = hide.Ide.inst;
+	// 	return ide.database.getSheet(ide.currentProps.get("l3d.cdbLevel", "level"));
+	// }
 	#end
 	#end
 
 
 	override function save() {
 	override function save() {

+ 73 - 11
hide/view/l3d/Level3D.hx

@@ -124,16 +124,6 @@ private class Level3DSceneEditor extends hide.comp.SceneEditor {
 		parent.onPrefabChange(p, pname);
 		parent.onPrefabChange(p, pname);
 	}
 	}
 
 
-	override function addObject(p: PrefabElement) {
-		var layer = p.getParent(Layer);
-		if(layer != null) {
-			var cdbSheet = layer.getCdbModel(layer);
-			if(cdbSheet != null)
-				p.props = cdbSheet.getDefaults();
-		}
-		super.addObject(p);
-	}
-
 	override function projectToGround(ray: h3d.col.Ray) {
 	override function projectToGround(ray: h3d.col.Ray) {
 		var polygons = parent.getGroundPolys();
 		var polygons = parent.getGroundPolys();
 		var minDist = -1.;
 		var minDist = -1.;
@@ -226,6 +216,56 @@ private class Level3DSceneEditor extends hide.comp.SceneEditor {
 		addNewInstances();
 		addNewInstances();
 		return newItems;
 		return newItems;
 	}
 	}
+
+	function resolveCdbType(id: String) {
+		var types = parent.getCdbTypes();
+		return types.find(t -> t.name.split("@").pop() == id);
+	}
+
+	override function fillProps(edit:hide.prefab.EditContext, e:PrefabElement) {
+		super.fillProps(edit, e);
+
+		var sheet = parent.getCdbModel(e);
+		var group = new hide.Element('
+			<div class="group" name="CDB">
+				<dl><dt>Type</dt><dd><select><option value="">-- Choose --</option></select></dd>
+			</div>
+		');
+
+		var select = group.find("select");
+		var cdbTypes = parent.getCdbTypes();
+		for(t in cdbTypes) {
+			var current = sheet != null && sheet.name == t.name;
+			var id = t.name.split("@").pop();
+			var opt = new hide.Element("<option>").attr("value", id).text(id).appendTo(select);
+		}
+		if(sheet != null) {
+			select.val(sheet.name.split("@").pop());
+		}
+		select.change(function(v) {
+			var typeId = select.val();
+			var cdbSheet = resolveCdbType(typeId);
+			if(cdbSheet == null)
+				return;
+
+			properties.undo.change(Field(e, "props", e.props), ()->edit.rebuildProperties());
+			e.props = cdbSheet.getDefaults();
+			Reflect.setField(e.props, "$cdbtype", typeId);
+			edit.onChange(e, "props");
+			edit.rebuildProperties();
+		});
+
+		edit.properties.add(group);
+
+		if(sheet != null) {
+			var props = new hide.Element('<div></div>').appendTo(group.find(".group .content"));
+			var editor = new hide.comp.cdb.ObjEditor(sheet, e.props, props);
+			editor.undo = properties.undo;
+			editor.onChange = function(pname) {
+				edit.onChange(e, 'props.$pname');
+			}
+		}
+	}
 }
 }
 
 
 class Level3D extends FileView {
 class Level3D extends FileView {
@@ -606,9 +646,31 @@ class Level3D extends FileView {
 		return color;
 		return color;
 	}
 	}
 
 
+	public function getLevelSheet() {
+		return ide.database.getSheet(ide.currentProps.get("l3d.cdbLevel", "level"));
+	}
+
+	public function getCdbTypes() {
+		var levelSheet = getLevelSheet();
+		if(levelSheet == null) return [];
+		return [for(c in levelSheet.columns) if(c.type == TList) levelSheet.getSub(c)];
+	}
+
+	public function getCdbModel(e:hxd.prefab.Prefab):cdb.Sheet {
+		if(e.props == null)
+			return null;
+		var typeName : String = Reflect.getProperty(e.props, "$cdbtype");
+		if(typeName == null)
+			return null;
+		var types = getCdbTypes();
+		return types.find(t -> t.name.split("@").pop() == typeName);
+	}
+
 	function getGroundPolys() {
 	function getGroundPolys() {
 		var gname = props.get("l3d.groundLayer");
 		var gname = props.get("l3d.groundLayer");
-		var groundLayer = data.get(Layer, gname);
+		var groundLayer = data.getOpt(Layer, gname);
+		if(groundLayer == null)
+			return [];
 		var polygons = groundLayer.getAll(hide.prefab.l3d.Polygon);
 		var polygons = groundLayer.getAll(hide.prefab.l3d.Polygon);
 		return polygons;
 		return polygons;
 	}
 	}