[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25125] trunk/blender: BGE: Add option to return UV coordinates aofthe hit point to KX_GameObject:: rayCast().
Benoit Bolsee
benoit.bolsee at online.be
Fri Dec 4 12:27:40 CET 2009
Revision: 25125
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25125
Author: ben2610
Date: 2009-12-04 12:27:40 +0100 (Fri, 04 Dec 2009)
Log Message:
-----------
BGE: Add option to return UV coordinates aofthe hit point to KX_GameObject::rayCast(). Details in PyDoc.
Modified Paths:
--------------
trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp
trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
trunk/blender/source/gameengine/Ketsji/KX_RayCast.cpp
trunk/blender/source/gameengine/Ketsji/KX_RayCast.h
trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h
trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
trunk/blender/source/gameengine/Physics/common/PHY_DynamicTypes.h
trunk/blender/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h
trunk/blender/source/gameengine/PyDoc/GameTypes.py
Modified: trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp
===================================================================
--- trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp 2009-12-04 10:45:23 UTC (rev 25124)
+++ trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp 2009-12-04 11:27:40 UTC (rev 25125)
@@ -828,7 +828,8 @@
#undef IDX
psb->appendFace(idx[0],idx[1],idx[2]);
}
- psb->randomizeConstraints();
+ // don't randomize now, let's give a chance to the application to set face data
+ //psb->randomizeConstraints();
return(psb);
}
Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp 2009-12-04 10:45:23 UTC (rev 25124)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp 2009-12-04 11:27:40 UTC (rev 25125)
@@ -2606,8 +2606,8 @@
}
KX_PYMETHODDEF_DOC(KX_GameObject, rayCast,
- "rayCast(to,from,dist,prop,face,xray,poly): cast a ray and return 3-tuple (object,hit,normal) or 4-tuple (object,hit,normal,polygon) of contact point with object within dist that matches prop.\n"
- " If no hit, return (None,None,None) or (None,None,None,None).\n"
+ "rayCast(to,from,dist,prop,face,xray,poly): cast a ray and return 3-tuple (object,hit,normal) or 4-tuple (object,hit,normal,polygon) or 4-tuple (object,hit,normal,polygon,hituv) of contact point with object within dist that matches prop.\n"
+ " If no hit, return (None,None,None) or (None,None,None,None) or (None,None,None,None,None).\n"
" to = 3-tuple or object reference for destination of ray (if object, use center of object)\n"
" from = 3-tuple or object reference for origin of ray (if object, use center of object)\n"
" Can be None or omitted => start from self object center\n"
@@ -2617,6 +2617,8 @@
" xray = X-ray option: 1=>skip objects that don't match prop; 0 or omitted => stop on first object\n"
" poly = polygon option: 1=>return value is a 4-tuple and the 4th element is a KX_PolyProxy object\n"
" which can be None if hit object has no mesh or if there is no hit\n"
+" 2=>return value is a 5-tuple, the 4th element is the KX_PolyProxy object\n"
+" and the 5th element is the vector of UV coordinates at the hit point of the None if there is no UV mapping\n"
" If 0 or omitted, return value is a 3-tuple\n"
"Note: The object on which you call this method matters: the ray will ignore it.\n"
" prop and xray option interact as follow:\n"
@@ -2697,12 +2699,12 @@
m_testPropName.SetLength(0);
m_xray = xray;
// to get the hit results
- KX_RayCast::Callback<KX_GameObject> callback(this,spc,NULL,face);
+ KX_RayCast::Callback<KX_GameObject> callback(this,spc,NULL,face,(poly==2));
KX_RayCast::RayTest(pe, fromPoint, toPoint, callback);
if (m_pHitObject)
{
- PyObject* returnValue = (poly) ? PyTuple_New(4) : PyTuple_New(3);
+ PyObject* returnValue = (poly==2) ? PyTuple_New(5) : (poly) ? PyTuple_New(4) : PyTuple_New(3);
if (returnValue) { // unlikely this would ever fail, if it does python sets an error
PyTuple_SET_ITEM(returnValue, 0, m_pHitObject->GetProxy());
PyTuple_SET_ITEM(returnValue, 1, PyObjectFrom(callback.m_hitPoint));
@@ -2715,11 +2717,25 @@
RAS_Polygon* polygon = callback.m_hitMesh->GetPolygon(callback.m_hitPolygon);
KX_PolyProxy* polyproxy = new KX_PolyProxy(callback.m_hitMesh, polygon);
PyTuple_SET_ITEM(returnValue, 3, polyproxy->NewProxy(true));
+ if (poly == 2)
+ {
+ if (callback.m_hitUVOK)
+ PyTuple_SET_ITEM(returnValue, 4, PyObjectFrom(callback.m_hitUV));
+ else {
+ Py_INCREF(Py_None);
+ PyTuple_SET_ITEM(returnValue, 4, Py_None);
+ }
+ }
}
else
{
Py_INCREF(Py_None);
PyTuple_SET_ITEM(returnValue, 3, Py_None);
+ if (poly==2)
+ {
+ Py_INCREF(Py_None);
+ PyTuple_SET_ITEM(returnValue, 4, Py_None);
+ }
}
}
}
Modified: trunk/blender/source/gameengine/Ketsji/KX_RayCast.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_RayCast.cpp 2009-12-04 10:45:23 UTC (rev 25124)
+++ trunk/blender/source/gameengine/Ketsji/KX_RayCast.cpp 2009-12-04 11:27:40 UTC (rev 25125)
@@ -40,8 +40,8 @@
#include "PHY_IPhysicsEnvironment.h"
#include "PHY_IPhysicsController.h"
-KX_RayCast::KX_RayCast(KX_IPhysicsController* ignoreController, bool faceNormal)
- :PHY_IRayCastFilterCallback(dynamic_cast<PHY_IPhysicsController*>(ignoreController), faceNormal)
+KX_RayCast::KX_RayCast(KX_IPhysicsController* ignoreController, bool faceNormal, bool faceUV)
+ :PHY_IRayCastFilterCallback(dynamic_cast<PHY_IPhysicsController*>(ignoreController), faceNormal, faceUV)
{
}
@@ -50,6 +50,8 @@
m_hitFound = true;
m_hitPoint.setValue((const float*)result->m_hitPoint);
m_hitNormal.setValue((const float*)result->m_hitNormal);
+ m_hitUVOK = result->m_hitUVOK;
+ m_hitUV.setValue((const float*)result->m_hitUV);
m_hitMesh = result->m_meshObject;
m_hitPolygon = result->m_polygon;
}
Modified: trunk/blender/source/gameengine/Ketsji/KX_RayCast.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_RayCast.h 2009-12-04 10:45:23 UTC (rev 25124)
+++ trunk/blender/source/gameengine/Ketsji/KX_RayCast.h 2009-12-04 11:27:40 UTC (rev 25125)
@@ -32,6 +32,7 @@
#include "PHY_IPhysicsEnvironment.h"
#include "PHY_IPhysicsController.h"
+#include "MT_Vector2.h"
#include "MT_Point3.h"
#include "MT_Vector3.h"
@@ -59,8 +60,10 @@
MT_Vector3 m_hitNormal;
const RAS_MeshObject* m_hitMesh;
int m_hitPolygon;
+ int m_hitUVOK; // !=0 if UV coordinate in m_hitUV is valid
+ MT_Vector2 m_hitUV;
- KX_RayCast(KX_IPhysicsController* ignoreController, bool faceNormal);
+ KX_RayCast(KX_IPhysicsController* ignoreController, bool faceNormal, bool faceUV);
virtual ~KX_RayCast() {}
/**
@@ -102,8 +105,8 @@
T *self;
void *data;
public:
- Callback(T *_self, KX_IPhysicsController* controller=NULL, void *_data = NULL, bool faceNormal=false)
- : KX_RayCast(controller, faceNormal),
+ Callback(T *_self, KX_IPhysicsController* controller=NULL, void *_data = NULL, bool faceNormal=false, bool faceUV=false)
+ : KX_RayCast(controller, faceNormal, faceUV),
self(_self),
data(_data)
{
Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp 2009-12-04 10:45:23 UTC (rev 25124)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp 2009-12-04 11:27:40 UTC (rev 25125)
@@ -214,6 +214,7 @@
}
} else
{
+ int numtris = 0;
if (m_cci.m_collisionShape->getShapeType() ==SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE)
{
btScaledBvhTriangleMeshShape* scaledtrimeshshape = (btScaledBvhTriangleMeshShape*) m_cci.m_collisionShape;
@@ -228,7 +229,6 @@
int vertexstride;
unsigned char* indexbase;
int indexstride;
- int numtris;
PHY_ScalarType indexType;
trimeshshape->getMeshInterface()->getLockedVertexIndexBase(&vertexBase,numverts,vertexType,vertexstride,&indexbase,indexstride,numtris,indexType);
@@ -246,14 +246,21 @@
int vertexstride;
unsigned char* indexbase;
int indexstride;
- int numtris;
PHY_ScalarType indexType;
trimeshshape->getMeshInterface()->getLockedVertexIndexBase(&vertexBase,numverts,vertexType,vertexstride,&indexbase,indexstride,numtris,indexType);
psb = btSoftBodyHelpers::CreateFromTriMesh(worldInfo,(const btScalar*)vertexBase,(const int*)indexbase,numtris);
}
}
-
+ // store face tag so that we can find our original face when doing ray casting
+ btSoftBody::Face* ft;
+ int i;
+ for (i=0, ft=&psb->m_faces[0]; i<numtris; ++i, ++ft)
+ {
+ // Hack!! use m_tag to store the face number, normally it is a pointer
+ // add 1 to make sure it is never 0
+ ft->m_tag = (void*)((uintptr_t)(i+1));
+ }
}
if (m_cci.m_margin > 0.f)
{
@@ -1402,6 +1409,7 @@
m_vertexArray.clear();
m_polygonIndexArray.clear();
m_triFaceArray.clear();
+ m_triFaceUVcoArray.clear();
return false;
}
@@ -1415,6 +1423,7 @@
numpolys = dm->getNumFaces(dm);
numverts = dm->getNumVerts(dm);
int* index = (int*)dm->getFaceDataArray(dm, CD_ORIGINDEX);
+ MTFace *tface = (MTFace *)dm->getFaceDataArray(dm, CD_MTFACE);
m_shapeType = (polytope) ? PHY_SHAPE_POLYTOPE : PHY_SHAPE_MESH;
@@ -1515,14 +1524,23 @@
m_vertexArray.resize(tot_bt_verts*3);
m_polygonIndexArray.resize(tot_bt_tris);
m_triFaceArray.resize(tot_bt_tris*3);
-
btScalar *bt= &m_vertexArray[0];
int *poly_index_pt= &m_polygonIndexArray[0];
int *tri_pt= &m_triFaceArray[0];
+ UVco *uv_pt = NULL;
+ if (tface)
+ {
+ m_triFaceUVcoArray.resize(tot_bt_tris*3);
+ uv_pt = &m_triFaceUVcoArray[0];
+ }
+ else
+ m_triFaceUVcoArray.clear();
+
for (int p2=0; p2<numpolys; p2++)
{
MFace* mf = &mface[p2];
+ MTFace* tf = (tface) ? &tface[p2] : NULL;
RAS_Polygon* poly= meshobj->GetPolygon(index[p2]);
// only add polygons that have the collisionflag set
@@ -1537,6 +1555,16 @@
tri_pt[1]= vert_remap_array[mf->v2];
tri_pt[2]= vert_remap_array[mf->v3];
tri_pt= tri_pt+3;
+ if (tf)
+ {
+ uv_pt[0].uv[0] = tf->uv[0][0];
+ uv_pt[0].uv[1] = tf->uv[0][1];
+ uv_pt[1].uv[0] = tf->uv[1][0];
+ uv_pt[1].uv[1] = tf->uv[1][1];
+ uv_pt[2].uv[0] = tf->uv[2][0];
+ uv_pt[2].uv[1] = tf->uv[2][1];
+ uv_pt += 3;
+ }
// m_polygonIndexArray
*poly_index_pt= index[p2];
@@ -1570,6 +1598,16 @@
tri_pt[1]= vert_remap_array[mf->v3];
tri_pt[2]= vert_remap_array[mf->v4];
tri_pt= tri_pt+3;
+ if (tf)
+ {
+ uv_pt[0].uv[0] = tf->uv[0][0];
+ uv_pt[0].uv[1] = tf->uv[0][1];
+ uv_pt[1].uv[0] = tf->uv[2][0];
+ uv_pt[1].uv[1] = tf->uv[2][1];
+ uv_pt[2].uv[0] = tf->uv[3][0];
+ uv_pt[2].uv[1] = tf->uv[3][1];
+ uv_pt += 3;
+ }
// m_polygonIndexArray
*poly_index_pt= index[p2];
@@ -1728,10 +1766,12 @@
m_triFaceArray.resize(tot_bt_tris*3);
int *tri_pt= &m_triFaceArray[0];
+ m_triFaceUVcoArray.resize(tot_bt_tris*3);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list