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;
}
}