コード例 #1
0
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;
	}
}
コード例 #2
0
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);
}
コード例 #3
0
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();
}
コード例 #4
0
	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 );
	}
コード例 #5
0
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);
}