Browse Source

Increased the threshold for justifying a threaded Octree raycast. Exposed PhysicsWorld::Raycast() to Lua.

Lasse Öörni 12 years ago
parent
commit
4f64f21915

+ 1 - 1
Source/Engine/Graphics/Octree.cpp

@@ -521,7 +521,7 @@ void Octree::Raycast(RayOctreeQuery& query) const
         GetDrawablesOnlyInternal(query, rayQueryDrawables_);
 
         // Check that amount of drawables is large enough to justify threading
-        if (rayQueryDrawables_.Size() > RAYCASTS_PER_WORK_ITEM)
+        if (rayQueryDrawables_.Size() >= queue->GetNumThreads() * RAYCASTS_PER_WORK_ITEM)
         {
             for (unsigned i = 0; i < rayQueryResults_.Size(); ++i)
                 rayQueryResults_[i].Clear();

+ 5 - 2
Source/Engine/LuaScript/pkgs/Container/Vector.pkg

@@ -1,10 +1,12 @@
 $#include "Vector.h"
 $#include "Vector3.h"
 $#include "OctreeQuery.h"
+$#include "PhysicsWorld.h"
+$#include "Drawable.h"
 
 class PODVector
 {
-    TOLUA_TEMPLATE_BIND(T, Vector3, RayQueryResult)
+    TOLUA_TEMPLATE_BIND(T, Vector3, RayQueryResult, PhysicsRaycastResult)
     
     PODVector();
     PODVector(const PODVector<T>& vector);
@@ -51,4 +53,5 @@ class PODVector
     tolua_readonly tolua_property__no_prefix bool empty;
 };
 
-$renaming PODVector<RayQueryResult> @ RayQueryResultVector
+$renaming PODVector<RayQueryResult> @ RayQueryResultVector
+$renaming PODVector<PhysicsRaycastResult> @ PhysicsRaycastResultVector

+ 3 - 9
Source/Engine/LuaScript/pkgs/Physics/PhysicsWorld.pkg

@@ -9,14 +9,6 @@ struct PhysicsRaycastResult
     RigidBody* body_ @ body;
 };
 
-struct DelayedWorldTransform
-{
-    RigidBody* rigidBody_ @ rigidBody;
-    RigidBody* parentRigidBody_ @ parentRigidBody;
-    Vector3 worldPosition_ @ worldPosition;
-    Quaternion worldRotation_ @ worldRotation;
-};
-
 class PhysicsWorld : public Component
 {
     void Update(float timeStep);
@@ -29,9 +21,11 @@ class PhysicsWorld : public Component
     void SetSplitImpulse(bool enable);
     void SetMaxNetworkAngularVelocity(float velocity);
 
+    void Raycast(PODVector<PhysicsRaycastResult>& result, const Ray& ray, float maxDistance, unsigned collisionMask = M_MAX_UNSIGNED);
+
     // void RaycastSingle(PhysicsRaycastResult& result, const Ray& ray, float maxDistance, unsigned collisionMask = M_MAX_UNSIGNED);
     tolua_outside PhysicsRaycastResult PhysicsWorldRaycastSingle @ RaycastSingle(const Ray& ray, float maxDistance, unsigned collisionMask = M_MAX_UNSIGNED);
-    
+
     // void SphereCast(PhysicsRaycastResult& result, const Ray& ray, float radius, float maxDistance, unsigned collisionMask = M_MAX_UNSIGNED);
     tolua_outside PhysicsRaycastResult PhysicsWorldSphereCast @ SphereCast(const Ray& ray, float radius, float maxDistance, unsigned collisionMask = M_MAX_UNSIGNED);
 

+ 3 - 0
Source/Engine/Physics/PhysicsWorld.h

@@ -62,6 +62,9 @@ struct PhysicsRaycastResult
     {
     }
 
+    /// Test for inequality, added to prevent GCC from complaining.
+    bool operator != (const PhysicsRaycastResult& rhs) const { return position_ != rhs.position_ || normal_ != rhs.normal_ || distance_ != rhs.distance_ || body_ != rhs.body_; }
+    
     /// Hit worldspace position.
     Vector3 position_;
     /// Hit worldspace normal.