|
From: <cn...@us...> - 2009-09-26 18:09:33
|
Revision: 541
http://hgengine.svn.sourceforge.net/hgengine/?rev=541&view=rev
Author: cnlohr
Date: 2009-09-26 18:09:25 +0000 (Sat, 26 Sep 2009)
Log Message:
-----------
make use of new CTA + Priority Queue
Modified Paths:
--------------
Mercury2/src/MercuryMessageManager.cpp
Mercury2/src/MercuryMessageManager.h
Mercury2/src/RenderGraph.cpp
Mercury2/src/RenderGraph.h
Modified: Mercury2/src/MercuryMessageManager.cpp
===================================================================
--- Mercury2/src/MercuryMessageManager.cpp 2009-09-26 18:08:19 UTC (rev 540)
+++ Mercury2/src/MercuryMessageManager.cpp 2009-09-26 18:09:25 UTC (rev 541)
@@ -1,30 +1,39 @@
#include <MercuryMessageManager.h>
+#include <MercuryCTA.h>
+MercuryCTA HolderAllocator( sizeof(MessageHolder), 8 );
+
+
MessageHolder::MessageHolder()
- :data(NULL)
+ :data(NULL),when(0)
{
}
+bool MessageHolder::Compare( void * left, void * right )
+{
+ return (((MessageHolder*)left)->when) < (((MessageHolder*)right)->when);
+}
+
void MercuryMessageManager::PostMessage(const MString& message, MessageData* data, float delay)
{
- MessageHolder m;
- m.message = message;
- m.data = data;
- uint64_t fireTime = m_currTime + uint64_t(delay*1000000);
- m_messageQueue.Insert(fireTime, m);
+ MessageHolder * m = new(HolderAllocator.Malloc()) MessageHolder();
+ m->message = message;
+ m->data = data;
+ m->when = m_currTime + uint64_t(delay*1000000);
+ m_messageQueue.Push( m );
}
void MercuryMessageManager::PumpMessages(const uint64_t& currTime)
{
m_currTime = currTime;
- while ( !m_messageQueue.empty() )
+ while ( !m_messageQueue.Empty() )
{
- if ( m_messageQueue.PeekNextPriority() > m_currTime ) return;
+ if ( ((MessageHolder *)m_messageQueue.Peek())->when > m_currTime ) return;
- MessageHolder& message = m_messageQueue.GetNext();
- FireOffMessage( message );
- SAFE_DELETE( message.data );
- m_messageQueue.PopNext();
+ MessageHolder * message = (MessageHolder *)m_messageQueue.Pop();
+ FireOffMessage( *message );
+ SAFE_DELETE( message->data );
+ HolderAllocator.Free(message);
}
}
@@ -33,15 +42,15 @@
m_messageRecipients[message].push_back(ptr);
}
-void MercuryMessageManager::FireOffMessage(const MessageHolder& message)
+void MercuryMessageManager::FireOffMessage( const MessageHolder & message )
{
- std::map< MString, std::list< MessageHandler* > >::iterator i = m_messageRecipients.find(message.message);
-
- if ( i != m_messageRecipients.end() )
+// std::map< MString, std::list< MessageHandler* > >::iterator i = m_messageRecipients.find(message.message);
+ std::list< MessageHandler* > * ref = m_messageRecipients.get( message.message );
+ if ( ref )
{
- std::list< MessageHandler* >::iterator recipients = i->second.begin();
+ std::list< MessageHandler* >::iterator recipients = ref->begin();
- for (; recipients != i->second.end(); ++recipients)
+ for (; recipients != ref->end(); ++recipients)
(*recipients)->HandleMessage(message.message, message.data);
}
}
Modified: Mercury2/src/MercuryMessageManager.h
===================================================================
--- Mercury2/src/MercuryMessageManager.h 2009-09-26 18:08:19 UTC (rev 540)
+++ Mercury2/src/MercuryMessageManager.h 2009-09-26 18:09:25 UTC (rev 541)
@@ -1,20 +1,25 @@
#ifndef MERCURYMESSAGEMANAGER_H
#define MERCURYMESSAGEMANAGER_H
+
+#include <PriorityQueue.h>
#include <Callback.h>
#include <MessageHandler.h>
-#include <map>
-#include <PriorityQueue.h>
+#include <MercuryHash.h>
+#include <list>
#include <MercuryString.h>
#include <MercuryUtil.h>
#include <Mint.h>
+#include <MAutoPtr.h>
-class MessageHolder
+class MessageHolder : public RefBase
{
public:
MessageHolder();
MString message;
MessageData* data;
+ uint64_t when;
+ static bool Compare( void * left, void * right );
};
/* This message system uses absolute integer time values to fire off events.
@@ -25,18 +30,19 @@
class MercuryMessageManager
{
public:
+ MercuryMessageManager() : m_messageQueue( MessageHolder::Compare ) { }
void PostMessage(const MString& message, MessageData* data, float delay);
void PumpMessages(const uint64_t& currTime);
void RegisterForMessage(const MString& message, MessageHandler* ptr);
static MercuryMessageManager& GetInstance();
private:
- void FireOffMessage(const MessageHolder& message);
+ void FireOffMessage( const MessageHolder & message );
- PriorityQueue<uint64_t, MessageHolder> m_messageQueue;
+ PriorityQueue m_messageQueue;
uint64_t m_currTime; //microseconds
- std::map< MString, std::list< MessageHandler* > > m_messageRecipients;
+ MHash< std::list< MessageHandler* > > m_messageRecipients;
};
static InstanceCounter<MercuryMessageManager> MMcounter("MessageManager");
Modified: Mercury2/src/RenderGraph.cpp
===================================================================
--- Mercury2/src/RenderGraph.cpp 2009-09-26 18:08:19 UTC (rev 540)
+++ Mercury2/src/RenderGraph.cpp 2009-09-26 18:09:25 UTC (rev 541)
@@ -1,14 +1,18 @@
#include <MercuryMatrix.h>
#include <RenderGraph.h>
-
+#include <MercuryCTA.h>
#include <GLHeaders.h>
#include <Shader.h>
#include <Viewport.h>
#include <Texture.h>
+MercuryCTA AlphaHolderAllocator( sizeof(StoreRenderState), 8 );
+
RenderGraph* CURRENTRENDERGRAPH = NULL;
+
+
void RenderGraphEntry::Render()
{
MercuryMatrix modelView;
@@ -88,37 +92,40 @@
void RenderGraph::AddAlphaNode( MercuryNode* node )
{
- StoreRenderState srs;
- srs.Save();
- srs.Matrix = node->GetGlobalMatrix();
- srs.Node = node;
-
- MercuryVertex p = srs.Matrix * MercuryVertex(0,0,0,1);
+ StoreRenderState * srs = new(AlphaHolderAllocator.Malloc()) StoreRenderState();
+ srs->Save();
+ srs->Matrix = node->GetGlobalMatrix();
+ MercuryVertex p = srs->Matrix * MercuryVertex(0,0,0,1);
+ srs->Node = node;
//order from back to front (ensure furthest has lowest number and is first)
- float length = (p - EYE).Length() * -1;
- m_alphaNodesQueue.Insert(length, srs);
+ srs->fDistance = (p - EYE).Length() * -1;
+
+ //This makes the insertion linear time. We fix this up before rendering.
+ m_alphaNodesQueue.PushRaw( srs );
}
void RenderGraph::RenderAlpha()
{
- while ( !m_alphaNodesQueue.empty() )
+ m_alphaNodesQueue.Fixup();
+
+ while ( !m_alphaNodesQueue.Empty() )
{
- StoreRenderState& srs = m_alphaNodesQueue.GetNext();
-
- std::list< MercuryAsset* >::iterator i = srs.Assets.begin();
- for (;i != srs.Assets.end(); ++i)
+ StoreRenderState * srs = (StoreRenderState *)m_alphaNodesQueue.Pop();
+
+ std::list< MercuryAsset* >::iterator i = srs->Assets.begin();
+ for (;i != srs->Assets.end(); ++i)
{
- (*i)->PreRender(srs.Node);
- (*i)->Render(srs.Node);
+ (*i)->PreRender(srs->Node);
+ (*i)->Render(srs->Node);
}
- srs.Node->RecursiveRender();
+ srs->Node->RecursiveRender();
- for (i = srs.Assets.begin();i != srs.Assets.end(); ++i)
- (*i)->PostRender(srs.Node);
+ for (i = srs->Assets.begin();i != srs->Assets.end(); ++i)
+ (*i)->PostRender(srs->Node);
- m_alphaNodesQueue.PopNext();
+ AlphaHolderAllocator.Free( srs );
}
}
@@ -136,11 +143,17 @@
m_lights.clear();
}
+
StoreRenderState::StoreRenderState()
:Node(NULL)
{
}
+bool StoreRenderState::Compare( void * Left, void * Right )
+{
+ return ((StoreRenderState*)Left)->fDistance < ((StoreRenderState*)Right)->fDistance;
+}
+
void StoreRenderState::Save()
{
//get assets for current textures
Modified: Mercury2/src/RenderGraph.h
===================================================================
--- Mercury2/src/RenderGraph.h 2009-09-26 18:08:19 UTC (rev 540)
+++ Mercury2/src/RenderGraph.h 2009-09-26 18:09:25 UTC (rev 541)
@@ -39,6 +39,8 @@
void Save();
MercuryNode* Node;
MercuryMatrix Matrix;
+ float fDistance;
+ static bool Compare( void * Left, void * Right );
// private:
std::list< MercuryAsset* > Assets;
};
@@ -46,6 +48,7 @@
class RenderGraph
{
public:
+ RenderGraph() : m_alphaNodesQueue( &StoreRenderState::Compare ) { }
void Build( MercuryNode* node );
inline void Render() { m_root.Render(); }
@@ -59,7 +62,7 @@
RenderGraphEntry m_root;
//nodes that use alpha, ordered from farthest to nearest from the camera
- PriorityQueue<float, StoreRenderState > m_alphaNodesQueue;
+ PriorityQueue m_alphaNodesQueue;
std::list< Light* > m_lights;
};
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|