示例#1
0
bool CPhysicController::UpdateCharacterExtents (bool bent, float ammount)
{
	NxF32 height = m_fHeightControler;
	NxF32 radius = m_fRadiusControler;
	NxExtendedVec3 pos = m_pPhXController->getPosition();
	if ( bent )
	{
		//Ponerse de pie
		height += ammount;
		pos.y += ammount*0.5f;
	} 
	else 
	{ 
		//Agacharse
		height -= ammount;
		pos.y -= ammount*0.5f;
	}

	NxCapsule worldCapsule;
	worldCapsule.p0.x = worldCapsule.p1.x = (NxReal)pos.x;
	worldCapsule.p0.y = worldCapsule.p1.y = (NxReal)pos.y;
	worldCapsule.p0.z = worldCapsule.p1.z = (NxReal)pos.z;
	worldCapsule.p0.y -= height*0.5f;
	worldCapsule.p1.y += height*0.5f;
	worldCapsule.radius = radius;
	m_pPhXController->setCollision(false);	// Avoid checking overlap with ourself
	bool Status = m_pPhXScene->checkOverlapCapsule(worldCapsule);
	m_pPhXController->setCollision(true);
	if(Status)
	{
		return false;
	}

	NxExtendedVec3 position(pos.x, pos.y, pos.z);
	m_pPhXController->setPosition(position);
	SetPosition ( Vect3f ( (float)pos.x, (float)pos.y, (float)pos.z ) );
	NxCapsuleController* c = static_cast<NxCapsuleController*> (m_pPhXController);
	c->setHeight(height);
	m_fHeightControler = height;
	//CObject3D::InitMat44();
	return 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);
}
bool UpdateCharacterExtents(NxU32 index, bool& increase)
{
	if(index&1)
	{
		NxBoxController* c = static_cast<NxBoxController*>(gManager->getController(index));
		NxVec3 extents = c->getExtents();
		NxF32 inc = 1.0f;
		NxExtendedVec3 pos = GetCharacterPos(index);
		if (increase)
		{
			extents.y += inc;
			pos.y += inc;
		} 
		else 
		{ 
			extents.y -= inc;
			pos.y -= inc;
		}

		if(1)
		{
			NxBounds3 worldBounds;
			worldBounds.setCenterExtents(NxVec3(pos.x, pos.y, pos.z), extents);
			c->setCollision(false);	// Avoid checking overlap with ourself
			bool Status = gScene->checkOverlapAABB(worldBounds);
			c->setCollision(true);
			if(Status)
			{
				printf("Can not resize box!\n");
				return false;
			}
		}

		increase = !increase;	// Increase or decrease height each time we're called

		// WARNING: the SDK currently doesn't check for collisions when changing extents, so if you're close
		// to a wall you might end up penetrating it. In some cases you might also fall through the level.
		// A more advanced implementation will take care of that later.
		c->setPosition(pos);
		return c->setExtents(extents);
	}
	else
	{
		NxCapsuleController* c = static_cast<NxCapsuleController*>(gManager->getController(index));
		NxF32 height = c->getHeight();
		NxF32 radius = c->getRadius();
		NxF32 inc = 1.0f;
		NxExtendedVec3 pos = GetCharacterPos(index);
		if (increase)
		{
			height += inc;
			pos.y += inc*0.5f;
		} 
		else 
		{ 
			height -= inc;
			pos.y -= inc*0.5f;
		}

		if(1)
		{
			NxCapsule worldCapsule;
			worldCapsule.p0.x = worldCapsule.p1.x = pos.x;
			worldCapsule.p0.y = worldCapsule.p1.y = pos.y;
			worldCapsule.p0.z = worldCapsule.p1.z = pos.z;
			worldCapsule.p0.y -= height*0.5f;
			worldCapsule.p1.y += height*0.5f;
			worldCapsule.radius = radius;
			c->setCollision(false);	// Avoid checking overlap with ourself
			bool Status = gScene->checkOverlapCapsule(worldCapsule);
			c->setCollision(true);
			if(Status)
			{
				printf("Can not resize capsule!\n");
				return false;
			}
		}

		increase = !increase;	// Increase or decrease height each time we're called

		// WARNING: the SDK currently doesn't check for collisions when changing height, so if you're close
		// to a wall you might end up penetrating it. In some cases you might also fall through the level.
		// A more advanced implementation will take care of that later.
		c->setPosition(NxExtendedVec3(pos.x, pos.y, pos.z));
		return c->setHeight(height);
	}
}