#ifdef _MSC_VER
#include "..\..\..\OpenGL\include\oag\OAGCube.h"
#endif
oag::OAGCube::OAGCube(void)
:m_nWidth(0)
,m_nHeight(0)
,m_nDepth(0)
{
SetPolygonMode(GL_FILL);
}
oag::OAGCube::OAGCube(float nWidth, float nHeight, float nDepth)
:m_nWidth(nWidth)
,m_nHeight(nHeight)
,m_nDepth(nDepth)
{
SetPolygonMode(GL_FILL);
}
oag::OAGCube::~OAGCube(void)
{
}
//Operations
void oag::OAGCube::CreateCube()
{
float w = GetWidth() / 2;
float h = GetHeight() / 2;
float d = GetDepth() / 2;
frontFace.SetArraySize(4);
frontFace.SetGeometryType(GL_QUADS);
frontFace.AddVertex( -w, -h, d );
frontFace.AddVertex( w, -h, d );
frontFace.AddVertex( w, h, d );
frontFace.AddVertex( -w, h, d );
backFace.SetArraySize(4);
backFace.SetGeometryType(GL_QUADS);
backFace.AddVertex( -w, -h, -d );
backFace.AddVertex( -w, h, -d );
backFace.AddVertex( w, h, -d );
backFace.AddVertex( w, -h, -d );
rightFace.SetArraySize(4);
rightFace.SetGeometryType(GL_QUADS);
rightFace.AddVertex( w, -h, d );
rightFace.AddVertex( w, -h, -d );
rightFace.AddVertex( w, h, -d );
rightFace.AddVertex( w, h, d );
leftFace.SetArraySize(4);
leftFace.SetGeometryType(GL_QUADS);
leftFace.AddVertex( -w, -h, d );
leftFace.AddVertex( -w, h, d );
leftFace.AddVertex( -w, h, -d );
leftFace.AddVertex( -w, -h, -d );
bottomFace.SetArraySize(4);
bottomFace.SetGeometryType(GL_QUADS);
bottomFace.AddVertex( -w, -h, +d );
bottomFace.AddVertex( -w, -h, -d );
bottomFace.AddVertex( w, -h, -d );
bottomFace.AddVertex( w, -h, +d );
topFace.SetArraySize(4);
topFace.SetGeometryType(GL_QUADS);
topFace.AddVertex(-w, h, -d);
topFace.AddVertex(w, h, -d);
topFace.AddVertex(w, h, d);
topFace.AddVertex(-w, h, d);
}
void oag::OAGCube::OnDraw()
{
::glPushMatrix();
::glColor4ubv( m_Color.GetColor4ubv() );
::glTranslated( m_position.m_X, m_position.m_Y, m_position.m_Z);
::glScalef( m_scale.m_X, m_scale.m_Y, m_scale.m_Z);
::glRotatef( m_rotation.m_X, 1.0, 0, 0);
::glRotatef( m_rotation.m_Y, 0, 1.0, 0);
::glRotatef( m_rotation.m_Z, 0, 0, 1.0);
frontFace.OnDraw();
rightFace.OnDraw();
backFace.OnDraw();
leftFace.OnDraw();
bottomFace.OnDraw();
topFace.OnDraw();
::glPopMatrix();
}
void oag::OAGCube::ReadNodeXML(CXmlNode* pNode)
{
oag::OAGObject::ReadNodeXML(pNode);
CXmlNode* pNodeColors = pNode->GetNode("Colors");
if( pNodeColors )
{
CXmlNode* pNodeColor = pNodeColors->GetNode("FrontFaceColor");
if( pNodeColor )
frontFace.SetColor(pNodeColor);
pNodeColor = pNodeColors->GetNode("FrontFaceColor");
if( pNodeColor )
frontFace.SetColor(pNodeColor);
pNodeColor = pNodeColors->GetNode("RightFaceColor");
if( pNodeColor )
rightFace.SetColor(pNodeColor);
pNodeColor = pNodeColors->GetNode("BackFaceColor");
if( pNodeColor )
backFace.SetColor(pNodeColor);
pNodeColor = pNodeColors->GetNode("LeftFaceColor");
if( pNodeColor )
leftFace.SetColor(pNodeColor);
pNodeColor = pNodeColors->GetNode("BottomFaceColor");
if( pNodeColor )
bottomFace.SetColor(pNodeColor);
pNodeColor = pNodeColors->GetNode("TopFaceColor");
if( pNodeColor )
topFace.SetColor(pNodeColor);
}
CXmlNode* pNodeSize = pNode->GetNode("Size");
if ( pNodeSize )
{
float value = 0.f;
value = (float)atof( pNodeSize->GetAttribute("Width").c_str() );
this->SetWidth( value );
value = (float)atof( pNodeSize->GetAttribute("Height").c_str() );
this->SetHeight( value );
value = (float)atof( pNodeSize->GetAttribute("Depth").c_str() );
this->SetDepth( value );
}
this->CreateCube();
}
void oag::OAGCube::SaveNodeXML(CXmlNode* pNode)
{
CXmlNode* pNodeBox = new CXmlNode("Box");
pNode->AppendChild( pNodeBox );
//Setting the cube color
CXmlNode* pNodeColors = new CXmlNode("Colors");
pNodeBox->AppendChild(pNodeColors);
oag::OAGColor color;
frontFace.GetColor( color );
CXmlNode* pNodeFrontFaceColor = new CXmlNode("FrontFaceColor");
CreateNodeColor(color, pNodeFrontFaceColor) ;
pNodeColors->AppendChild( pNodeFrontFaceColor );
rightFace.GetColor(color);
CXmlNode* pNodeRightFaceColor = new CXmlNode("RightFaceColor");
CreateNodeColor(color, pNodeRightFaceColor );
pNodeColors->AppendChild( pNodeRightFaceColor );
backFace.GetColor(color);
CXmlNode* pNodeBackFaceColor = new CXmlNode("BackFaceColor");
CreateNodeColor(color, pNodeBackFaceColor );
pNodeColors->AppendChild( pNodeBackFaceColor );
leftFace.GetColor(color);
CXmlNode* pNodeLeftFaceColor = new CXmlNode("LeftFaceColor");
CreateNodeColor(color, pNodeLeftFaceColor );
pNodeColors->AppendChild( pNodeLeftFaceColor );
bottomFace.GetColor(color);
CXmlNode* pNodeBottomFaceColor = new CXmlNode("BottomFaceColor");
CreateNodeColor(color, pNodeBottomFaceColor );
pNodeColors->AppendChild( pNodeBottomFaceColor );
topFace.GetColor(color);
CXmlNode* pNodeTopFaceColor = new CXmlNode("TopFaceColor");
CreateNodeColor(color, pNodeTopFaceColor);
pNodeColors->AppendChild( pNodeTopFaceColor );
char buffer[_CVTBUFSIZE];
//Setting the cube size
CXmlNode* pNodeSize = new CXmlNode("Size");
pNodeBox->AppendChild( pNodeSize );
_gcvt_s(buffer, _CVTBUFSIZE, m_nWidth, 4 );
pNodeSize->AddAttribute("Width", buffer);
_gcvt_s(buffer, _CVTBUFSIZE, m_nHeight, 4 );
pNodeSize->AddAttribute("Height", buffer);
_gcvt_s(buffer, _CVTBUFSIZE, m_nDepth, 4 );
pNodeSize->AddAttribute("Depth", buffer);
oag::OAGObject::SaveNodeXML( pNodeBox );
}