Przeglądaj źródła

tools: make sure all objects have a type

Daniele Bartolini 4 lat temu
rodzic
commit
fffaa2e06f

+ 6 - 3
tools/core/database.vala

@@ -732,6 +732,7 @@ public class Database
 		_distance_from_last_sync += dir;
 	}
 
+	// Returns the type of the object @a id.
 	public string object_type(Guid id)
 	{
 		assert(has_object(id));
@@ -748,7 +749,7 @@ public class Database
 		get_data(id)["type"] = type;
 	}
 
-	public void create(Guid id)
+	public void create(Guid id, string type)
 	{
 		assert(id != GUID_ZERO);
 		assert(!has_object(id));
@@ -758,6 +759,8 @@ public class Database
 		_redo_points.clear();
 
 		create_internal(1, id);
+		set_object_type(id, type);
+		object_created(id);
 	}
 
 	public void destroy(Guid id)
@@ -1065,7 +1068,7 @@ public class Database
 		assert(id != new_id);
 		assert(has_object(id));
 
-		create(new_id);
+		create(new_id, object_type(id));
 
 		HashMap<string, Value?> ob = get_data(id);
 		string[] keys = ob.keys.to_array();
@@ -1123,7 +1126,7 @@ public class Database
 				HashSet<Guid?> hs = (HashSet<Guid?>)value;
 				foreach (Guid j in hs)
 				{
-					db.create(j);
+					db.create(j, object_type(j));
 					copy_deep(db, j, "");
 					db.add_to_set(id, new_key + (new_key == "" ? "" : ".") + key, j);
 				}

+ 15 - 2
tools/level_editor/level.vala

@@ -87,6 +87,8 @@ public class Level
 		if (!_project.path_is_within_source_dir(path))
 			_path = null;
 
+		fix_objects_types();
+
 		// FIXME: hack to keep the LevelTreeView working.
 		_db.key_changed(_id, "units");
 
@@ -216,7 +218,7 @@ public class Level
 	public void on_unit_spawned(Guid id, string? name, Vector3 pos, Quaternion rot, Vector3 scl)
 	{
 		_db.add_restore_point((int)ActionType.SPAWN_UNIT, new Guid[] { id });
-		_db.create(id);
+		_db.create(id, "unit");
 		_db.set_property_string(id, "editor.name", "unit_%04u".printf(_num_units++));
 
 		if (name != null)
@@ -246,7 +248,7 @@ public class Level
 	public void on_sound_spawned(Guid id, string name, Vector3 pos, Quaternion rot, Vector3 scl, double range, double volume, bool loop)
 	{
 		_db.add_restore_point((int)ActionType.SPAWN_SOUND, new Guid[] { id });
-		_db.create(id);
+		_db.create(id, "sound_source");
 		_db.set_property_string    (id, "editor.name", "sound_%04u".printf(_num_sounds++));
 		_db.set_property_vector3   (id, "position", pos);
 		_db.set_property_quaternion(id, "rotation", rot);
@@ -857,6 +859,17 @@ public class Level
 	{
 		return _db.get_property_set(_id, "sounds", new HashSet<Guid?>()).contains(id);
 	}
+
+	private void fix_objects_types()
+	{
+		HashSet<Guid?> units = _db.get_property_set(_id, "units", new HashSet<Guid?>());
+		foreach (var id in units)
+			_db.set_object_type(id, "unit");
+
+		HashSet<Guid?> sounds = _db.get_property_set(_id, "sounds", new HashSet<Guid?>());
+		foreach (var id in sounds)
+			_db.set_object_type(id, "sound_source");
+	}
 }
 
 }

+ 1 - 1
tools/level_editor/project.vala

@@ -446,7 +446,7 @@ public class Project
 		string name = type == "" ? path : path.substring(0, path.last_index_of("."));
 
 		Guid id = Guid.new_guid();
