BGE: add hitUV property to mouse focus sensor to return UV coordinates under mouse...
authorBenoit Bolsee <benoit.bolsee@online.be>
Tue, 8 Dec 2009 08:58:24 +0000 (08:58 +0000)
committerBenoit Bolsee <benoit.bolsee@online.be>
Tue, 8 Dec 2009 08:58:24 +0000 (08:58 +0000)
source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
source/gameengine/Ketsji/KX_MouseFocusSensor.h
source/gameengine/PyDoc/GameTypes.py

index 2dbaf3c90815f3125ff5ad272ed29f61fe52349c..110e3abd6d868fd370fd2c769f34e7360130335b 100644 (file)
@@ -150,6 +150,7 @@ bool KX_MouseFocusSensor::RayHit(KX_ClientObjectInfo* client_info, KX_RayCast* r
                m_hitObject = hitKXObj;
                m_hitPosition = result->m_hitPoint;
                m_hitNormal = result->m_hitNormal;
+               m_hitUV = result->m_hitUV;
                return true;
        }
        
@@ -284,7 +285,8 @@ bool KX_MouseFocusSensor::ParentObjectHasFocusCamera(KX_Camera *cam)
        KX_IPhysicsController* physics_controller = cam->GetPhysicsController();
        PHY_IPhysicsEnvironment* physics_environment = m_kxscene->GetPhysicsEnvironment();
 
-       KX_RayCast::Callback<KX_MouseFocusSensor> callback(this,physics_controller);
+       // get UV mapping
+       KX_RayCast::Callback<KX_MouseFocusSensor> callback(this,physics_controller,NULL,false,true);
         
        KX_RayCast::RayTest(physics_environment, m_prevSourcePoint, m_prevTargetPoint, callback);
        
@@ -340,6 +342,11 @@ const MT_Vector3& KX_MouseFocusSensor::HitNormal() const
        return m_hitNormal;
 }
 
+const MT_Vector2& KX_MouseFocusSensor::HitUV() const
+{
+       return m_hitUV;
+}
+
 #ifndef DISABLE_PYTHON
 
 /* ------------------------------------------------------------------------- */
@@ -380,6 +387,7 @@ PyAttributeDef KX_MouseFocusSensor::Attributes[] = {
        KX_PYATTRIBUTE_RO_FUNCTION("hitObject",         KX_MouseFocusSensor, pyattr_get_hit_object),
        KX_PYATTRIBUTE_RO_FUNCTION("hitPosition",       KX_MouseFocusSensor, pyattr_get_hit_position),
        KX_PYATTRIBUTE_RO_FUNCTION("hitNormal",         KX_MouseFocusSensor, pyattr_get_hit_normal),
+       KX_PYATTRIBUTE_RO_FUNCTION("hitUV",             KX_MouseFocusSensor, pyattr_get_hit_uv),
        KX_PYATTRIBUTE_BOOL_RW("usePulseFocus", KX_MouseFocusSensor,m_bTouchPulse),
        { NULL }        //Sentinel
 };
@@ -428,6 +436,12 @@ PyObject* KX_MouseFocusSensor::pyattr_get_hit_normal(void *self_v, const KX_PYAT
        return PyObjectFrom(self->HitNormal());
 }
 
+PyObject* KX_MouseFocusSensor::pyattr_get_hit_uv(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+       KX_MouseFocusSensor* self= static_cast<KX_MouseFocusSensor*>(self_v);
+       return PyObjectFrom(self->HitUV());
+}
+
 #endif // DISABLE_PYTHON
 
 /* eof */
index e3f0e2b34f5f83ae362a3d04c3263d49a3c04cce..b107b54434b01a33307b2771d5c82d2a296c4718 100644 (file)
@@ -92,6 +92,7 @@ class KX_MouseFocusSensor : public SCA_MouseSensor
        const MT_Point3& RayTarget() const;
        const MT_Point3& HitPosition() const;
        const MT_Vector3& HitNormal() const;
+       const MT_Vector2& HitUV() const;
        
 #ifndef DISABLE_PYTHON
 
@@ -106,6 +107,7 @@ class KX_MouseFocusSensor : public SCA_MouseSensor
        static PyObject*        pyattr_get_hit_object(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
        static PyObject*        pyattr_get_hit_position(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
        static PyObject*        pyattr_get_hit_normal(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+       static PyObject*        pyattr_get_hit_uv(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
                
 #endif // DISABLE_PYTHON
 
@@ -164,6 +166,11 @@ class KX_MouseFocusSensor : public SCA_MouseSensor
         * the object was hit.  */
        MT_Vector3               m_hitNormal;
 
+       /**
+        * UV texture coordinate of the hit point if any, (0,0) otherwise
+        */
+       MT_Vector2               m_hitUV;
+
        /**
         * The KX scene that holds the camera. The camera position
         * determines a part of the start location of the picking ray.  */
index 27b4685ca149b956c3f515c4d5fe59c537f2c0a4..ba22dbd4e8fc967a72cd27d9e8c5ee432f857112 100644 (file)
@@ -2414,6 +2414,10 @@ class KX_MouseFocusSensor(SCA_MouseSensor):
        @type hitPosition: list (vector of 3 floats)
        @ivar hitNormal: the worldspace normal from the face at point of intersection.
        @type hitNormal: list (normalized vector of 3 floats)
+       @ivar hitUV: the UV coordinates at the point of intersection.
+               If the object has no UV mapping, it returns [0,0].
+               The UV coordinates are not normalized, they can be < 0 or > 1 depending on the UV mapping.
+       @type hitUV: list (vector of 2 floats)
        @ivar usePulseFocus: When enabled, moving the mouse over a different object generates a pulse. (only used when the 'Mouse Over Any' sensor option is set)
        @type usePulseFocus: bool
        """