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