-		_files.create(id);
+		_files.create(id, "file");
 		_files.set_property_string(id, "path", path);
 		_files.set_property_string(id, "type", type);
 		_files.set_property_string(id, "name", name);

+ 8 - 13
tools/resource/mesh_resource.vala

@@ -25,14 +25,13 @@ public class MeshResource
 			if (!unit.has_component(out component_id, "transform"))
 			{
 				component_id = Guid.new_guid();
-				db.create(component_id);
+				db.create(component_id, "transform");
 				db.add_to_set(unit_id, "components", component_id);
 			}
 
 			unit.set_component_property_vector3   (component_id, "data.position", position);
 			unit.set_component_property_quaternion(component_id, "data.rotation", rotation);
 			unit.set_component_property_vector3   (component_id, "data.scale", scale);
-			unit.set_component_property_string    (component_id, "type", "transform");
 		}
 
 		// Create mesh_renderer
@@ -41,7 +40,7 @@ public class MeshResource
 			if (!unit.has_component(out component_id, "mesh_renderer"))
 			{
 				component_id = Guid.new_guid();
-				db.create(component_id);
+				db.create(component_id, "mesh_renderer");
 				db.add_to_set(unit_id, "components", component_id);
 			}
 
@@ -49,7 +48,6 @@ public class MeshResource
 			unit.set_component_property_string(component_id, "data.material", material_name);
 			unit.set_component_property_string(component_id, "data.mesh_resource", resource_name);
 			unit.set_component_property_bool  (component_id, "data.visible", true);
-			unit.set_component_property_string(component_id, "type", "mesh_renderer");
 		}
 
 		// Create collider
@@ -58,14 +56,13 @@ public class MeshResource
 			if (!unit.has_component(out component_id, "collider"))
 			{
 				component_id = Guid.new_guid();
-				db.create(component_id);
+				db.create(component_id, "collider");
 				db.add_to_set(unit_id, "components", component_id);
 			}
 
 			unit.set_component_property_string(component_id, "data.shape", "mesh");
 			unit.set_component_property_string(component_id, "data.scene", resource_name);
 			unit.set_component_property_string(component_id, "data.name", node_name);
-			unit.set_component_property_string(component_id, "type", "collider");
 		}
 
 		// Create actor
@@ -74,7 +71,7 @@ public class MeshResource
 			if (!unit.has_component(out component_id, "actor"))
 			{
 				component_id = Guid.new_guid();
-				db.create(component_id);
+				db.create(component_id, "actor");
 				db.add_to_set(unit_id, "components", component_id);
 			}
 
@@ -82,7 +79,6 @@ public class MeshResource
 			unit.set_component_property_string(component_id, "data.collision_filter", "default");
 			unit.set_component_property_double(component_id, "data.mass", 10);
 			unit.set_component_property_string(component_id, "data.material", "default");
-			unit.set_component_property_string(component_id, "type", "actor");
 		}
 
 		if (parent_unit_id != unit_id)
@@ -94,7 +90,7 @@ public class MeshResource
 			foreach (var child in children.entries)
 			{
 				Guid new_unit_id = Guid.new_guid();
-				db.create(new_unit_id);
+				db.create(new_unit_id, "unit");
 				create_components(db, unit_id, new_unit_id, material_name, resource_name, child.key,(Hashtable)child.value);
 			}
 		}
@@ -167,7 +163,7 @@ public class MeshResource
 			{
 				db = new Database();
 				unit_id = Guid.new_guid();
-				db.create(unit_id);
+				db.create(unit_id, "unit");
 			}
 
 			Hashtable mesh = SJSON.load_from_path(filename_i);
@@ -184,14 +180,13 @@ public class MeshResource
 				if (!unit.has_component(out component_id, "transform"))
 				{
 					component_id = Guid.new_guid();
-					db.create(component_id);
+					db.create(component_id, "transform");
 					db.add_to_set(unit_id, "components", component_id);
 				}
 
 				unit.set_component_property_vector3   (component_id, "data.position", VECTOR3_ZERO);
 				unit.set_component_property_quaternion(component_id, "data.rotation", QUATERNION_IDENTITY);
 				unit.set_component_property_vector3   (component_id, "data.scale", VECTOR3_ONE);
