|
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.
|