|
From: <axl...@us...> - 2009-06-13 21:30:15
|
Revision: 316
http://hgengine.svn.sourceforge.net/hgengine/?rev=316&view=rev
Author: axlecrusher
Date: 2009-06-13 21:30:11 +0000 (Sat, 13 Jun 2009)
Log Message:
-----------
FBO works
Modified Paths:
--------------
Mercury2/scenegraph.xml
Mercury2/src/MercuryFBO.cpp
Mercury2/src/MercuryFBO.h
Mercury2/src/RenderBuffer.cpp
Mercury2/src/Texture.cpp
Mercury2/src/Texture.h
Modified: Mercury2/scenegraph.xml
===================================================================
--- Mercury2/scenegraph.xml 2009-06-13 02:35:10 UTC (rev 315)
+++ Mercury2/scenegraph.xml 2009-06-13 21:30:11 UTC (rev 316)
@@ -11,9 +11,13 @@
<asset type="texture" file="map.png"/>
<asset type="hgmdlmodel" file="map.hgmdl" />
</node>
+ <node type="renderablenode">
+ <asset type="texture" file="screenFBO" dynamic="true"/>
+ <asset type="quad"/>
+ </node>
</node>
- <node type="mercuryfbo" >
- <asset type="renderbuffer" buffertype="texture" />
+ <node type="mercuryfbo" width="512" height="512" depth="false" tnum="1" name="screenFBO">
+<!-- <asset type="renderbuffer" buffertype="texture" /> -->
<node type="renderablenode" name="lampForest">
<asset type="texture" file="lamp.png"/>
<node type="transformnode" movz="-5" movx="0" movy="0" name="lamprow" >
Modified: Mercury2/src/MercuryFBO.cpp
===================================================================
--- Mercury2/src/MercuryFBO.cpp 2009-06-13 02:35:10 UTC (rev 315)
+++ Mercury2/src/MercuryFBO.cpp 2009-06-13 21:30:11 UTC (rev 316)
@@ -4,15 +4,57 @@
REGISTER_NODE_TYPE(MercuryFBO);
MercuryFBO::MercuryFBO()
- :m_fboID(0), m_initiated(false)
+ :m_fboID(0), m_depthBufferID(0), m_initiated(false), m_useDepth(false), m_numTextures(0)
{
+ for (uint8_t i = 0; i < 4; ++i) m_textures[i] = NULL;
}
MercuryFBO::~MercuryFBO()
{
+ Clean();
+}
+
+void MercuryFBO::Clean()
+{
if (m_fboID != 0) glDeleteFramebuffersEXT(1, &m_fboID);
+ if (m_depthBufferID != 0) glDeleteRenderbuffersEXT( 1, &m_depthBufferID );
+ m_fboID = m_depthBufferID = 0;
+ m_initiated = false;
+ for (uint8_t i = 0; i < 4; ++i) m_textures[i] = NULL;
}
+void MercuryFBO::Setup()
+{
+ Clean();
+
+ m_initiated = true;
+
+ if( m_useDepth ) glGenRenderbuffersEXT( 1, &m_depthBufferID );
+ glGenFramebuffersEXT( 1, &m_fboID );
+
+ for (uint8_t i = 0; i < m_numTextures; ++i)
+ {
+ m_textures[i] = Texture::LoadDynamicTexture(m_name);
+ m_textures[i]->MakeDynamic(m_width, m_height,m_name);
+ }
+
+ if( m_useDepth )
+ {
+ glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, m_fboID );
+ glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, m_width, m_height );
+ }
+ glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_fboID );
+
+ for (uint8_t i = 0; i < m_numTextures; ++i)
+ glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + i, GL_TEXTURE_2D, m_textures[i]->TextureID(), 0 );
+
+
+ if( m_useDepth )
+ glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthBufferID );
+
+ CHECKFBO; //Incomplete FBO
+}
+/*
void MercuryFBO::InitFBOBeforeRender()
{
m_initiated = true;
@@ -20,10 +62,10 @@
CHECKFBO;
GLERRORCHECK;
}
-
+*/
void MercuryFBO::PreRender(const MercuryMatrix& matrix)
{
- if ( !m_initiated ) InitFBOBeforeRender();
+ if ( !m_initiated ) Setup();
RenderableNode::PreRender(matrix);
}
@@ -38,15 +80,17 @@
// m_lastInStask = m_lastRendered;
}
-// glPushAttrib(GL_VIEWPORT_BIT);
- // glViewport(0,0,width, height);
+ glClear(GL_COLOR_BUFFER_BIT );
+
+ glPushAttrib(GL_VIEWPORT_BIT);
+ glViewport(0,0,m_width, m_width);
RenderableNode::Render(matrix);
}
void MercuryFBO::PostRender(const MercuryMatrix& matrix)
{
-// glPopAttrib();
+ glPopAttrib();
// glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_lastInStask);
// m_lastRendered = m_lastInStask;
@@ -61,6 +105,26 @@
m_lastRendered = 0;
}
+void MercuryFBO::LoadFromXML(const XMLNode& node)
+{
+ printf("load\n");
+ if ( !node.Attribute("width").empty() )
+ SetWidth( StrToInt(node.Attribute("width")) );
+
+ if ( !node.Attribute("height").empty() )
+ SetHeight( StrToInt(node.Attribute("height")) );
+
+ if ( !node.Attribute("depth").empty() )
+ SetUseDepth( node.Attribute("depth") == "true"?true:false );
+
+ if ( !node.Attribute("tnum").empty() )
+ SetNumTextures( StrToInt(node.Attribute("tnum")) );
+
+ printf("%d %d %d %d\n", m_width, m_height, m_useDepth, m_numTextures);
+
+ RenderableNode::LoadFromXML(node);
+}
+
uint32_t MercuryFBO::m_lastRendered = NULL;
/****************************************************************************
Modified: Mercury2/src/MercuryFBO.h
===================================================================
--- Mercury2/src/MercuryFBO.h 2009-06-13 02:35:10 UTC (rev 315)
+++ Mercury2/src/MercuryFBO.h 2009-06-13 21:30:11 UTC (rev 316)
@@ -2,6 +2,7 @@
#define MERCURYFBO_H
#include <RenderableNode.h>
+#include <Texture.h>
class MercuryFBO : public RenderableNode
{
@@ -13,16 +14,31 @@
virtual void Render(const MercuryMatrix& matrix);
virtual void PostRender(const MercuryMatrix& matrix);
+ virtual void LoadFromXML(const XMLNode& node);
+
+ inline void SetWidth(uint16_t width) { m_width = width; }
+ inline void SetHeight(uint16_t height) { m_height = height; }
+ inline void SetUseDepth(bool toggle) { m_useDepth = toggle; }
+ inline void SetNumTextures(uint8_t x) { m_numTextures = x; }
+
+
GENRTTI(MercuryFBO);
private:
- void InitFBOBeforeRender();
+ void Setup();
+ void Clean();
+// void InitFBOBeforeRender();
- uint32_t m_fboID;
- bool m_initiated;
+ uint32_t m_fboID, m_depthBufferID;
+ bool m_initiated, m_useDepth;
+ uint16_t m_width, m_height;
+// uint32_t m_textureID[4];
+ Texture *m_textures[4];
+ uint8_t m_numTextures;
+
static uint32_t m_lastRendered;
- uint32_t m_lastInStask;
+// uint32_t m_lastInStask;
protected:
// AlignedBuffer<float> m_vertexData;
Modified: Mercury2/src/RenderBuffer.cpp
===================================================================
--- Mercury2/src/RenderBuffer.cpp 2009-06-13 02:35:10 UTC (rev 315)
+++ Mercury2/src/RenderBuffer.cpp 2009-06-13 21:30:11 UTC (rev 316)
@@ -37,24 +37,20 @@
void RenderBuffer::Render(const MercuryNode* node)
{
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_bufferID);
-// CHECKFBO; //missing attachment
- GLERRORCHECK;
if ( NeedResize() ) AllocateSpace();
-
- //attach to FBO
-// if ( !m_bound )
+
+ if ( m_type == TEXTURE )
{
- m_bound = true;
- if ( m_type == TEXTURE )
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GLAttachPoint(), GL_TEXTURE_2D, m_textureID, 0);
- else
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GLAttachPoint(), GL_RENDERBUFFER_EXT, m_bufferID);
- CHECKFBO;
- GLERRORCHECK;
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GLAttachPoint(), GL_TEXTURE_2D, m_textureID, 0);
}
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ else
+ {
+ glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GLAttachPoint(), GL_RENDERBUFFER_EXT, m_bufferID);
+ }
+ CHECKFBO;
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT );
GLERRORCHECK;
}
@@ -134,6 +130,8 @@
{
m_width = MercuryWindow::GetCurrentWindow()->Width();
m_height = MercuryWindow::GetCurrentWindow()->Height();
+ m_width = 512;
+ m_height = 512;
if (m_type == TEXTURE)
{
Modified: Mercury2/src/Texture.cpp
===================================================================
--- Mercury2/src/Texture.cpp 2009-06-13 02:35:10 UTC (rev 315)
+++ Mercury2/src/Texture.cpp 2009-06-13 21:30:11 UTC (rev 316)
@@ -21,12 +21,17 @@
{
REMOVE_ASSET_INSTANCE(TEXTURE, m_path);
- if (m_textureID) glDeleteTextures(1, &m_textureID);
- m_textureID = 0;
+ Clean();
SAFE_DELETE(m_raw);
}
+void Texture::Clean()
+{
+ if (m_textureID) glDeleteTextures(1, &m_textureID);
+ m_textureID = 0;
+}
+
void Texture::Init(MercuryNode* node)
{
MercuryAsset::Init( node );
@@ -101,7 +106,16 @@
void Texture::LoadFromXML(const XMLNode& node)
{
- LoadImagePath( node.Attribute("file") );
+ bool dynamic = false;
+ if ( !node.Attribute("dynamic").empty() )
+ dynamic = node.Attribute("dynamic")=="true"?true:false;
+
+ MString file = node.Attribute("file");
+
+ if ( dynamic )
+ MakeDynamic( 0, 0, file );
+ else
+ LoadImagePath( file );
}
void Texture::BindTexture()
@@ -151,6 +165,27 @@
m_raw = raw;
}
+void Texture::MakeDynamic(uint16_t width, uint16_t height, const MString& name)
+{
+ Clean();
+
+ SetLoadState(LOADED);
+
+ REMOVE_ASSET_INSTANCE(TEXTURE, m_path);
+ m_path = "DYNATEXT"+name;
+ ADD_ASSET_INSTANCE(Texture, m_path, this);
+
+ glGenTextures( 1, &m_textureID );
+ printf("booo %d\n", m_textureID);
+ glBindTexture( GL_TEXTURE_2D, m_textureID );
+ glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, width, height, 0 );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glBindTexture( GL_TEXTURE_2D, 0 );
+
+ GLERRORCHECK;
+}
+
Texture* Texture::Generate()
{
return new Texture();
@@ -164,6 +199,14 @@
return a;
}
+MAutoPtr< Texture > Texture::LoadDynamicTexture(const MString& name)
+{
+ MAutoPtr< MercuryAsset > t( AssetFactory::GetInstance().Generate("Texture", "DYNATEXT"+name) );
+ Texture *a = (Texture*)t.Ptr();
+// a->LoadImagePath( path );
+ return a;
+}
+
bool Texture::m_initTextureSuccess = false;
uint8_t Texture::m_activeTextures = 0;
uint32_t Texture::m_textureBinds = 0;
Modified: Mercury2/src/Texture.h
===================================================================
--- Mercury2/src/Texture.h 2009-06-13 02:35:10 UTC (rev 315)
+++ Mercury2/src/Texture.h 2009-06-13 21:30:11 UTC (rev 316)
@@ -10,6 +10,8 @@
Texture();
virtual ~Texture();
+ void Clean();
+
virtual void Init(MercuryNode* node);
virtual void Render(const MercuryNode* node);
@@ -21,9 +23,14 @@
inline static uint8_t NumberActiveTextures() { return m_activeTextures; }
inline static uint32_t ReadAndResetBindCount() { uint32_t t = m_textureBinds; m_textureBinds = 0; return t; }
+ inline uint32_t TextureID() const { return m_textureID; }
+ void MakeDynamic(uint16_t width, uint16_t height, const MString& name);
+
+
static Texture* Generate();
static MAutoPtr< Texture > LoadFromFile(const MString& path);
+ static MAutoPtr< Texture > LoadDynamicTexture(const MString& name);
void SetRawData(RawImageData* raw);
private:
@@ -33,8 +40,8 @@
void UnbindTexture();
const RawImageData* m_raw;
- unsigned int m_textureID;
- unsigned int m_textureResource;
+ uint32_t m_textureID;
+ uint32_t m_textureResource;
static bool m_initTextureSuccess;
static uint8_t m_activeTextures;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|