From: <dan...@us...> - 2008-01-02 04:42:22
|
Revision: 1344 http://opende.svn.sourceforge.net/opende/?rev=1344&view=rev Author: danielosmari Date: 2008-01-01 20:42:25 -0800 (Tue, 01 Jan 2008) Log Message: ----------- applied patch 1851394: support for GIMPACT with double precision, dCollide fix Modified Paths: -------------- trunk/CHANGELOG.txt trunk/configure.in trunk/ode/src/collision_trimesh_box.cpp trunk/ode/src/collision_trimesh_gimpact.cpp trunk/ode/src/collision_trimesh_internal.h trunk/ode/src/collision_trimesh_plane.cpp trunk/ode/src/collision_trimesh_ray.cpp trunk/ode/src/collision_trimesh_sphere.cpp Modified: trunk/CHANGELOG.txt =================================================================== --- trunk/CHANGELOG.txt 2008-01-02 04:26:46 UTC (rev 1343) +++ trunk/CHANGELOG.txt 2008-01-02 04:42:25 UTC (rev 1344) @@ -9,6 +9,13 @@ ------------------------------------------------------------------------------ +01/02/08 Daniel K. O. + + * Applied patch 1851394: support for GIMPACT with double precision, + dCollide fix. + * Removed an opcode source from gimpact build. + + 01/01/08 Daniel K. O. * Replaced ode/config.h by odeconfig.h and plain config.h. Public Modified: trunk/configure.in =================================================================== --- trunk/configure.in 2008-01-02 04:26:46 UTC (rev 1343) +++ trunk/configure.in 2008-01-02 04:42:25 UTC (rev 1344) @@ -558,8 +558,4 @@ echo " Headers will be installed in $prefix/include/ode" echo " Libraries will be installed in $prefix/lib" echo " Building in directory $BUILDDIR" -if test $gimpact = yes -a $precision = yes -then - echo "WARNING! Double precision not yet supported for GIMPACT" -fi Modified: trunk/ode/src/collision_trimesh_box.cpp =================================================================== --- trunk/ode/src/collision_trimesh_box.cpp 2008-01-02 04:26:46 UTC (rev 1343) +++ trunk/ode/src/collision_trimesh_box.cpp 2008-01-02 04:42:25 UTC (rev 1344) @@ -1300,7 +1300,10 @@ dxTriMesh* TriMesh = (dxTriMesh*)g1; + g1 -> recomputeAABB(); + BoxGeom -> recomputeAABB(); + // get source hull position, orientation and half size const dMatrix3& mRotBox=*(const dMatrix3*)dGeomGetRotation(BoxGeom); const dVector3& vPosBox=*(const dVector3*)dGeomGetPosition(BoxGeom); Modified: trunk/ode/src/collision_trimesh_gimpact.cpp =================================================================== --- trunk/ode/src/collision_trimesh_gimpact.cpp 2008-01-02 04:26:46 UTC (rev 1343) +++ trunk/ode/src/collision_trimesh_gimpact.cpp 2008-01-02 04:42:25 UTC (rev 1344) @@ -197,7 +197,7 @@ //Update trimesh boxes gim_trimesh_update(&m_collision_trimesh); - memcpy(aabb,&m_collision_trimesh.m_aabbset.m_global_bound,6*sizeof(GREAL)); + GIM_AABB_COPY( &m_collision_trimesh.m_aabbset.m_global_bound, aabb ); } @@ -268,8 +268,8 @@ // GIMPACT only supports stride 12, so we need to catch the error early. dUASSERT ( - Data->m_VertexStride == 3*sizeof(dReal) && Data->m_TriStride == 3*sizeof(int), - "Gimpact trimesh only supports a stride of 3 dReal/int\n" + Data->m_VertexStride == 3*sizeof(float) && Data->m_TriStride == 3*sizeof(int), + "Gimpact trimesh only supports a stride of 3 float/int\n" "This means that you cannot use dGeomTriMeshDataBuildSimple() with Gimpact.\n" "Change the stride, or use Opcode trimeshes instead.\n" ); @@ -407,6 +407,9 @@ GDYNAMIC_ARRAY trimeshcontacts; GIM_CREATE_CONTACT_LIST(trimeshcontacts); + g1 -> recomputeAABB(); + g2 -> recomputeAABB(); + //Collide trimeshes gim_trimesh_trimesh_collision(&TriMesh1->m_collision_trimesh,&TriMesh2->m_collision_trimesh,&trimeshcontacts); Modified: trunk/ode/src/collision_trimesh_internal.h =================================================================== --- trunk/ode/src/collision_trimesh_internal.h 2008-01-02 04:26:46 UTC (rev 1343) +++ trunk/ode/src/collision_trimesh_internal.h 2008-01-02 04:42:25 UTC (rev 1344) @@ -311,6 +311,80 @@ #endif // dTRIMESH_OPCODE #ifdef dTRIMESH_GIMPACT + + #ifdef dDOUBLE + // To use GIMPACT with doubles, we need to patch a couple of the GIMPACT functions to + // convert arguments to floats before sending them in + + + /// Convert an gimpact vec3f to a ODE dVector3d: dVector3[i] = vec3f[i] + #define dVECTOR3_VEC3F_COPY(b,a) { \ + (b)[0] = (a)[0]; \ + (b)[1] = (a)[1]; \ + (b)[2] = (a)[2]; \ + (b)[3] = 0; \ + } + + inline void gim_trimesh_get_triangle_verticesODE(GIM_TRIMESH * trimesh, GUINT triangle_index, dVector3 v1, dVector3 v2, dVector3 v3) { + vec3f * transformed_vertices = GIM_BUFFER_ARRAY_POINTER(vec3f,trimesh->m_transformed_vertex_buffer,0); + + GUINT * triangle_indices = GIM_BUFFER_ARRAY_POINTER(GUINT,trimesh->m_tri_index_buffer,triangle_index*3); + + dVECTOR3_VEC3F_COPY(v1, transformed_vertices[triangle_indices[0]]); + dVECTOR3_VEC3F_COPY(v2, transformed_vertices[triangle_indices[1]]); + dVECTOR3_VEC3F_COPY(v3, transformed_vertices[triangle_indices[2]]); + } + + // Anything calling gim_trimesh_get_triangle_vertices from within ODE + // should be patched through to the dDOUBLE version above + + #define gim_trimesh_get_triangle_vertices gim_trimesh_get_triangle_verticesODE + + inline int gim_trimesh_ray_closest_collisionODE( GIM_TRIMESH *mesh, dVector3 origin, dVector3 dir, GREAL tmax, GIM_TRIANGLE_RAY_CONTACT_DATA *contact ) { + vec3f dir_vec3f = { dir[ 0 ], dir[ 1 ], dir[ 2 ] }; + vec3f origin_vec3f = { origin[ 0 ], origin[ 1 ], origin[ 2 ] }; + + return gim_trimesh_ray_closest_collision( mesh, origin_vec3f, dir_vec3f, tmax, contact ); + } + + inline int gim_trimesh_ray_collisionODE( GIM_TRIMESH *mesh, dVector3 origin, dVector3 dir, GREAL tmax, GIM_TRIANGLE_RAY_CONTACT_DATA *contact ) { + vec3f dir_vec3f = { dir[ 0 ], dir[ 1 ], dir[ 2 ] }; + vec3f origin_vec3f = { origin[ 0 ], origin[ 1 ], origin[ 2 ] }; + + return gim_trimesh_ray_collision( mesh, origin_vec3f, dir_vec3f, tmax, contact ); + } + + #define gim_trimesh_sphere_collisionODE( mesh, Position, Radius, contact ) { \ + vec3f pos_vec3f = { Position[ 0 ], Position[ 1 ], Position[ 2 ] }; \ + gim_trimesh_sphere_collision( mesh, pos_vec3f, Radius, contact ); \ + } + + #define gim_trimesh_plane_collisionODE( mesh, plane, contact ) { \ + vec4f plane_vec4f = { plane[ 0 ], plane[ 1 ], plane[ 2 ], plane[ 3 ] }; \ + gim_trimesh_plane_collision( mesh, plane_vec4f, contact ); \ + } + + #define GIM_AABB_COPY( src, dst ) { \ + dst[ 0 ]= (src) -> minX; \ + dst[ 1 ]= (src) -> maxX; \ + dst[ 2 ]= (src) -> minY; \ + dst[ 3 ]= (src) -> maxY; \ + dst[ 4 ]= (src) -> minZ; \ + dst[ 5 ]= (src) -> maxZ; \ + } + + #else + // With single precision, we can pass native ODE vectors directly to GIMPACT + + #define gim_trimesh_ray_closest_collisionODE gim_trimesh_ray_closest_collision + #define gim_trimesh_ray_collisionODE gim_trimesh_ray_collision + #define gim_trimesh_sphere_collisionODE gim_trimesh_sphere_collision + #define gim_trimesh_plane_collisionODE gim_trimesh_plane_collision + + #define GIM_AABB_COPY( src, dst ) memcpy( dst, src, 6 * sizeof( GREAL ) ) + + #endif // dDouble + inline void FetchTriangle(dxTriMesh* TriMesh, int Index, const dVector3 Position, const dMatrix3 Rotation, dVector3 Out[3]){ // why is this not implemented? dAASSERT(false); Modified: trunk/ode/src/collision_trimesh_plane.cpp =================================================================== --- trunk/ode/src/collision_trimesh_plane.cpp 2008-01-02 04:26:46 UTC (rev 1343) +++ trunk/ode/src/collision_trimesh_plane.cpp 2008-01-02 04:42:25 UTC (rev 1344) @@ -156,15 +156,18 @@ // Alias pointers to the plane and trimesh dxTriMesh* trimesh = (dxTriMesh*)( o1 ); - vec4f plane; + dVector4 plane; dGeomPlaneGetParams(o2, plane); + o1 -> recomputeAABB(); + o2 -> recomputeAABB(); + //Find collision GDYNAMIC_ARRAY collision_result; GIM_CREATE_TRIMESHPLANE_CONTACTS(collision_result); - gim_trimesh_plane_collision(&trimesh->m_collision_trimesh,plane,&collision_result); + gim_trimesh_plane_collisionODE(&trimesh->m_collision_trimesh,plane,&collision_result); if(collision_result.m_size == 0 ) { Modified: trunk/ode/src/collision_trimesh_ray.cpp =================================================================== --- trunk/ode/src/collision_trimesh_ray.cpp 2008-01-02 04:26:46 UTC (rev 1343) +++ trunk/ode/src/collision_trimesh_ray.cpp 2008-01-02 04:42:25 UTC (rev 1344) @@ -165,11 +165,11 @@ if(ClosestHit) { - intersect = gim_trimesh_ray_closest_collision(&TriMesh->m_collision_trimesh,Origin,Direction,Length,&contact_data); + intersect = gim_trimesh_ray_closest_collisionODE(&TriMesh->m_collision_trimesh,Origin,Direction,Length,&contact_data); } else { - intersect = gim_trimesh_ray_collision(&TriMesh->m_collision_trimesh,Origin,Direction,Length,&contact_data); + intersect = gim_trimesh_ray_collisionODE(&TriMesh->m_collision_trimesh,Origin,Direction,Length,&contact_data); } if(intersect == 0) Modified: trunk/ode/src/collision_trimesh_sphere.cpp =================================================================== --- trunk/ode/src/collision_trimesh_sphere.cpp 2008-01-02 04:26:46 UTC (rev 1343) +++ trunk/ode/src/collision_trimesh_sphere.cpp 2008-01-02 04:42:25 UTC (rev 1344) @@ -523,8 +523,11 @@ GDYNAMIC_ARRAY trimeshcontacts; GIM_CREATE_CONTACT_LIST(trimeshcontacts); + g1 -> recomputeAABB(); + SphereGeom -> recomputeAABB(); + //Collide trimeshes - gim_trimesh_sphere_collision(&TriMesh->m_collision_trimesh,Position,Radius,&trimeshcontacts); + gim_trimesh_sphere_collisionODE(&TriMesh->m_collision_trimesh,Position,Radius,&trimeshcontacts); if(trimeshcontacts.m_size == 0) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |