From: <axl...@us...> - 2009-03-01 20:22:13
|
Revision: 152 http://hgengine.svn.sourceforge.net/hgengine/?rev=152&view=rev Author: axlecrusher Date: 2009-03-01 19:49:51 +0000 (Sun, 01 Mar 2009) Log Message: ----------- show bounding boxes Modified Paths: -------------- Mercury2/src/HGMDLMesh.cpp Mercury2/src/HGMDLMesh.h Mercury2/tools/obj2hgmdl/obj2hgmdl.cpp Modified: Mercury2/src/HGMDLMesh.cpp =================================================================== --- Mercury2/src/HGMDLMesh.cpp 2009-03-01 16:19:05 UTC (rev 151) +++ Mercury2/src/HGMDLMesh.cpp 2009-03-01 19:49:51 UTC (rev 152) @@ -1,5 +1,15 @@ #include <HGMDLMesh.h> +HGMDLMesh::HGMDLMesh() + :MercuryVBO(), m_boundingBox(NULL) +{ +} + +HGMDLMesh::~HGMDLMesh() +{ + SAFE_DELETE(m_boundingBox); +} + void HGMDLMesh::LoadFromFile(MercuryFile* hgmdl) { uint32_t nameLength; @@ -50,16 +60,154 @@ void HGMDLMesh::ReadExtraData(MercuryFile* hgmdl) { - uint32_t type, length; + uint32_t type; + hgmdl->Read( &type, sizeof(char)*4 ); + + switch( type ) + { + case 541213263: + { + LoadOBB(hgmdl); + break; + } + default: + { + printf("Junk extra type '%x'\n", type); + //read and discard as junk + uint32_t length; + hgmdl->Read( &length, sizeof(uint32_t) ); + if ( length > 0 ) + { + char* data = new char[length]; + hgmdl->Read( data, length ); + SAFE_DELETE_ARRAY(data); + } + break; + } + } +} + +void HGMDLMesh::LoadOBB(MercuryFile* hgmdl) +{ + uint32_t length; char* data = NULL; - hgmdl->Read( &type, sizeof(char)*4 ); + hgmdl->Read( &length, sizeof(uint32_t) ); + if (length > 0) + { + data = new char[length]; + hgmdl->Read( data, length ); + + m_boundingBox = new OBB(); + m_boundingBox->LoadFromBinary( data ); + } + + SAFE_DELETE_ARRAY(data); +} + +void OBB::LoadFromBinary(char* data) +{ + memcpy(center, data, sizeof(float)*3); + memcpy(extend, data, sizeof(float)*3); +} + +#include <GL/gl.h> +#include <GL/glext.h> + +void OBB::Render(MercuryNode* node) +{ + glPushAttrib( GL_CURRENT_BIT ); + glBegin(GL_LINES); + glColor3f(0,1.0f,0); + + //front + glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]); + glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]); + glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]); + glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]); + glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]); + glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]); + glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]); + glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]); + + //back + glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]); + glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]); + glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]); + glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]); + glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]); + glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]); + glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]); + glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]); + + //top + glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]); + glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]); + glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]); + glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]); + + //bottom + glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]); + glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]); + glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]); + glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]); + +/* + glBegin(GL_QUADS); + //front + glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]); + glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]); + glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]); + glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]); - data = new char[length]; - hgmdl->Read( data, length ); - delete data; + //back + glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]); + glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]); + glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]); + glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]); + + //left side + glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]); + glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]); + glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]); + glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]); + + //right side + glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]); + glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]); + glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]); + glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]); + + //top + glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]); + glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]); + glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]); + glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]); + + //bottom + glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]); + glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]); + glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]); + glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]); +*/ + glEnd(); + + glPointSize(4); + glBegin(GL_POINTS); + glVertex3f(center[0], center[1], center[2]); + glEnd(); + + glPopAttrib( ); } +void HGMDLMesh::Render(MercuryNode* node) +{ + MercuryVBO::Render(node); + + if (m_boundingBox) + m_boundingBox->Render(node); +} + /**************************************************************************** * Copyright (C) 2008 by Joshua Allen * * * Modified: Mercury2/src/HGMDLMesh.h =================================================================== --- Mercury2/src/HGMDLMesh.h 2009-03-01 16:19:05 UTC (rev 151) +++ Mercury2/src/HGMDLMesh.h 2009-03-01 19:49:51 UTC (rev 152) @@ -4,14 +4,33 @@ #include <MercuryVBO.h> #include <MercuryFile.h> +class OBB : public MercuryAsset +{ + public: + void LoadFromBinary(char* data); + + virtual void Render(MercuryNode* node); + + float center[3]; + float extend[3]; +}; + class HGMDLMesh : public MercuryVBO { public: + HGMDLMesh(); + ~HGMDLMesh(); void LoadFromFile(MercuryFile* hgmdl); void ReadExtraData(MercuryFile* hgmdl); + void LoadOBB(MercuryFile* hgmdl); + + virtual void Render(MercuryNode* node); + private: MString m_name; bool m_cachable; + + OBB* m_boundingBox; }; #endif Modified: Mercury2/tools/obj2hgmdl/obj2hgmdl.cpp =================================================================== --- Mercury2/tools/obj2hgmdl/obj2hgmdl.cpp 2009-03-01 16:19:05 UTC (rev 151) +++ Mercury2/tools/obj2hgmdl/obj2hgmdl.cpp 2009-03-01 19:49:51 UTC (rev 152) @@ -188,9 +188,9 @@ if (line.length() > 0) LineParser(line); } - printf("%f %f %f\n", minX, maxX, (maxX-minX)/2.0f ); - printf("%f %f %f\n", minY, maxY, (maxY-minY)/2.0f ); - printf("%f %f %f\n", minZ, maxZ, (maxZ-minZ)/2.0f ); + printf("X min:%f max:%f %f\n", minX, maxX, (maxX-minX)/2.0f ); + printf("Y min:%f max:%f %f\n", minY, maxY, (maxY-minY)/2.0f ); + printf("Z min:%f max:%f %f\n", minZ, maxZ, (maxZ-minZ)/2.0f ); WriteMBMF( mbmf ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |