|
From: <axl...@us...> - 2009-10-12 23:55:52
|
Revision: 567
http://hgengine.svn.sourceforge.net/hgengine/?rev=567&view=rev
Author: axlecrusher
Date: 2009-10-12 23:55:41 +0000 (Mon, 12 Oct 2009)
Log Message:
-----------
updates to allow for walking on terrain
Modified Paths:
--------------
Mercury2/modules/Terrain.cpp
Mercury2/modules/Terrain.h
Modified: Mercury2/modules/Terrain.cpp
===================================================================
--- Mercury2/modules/Terrain.cpp 2009-10-12 23:54:57 UTC (rev 566)
+++ Mercury2/modules/Terrain.cpp 2009-10-12 23:55:41 UTC (rev 567)
@@ -1,4 +1,6 @@
#include "Terrain.h"
+#include <MercuryMessageManager.h>
+#include <MercuryNode.h>
REGISTER_ASSET_TYPE(Terrain);
@@ -17,6 +19,11 @@
return new Terrain();
}
+MercuryAssetInstance* Terrain::GenerateInstanceData(MercuryNode* parentNode)
+{
+ return new TerrainAssetInstance(this, parentNode);
+}
+
void Terrain::LoadedCallback()
{
BuildHash();
@@ -67,4 +74,119 @@
}
}
+MercuryVertex Terrain::ComputePositionLinear(const MercuryVertex& p)
+{
+ HGMDLMesh& mesh = *m_meshes[0];
+ const float* vertice = mesh.GetVertexHandle() + MercuryVBO::VERTEX_OFFSET;
+ const short unsigned int* indice = mesh.GetIndexHandle();
+
+ MercuryVertex l( p );
+ l[2] = 0;
+
+ MercuryVector result = l;
+
+ uint16_t length = mesh.IndiceCount();
+ uint16_t foundCount = 0;
+ for(uint16_t i = 0; i < length; i+=3)
+ {
+ MercuryVertex v1(vertice+(indice[i]*HGMDLMesh::STRIDE));
+ MercuryVertex v2(vertice+(indice[i+1]*HGMDLMesh::STRIDE));
+ MercuryVertex v3(vertice+(indice[i+2]*HGMDLMesh::STRIDE));
+
+ MTriangle t( v1, v2, v3 );
+ MTriangle tflat(t);
+
+ tflat.m_verts[0][2] = 0;
+ tflat.m_verts[1][2] = 0;
+ tflat.m_verts[2][2] = 0;
+ if ( tflat.IsInTriangle(l) )
+ {
+ ++foundCount;
+ MercuryVector b = tflat.Barycentric(l);
+
+ MercuryVector pos( t.InterpolatePosition(b) );
+ result = pos;
+// return result;
+ }
+ }
+
+ if (foundCount > 1) LOG.Write( ssprintf("!!!!!! Found %d triangles !!!!!!", foundCount) );
+ return result;
+}
+/*
+MercuryVertex Terrain::ComputePosition(const MercuryVertex& p)
+{
+ MercuryVertex l( p );
+ l[2] = 0;
+
+ std::list<MTriangle> triangles = m_hash.FindByXY(p[0], p[1]);
+ LOG.Write( ssprintf("%d", triangles.size()) );
+
+ MercuryVector result = l;
+
+ if (!triangles.empty())
+ {
+ std::list<MTriangle>::iterator i = triangles.begin();
+ for(;i != triangles.end(); ++i)
+ {
+ MTriangle t = *i;
+ t.m_verts[0][2] = 0;
+ t.m_verts[1][2] = 0;
+ t.m_verts[2][2] = 0;
+ if ( t.IsInTriangle(l) )
+ {
+ MercuryVector b = t.Barycentric(l);
+ t = *i;
+
+ MercuryVector pos;//(t.m_verts[0]);
+
+ pos = t.m_verts[0]*b[0] + t.m_verts[1]*b[1] + t.m_verts[2]*b[2];
+// pos.Print();
+// pos += (t.m_verts[0] - t.m_verts[1]) * b;
+// pos += (t.m_verts[0] - t.m_verts[2]) * b;
+
+
+// pos.Print();
+ LOG.Write("Found");
+ result[2] = result[2]<pos[2]?pos[2]:result[2];
+// return pos;
+ }
+ }
+ }
+
+ return result;
+}
+*/
+
+TerrainAssetInstance::TerrainAssetInstance(MercuryAsset* asset, MercuryNode* parentNode)
+ :base(asset, parentNode)
+{
+ REGISTER_FOR_MESSAGE("QueryTerrainPoint");
+}
+
+TerrainAssetInstance::~TerrainAssetInstance()
+{
+ UNREGISTER_FOR_MESSAGE("QueryTerrainPoint");
+}
+
+void TerrainAssetInstance::HandleMessage(const MString& message, const MessageData* data)
+{
+ if (message == "QueryTerrainPoint")
+ {
+ VertexDataMessage* v = (VertexDataMessage*)data;
+
+ //compute local space position
+ MercuryVertex local = v->Vertex * m_parentNode->GetGlobalMatrix();
+ local[3] = 1; //no W
+
+ Terrain* t = (Terrain*)m_asset.Ptr();
+ local = t->ComputePositionLinear( local );
+ local[2] += 0.5; //height of player
+
+ local = m_parentNode->GetGlobalMatrix() * local;
+ POST_MESSAGE("SetCameraPosition", new VertexDataMessage(local), 0);
+ }
+}
+
+
Modified: Mercury2/modules/Terrain.h
===================================================================
--- Mercury2/modules/Terrain.h 2009-10-12 23:54:57 UTC (rev 566)
+++ Mercury2/modules/Terrain.h 2009-10-12 23:55:41 UTC (rev 567)
@@ -17,6 +17,10 @@
static Terrain* Generate();
virtual void LoadedCallback(); //thread safe
+ virtual MercuryAssetInstance* GenerateInstanceData(MercuryNode* parentNode);
+ MercuryVertex ComputePosition(const MercuryVertex& p);
+ MercuryVertex ComputePositionLinear(const MercuryVertex& p);
+
private:
CLASS_HELPERS( HGMDLModel );
void BuildHash();
@@ -29,6 +33,16 @@
// std::vector< MAutoPtr< HGMDLMesh > > m_meshes;
};
+class TerrainAssetInstance : public MercuryAssetInstance
+{
+ public:
+ TerrainAssetInstance(MercuryAsset* asset, MercuryNode* parentNode);
+ ~TerrainAssetInstance();
+ virtual void HandleMessage(const MString& message, const MessageData* data);
+ private:
+ CLASS_HELPERS( MercuryAssetInstance );
+};
+
#endif
/****************************************************************************
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|