void DrawShape(NxShape* shape, const NxVec3& color) { switch(shape->getType()) { case NX_SHAPE_PLANE: DrawPlane(shape); break; case NX_SHAPE_BOX: DrawBox(shape, color); break; case NX_SHAPE_SPHERE: DrawSphere(shape, color); break; case NX_SHAPE_CAPSULE: DrawCapsule(shape, color); break; case NX_SHAPE_CONVEX: DrawConvex(shape, color); break; case NX_SHAPE_MESH: DrawMesh(shape, color); break; case NX_SHAPE_WHEEL: DrawWheelShape(shape); break; default: break; } }
void CapsuleMeshQuery::PerformTest() { RenderTerrain(); mCapsule.mP0 = mP0 * mWorld; mCapsule.mP1 = mP1 * mWorld; mCapsule.mRadius = 1.0f; DrawCapsule(mWorld, mP0, mP1, 1.0f); const Model* TM = GetTerrainModel(); if(TM) { LSSCollider Collider; mProfiler.Start(); bool Status = Collider.Collide(mCache, mCapsule, *TM, null, null); mProfiler.End(); mProfiler.Accum(); if(Status) { if(Collider.GetContactStatus()) { udword NbTris = Collider.GetNbTouchedPrimitives(); const udword* Indices = Collider.GetTouchedPrimitives(); RenderTerrainTriangles(NbTris, Indices); } } } // Raycast hit if(mValidHit) { Point wp = mLocalHit + (Point)mWorld.GetTrans(); DrawLine(wp, wp + Point(1.0f, 0.0f, 0.0f), Point(1,0,0), 1.0f); DrawLine(wp, wp + Point(0.0f, 1.0f, 0.0f), Point(0,1,0), 1.0f); DrawLine(wp, wp + Point(0.0f, 0.0f, 1.0f), Point(0,0,1), 1.0f); } char Buffer[4096]; sprintf(Buffer, "Capsule-mesh query = %5.1f us (%d cycles)\n", mProfiler.mMsTime, mProfiler.mCycles); GLFontRenderer::print(10.0f, 10.0f, 0.02f, Buffer); }
static void DrawActorShadow(NxActor* actor, const float* ShadowMat) { glPushMatrix(); glMultMatrixf(ShadowMat); glDisable(GL_LIGHTING); glColor4f(0.05f, 0.1f, 0.15f, 1.0f); NxShape*const* shapes = actor->getShapes(); NxU32 nShapes = actor->getNbShapes(); while (nShapes--) { //Ignore the shapes below d=0 plane if(shapes[nShapes]->getGlobalPosition().y < 0) continue; switch(shapes[nShapes]->getType()) { case NX_SHAPE_BOX: DrawBox(shapes[nShapes]); break; case NX_SHAPE_SPHERE: DrawSphere(shapes[nShapes]); break; case NX_SHAPE_CAPSULE: DrawCapsule(shapes[nShapes]); break; case NX_SHAPE_CONVEX: DrawConvex(shapes[nShapes]); break; default: break; } } glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glEnable(GL_LIGHTING); glPopMatrix(); }
void DrawCapsule( const Vector3& p1, const Vector3& p2, float r, DWORD color ) { iexSystem::GetDevice()->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE ); DrawCapsule( iexSystem::GetDevice(), D3DXVECTOR3( p1.x, p1.y, p1.z ), D3DXVECTOR3( p2.x, p2.y, p2.z ), r, color ); iexSystem::GetDevice()->SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE ); }
void RenderCharacters() { NxU32 number = gManager->getNbControllers(); for(NxU32 i=0;i<number;i++) { if(i&1) { //#ifdef USE_BOX_CONTROLLER glDisable(GL_LIGHTING); NxBoxController* bc = static_cast<NxBoxController*>(gManager->getController(i)); // Catch current extents const NxVec3& extents = bc->getExtents(); // Generate 8 corners of the bbox NxExtendedVec3 tmp = GetCharacterPos(i); NxVec3 min = NxVec3(tmp.x, tmp.y, tmp.z) - extents; NxVec3 max = NxVec3(tmp.x, tmp.y, tmp.z) + extents; NxVec3 e = extents; e.y += SKINWIDTH; min = NxVec3(tmp.x, tmp.y, tmp.z) - e; max = NxVec3(tmp.x, tmp.y, tmp.z) + e; NxVec3 pts[8]; pts[0] = NxVec3(min.x, min.y, min.z); pts[1] = NxVec3(max.x, min.y, min.z); pts[2] = NxVec3(max.x, max.y, min.z); pts[3] = NxVec3(min.x, max.y, min.z); pts[4] = NxVec3(min.x, min.y, max.z); pts[5] = NxVec3(max.x, min.y, max.z); pts[6] = NxVec3(max.x, max.y, max.z); pts[7] = NxVec3(min.x, max.y, max.z); // Render box static float vertexBuf[24*3]; vertexBuf[ 0] = pts[0].x; vertexBuf[ 1] = pts[0].y; vertexBuf[ 2] = pts[0].z; vertexBuf[ 3] = pts[1].x; vertexBuf[ 4] = pts[1].y; vertexBuf[ 5] = pts[1].z; vertexBuf[ 6] = pts[1].x; vertexBuf[ 7] = pts[1].y; vertexBuf[ 8] = pts[1].z; vertexBuf[ 9] = pts[2].x; vertexBuf[10] = pts[2].y; vertexBuf[11] = pts[2].z; vertexBuf[12] = pts[2].x; vertexBuf[13] = pts[2].y; vertexBuf[14] = pts[2].z; vertexBuf[15] = pts[3].x; vertexBuf[16] = pts[3].y; vertexBuf[17] = pts[3].z; vertexBuf[18] = pts[3].x; vertexBuf[19] = pts[3].y; vertexBuf[20] = pts[3].z; vertexBuf[21] = pts[0].x; vertexBuf[22] = pts[0].y; vertexBuf[23] = pts[0].z; vertexBuf[24] = pts[4].x; vertexBuf[25] = pts[4].y; vertexBuf[26] = pts[4].z; vertexBuf[27] = pts[5].x; vertexBuf[28] = pts[5].y; vertexBuf[29] = pts[5].z; vertexBuf[30] = pts[5].x; vertexBuf[31] = pts[5].y; vertexBuf[32] = pts[5].z; vertexBuf[33] = pts[6].x; vertexBuf[34] = pts[6].y; vertexBuf[35] = pts[6].z; vertexBuf[36] = pts[6].x; vertexBuf[37] = pts[6].y; vertexBuf[38] = pts[6].z; vertexBuf[39] = pts[7].x; vertexBuf[40] = pts[7].y; vertexBuf[41] = pts[7].z; vertexBuf[42] = pts[7].x; vertexBuf[43] = pts[7].y; vertexBuf[44] = pts[7].z; vertexBuf[45] = pts[4].x; vertexBuf[46] = pts[4].y; vertexBuf[47] = pts[4].z; vertexBuf[48] = pts[0].x; vertexBuf[49] = pts[0].y; vertexBuf[50] = pts[0].z; vertexBuf[51] = pts[4].x; vertexBuf[52] = pts[4].y; vertexBuf[53] = pts[4].z; vertexBuf[54] = pts[1].x; vertexBuf[55] = pts[1].y; vertexBuf[56] = pts[1].z; vertexBuf[57] = pts[5].x; vertexBuf[58] = pts[5].y; vertexBuf[59] = pts[5].z; vertexBuf[60] = pts[3].x; vertexBuf[61] = pts[3].y; vertexBuf[62] = pts[3].z; vertexBuf[63] = pts[7].x; vertexBuf[64] = pts[7].y; vertexBuf[65] = pts[7].z; vertexBuf[66] = pts[2].x; vertexBuf[67] = pts[2].y; vertexBuf[68] = pts[2].z; vertexBuf[69] = pts[6].x; vertexBuf[70] = pts[6].y; vertexBuf[71] = pts[6].z; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, 24, vertexBuf); // if(i!=0 || !gJump) glColor4f(1.0f, 1.0f, 0.0f, 1.0f); // else glColor4f(1.0f, 0.0f, 1.0f, 1.0f); glDrawArrays(GL_LINES, 0, 24); glDisableClientState(GL_VERTEX_ARRAY); //#endif } else { //#ifdef USE_CAPSULE_CONTROLLER glEnable(GL_LIGHTING); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); glDepthMask(GL_FALSE); NxCapsuleController* cc = static_cast<NxCapsuleController*>(gManager->getController(i)); #ifdef DEBUG_CCT const NxExtendedVec3& pos = i ? getCharacterPos(i) : gLimitPos; #else const NxExtendedVec3& pos = GetCharacterPos(i); #endif NxF32 r = cc->getRadius(); const NxF32 h = cc->getHeight(); if(gDrawSkinWidth) r += SKINWIDTH; glDisable(GL_LIGHTING); glDisable(GL_BLEND); static GLfloat colorBuf[] = { 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f }; static GLfloat vertexBuf[8*3]; vertexBuf[ 0] = pos.x; vertexBuf[ 1] = pos.y; vertexBuf[ 2] = pos.z; vertexBuf[ 3] = pos.x+h; vertexBuf[ 4] = pos.y; vertexBuf[ 5] = pos.z; vertexBuf[ 6] = pos.x; vertexBuf[ 7] = pos.y; vertexBuf[ 8] = pos.z; vertexBuf[ 9] = pos.x; vertexBuf[10] = pos.y+h; vertexBuf[11] = pos.z; vertexBuf[12] = pos.x; vertexBuf[13] = pos.y; vertexBuf[14] = pos.z; vertexBuf[15] = pos.x; vertexBuf[16] = pos.y; vertexBuf[17] = pos.z+h; vertexBuf[18] = pos.x; vertexBuf[19] = pos.y-h*0.5f-r; vertexBuf[20] = pos.z; vertexBuf[21] = pos.x; vertexBuf[22] = pos.y+h*0.5f+r; vertexBuf[23] = pos.z; glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glVertexPointer(3, GL_FLOAT, 0, 8, vertexBuf); glColorPointer(4, GL_FLOAT, 0, 8, colorBuf); glDrawArrays(GL_LINES, 0, 8); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); glEnable(GL_BLEND); glEnable(GL_LIGHTING); float glmat[16]; memset(glmat, 0, 16*4); glmat[0] = glmat[5] = glmat[10] = glmat[15] = 1.0f; glmat[12] = pos.x; glmat[13] = pos.y; glmat[14] = pos.z; glPushMatrix(); glMultMatrixf(&(glmat[0])); NxVec3 color(1.0f, 1.0f, 1.0f); DrawCapsule(color, r, h); glPopMatrix(); //#endif } #ifdef __PPCGEKKO__ glColor4f(1.0f, 0.0f, 0.0f, 1.0f); glBegin(GL_LINES, 2); glVertex3d(gPts[i].x, gPts[i].y, gPts[i].z); glVertex3d(gPts[i].x+1.0f, gPts[i].y, gPts[i].z); glEnd(); glColor4f(0.0f, 1.0f, 0.0f, 1.0f); glBegin(GL_LINES, 2); glVertex3d(gPts[i].x, gPts[i].y, gPts[i].z); glVertex3d(gPts[i].x, gPts[i].y+1.0f, gPts[i].z); glEnd(); glColor4f(0.0f, 0.0f, 1.0f, 1.0f); glBegin(GL_LINES, 2); glVertex3d(gPts[i].x, gPts[i].y, gPts[i].z); glVertex3d(gPts[i].x, gPts[i].y, gPts[i].z+1.0f); glEnd(); #else glEnableClientState(GL_VERTEX_ARRAY); float line1[2][3] = { {gPts[i].x, gPts[i].y, gPts[i].z}, {gPts[i].x+1.0f, gPts[i].y, gPts[i].z}}; glVertexPointer(3, GL_FLOAT, 0, line1); glColor4f(1.0f, 0.0f, 0.0f, 1.0f); glDrawArrays(GL_LINES, 0, 2); float line2[2][3] = { {gPts[i].x, gPts[i].y, gPts[i].z}, {gPts[i].x, gPts[i].y+1.0f, gPts[i].z}}; glVertexPointer(3, GL_FLOAT, 0, line2); glColor4f(0.0f, 1.0f, 0.0f, 1.0f); glDrawArrays(GL_LINES, 0, 2); float line3[2][3] = { {gPts[i].x, gPts[i].y, gPts[i].z}, {gPts[i].x, gPts[i].y, gPts[i].z+1.0f}}; glVertexPointer(3, GL_FLOAT, 0, line3); glColor4f(0.0f, 0.0f, 1.0f, 1.0f); glDrawArrays(GL_LINES, 0, 2); glDisableClientState(GL_VERTEX_ARRAY); #endif #ifdef DRAW_CONTACT_DATA // Draw contact data, if valid if(gNbContactPts) { NxVec3* t = new NxVec3[gNbContactPts*2]; for(NxU32 i=0;i<gNbContactPts;i++) { t[i*2+0] = gContactPt[i]; t[i*2+1] = gContactPt[i] + gContactNorm[i] * 10.0f; } glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, t); glColor4f(1.0f, 0.0f, 1.0f, 1.0f); glDrawArrays(GL_LINES, 0, gNbContactPts*2); glDisableClientState(GL_VERTEX_ARRAY); delete[]t; gNbContactPts = 0; } #endif #ifdef DRAW_TOUCHED_TRIANGLE // Draw touched triangle, if valid if(gValidTouchedTri) { glDisable(GL_CULL_FACE); /* glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, &gTouchedTri); glColor4f(1.0f, 0.0f, 0.0f, 1.0f); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableClientState(GL_VERTEX_ARRAY);*/ NxVec3 t[6]; t[0] = gTouchedTri.verts[0]; t[1] = gTouchedTri.verts[1]; t[2] = gTouchedTri.verts[1]; t[3] = gTouchedTri.verts[2]; t[4] = gTouchedTri.verts[2]; t[5] = gTouchedTri.verts[0]; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, t); glColor4f(1.0f, 0.0f, 0.0f, 1.0f); glDrawArrays(GL_LINES, 0, 6); glDisableClientState(GL_VERTEX_ARRAY); glEnable(GL_CULL_FACE); } #endif } //#ifdef USE_CAPSULE_CONTROLLER glDisable(GL_BLEND); glDepthMask(GL_TRUE); //#endif glEnable(GL_LIGHTING); }