Просмотр исходного кода

tools: do not try to read non-existent properties

Daniele Bartolini 6 лет назад
Родитель
Сommit
3792117293

+ 55 - 57
tools/level_editor/project.vala

@@ -331,7 +331,7 @@ end
 			int collision_h                = (int)sid.collision_h.value;
 			string actor_class             = (string)sid.actor_class.value;
 			bool lock_rotation_y           = sid.lock_rotation_y.active;
-			double mass					   = (double)sid.mass.value;
+			double mass                    = (double)sid.mass.value;
 
 			sid.destroy();
 
@@ -486,40 +486,40 @@ end
 						{
 							db.create(id);
 							db.set_property_string(id, "data.source", "inline");
-							if (shape_active_name == "square_collider") {
-								double pos_x = (collision_x + collision_w/2.0 - pivot_xy.x) / PIXELS_PER_METER;
+							if (shape_active_name == "square_collider")
+							{
+								double pos_x =  (collision_x + collision_w/2.0 - pivot_xy.x) / PIXELS_PER_METER;
 								double pos_y = -(collision_y + collision_h/2.0 - pivot_xy.y) / PIXELS_PER_METER;
 								Vector3 position = Vector3(pos_x, 0, pos_y);
-								db.set_property_vector3(id, "data.collider_data.position", position);
-								db.set_property_string(id, "data.shape", "box");
+								Vector3 half_extents = Vector3(collision_w/2/PIXELS_PER_METER, 0.5/PIXELS_PER_METER, collision_h/2/PIXELS_PER_METER);
+								db.set_property_vector3   (id, "data.collider_data.position", position);
+								db.set_property_string    (id, "data.shape", "box");
 								db.set_property_quaternion(id, "data.collider_data.rotation", rotation);
-								db.set_property_vector3(id, "data.collider_data.half_extents",
-														Vector3(collision_w/2/PIXELS_PER_METER,
-																0.5/PIXELS_PER_METER,
-																collision_h/2/PIXELS_PER_METER));
-							} else if (shape_active_name == "circle_collider") {
-								double pos_x = (circle_collision_center_x - pivot_xy.x) / PIXELS_PER_METER;
+								db.set_property_vector3   (id, "data.collider_data.half_extents", half_extents);
+							}
+							else if (shape_active_name == "circle_collider")
+							{
+								double pos_x =  (circle_collision_center_x - pivot_xy.x) / PIXELS_PER_METER;
 								double pos_y = -(circle_collision_center_y - pivot_xy.y) / PIXELS_PER_METER;
 								Vector3 position = Vector3(pos_x, 0, pos_y);
-								db.set_property_vector3(id, "data.collider_data.position", position);
-								db.set_property_string(id, "data.shape", "sphere");
+								double radius = circle_collision_radius / PIXELS_PER_METER;
+								db.set_property_vector3   (id, "data.collider_data.position", position);
+								db.set_property_string    (id, "data.shape", "sphere");
 								db.set_property_quaternion(id, "data.collider_data.rotation", rotation);
-								db.set_property_double(id, "data.collider_data.radius",
-													   circle_collision_radius / PIXELS_PER_METER);
-							} else if (shape_active_name == "capsule_collider") {
-								double pos_x = (capsule_collision_center_x - pivot_xy.x) / PIXELS_PER_METER;
+								db.set_property_double    (id, "data.collider_data.radius", radius);
+							}
+							else if (shape_active_name == "capsule_collider")
+							{
+								double pos_x =  (capsule_collision_center_x - pivot_xy.x) / PIXELS_PER_METER;
 								double pos_y = -(capsule_collision_center_y - pivot_xy.y) / PIXELS_PER_METER;
 								Vector3 position = Vector3(pos_x, 0, pos_y);
-								db.set_property_vector3(id, "data.collider_data.position", position);
-								db.set_property_string(id, "data.shape", "capsule");
-								db.set_property_quaternion(id, "data.collider_data.rotation",
-													   Quaternion.from_axis_angle(Vector3(0, 0, 1),
-													   (float)Math.PI/2));
-								db.set_property_double(id, "data.collider_data.radius",
-													   capsule_collision_radius / PIXELS_PER_METER);
-								db.set_property_double(id, "data.collider_data.height",
-													   (capsule_collision_height -
-														2*capsule_collision_radius) / PIXELS_PER_METER);
+								double radius = capsule_collision_radius / PIXELS_PER_METER;
+								double capsule_height = (capsule_collision_height - 2*capsule_collision_radius) / PIXELS_PER_METER;
+								db.set_property_vector3   (id, "data.collider_data.position", position);
+								db.set_property_string    (id, "data.shape", "capsule");
+								db.set_property_quaternion(id, "data.collider_data.rotation", Quaternion.from_axis_angle(Vector3(0, 0, 1), (float)Math.PI/2));
+								db.set_property_double    (id, "data.collider_data.radius", radius);
+								db.set_property_double    (id, "data.collider_data.height", capsule_height);
 							}
 							db.set_property_string(id, "type", "collider");
 
@@ -528,42 +528,40 @@ end
 						else
 						{
 							unit.set_component_property_string(id, "data.source", "inline");
-							if (shape_active_name == "square_collider") {
-								double pos_x = (collision_x + collision_w/2.0 - pivot_xy.x) / PIXELS_PER_METER;
+							if (shape_active_name == "square_collider")
+							{
+								double pos_x =  (collision_x + collision_w/2.0 - pivot_xy.x) / PIXELS_PER_METER;
 								double pos_y = -(collision_y + collision_h/2.0 - pivot_xy.y) / PIXELS_PER_METER;
 								Vector3 position = Vector3(pos_x, 0, pos_y);
-								unit.set_component_property_vector3(id, "data.collider_data.position", position);
-								unit.set_component_property_quaternion(id,"data.collider_data.rotation",
-											   rotation);
-								unit.set_component_property_string(id, "data.shape", "box");
-								unit.set_component_property_vector3(id, "data.collider_data.half_extents",
-														Vector3(collision_w/2/PIXELS_PER_METER,
-																0.5/PIXELS_PER_METER,
-																collision_h/2/PIXELS_PER_METER));
-							} else if (shape_active_name == "circle_collider") {
-								double pos_x = (circle_collision_center_x - pivot_xy.x) / PIXELS_PER_METER;
+								Vector3 half_extents = Vector3(collision_w/2/PIXELS_PER_METER, 0.5/PIXELS_PER_METER, collision_h/2/PIXELS_PER_METER);
+								unit.set_component_property_vector3   (id, "data.collider_data.position", position);
+								unit.set_component_property_quaternion(id, "data.collider_data.rotation", rotation);
+								unit.set_component_property_string    (id, "data.shape", "box");
+								unit.set_component_property_vector3   (id, "data.collider_data.half_extents", half_extents);
+							}
+							else if (shape_active_name == "circle_collider")
+							{
+								double pos_x =  (circle_collision_center_x - pivot_xy.x) / PIXELS_PER_METER;
 								double pos_y = -(circle_collision_center_y - pivot_xy.y) / PIXELS_PER_METER;
 								Vector3 position = Vector3(pos_x, 0, pos_y);
-								unit.set_component_property_vector3(id, "data.collider_data.position", position);
-								unit.set_component_property_quaternion(id,"data.collider_data.rotation",
-											   rotation);
-								unit.set_component_property_string(id, "data.shape", "sphere");
-								unit.set_component_property_double(id, "data.collider_data.radius",
-													   circle_collision_radius / PIXELS_PER_METER);
-							} else if (shape_active_name == "capsule_collider") {
-								double pos_x = (capsule_collision_center_x - pivot_xy.x) / PIXELS_PER_METER;
+								double radius = circle_collision_radius / PIXELS_PER_METER;
+								unit.set_component_property_vector3   (id, "data.collider_data.position", position);
+								unit.set_component_property_quaternion(id, "data.collider_data.rotation", rotation);
+								unit.set_component_property_string    (id, "data.shape", "sphere");
+								unit.set_component_property_double    (id, "data.collider_data.radius", radius);
+							}
+							else if (shape_active_name == "capsule_collider")
+							{
+								double pos_x =  (capsule_collision_center_x - pivot_xy.x) / PIXELS_PER_METER;
 								double pos_y = -(capsule_collision_center_y - pivot_xy.y) / PIXELS_PER_METER;
 								Vector3 position = Vector3(pos_x, 0, pos_y);
-								unit.set_component_property_vector3(id, "data.collider_data.position", position);
-								unit.set_component_property_quaternion(id,"data.collider_data.rotation",
-											   Quaternion.from_axis_angle(Vector3(0, 0, 1),
-											   (float)Math.PI/2));
-								unit.set_component_property_string(id, "data.shape", "capsule");
-								unit.set_component_property_double(id, "data.collider_data.radius",
-													   capsule_collision_radius / PIXELS_PER_METER);
-								unit.set_component_property_double(id, "data.collider_data.height",
-													   (capsule_collision_height -
-														2*capsule_collision_radius) / PIXELS_PER_METER);
+								double radius = capsule_collision_radius / PIXELS_PER_METER;
+								double capsule_height = (capsule_collision_height - 2*capsule_collision_radius) / PIXELS_PER_METER;
+								unit.set_component_property_vector3   (id, "data.collider_data.position", position);
+								unit.set_component_property_quaternion(id, "data.collider_data.rotation", Quaternion.from_axis_angle(Vector3(0, 0, 1), (float)Math.PI/2));
+								unit.set_component_property_string    (id, "data.shape", "capsule");
+								unit.set_component_property_double    (id, "data.collider_data.radius", radius);
+								unit.set_component_property_double    (id, "data.collider_data.height", capsule_height);
 							}
 							unit.set_component_property_string(id, "type", "collider");
 						}

+ 40 - 9
tools/level_editor/properties_view.vala

@@ -341,6 +341,7 @@ namespace Crown
 		Level _level;
 
 		// Widgets
+		private Gtk.Entry _source;
 		private Gtk.Entry _shape;
 		private ReferenceChooser _scene;
 		private Gtk.Entry _name;
@@ -351,13 +352,17 @@ namespace Crown
 			_level = level;
 
 			// Widgets
+			_source = new Gtk.Entry();
+			_source.sensitive = false;
 			_shape = new Gtk.Entry();
 			_shape.sensitive = false;
 			_scene = new ReferenceChooser(store, "mesh");
 			_scene.value_changed.connect(on_value_changed);
+			_scene.sensitive = false;
 			_name = new Gtk.Entry();
 			_name.sensitive = false;
 
+			add_row("Source", _source);
 			add_row("Shape", _shape);
 			add_row("Scene", _scene);
 			add_row("Name", _name);
@@ -365,20 +370,46 @@ namespace Crown
 
 		private void on_value_changed()
 		{
-			_level.set_collider(_id
-				, _component_id
-				, _shape.text
-				, _scene.value
-				, _name.text
-				);
+			if (_source.text == "mesh")
+			{
+				_level.set_collider(_id
+					, _component_id
+					, _shape.text
+					, _scene.value
+					, _name.text
+					);
+			}
 		}
 
 		public override void update()
 		{
 			Unit unit = new Unit(_level._db, _id, _level._prefabs);
-			_shape.text    = unit.get_component_property_string(_component_id, "data.shape");
-			_scene.value   = unit.get_component_property_string(_component_id, "data.scene");
-			_name.text     = unit.get_component_property_string(_component_id, "data.name");
+
+			Value? source = unit.get_component_property(_component_id, "data.source");
+			if (source != null)
+			{
+				if ((string)source == "inline")
+				{
+					_source.text     = "inline";
+					_shape.text      = "";
+					_scene.value     = "";
+					_name.text       = "";
+				}
+				else
+				{
+					_source.text     = "mesh";
+					_shape.text      = unit.get_component_property_string(_component_id, "data.shape");
+					_scene.value     = unit.get_component_property_string(_component_id, "data.scene");
+					_name.text       = unit.get_component_property_string(_component_id, "data.name");
+				}
+			}
+			else
+			{
+				_source.text     = "mesh";
+				_shape.text      = unit.get_component_property_string(_component_id, "data.shape");
+				_scene.value     = unit.get_component_property_string(_component_id, "data.scene");
+				_name.text       = unit.get_component_property_string(_component_id, "data.name");
+			}
 		}
 	}
 

+ 1 - 1
tools/level_editor/unit.vala

@@ -20,7 +20,7 @@ public class Unit
 		_prefabs = prefabs != null ? prefabs : new Database();
 	}
 
-	private Value? get_component_property(Guid component_id, string key)
+	public Value? get_component_property(Guid component_id, string key)
 	{
 		// Search in components
 		{