Browse Source

Add GetRigidBody function mouse position in PhysicsWorld2D.

aster2013 11 years ago
parent
commit
6daabe1b74

+ 1 - 0
Source/Engine/LuaScript/pkgs/Urho2D/PhysicsWorld2D.pkg

@@ -33,6 +33,7 @@ class PhysicsWorld2D : Component
     // void RaycastSingle(PhysicsRaycastResult2D& result, const Vector2& startPoint, const Vector2& endPoint, unsigned collisionMask = M_MAX_UNSIGNED);
     tolua_outside PhysicsRaycastResult2D PhysicsWorld2DRaycastSingle @ RaycastSingle(const Vector2& startPoint, const Vector2& endPoint, unsigned collisionMask = M_MAX_UNSIGNED);
     RigidBody2D* GetRigidBody(const Vector2& point, unsigned collisionMask = M_MAX_UNSIGNED);
+    RigidBody2D* GetRigidBody(int mouseX, int mouseY, unsigned collisionMask = M_MAX_UNSIGNED, Camera* camera = 0);
     // void GetRigidBodies(PODVector<RigidBody2D*>& result, const Rect& aabb, unsigned collisionMask = M_MAX_UNSIGNED);
     tolua_outside const PODVector<RigidBody2D*>& PhysicsWorld2DGetRigidBodies @ GetRigidBodies(const Rect& aabb, unsigned collisionMask = M_MAX_UNSIGNED);
 

+ 2 - 1
Source/Engine/Script/Urho2DAPI.cpp

@@ -268,7 +268,8 @@ static void RegisterPhysicsWorld2D(asIScriptEngine* engine)
     RegisterComponent<PhysicsWorld2D>(engine, "PhysicsWorld2D");
     engine->RegisterObjectMethod("PhysicsWorld2D", "Array<PhysicsRaycastResult2D>@ Raycast(const Vector2&, const Vector2&, uint collisionMask = 0xffff)", asFUNCTION(PhysicsWorld2DRaycast), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("PhysicsWorld2D", "PhysicsRaycastResult2D RaycastSingle(const Vector2&, const Vector2&, uint collisionMask = 0xffff)", asFUNCTION(PhysicsWorld2DRaycastSingle), asCALL_CDECL_OBJLAST);
-    engine->RegisterObjectMethod("PhysicsWorld2D", "RigidBody2D@+ GetRigidBody(const Vector2&, uint collisionMask = 0xffff)", asMETHOD(PhysicsWorld2D, GetRigidBody), asCALL_THISCALL);
+    engine->RegisterObjectMethod("PhysicsWorld2D", "RigidBody2D@+ GetRigidBody(const Vector2&, uint collisionMask = 0xffff)", asMETHODPR(PhysicsWorld2D, GetRigidBody, (const Vector2&, unsigned), RigidBody2D*), asCALL_THISCALL);
+    engine->RegisterObjectMethod("PhysicsWorld2D", "RigidBody2D@+ GetRigidBody(int, int, uint collisionMask = 0xffff, Camera@+ = 0)", asMETHODPR(PhysicsWorld2D, GetRigidBody, (int, int, unsigned, Camera*), RigidBody2D*), asCALL_THISCALL);
     engine->RegisterObjectMethod("PhysicsWorld2D", "Array<RigidBody2D@>@ GetRigidBodies(const Rect&in, uint collisionMask = 0xffff)", asFUNCTION(PhysicsWorld2DGetRigidBodies), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("PhysicsWorld2D", "void set_drawShape(bool)", asMETHOD(PhysicsWorld2D, SetDrawShape), asCALL_THISCALL);
     engine->RegisterObjectMethod("PhysicsWorld2D", "bool get_drawShape() const", asMETHOD(PhysicsWorld2D, GetDrawShape), asCALL_THISCALL);

+ 26 - 0
Source/Engine/Urho2D/PhysicsWorld2D.cpp

@@ -21,8 +21,11 @@
 //
 
 #include "Precompiled.h"
+#include "Camera.h"
 #include "Context.h"
 #include "DebugRenderer.h"
+#include "Graphics.h"
+#include "Log.h"
 #include "PhysicsEvents2D.h"
 #include "PhysicsUtils2D.h"
 #include "PhysicsWorld2D.h"
@@ -522,6 +525,29 @@ RigidBody2D* PhysicsWorld2D::GetRigidBody(const Vector2& point, unsigned collisi
     return callback.GetRigidBody();
 }
 
+RigidBody2D* PhysicsWorld2D::GetRigidBody(int mouseX, int mouseY, unsigned collisionMask, Camera* camera)
+{
+    if (!camera)
+    {
+        PODVector<Camera*> cameras;
+        GetScene()->GetComponents<Camera>(cameras, true);
+        if (!cameras.Empty())
+            camera = cameras[0];
+    }
+
+    if (!camera)
+    {
+        LOGWARNING("Could not find camera in scene");
+        return 0;
+    }
+
+    Graphics* graphics = GetSubsystem<Graphics>();
+    Vector3 screenPoint((float)mouseX / graphics->GetWidth(), (float)mouseY / graphics->GetHeight(), 0.0f);
+    Vector3 worldPoint = camera->ScreenToWorldPoint(screenPoint);
+
+    return GetRigidBody(Vector2(worldPoint.x_, worldPoint.y_), collisionMask);    
+}
+
 // Aabb query callback class.
 class AabbQueryCallback : public b2QueryCallback
 {

+ 3 - 0
Source/Engine/Urho2D/PhysicsWorld2D.h

@@ -28,6 +28,7 @@
 namespace Urho3D
 {
 
+class Camera;
 class RigidBody2D;
 
 /// 2D Physics raycast hit.
@@ -128,6 +129,8 @@ public:
     void RaycastSingle(PhysicsRaycastResult2D& result, const Vector2& startPoint, const Vector2& endPoint, unsigned collisionMask = M_MAX_UNSIGNED);
     /// Return rigid body at point.
     RigidBody2D* GetRigidBody(const Vector2& point, unsigned collisionMask = M_MAX_UNSIGNED);
+    /// Return rigid body at mouse point, if camera is 0, it will use first camera in scene. when viewport size was not equal to window size it may have problem.
+    RigidBody2D* GetRigidBody(int mouseX, int mouseY, unsigned collisionMask = M_MAX_UNSIGNED, Camera* camera = 0);
     /// Return rigid bodies by a box query.
     void GetRigidBodies(PODVector<RigidBody2D*>& result, const Rect& aabb, unsigned collisionMask = M_MAX_UNSIGNED);