-				unit.set_component_property_string    (component_id, "type", "transform");
 			}
 
 			Guid new_unit_id = unit_id;
@@ -202,7 +197,7 @@ public class MeshResource
 					// If the mesh contains multiple root objects, create a new unit for each
 					// one of those, otherwise put the components inside the base unit.
 					new_unit_id = Guid.new_guid();
-					db.create(new_unit_id);
+					db.create(new_unit_id, "unit");
 				}
 				create_components(db, unit_id, new_unit_id, material_name, resource_name, entry.key, (Hashtable)entry.value);
 			}

+ 5 - 9
tools/resource/sprite_resource.vala

@@ -168,7 +168,7 @@ public class SpriteResource
 			{
 				db = new Database();
 				unit_id = Guid.new_guid();
-				db.create(unit_id);
+				db.create(unit_id, "unit");
 			}
 
 			Unit unit = new Unit(db, unit_id);
@@ -179,14 +179,13 @@ public class SpriteResource
 				if (!unit.has_component(out component_id, "transform"))
 				{
 					component_id = Guid.new_guid();
-					db.create(component_id);
+					db.create(component_id, "transform");
 					db.add_to_set(unit_id, "components", component_id);
 				}
 
 				unit.set_component_property_vector3   (component_id, "data.position", VECTOR3_ZERO);
 				unit.set_component_property_quaternion(component_id, "data.rotation", QUATERNION_IDENTITY);
 				unit.set_component_property_vector3   (component_id, "data.scale", VECTOR3_ONE);
-				unit.set_component_property_string    (component_id, "type", "transform");
 			}
 
 			// Create sprite_renderer
@@ -195,7 +194,7 @@ public class SpriteResource
 				if (!unit.has_component(out component_id, "sprite_renderer"))
 				{
 					component_id = Guid.new_guid();
-					db.create(component_id);
+					db.create(component_id, "sprite_renderer");
 					db.add_to_set(unit_id, "components", component_id);
 				}
 
@@ -204,7 +203,6 @@ public class SpriteResource
 				unit.set_component_property_double(component_id, "data.layer", layer);
 				unit.set_component_property_double(component_id, "data.depth", depth);
 				unit.set_component_property_bool  (component_id, "data.visible", true);
-				unit.set_component_property_string(component_id, "type", "sprite_renderer");
 			}
 
 			if (collision_enabled)
@@ -218,7 +216,7 @@ public class SpriteResource
 					if (!unit.has_component(out component_id, "collider"))
 					{
 						component_id = Guid.new_guid();
-						db.create(component_id);
+						db.create(component_id, "collider");
 						db.add_to_set(unit_id, "components", component_id);
 					}
 
@@ -258,7 +256,6 @@ public class SpriteResource
 						unit.set_component_property_double    (component_id, "data.collider_data.radius", radius);
 						unit.set_component_property_double    (component_id, "data.collider_data.height", capsule_height);
 					}
-					unit.set_component_property_string(component_id, "type", "collider");
 				}
 
 				// Create actor
@@ -267,7 +264,7 @@ public class SpriteResource
 					if (!unit.has_component(out component_id, "actor"))
 					{
 						component_id = Guid.new_guid();
-						db.create(component_id);
+						db.create(component_id, "actor");
 						db.add_to_set(unit_id, "components", component_id);
 					}
 
@@ -281,7 +278,6 @@ public class SpriteResource
 					unit.set_component_property_bool  (component_id, "data.lock_translation_z", false);
 					unit.set_component_property_double(component_id, "data.mass", mass);
 					unit.set_component_property_string(component_id, "data.material", "default");
-					unit.set_component_property_string(component_id, "type", "actor");
 				}
 			}
 			else /* if (collision_enabled) */