[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