Bläddra i källkod

manage material in PhysicsResource.h

mikymod 12 år sedan
förälder
incheckning
46da2513a2
2 ändrade filer med 100 tillägg och 6 borttagningar
  1. 49 6
      engine/resource/PhysicsResource.cpp
  2. 51 0
      engine/resource/PhysicsResource.h

+ 49 - 6
engine/resource/PhysicsResource.cpp

@@ -46,10 +46,46 @@ static uint32_t actor_type_to_enum(const char* type)
 	CE_FATAL("Bad actor type");
 }
 
-static uint32_t shape_type_to_enum(const char* type)
+static uint32_t actor_group_to_enum(const char* group)
 {
-	const StringId32 th = hash::murmur2_32(type, string::strlen(type));
+	if (string::strcmp("GROUP_0", group) == 0) 	return PhysicsActorGroup::GROUP_0;
+	if (string::strcmp("GROUP_1", group) == 0) 	return PhysicsActorGroup::GROUP_1;
+	if (string::strcmp("GROUP_2", group) == 0) 	return PhysicsActorGroup::GROUP_2;
+	if (string::strcmp("GROUP_3", group) == 0) 	return PhysicsActorGroup::GROUP_3;
+	if (string::strcmp("GROUP_4", group) == 0) 	return PhysicsActorGroup::GROUP_4;
+	if (string::strcmp("GROUP_5", group) == 0) 	return PhysicsActorGroup::GROUP_5;
+	if (string::strcmp("GROUP_6", group) == 0) 	return PhysicsActorGroup::GROUP_6;
+	if (string::strcmp("GROUP_7", group) == 0) 	return PhysicsActorGroup::GROUP_7;
+	if (string::strcmp("GROUP_8", group) == 0) 	return PhysicsActorGroup::GROUP_8;
+	if (string::strcmp("GROUP_9", group) == 0) 	return PhysicsActorGroup::GROUP_9;
+	if (string::strcmp("GROUP_10", group) == 0) return PhysicsActorGroup::GROUP_10;
+	if (string::strcmp("GROUP_11", group) == 0) return PhysicsActorGroup::GROUP_11;
+	if (string::strcmp("GROUP_12", group) == 0) return PhysicsActorGroup::GROUP_12;
+	if (string::strcmp("GROUP_13", group) == 0) return PhysicsActorGroup::GROUP_13;
+	if (string::strcmp("GROUP_14", group) == 0) return PhysicsActorGroup::GROUP_14;
+	if (string::strcmp("GROUP_15", group) == 0) return PhysicsActorGroup::GROUP_15;
+	if (string::strcmp("GROUP_16", group) == 0) return PhysicsActorGroup::GROUP_16;
+	if (string::strcmp("GROUP_17", group) == 0) return PhysicsActorGroup::GROUP_17;
+	if (string::strcmp("GROUP_18", group) == 0) return PhysicsActorGroup::GROUP_18;
+	if (string::strcmp("GROUP_19", group) == 0) return PhysicsActorGroup::GROUP_19;
+	if (string::strcmp("GROUP_20", group) == 0) return PhysicsActorGroup::GROUP_20;
+	if (string::strcmp("GROUP_21", group) == 0) return PhysicsActorGroup::GROUP_21;
+	if (string::strcmp("GROUP_22", group) == 0) return PhysicsActorGroup::GROUP_22;
+	if (string::strcmp("GROUP_23", group) == 0) return PhysicsActorGroup::GROUP_23;
+	if (string::strcmp("GROUP_24", group) == 0) return PhysicsActorGroup::GROUP_24;
+	if (string::strcmp("GROUP_25", group) == 0) return PhysicsActorGroup::GROUP_25;
+	if (string::strcmp("GROUP_26", group) == 0) return PhysicsActorGroup::GROUP_26;
+	if (string::strcmp("GROUP_27", group) == 0) return PhysicsActorGroup::GROUP_27;
+	if (string::strcmp("GROUP_28", group) == 0) return PhysicsActorGroup::GROUP_28;
+	if (string::strcmp("GROUP_29", group) == 0) return PhysicsActorGroup::GROUP_29;
+	if (string::strcmp("GROUP_30", group) == 0) return PhysicsActorGroup::GROUP_30;
+	if (string::strcmp("GROUP_31", group) == 0) return PhysicsActorGroup::GROUP_31;
+
+	CE_FATAL("Bad actor group");
+}
 
