소스 검색

Applied contact processing threshold patch from primitivewaste.
Cleanup scenepass metadata processing code.

Lasse Öörni 12 년 전
부모
커밋
4625dc78a2
5개의 변경된 파일30개의 추가작업 그리고 4개의 파일을 삭제
  1. 1 0
      Docs/ScriptAPI.dox
  2. 2 0
      Engine/Engine/PhysicsAPI.cpp
  3. 5 4
      Engine/Graphics/View.cpp
  4. 18 0
      Engine/Physics/RigidBody.cpp
  5. 4 0
      Engine/Physics/RigidBody.h

+ 1 - 0
Docs/ScriptAPI.dox

@@ -5626,6 +5626,7 @@ Properties:<br>
 - float angularDamping
 - float friction
 - float restitution
+- float contactProcessingThreshold
 - float ccdRadius
 - float ccdMotionThreshold
 - bool useGravity

+ 2 - 0
Engine/Engine/PhysicsAPI.cpp

@@ -150,6 +150,8 @@ static void RegisterRigidBody(asIScriptEngine* engine)
     engine->RegisterObjectMethod("RigidBody", "float get_friction() const", asMETHOD(RigidBody, GetFriction), asCALL_THISCALL);
     engine->RegisterObjectMethod("RigidBody", "void set_restitution(float)", asMETHOD(RigidBody, SetRestitution), asCALL_THISCALL);
     engine->RegisterObjectMethod("RigidBody", "float get_restitution() const", asMETHOD(RigidBody, GetRestitution), asCALL_THISCALL);
+    engine->RegisterObjectMethod("RigidBody", "void set_contactProcessingThreshold(float)", asMETHOD(RigidBody, SetContactProcessingThreshold), asCALL_THISCALL);
+    engine->RegisterObjectMethod("RigidBody", "float get_contactProcessingThreshold() const", asMETHOD(RigidBody, GetContactProcessingThreshold), asCALL_THISCALL);
     engine->RegisterObjectMethod("RigidBody", "void set_ccdRadius(float)", asMETHOD(RigidBody, SetCcdRadius), asCALL_THISCALL);
     engine->RegisterObjectMethod("RigidBody", "float get_ccdRadius() const", asMETHOD(RigidBody, GetCcdRadius), asCALL_THISCALL);
     engine->RegisterObjectMethod("RigidBody", "void set_ccdMotionThreshold(float)", asMETHOD(RigidBody, SetCcdMotionThreshold), asCALL_THISCALL);

+ 5 - 4
Engine/Graphics/View.cpp

@@ -324,16 +324,17 @@ bool View::Define(RenderSurface* renderTarget, Viewport* viewport)
             info.vertexLights_ = command.vertexLights_;
             
             // Check scenepass metadata for defining custom passes which interact with lighting
-            if (command.metadata_.Length())
+            String metadata = command.metadata_.Trimmed().ToLower();
+            if (!metadata.Empty())
             {
-                if (!command.metadata_.Compare("gbuffer", false))
+                if (metadata == "gbuffer")
                     gBufferPassName_ = command.pass_;
-                if (!command.metadata_.Compare("base", false))
+                else if (metadata == "base")
                 {
                     basePassName_ = command.pass_;
                     litBasePassName_ = "lit" + command.pass_;
                 }
-                if (!command.metadata_.Compare("alpha", false))
+                else if (metadata == "alpha")
                 {
                     alphaPassName_ = command.pass_;
                     litAlphaPassName_ = "lit" + command.pass_;

+ 18 - 0
Engine/Physics/RigidBody.cpp

@@ -111,6 +111,7 @@ void RigidBody::RegisterObject(Context* context)
     ACCESSOR_ATTRIBUTE(RigidBody, VAR_FLOAT, "Angular Rest Threshold", GetAngularRestThreshold, SetAngularRestThreshold, float, 0.01f, AM_DEFAULT);
     ATTRIBUTE(RigidBody, VAR_INT, "Collision Layer", collisionLayer_, DEFAULT_COLLISION_LAYER, AM_DEFAULT);
     ATTRIBUTE(RigidBody, VAR_INT, "Collision Mask", collisionMask_, DEFAULT_COLLISION_MASK, AM_DEFAULT);
+    ACCESSOR_ATTRIBUTE(RigidBody, VAR_FLOAT, "Contact Threshold", GetContactProcessingThreshold, SetContactProcessingThreshold, float, BT_LARGE_FLOAT, AM_DEFAULT);
     ACCESSOR_ATTRIBUTE(RigidBody, VAR_FLOAT, "CCD Radius", GetCcdRadius, SetCcdRadius, float, 0.0f, AM_DEFAULT);
     ACCESSOR_ATTRIBUTE(RigidBody, VAR_FLOAT, "CCD Motion Threshold", GetCcdMotionThreshold, SetCcdMotionThreshold, float, 0.0f, AM_DEFAULT);
     REF_ACCESSOR_ATTRIBUTE(RigidBody, VAR_BUFFER, "Network Angular Velocity", GetNetAngularVelocityAttr, SetNetAngularVelocityAttr, PODVector<unsigned char>, Variant::emptyBuffer, AM_NET | AM_LATESTDATA | AM_NOEDIT);
@@ -368,6 +369,15 @@ void RigidBody::SetRestitution(float restitution)
     }
 }
 
+void RigidBody::SetContactProcessingThreshold(float threshold)
+{
+    if (body_)
+    {
+        body_->setContactProcessingThreshold(threshold);
+        MarkNetworkUpdate();
+    }
+}
+
 void RigidBody::SetCcdRadius(float radius)
 {
     radius = Max(radius, 0.0f);
@@ -627,6 +637,14 @@ float RigidBody::GetRestitution() const
         return 0.0f;
 }
 
+float RigidBody::GetContactProcessingThreshold() const
+{
+    if (body_)
+        return body_->getContactProcessingThreshold();
+    else
+        return 0.0f;
+}
+
 float RigidBody::GetCcdRadius() const
 {
     if (body_)

+ 4 - 0
Engine/Physics/RigidBody.h

@@ -99,6 +99,8 @@ public:
     void SetFriction(float friction);
     /// Set restitution coefficient.
     void SetRestitution(float restitution);
+    /// Set contact processing threshold.
+    void SetContactProcessingThreshold(float threshold);
     /// Set continuous collision detection swept sphere radius.
     void SetCcdRadius(float radius);
     /// Set continuous collision detection motion-per-simulation-step threshold. 0 disables, which is the default.
@@ -172,6 +174,8 @@ public:
     float GetFriction() const;
     /// Return restitution coefficient.
     float GetRestitution() const;
+    /// Return contact processing threshold.
+    float GetContactProcessingThreshold() const;
     /// Return continuous collision detection swept sphere radius.
     float GetCcdRadius() const;
     /// Return continuous collision detection motion-per-simulation-step threshold.