27 int numtotalphysicsverts = 0;
29 const unsigned char* vertexbase;
30 const unsigned char* indexbase;
34 int stride, numverts, numtriangles;
41 for (part = 0; part < graphicssubparts; part++)
44 numtotalphysicsverts += numtriangles * 3;
60 for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
62 unsigned int* tri_indices = (
unsigned int*)(indexbase + gfxindex * indexstride);
63 graphicsbase = (
float*)(vertexbase + tri_indices[0] * stride);
64 triangle[0].
setValue(graphicsbase[0] * meshScaling.
getX(), graphicsbase[1] * meshScaling.
getY(), graphicsbase[2] * meshScaling.
getZ());
65 graphicsbase = (
float*)(vertexbase + tri_indices[1] * stride);
66 triangle[1].
setValue(graphicsbase[0] * meshScaling.
getX(), graphicsbase[1] * meshScaling.
getY(), graphicsbase[2] * meshScaling.
getZ());
67 graphicsbase = (
float*)(vertexbase + tri_indices[2] * stride);
68 triangle[2].
setValue(graphicsbase[0] * meshScaling.
getX(), graphicsbase[1] * meshScaling.
getY(), graphicsbase[2] * meshScaling.
getZ());
75 for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
77 unsigned short int* tri_indices = (
unsigned short int*)(indexbase + gfxindex * indexstride);
78 graphicsbase = (
float*)(vertexbase + tri_indices[0] * stride);
79 triangle[0].
setValue(graphicsbase[0] * meshScaling.
getX(), graphicsbase[1] * meshScaling.
getY(), graphicsbase[2] * meshScaling.
getZ());
80 graphicsbase = (
float*)(vertexbase + tri_indices[1] * stride);
81 triangle[1].
setValue(graphicsbase[0] * meshScaling.
getX(), graphicsbase[1] * meshScaling.
getY(), graphicsbase[2] * meshScaling.
getZ());
82 graphicsbase = (
float*)(vertexbase + tri_indices[2] * stride);
83 triangle[2].
setValue(graphicsbase[0] * meshScaling.
getX(), graphicsbase[1] * meshScaling.
getY(), graphicsbase[2] * meshScaling.
getZ());
90 for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
92 unsigned char* tri_indices = (
unsigned char*)(indexbase + gfxindex * indexstride);
93 graphicsbase = (
float*)(vertexbase + tri_indices[0] * stride);
94 triangle[0].
setValue(graphicsbase[0] * meshScaling.
getX(), graphicsbase[1] * meshScaling.
getY(), graphicsbase[2] * meshScaling.
getZ());
95 graphicsbase = (
float*)(vertexbase + tri_indices[1] * stride);
96 triangle[1].
setValue(graphicsbase[0] * meshScaling.
getX(), graphicsbase[1] * meshScaling.
getY(), graphicsbase[2] * meshScaling.
getZ());
97 graphicsbase = (
float*)(vertexbase + tri_indices[2] * stride);
98 triangle[2].
setValue(graphicsbase[0] * meshScaling.
getX(), graphicsbase[1] * meshScaling.
getY(), graphicsbase[2] * meshScaling.
getZ());
111 double* graphicsbase;
113 switch (gfxindextype)
117 for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
119 unsigned int* tri_indices = (
unsigned int*)(indexbase + gfxindex * indexstride);
120 graphicsbase = (
double*)(vertexbase + tri_indices[0] * stride);
122 graphicsbase = (
double*)(vertexbase + tri_indices[1] * stride);
124 graphicsbase = (
double*)(vertexbase + tri_indices[2] * stride);
132 for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
134 unsigned short int* tri_indices = (
unsigned short int*)(indexbase + gfxindex * indexstride);
135 graphicsbase = (
double*)(vertexbase + tri_indices[0] * stride);
137 graphicsbase = (
double*)(vertexbase + tri_indices[1] * stride);
139 graphicsbase = (
double*)(vertexbase + tri_indices[2] * stride);
147 for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
149 unsigned char* tri_indices = (
unsigned char*)(indexbase + gfxindex * indexstride);
150 graphicsbase = (
double*)(vertexbase + tri_indices[0] * stride);
152 graphicsbase = (
double*)(vertexbase + tri_indices[1] * stride);
154 graphicsbase = (
double*)(vertexbase + tri_indices[2] * stride);
180 AabbCalculationCallback()
186 virtual void internalProcessTriangleIndex(
btVector3* triangle,
int partId,
int triangleIndex)
191 m_aabbMin.
setMin(triangle[0]);
192 m_aabbMax.
setMax(triangle[0]);
193 m_aabbMin.
setMin(triangle[1]);
194 m_aabbMax.
setMax(triangle[1]);
195 m_aabbMin.
setMin(triangle[2]);
196 m_aabbMax.
setMax(triangle[2]);
201 AabbCalculationCallback aabbCallback;
206 aabbMin = aabbCallback.m_aabbMin;
207 aabbMax = aabbCallback.m_aabbMax;
229 const unsigned char* vertexbase;
230 const unsigned char* indexbase;
234 int stride, numverts, numtriangles;
241 for (part = 0; part < graphicssubparts; part++, memPtr++)
253 switch (gfxindextype)
257 int numindices = numtriangles * 3;
264 for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
266 unsigned int* tri_indices = (
unsigned int*)(indexbase + gfxindex * indexstride);
267 tmpIndices[gfxindex * 3].
m_value = tri_indices[0];
268 tmpIndices[gfxindex * 3 + 1].
m_value = tri_indices[1];
269 tmpIndices[gfxindex * 3 + 2].
m_value = tri_indices[2];
282 for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
284 unsigned short int* tri_indices = (
unsigned short int*)(indexbase + gfxindex * indexstride);
285 tmpIndices[gfxindex].
m_values[0] = tri_indices[0];
286 tmpIndices[gfxindex].
m_values[1] = tri_indices[1];
287 tmpIndices[gfxindex].
m_values[2] = tri_indices[2];
289 tmpIndices[gfxindex].
m_pad[0] = 0;
290 tmpIndices[gfxindex].
m_pad[1] = 0;
303 for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
305 unsigned char* tri_indices = (
unsigned char*)(indexbase + gfxindex * indexstride);
306 tmpIndices[gfxindex].
m_values[0] = tri_indices[0];
307 tmpIndices[gfxindex].
m_values[1] = tri_indices[1];
308 tmpIndices[gfxindex].
m_values[2] = tri_indices[2];
310 tmpIndices[gfxindex].
m_pad = 0;
334 for (
int i = 0; i < numverts; i++)
336 graphicsbase = (
float*)(vertexbase + i * stride);
337 tmpVertices[i].
m_floats[0] = graphicsbase[0];
338 tmpVertices[i].
m_floats[1] = graphicsbase[1];
339 tmpVertices[i].
m_floats[2] = graphicsbase[2];
353 for (
int i = 0; i < numverts; i++)
355 double* graphicsbase = (
double*)(vertexbase + i * stride);
356 tmpVertices[i].
m_floats[0] = graphicsbase[0];
357 tmpVertices[i].
m_floats[1] = graphicsbase[1];
358 tmpVertices[i].
m_floats[2] = graphicsbase[2];
379 return "btStridingMeshInterfaceData";
btMeshPartData * m_meshPartsPtr
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
virtual void InternalProcessAllTriangles(btInternalTriangleIndexCallback *callback, const btVector3 &aabbMin, const btVector3 &aabbMax) const
virtual void * getUniquePointer(void *oldPtr)=0
void serializeFloat(struct btVector3FloatData &dataOut) const
const btScalar & getY() const
Return the y value.
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
btVector3FloatData * m_vertices3f
btShortIntIndexData * m_indices16
btCharIndexTripletData * m_3indices8
const btScalar & getZ() const
Return the z value.
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
btShortIntIndexTripletData * m_3indices16
unsigned char m_values[3]
btVector3FloatData m_scaling
virtual const char * serialize(void *dataBuffer, btSerializer *serializer) const
fills the dataBuffer and returns the struct name (and 0 on failure)
btVector3 can be used to represent 3D points and vectors.
virtual int getNumSubParts() const =0
getNumSubParts returns the number of seperate subparts each subpart has a continuous array of vertice...
virtual void finalizeChunk(btChunk *chunk, const char *structType, int chunkCode, void *oldPtr)=0
virtual ~btStridingMeshInterface()
const btVector3 & getScaling() const
virtual void getLockedReadOnlyVertexIndexBase(const unsigned char **vertexbase, int &numverts, PHY_ScalarType &type, int &stride, const unsigned char **indexbase, int &indexstride, int &numfaces, PHY_ScalarType &indicestype, int subpart=0) const =0
virtual void internalProcessTriangleIndex(btVector3 *triangle, int partId, int triangleIndex)=0
btIntIndexData * m_indices32
virtual void unLockReadOnlyVertexBase(int subpart) const =0
void setMax(const btVector3 &other)
Set each element to the max of the current values and the values of another btVector3.
virtual btChunk * allocate(size_t size, int numElements)=0
const btScalar & getX() const
Return the x value.
void setMin(const btVector3 &other)
Set each element to the min of the current values and the values of another btVector3.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
PHY_ScalarType
PHY_ScalarType enumerates possible scalar types.
void calculateAabbBruteForce(btVector3 &aabbMin, btVector3 &aabbMax)
brute force method to calculate aabb
btVector3DoubleData * m_vertices3d