+static uint32_t shape_type_to_enum(const char* type)
+{
 	if (string::strcmp("sphere", type) == 0) 		return PhysicsShapeType::SPHERE;
 	else if (string::strcmp("capsule", type) == 0) 	return PhysicsShapeType::CAPSULE;
 	else if (string::strcmp("box", type) == 0) 		return PhysicsShapeType::BOX;
@@ -83,10 +119,6 @@ void parse_shape(JSONElement e, PhysicsShape& shape)
 {
 	JSONElement name = e.key("name");
 	JSONElement type = e.key("type");
-/*	JSONElement x = e.key("x");
-	JSONElement y = e.key("y");
-	JSONElement z = e.key("z");
-	JSONElement w = e.key("w");*/
 
 	DynamicString shape_name;
 	DynamicString shape_type;
@@ -135,18 +167,29 @@ void parse_actor(JSONElement e, PhysicsActor& actor, List<PhysicsShape>& actor_s
 	JSONElement name = e.key("name");
 	JSONElement node = e.key("node");
 	JSONElement type = e.key("type");
+	JSONElement material = e.key("material");
+	JSONElement group = e.key("group");
 	JSONElement shapes = e.key("shapes");
 
 	DynamicString actor_name;
 	DynamicString actor_node;
 	DynamicString actor_type;
+	DynamicString actor_group;
+	List<float> actor_material(default_allocator());
 	name.string_value(actor_name);
 	node.string_value(actor_node);
 	type.string_value(actor_type);
+	material.array_value(actor_material);
+	group.string_value(actor_group);
 
 	actor.name = hash::murmur2_32(actor_name.c_str(), actor_name.length());
 	actor.node = hash::murmur2_32(actor_node.c_str(), actor_node.length());
 	actor.type = actor_type_to_enum(actor_type.c_str());
+	Log::i("s:%f d:%f r: %f", actor_material[0], actor_material[1], actor_material[2]);
+	actor.static_friction = actor_material[0];
+	actor.dynamic_friction = actor_material[1];
+	actor.restitution = actor_material[2];
+	actor.group = actor_group_to_enum(actor_group.c_str());
 
 	actor.num_shapes = shapes.size();
 

+ 51 - 0
engine/resource/PhysicsResource.h

@@ -35,6 +35,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 namespace crown
 {
 
+//-----------------------------------------------------------------------------
 struct PhysicsHeader
 {
 	uint32_t version;
@@ -48,6 +49,7 @@ struct PhysicsHeader
 	uint32_t shapes_offset;
 };
 
+//-----------------------------------------------------------------------------
 struct PhysicsController
 {
 	StringId32 name;
@@ -58,6 +60,7 @@ struct PhysicsController
 	float contact_offset;	// Skin around the object within which contacts will be generated. Use it to avoid numerical precision issues.
 };
 
+//-----------------------------------------------------------------------------
 struct PhysicsActorType
 {
 	enum Enum
@@ -68,14 +71,61 @@ struct PhysicsActorType
 	};
 };
 
+//-----------------------------------------------------------------------------
+struct PhysicsActorGroup
+{
+	enum Enum
+	{
+		GROUP_0		= (1<<0),
+		GROUP_1		= (1<<1),
+		GROUP_2		= (1<<2),
+		GROUP_3		= (1<<3),
+		GROUP_4		= (1<<4),
+		GROUP_5		= (1<<5),
+		GROUP_6		= (1<<6),
+		GROUP_7		= (1<<7),
+		GROUP_8		= (1<<8),
+		GROUP_9		= (1<<9),
+		GROUP_10	= (1<<10),
+		GROUP_11	= (1<<11),
+		GROUP_12	= (1<<12),
+		GROUP_13	= (1<<13),
+		GROUP_14	= (1<<14),
+		GROUP_15	= (1<<15),
+		GROUP_16	= (1<<16),
+		GROUP_17	= (1<<17),
+		GROUP_18	= (1<<18),
+		GROUP_19	= (1<<19),
+		GROUP_20	= (1<<20),
+		GROUP_21	= (1<<21),
+		GROUP_22	= (1<<22),
+		GROUP_23	= (1<<23),
+		GROUP_24	= (1<<24),
+		GROUP_25	= (1<<25),
+		GROUP_26	= (1<<26),
+		GROUP_27	= (1<<27),
+		GROUP_28	= (1<<28),
+		GROUP_29	= (1<<29),
+		GROUP_30	= (1<<30),
+		GROUP_31	= (1<<31)
+	};
+};
+
+//-----------------------------------------------------------------------------
 struct PhysicsActor
 {
 	StringId32 name;
 	StringId32 node;
 	uint32_t type;
+	uint32_t group;
+	uint32_t mask;
+	float static_friction;
+	float dynamic_friction;
+	float restitution;
 	uint32_t num_shapes;
 };
 
+//-----------------------------------------------------------------------------
 struct PhysicsShapeType
 {
 	enum Enum
@@ -87,6 +137,7 @@ struct PhysicsShapeType
 	};
 };
 
+//-----------------------------------------------------------------------------
 struct PhysicsShape
 {
 	StringId32 name;