From: <yx...@us...> - 2010-12-17 00:23:23
|
Revision: 238 http://simspark.svn.sourceforge.net/simspark/?rev=238&view=rev Author: yxu Date: 2010-12-17 00:23:17 +0000 (Fri, 17 Dec 2010) Log Message: ----------- be able to render camera image on and off screen Modified Paths: -------------- trunk/rcssserver3d/data/rsg/agent/nao/naoneckhead.rsg trunk/spark/lib/kerosin/renderserver/baserenderserver.h trunk/spark/lib/kerosin/renderserver/rendercontrol.cpp trunk/spark/lib/kerosin/renderserver/renderserver.cpp trunk/spark/lib/kerosin/renderserver/renderserver.h trunk/spark/plugin/imageperceptor/imageperceptor.cpp trunk/spark/plugin/imageperceptor/imageperceptor.h trunk/spark/plugin/imageperceptor/imageperceptor_c.cpp trunk/spark/plugin/imageperceptor/imagerender.cpp trunk/spark/plugin/imageperceptor/imagerender.h trunk/spark/test/scenetest/main.cpp Modified: trunk/rcssserver3d/data/rsg/agent/nao/naoneckhead.rsg =================================================================== --- trunk/rcssserver3d/data/rsg/agent/nao/naoneckhead.rsg 2010-12-17 00:22:35 UTC (rev 237) +++ trunk/rcssserver3d/data/rsg/agent/nao/naoneckhead.rsg 2010-12-17 00:23:17 UTC (rev 238) @@ -99,7 +99,8 @@ ;; (setLocalRotation 0 0 0) ;; (nd ImagePerceptor ;; (setInterval 3) - ;; (setViewport 0 0 320 240) + ;; (setOffScreen false) + ;; (setResolution 320 240) ;; (setFOV 58) ;; (setZNear 0.003) ;; (setZFar 50) Modified: trunk/spark/lib/kerosin/renderserver/baserenderserver.h =================================================================== --- trunk/spark/lib/kerosin/renderserver/baserenderserver.h 2010-12-17 00:22:35 UTC (rev 237) +++ trunk/spark/lib/kerosin/renderserver/baserenderserver.h 2010-12-17 00:23:17 UTC (rev 238) @@ -51,7 +51,7 @@ virtual ~BaseRenderServer() {} //! display the current active scene - virtual void Render() = 0; + virtual void Render(bool clean) = 0; //! width of the render target virtual int Width() const { return 0; } Modified: trunk/spark/lib/kerosin/renderserver/rendercontrol.cpp =================================================================== --- trunk/spark/lib/kerosin/renderserver/rendercontrol.cpp 2010-12-17 00:22:35 UTC (rev 237) +++ trunk/spark/lib/kerosin/renderserver/rendercontrol.cpp 2010-12-17 00:23:17 UTC (rev 238) @@ -87,7 +87,7 @@ // update the window (pumps event loop, etc..) and render the // current frame mOpenGLServer->Update(); - mRenderServer->Render(); + mRenderServer->Render(true); RenderCustom(); mOpenGLServer->SwapBuffers(); ++mFramesRendered; Modified: trunk/spark/lib/kerosin/renderserver/renderserver.cpp =================================================================== --- trunk/spark/lib/kerosin/renderserver/renderserver.cpp 2010-12-17 00:22:35 UTC (rev 237) +++ trunk/spark/lib/kerosin/renderserver/renderserver.cpp 2010-12-17 00:23:17 UTC (rev 238) @@ -56,7 +56,7 @@ } void -RenderServer::Render() +RenderServer::Render(bool clean) { PreparePicking(); @@ -74,21 +74,29 @@ GetLog()->Error() << "(RenderServer) ERROR: found no camera node in the active scene\n"; return; - } + } + // set the view transformation + BindCamera(mCamera); + glClearColor( - mAmbientColor.r(), - mAmbientColor.g(), - mAmbientColor.b(), - mAmbientColor.a() - ); + mAmbientColor.r(), + mAmbientColor.g(), + mAmbientColor.b(), + mAmbientColor.a() + ); - glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); - glColor3f(1,1,1); + if (clean) + { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + } + else + { + glClear(GL_DEPTH_BUFFER_BIT); + } + glColor3f(1, 1, 1); + - // set the view transformation - BindCamera(mCamera); - // actual rendering // ambient pass Modified: trunk/spark/lib/kerosin/renderserver/renderserver.h =================================================================== --- trunk/spark/lib/kerosin/renderserver/renderserver.h 2010-12-17 00:22:35 UTC (rev 237) +++ trunk/spark/lib/kerosin/renderserver/renderserver.h 2010-12-17 00:23:17 UTC (rev 238) @@ -65,7 +65,7 @@ virtual ~RenderServer() {} //! display the current active scene - virtual void Render(); + virtual void Render(bool clean); //! @return the width of the current view virtual int Width() const; Modified: trunk/spark/plugin/imageperceptor/imageperceptor.cpp =================================================================== --- trunk/spark/plugin/imageperceptor/imageperceptor.cpp 2010-12-17 00:22:35 UTC (rev 237) +++ trunk/spark/plugin/imageperceptor/imageperceptor.cpp 2010-12-17 00:23:17 UTC (rev 238) @@ -89,9 +89,9 @@ return true; } -void ImagePerceptor::SetViewport(unsigned int x, unsigned int y, unsigned int w, unsigned int h) +void ImagePerceptor::SetResolution(unsigned int w, unsigned int h) { - mCamera->SetViewport(x, y, w, h); + mRender->SetResolution(w,h); } void ImagePerceptor::SetFOV(float fov) @@ -108,3 +108,8 @@ { mCamera->SetZFar(zFar); } + +void ImagePerceptor::SetOffScreen(bool offScreen) +{ + mRender->SetOffScreen(offScreen); +} Modified: trunk/spark/plugin/imageperceptor/imageperceptor.h =================================================================== --- trunk/spark/plugin/imageperceptor/imageperceptor.h 2010-12-17 00:22:35 UTC (rev 237) +++ trunk/spark/plugin/imageperceptor/imageperceptor.h 2010-12-17 00:23:17 UTC (rev 238) @@ -38,13 +38,15 @@ virtual void OnLink(); - void SetViewport(unsigned int x, unsigned int y, unsigned int w, unsigned int h); + void SetResolution(unsigned int w, unsigned int h); void SetFOV(float fov); void SetZNear(float zNear); void SetZFar(float zFar); + + void SetOffScreen(bool offScreen); private: boost::shared_ptr<oxygen::Camera> mCamera; Modified: trunk/spark/plugin/imageperceptor/imageperceptor_c.cpp =================================================================== --- trunk/spark/plugin/imageperceptor/imageperceptor_c.cpp 2010-12-17 00:22:35 UTC (rev 237) +++ trunk/spark/plugin/imageperceptor/imageperceptor_c.cpp 2010-12-17 00:23:17 UTC (rev 238) @@ -23,22 +23,20 @@ using namespace boost; using namespace oxygen; -FUNCTION(ImagePerceptor, setViewport) +FUNCTION(ImagePerceptor, setResolution) { - unsigned int x,y,w,h; + unsigned int w,h; if ( - (in.GetSize() != 4) || - (! in.GetValue(in[0], x) ) || - (! in.GetValue(in[1], y) ) || - (! in.GetValue(in[2], w) ) || - (! in.GetValue(in[3], h) ) + (in.GetSize() != 2) || + (! in.GetValue(in[0], w) ) || + (! in.GetValue(in[1], h) ) ) { return false; } - obj->SetViewport(x, y, w, h); + obj->SetResolution(w, h); return true; } @@ -90,11 +88,28 @@ return true; } +FUNCTION(ImagePerceptor, setOffScreen) +{ + bool offScreen; + + if ( + (in.GetSize() != 1) || + (! in.GetValue(in[0], offScreen) ) + ) + { + return false; + } + + obj->SetOffScreen(offScreen); + return true; +} + void CLASS(ImagePerceptor)::DefineClass() { DEFINE_BASECLASS(oxygen/Perceptor); - DEFINE_FUNCTION(setViewport); + DEFINE_FUNCTION(setResolution); DEFINE_FUNCTION(setFOV); DEFINE_FUNCTION(setZNear); DEFINE_FUNCTION(setZFar); + DEFINE_FUNCTION(setOffScreen); } Modified: trunk/spark/plugin/imageperceptor/imagerender.cpp =================================================================== --- trunk/spark/plugin/imageperceptor/imagerender.cpp 2010-12-17 00:22:35 UTC (rev 237) +++ trunk/spark/plugin/imageperceptor/imagerender.cpp 2010-12-17 00:23:17 UTC (rev 238) @@ -33,7 +33,6 @@ #include "imagerender.h" #include <zeitgeist/logserver/logserver.h> -#define USE_FBO // using namespace kerosin; using namespace oxygen; @@ -42,8 +41,12 @@ using namespace salt; using namespace std; +unsigned int ImageRender::autoScreenPosX = 0; +unsigned int ImageRender::autoScreenPosY = 0; + ImageRender::ImageRender(): kerosin::CustomRender(), - mDataSize(0), mWidth(0), mHeight(0), mRequested(false) + mDataSize(0), mWidth(0), mHeight(0), mRequested(false),mOffScreen(false), + mScreenPosX(0), mScreenPosY(0) { } @@ -53,7 +56,7 @@ #define REG_GL_EXT_FUN(_ptr, _function) \ static _ptr _function = (_ptr) mOpenGLServer->GetExtension(#_function);\ if ( !_function ){ \ - GetLog()->Error()<<"(Image Perceptor) ERROR: can not get "#_function"\n"; \ + GetLog()->Error()<<"(ImageRender) ERROR: can not get "#_function"\n"; \ } void ImageRender::SetCamera(boost::shared_ptr<oxygen::Camera> camera) @@ -68,7 +71,7 @@ if (mRenderServer.expired()) { GetLog()->Error() - << "(ImagePerceptor) ERROR: RenderServer not found\n"; + << "(ImageRender) ERROR: RenderServer not found\n"; } RegisterCachedPath(mOpenGLServer,"/sys/server/opengl"); @@ -76,7 +79,7 @@ if (mOpenGLServer.expired()) { GetLog()->Error() - << "(ImagePerceptor) ERROR: OpenGLServer not found\n"; + << "(ImageRender) ERROR: OpenGLServer not found\n"; } // create a framebuffer object @@ -98,6 +101,7 @@ void ImageRender::Render() { + mRequested = true; if ( (!mRequested) || (mOpenGLServer.expired()) || (mRenderServer.expired()) @@ -109,19 +113,20 @@ int w = mCamera->GetViewportWidth(); int h = mCamera->GetViewportHeight(); -#ifdef USE_FBO - REG_GL_EXT_FUN( PFNGLBINDFRAMEBUFFEREXTPROC, glBindFramebufferEXT ); - REG_GL_EXT_FUN( PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, glFramebufferRenderbufferEXT ); - REG_GL_EXT_FUN( PFNGLRENDERBUFFERSTORAGEEXTPROC, glRenderbufferStorageEXT ); - REG_GL_EXT_FUN( PFNGLBINDRENDERBUFFEREXTPROC, glBindRenderbufferEXT); - REG_GL_EXT_FUN( PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, glCheckFramebufferStatusEXT ); + if (mOffScreen) + { + REG_GL_EXT_FUN(PFNGLBINDFRAMEBUFFEREXTPROC, glBindFramebufferEXT); + REG_GL_EXT_FUN(PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, glFramebufferRenderbufferEXT); + REG_GL_EXT_FUN(PFNGLRENDERBUFFERSTORAGEEXTPROC, glRenderbufferStorageEXT); + REG_GL_EXT_FUN(PFNGLBINDRENDERBUFFEREXTPROC, glBindRenderbufferEXT); + REG_GL_EXT_FUN(PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, glCheckFramebufferStatusEXT); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBOId); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mRBOId); glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, w, h); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, - GL_RENDERBUFFER_EXT, mRBOId); + GL_RENDERBUFFER_EXT, mRBOId); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mDepthBuffer); glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, w, h); @@ -130,20 +135,22 @@ // check FBO status GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - if(status != GL_FRAMEBUFFER_COMPLETE_EXT){ -// GetLog()->Error()<<"fbo error!\n"; + if (status != GL_FRAMEBUFFER_COMPLETE_EXT) + { + GetLog()->Error() << "(ImageRender) fbo error!\n"; } -#endif + } + // setup the camera boost::shared_ptr<Camera> oldCamera = mRenderServer->GetCamera(); mRenderServer->SetCamera(mCamera); - mRenderServer->Render(); + mRenderServer->Render(false); -#ifdef USE_FBO -#else + if (!mOffScreen) + { glReadBuffer(GL_BACK); -#endif + } int size = w*h*3; if ( size != mDataSize ) @@ -152,7 +159,7 @@ mDataSize = size; } - glReadPixels(0, 0, + glReadPixels(, mScreenPosY, w, h, GL_RGB, GL_UNSIGNED_BYTE, @@ -160,11 +167,35 @@ mWidth = w; mHeight = h; -#ifdef USE_FBO + if (mOffScreen) + { // unbind FBO + REG_GL_EXT_FUN(PFNGLBINDFRAMEBUFFEREXTPROC, glBindFramebufferEXT); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); -#endif + } + mRenderServer->SetCamera(oldCamera); mRequested = false; } + +void ImageRender::SetResolution(int w, int h) +{ + if (!mOffScreen) // HACK! + { + // asssert this function is called only once per instance + // auto position on screen (simple) + mScreenPosX = autoScreenPosX; + int screenWidth = mRenderServer->GetCamera()->GetViewportWidth(); + if (mScreenPosX + w > screenWidth) + { + mScreenPosX = 0; + autoScreenPosY += h; + } + autoScreenPosX = mScreenPosX + w; + mScreenPosY = autoScreenPosY; + // + } + + mCamera->SetViewport(mScreenPosX, mScreenPosY, w, h); +} \ No newline at end of file Modified: trunk/spark/plugin/imageperceptor/imagerender.h =================================================================== --- trunk/spark/plugin/imageperceptor/imagerender.h 2010-12-17 00:22:35 UTC (rev 237) +++ trunk/spark/plugin/imageperceptor/imagerender.h 2010-12-17 00:23:17 UTC (rev 238) @@ -53,7 +53,14 @@ void RequestRender() { mRequested = true; } + void SetResolution(int w, int h); + + void SetOffScreen(bool offScreen) { mOffScreen = offScreen; } + + void SetScreenPos(int x, int y) { mScreenPosX = x; mScreenPosY = y; } + private: + boost::shared_ptr<oxygen::Camera> mCamera; /** cached reference to the RenderServer */ @@ -67,10 +74,15 @@ int mWidth; int mHeight; bool mRequested; + bool mOffScreen; + int mScreenPosX, mScreenPosY; unsigned int mFBOId; unsigned int mRBOId; unsigned int mDepthBuffer; + + static unsigned int autoScreenPosX; + static unsigned int autoScreenPosY; }; DECLARE_CLASS(ImageRender); Modified: trunk/spark/test/scenetest/main.cpp =================================================================== --- trunk/spark/test/scenetest/main.cpp 2010-12-17 00:22:35 UTC (rev 237) +++ trunk/spark/test/scenetest/main.cpp 2010-12-17 00:23:17 UTC (rev 238) @@ -163,7 +163,7 @@ shared_static_cast<RenderServer>(gContext->Get("/sys/server/scene")); if (renderServer) { - renderServer->Render(); + renderServer->Render(true); } #endif } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |