www.pudn.com > sancedit.rar > WireCube.cpp


// WireCube.cpp: implementation of the CWireCube class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "WireCube.h" 
#include "NewSimpleRenderable.h" 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CWireCube::CWireCube() 
{ 
	m_bInited = false; 
	 
 
 
} 
 
CWireCube::~CWireCube() 
{ 
	 
} 
 
/*	if this cube is already Inited then just change the vertices for the passed 
		in aab 
	else 
		create everything for a wireframe cube and attach it to the incoming node  
*/ 
void CWireCube::InitCube(AxisAlignedBox aab,char *name,SceneManager *pSceneMgr) 
{ 
	m_AAB = aab; 
	if (m_bInited) { 
		SetupBoundingBoxVertices(m_pvertexData,m_AAB); 
		return; 
	} 
	if (!m_bInited) { 
		assert( pSceneMgr && "CWireCube must have a SceneManager for InitCube" );		 
		RenderOperation ro;  
		m_pvertexData = new float[12*6];  
		SetupBoundingBoxVertices(m_pvertexData,m_AAB); 
		 
		m_pnormalData = new float[9];  
		m_pnormalData[0] = 0;  
		m_pnormalData[1] = 0;  
		m_pnormalData[2] = 1;  
		 
		m_pnormalData[3] = 0;  
		m_pnormalData[4] = 0;  
		m_pnormalData[5] = 1;  
		 
		m_pnormalData[6] = 0;  
		m_pnormalData[7] = 0;  
		m_pnormalData[8] = 1;  
		 
		m_pDiffuses = new long[24];  
		SetupColors(m_pDiffuses,0xFF0F00FF); 
 
		m_pSpecular = new long[3];  
		m_pSpecular[0] = 0xffffffff;  
		m_pSpecular[1] = 0xffffffff;  
		m_pSpecular[2] = 0xffffffff;  
		m_pTexCoords = new Real[2 * 3];  
		m_pTexCoords[0] = 0.0;  
		m_pTexCoords[1] = 0.0;  
		m_pTexCoords[2] = 1.0;  
		m_pTexCoords[3] = 0.0;  
		m_pTexCoords[4] = 0.0;  
		m_pTexCoords[5] = 1.0;  
		 
		//////////////////////////////////////////////// 
 
	//RenderOperation ro; 
	///*ro.useIndexes;*/ 
	///*ro.operationType;*/ 
	//ro.vertexData->vertexBufferBinding; 
	//ro.vertexData->hardwareShadowVolWBuffer; 
	//ro.vertexData->vertexCount=24; 
	//ro.vertexData->vertexDeclaration; 
	//ro.vertexData->vertexStart; 
		///////////////////////////////////////////////// 
 
		 
//		ro.numVertices = 24;  
		ro.useIndexes = false;  
//		ro.pNormals = m_pnormalData;  
//		ro.pVertices = m_pvertexData;  
//		ro.pDiffuseColour = (unsigned long*)m_pDiffuses;  
//		ro.pSpecularColour = (unsigned long*)m_pSpecular;  
//		ro.numTextureCoordSets = 1;  
//		ro.numTextureDimensions[0] = 2;  
//		ro.pTexCoords[0] = m_pTexCoords;  
		ro.operationType = RenderOperation::OT_LINE_LIST;  
		//		ro.vertexOptions = RenderOperation::VO_NORMALS | RenderOperation::VO_DIFFUSE_COLOURS | RenderOperation::VO_SPECULAR_COLOURS | RenderOperation::VO_TEXTURE_COORDS;  
//		ro.vertexOptions = RenderOperation::VO_DIFFUSE_COLOURS;  
		 
		//Material* pM = pSceneMgr->getMaterial("Material02");  
		//if (pSceneMgr->getMaterial("Wireframe") == NULL) 
//		m_pMaterial = pSceneMgr->createMaterial(name); 
		 
//		m_pMaterial->setCullingMode(CULL_NONE);  
		 
		 
		NewSimpleRenderable *sr = new NewSimpleRenderable(); 
		//NewSimpleRenderable simRender; 
		 
		//sr->setMaterial(name);  
		//sr->setRenderOperation(ro);		 
		AxisAlignedBox newBox; 
		newBox.setExtents(m_AAB.getMinimum(), m_AAB.getMaximum()); 
		//sr->setBoundingBox(newBox); 
		m_pNode = pSceneMgr->getRootSceneNode()->createChildSceneNode(); 
		m_pNode->translate(0,0,0);  
		m_pNode->attachObject(sr);  
		 
		m_bInited = true; 
	} 
} 
 
 
 
 
 
void CWireCube::SetupBoundingBoxVertices(float *pVArray,AxisAlignedBox &aab) 
{ 
 
	Vector3 vmax = aab.getMaximum(); 
	Vector3 vmin = aab.getMinimum(); 
	 
	float maxx = vmax.x + 1.0; 
	float maxy = vmax.y + 1.0; 
	float maxz = vmax.z + 1.0; 
	 
	float minx = vmin.x - 1.0; 
	float miny = vmin.y - 1.0; 
	float minz = vmin.z - 1.0; 
	 
	int i = 0; 
 
// 0 
	pVArray[i++] = minx; 
	pVArray[i++] = miny; 
	pVArray[i++] = minz; 
	pVArray[i++] = maxx; 
	pVArray[i++] = miny; 
	pVArray[i++] = minz; 
// 1 
	pVArray[i++] = minx; 
	pVArray[i++] = miny; 
	pVArray[i++] = minz; 
	pVArray[i++] = minx; 
	pVArray[i++] = miny; 
	pVArray[i++] = maxz; 
// 2 
	pVArray[i++] = minx; 
	pVArray[i++] = miny; 
	pVArray[i++] = minz; 
	pVArray[i++] = minx; 
	pVArray[i++] = maxy; 
	pVArray[i++] = minz; 
// 3 
	pVArray[i++] = minx; 
	pVArray[i++] = maxy; 
	pVArray[i++] = minz; 
	pVArray[i++] = minx; 
	pVArray[i++] = maxy; 
	pVArray[i++] = maxz; 
// 4 
	pVArray[i++] = minx; 
	pVArray[i++] = maxy; 
	pVArray[i++] = minz; 
	pVArray[i++] = maxx; 
	pVArray[i++] = maxy; 
	pVArray[i++] = minz; 
// 5 
	pVArray[i++] = maxx; 
	pVArray[i++] = miny; 
	pVArray[i++] = minz; 
	pVArray[i++] = maxx; 
	pVArray[i++] = miny; 
	pVArray[i++] = maxz; 
// 6 
	pVArray[i++] = maxx; 
	pVArray[i++] = miny; 
	pVArray[i++] = minz; 
	pVArray[i++] = maxx; 
	pVArray[i++] = maxy; 
	pVArray[i++] = minz; 
// 7 
	pVArray[i++] = minx; 
	pVArray[i++] = maxy; 
	pVArray[i++] = maxz; 
	pVArray[i++] = maxx; 
	pVArray[i++] = maxy; 
	pVArray[i++] = maxz; 
// 8 
	pVArray[i++] = minx; 
	pVArray[i++] = maxy; 
	pVArray[i++] = maxz; 
	pVArray[i++] = minx; 
	pVArray[i++] = miny; 
	pVArray[i++] = maxz; 
// 9 
	pVArray[i++] = maxx; 
	pVArray[i++] = maxy; 
	pVArray[i++] = minz; 
	pVArray[i++] = maxx; 
	pVArray[i++] = maxy; 
	pVArray[i++] = maxz; 
// 10 
	pVArray[i++] = maxx; 
	pVArray[i++] = miny; 
	pVArray[i++] = maxz; 
	pVArray[i++] = maxx; 
	pVArray[i++] = maxy; 
	pVArray[i++] = maxz; 
	// 11 
	pVArray[i++] = minx; 
	pVArray[i++] = miny; 
	pVArray[i++] = maxz; 
	pVArray[i++] = maxx; 
	pVArray[i++] = miny; 
	pVArray[i++] = maxz; 
} 
 
void CWireCube::translate(float x, float y, float z) 
{ 
	m_pNode->translate((Real)x,(Real)y,(Real)z); 
 
	Vector3 pos = m_pNode->getPosition(); 
 
/*	Real extmins[3] = { 
		-55.0,-55.0,-55.0 
	}; 
	Real extmaxs[3] = { 
		55.0,55.0,55.0 
	}; 
 
	Real mymins[3]; 
	mymins[0] = pos.x + m_AAB.getMinimum().x; 
	mymins[1] = pos.y + m_AAB.getMinimum().y; 
	mymins[2] = pos.z + m_AAB.getMinimum().z; 
	Real mymaxs[3]; 
	mymaxs[0] = pos.x + m_AAB.getMaximum().x; 
	mymaxs[1] = pos.y + m_AAB.getMaximum().y; 
	mymaxs[2] = pos.z + m_AAB.getMaximum().z; 
 
	if (checkCollision(mymins,mymaxs,extmins,extmaxs) == true) { 
		Highlight(true); 
		m_pNode->translate((Real)-x,(Real)-y,(Real)-z); 
	} else { 
		Highlight(false); 
	}*/ 
} 
 
bool CWireCube::checkCollision(Real *mymins,Real *mymaxs, Real *extmins,Real *extmaxs) 
{ 
	int i; 
	for(i = 0;i < 3; i++) { 
		if ((mymins[i] > extmaxs[i]) || (mymaxs[i] < extmins[i])) 
			return false;	// our bounding box is not within the external box 
	} 
	return true; 
} 
 
void CWireCube::Highlight(bool onoff,EHighlightColor ecolor ) 
{ 
	if (onoff)  
	{ 
		switch (ecolor)  
		{ 
		case ERed:		m_pMaterial->setAmbient(1.0,0.0,0.0); 
			break; 
		case EGreen:	m_pMaterial->setAmbient(0.0,1.0,0.0); 
			break; 
		case EBlue:		m_pMaterial->setAmbient(0.0,0.0,1.0); 
			break; 
		} 
	}  
	else  
	{ 
		m_pMaterial->setAmbient(1.0,0.0,0.0); 
	} 
} 
 
void CWireCube::SetupColors(long *pCol,long col) 
{ 
	int i; 
	for (i = 0; i < 24; i++)  
	{ 
		pCol[i] = col;  
	} 
}