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