mikymod 12 лет назад
Родитель
Сommit
aa5396cf04

+ 1 - 0
engine/Config.h.in

@@ -55,6 +55,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 #define CE_MAX_TRIGGERS						1024				// Per world
 #define CE_MAX_JOINTS						512					// Per world
 #define CE_MAX_SOUND_INSTANCES				64					// Per world
+#define CE_MAX_RAYCASTS						8					// Per World
 #define CE_MAX_RAY_INTERSECTIONS			16					
 
 #define CE_MAX_CONSOLE_CLIENTS				32

+ 2 - 2
engine/lua/LuaPhysicsWorld.cpp

@@ -66,9 +66,9 @@ CE_EXPORT int physics_world_make_raycast(lua_State* L)
 	int mode = stack.get_int(3);
 	int filter = stack.get_int(4);
 
-	Raycast* raycast = world->make_raycast(callback, (RaycastMode::Enum) mode, (RaycastFilter::Enum) filter);
+	RaycastId raycast = world->create_raycast(callback, (RaycastMode::Enum) mode, (RaycastFilter::Enum) filter);
 
-	stack.push_raycast(raycast);
+	stack.push_raycast(world->lookup_raycast(raycast));
 	return 1;
 }
 

+ 1 - 0
engine/physics/PhysicsTypes.h

@@ -35,6 +35,7 @@ typedef Id ActorId;
 typedef Id ControllerId;
 typedef Id TriggerId;
 typedef Id JointId;
+typedef Id RaycastId;
 
 struct Actor;
 

+ 24 - 6
engine/physics/PhysicsWorld.cpp

@@ -211,6 +211,7 @@ PhysicsWorld::PhysicsWorld()
 	, m_actors_pool(default_allocator(), CE_MAX_ACTORS, sizeof(Actor), CE_ALIGNOF(Actor))
 	, m_controllers_pool(default_allocator(), CE_MAX_CONTROLLERS, sizeof(Controller), CE_ALIGNOF(Controller))
 	, m_joints_pool(default_allocator(), CE_MAX_JOINTS, sizeof(Joint), CE_ALIGNOF(Joint))
+	, m_raycasts_pool(default_allocator(), CE_MAX_RAYCASTS, sizeof(Raycast), CE_ALIGNOF(Raycast))
 	, m_events(default_allocator())
 	, m_callback(m_events)
 {
@@ -301,6 +302,22 @@ void PhysicsWorld::destroy_joint(JointId id)
 	m_joints.destroy(id);
 }
 
+//-----------------------------------------------------------------------------
+RaycastId PhysicsWorld::create_raycast(const char* callback, RaycastMode::Enum mode, RaycastFilter::Enum filter)
+{
+	Raycast* raycast = CE_NEW(m_raycasts_pool, Raycast)(m_scene, m_events, callback, mode, filter);
+	return m_raycasts.create(raycast);
+}
+
+//-----------------------------------------------------------------------------
+void PhysicsWorld::destroy_raycast(RaycastId id)
+{
+	CE_ASSERT(m_raycasts.has(id), "Raycast does not exists");
+
+	CE_DELETE(m_raycasts_pool, m_raycasts.lookup(id));
+	m_raycasts.destroy(id);
+}
+
 //-----------------------------------------------------------------------------
 Actor* PhysicsWorld::lookup_actor(StringId32 name)
 {
@@ -329,6 +346,13 @@ Controller* PhysicsWorld::lookup_controller(ControllerId id)
 	return m_controllers.lookup(id);
 }
 
+//-----------------------------------------------------------------------------
+Raycast* PhysicsWorld::lookup_raycast(RaycastId id)
+{
+	CE_ASSERT(m_raycasts.has(id), "Raycast does not exists");
+	return m_raycasts.lookup(id);
+}
+
 //-----------------------------------------------------------------------------
 Vector3 PhysicsWorld::gravity() const
 {
@@ -356,12 +380,6 @@ void PhysicsWorld::clear_kinematic(ActorId id)
 	actor->clear_kinematic();
 }
 
-//-----------------------------------------------------------------------------
-Raycast* PhysicsWorld::make_raycast(const char* callback, RaycastMode::Enum mode, RaycastFilter::Enum filter)
-{
-	return CE_NEW(default_allocator(), Raycast)(m_scene, m_events, callback, mode, filter);
-}
-
 //-----------------------------------------------------------------------------
 void PhysicsWorld::update(float dt)
 {

+ 6 - 1
engine/physics/PhysicsWorld.h

@@ -86,9 +86,13 @@ public:
 	JointId						create_joint(const PhysicsResource* pr, const uint32_t index, const Actor& actor_0, const Actor& actor_1);
 	void						destroy_joint(JointId id);
 
+	RaycastId					create_raycast(const char* callback, RaycastMode::Enum mode, RaycastFilter::Enum filter);
+	void						destroy_raycast(RaycastId id);
+
 	Actor*						lookup_actor(StringId32 name);
 	Actor*						lookup_actor(ActorId id);
 	Controller*					lookup_controller(ControllerId id);
+	Raycast*					lookup_raycast(RaycastId id);
 
 	Vector3						gravity() const;
 	void						set_gravity(const Vector3& g);
@@ -96,7 +100,6 @@ public:
 	void						set_kinematic(ActorId id);
 	void						clear_kinematic(ActorId id);
 
-	Raycast*					make_raycast(const char* callback, RaycastMode::Enum mode, RaycastFilter::Enum filter);
 
 	void						update(float dt);
 
@@ -109,10 +112,12 @@ public:
 	PoolAllocator				m_actors_pool;
 	PoolAllocator				m_controllers_pool;
 	PoolAllocator				m_joints_pool;
+	PoolAllocator				m_raycasts_pool;
 
 	IdArray<CE_MAX_ACTORS, Actor*>	m_actors;
 	IdArray<CE_MAX_CONTROLLERS, Controller*> m_controllers;
 	IdArray<CE_MAX_JOINTS, Joint*> m_joints;
+	IdArray<CE_MAX_RAYCASTS, Raycast*> m_raycasts;
 
 	// Events management
 	EventStream m_events;