From: <yx...@us...> - 2010-12-17 00:21:27
|
Revision: 233 http://simspark.svn.sourceforge.net/simspark/?rev=233&view=rev Author: yxu Date: 2010-12-17 00:21:21 +0000 (Fri, 17 Dec 2010) Log Message: ----------- separate the render code Modified Paths: -------------- trunk/spark/plugin/imageperceptor/CMakeLists.txt trunk/spark/plugin/imageperceptor/export.cpp trunk/spark/plugin/imageperceptor/imageperceptor.cpp trunk/spark/plugin/imageperceptor/imageperceptor.h Added Paths: ----------- trunk/spark/plugin/imageperceptor/imagerender.cpp trunk/spark/plugin/imageperceptor/imagerender.h trunk/spark/plugin/imageperceptor/imagerender_c.cpp Modified: trunk/spark/plugin/imageperceptor/CMakeLists.txt =================================================================== --- trunk/spark/plugin/imageperceptor/CMakeLists.txt 2010-12-16 11:27:58 UTC (rev 232) +++ trunk/spark/plugin/imageperceptor/CMakeLists.txt 2010-12-17 00:21:21 UTC (rev 233) @@ -6,6 +6,9 @@ imageperceptor.h imageperceptor.cpp imageperceptor_c.cpp + imagerender.h + imagerender.cpp + imagerender_c.cpp ) add_library(imageperceptor MODULE ${imageperceptor_LIB_SRCS}) Modified: trunk/spark/plugin/imageperceptor/export.cpp =================================================================== --- trunk/spark/plugin/imageperceptor/export.cpp 2010-12-16 11:27:58 UTC (rev 232) +++ trunk/spark/plugin/imageperceptor/export.cpp 2010-12-17 00:21:21 UTC (rev 233) @@ -19,8 +19,9 @@ */ #include "imageperceptor.h" -#include <zeitgeist/zeitgeist.h> +#include "imagerender.h" ZEITGEIST_EXPORT_BEGIN() ZEITGEIST_EXPORT(ImagePerceptor); + ZEITGEIST_EXPORT(ImageRender); ZEITGEIST_EXPORT_END() Modified: trunk/spark/plugin/imageperceptor/imageperceptor.cpp =================================================================== --- trunk/spark/plugin/imageperceptor/imageperceptor.cpp 2010-12-16 11:27:58 UTC (rev 232) +++ trunk/spark/plugin/imageperceptor/imageperceptor.cpp 2010-12-17 00:21:21 UTC (rev 233) @@ -18,101 +18,44 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -// #include <IL/il.h> -// #include <IL/ilu.h> -// #include <sstream> -#ifndef WIN32 -#if __APPLE__ -#include <OpenGL/gl.h> -#else -#include <GL/gl.h> -#endif -#else -#include <windows.h> -#include <GL/gl.h> -#include <GL/glext.h> -#endif - #include "imageperceptor.h" #include <zeitgeist/logserver/logserver.h> -#include <boost/smart_ptr/shared_array.hpp> -#define USE_FBO - -// using namespace kerosin; using namespace oxygen; using namespace boost; using namespace zeitgeist; using namespace salt; using namespace std; -ImagePerceptor::ImagePerceptor() : oxygen::Perceptor(), - mDataSize(0) +ImagePerceptor::ImagePerceptor() : oxygen::Perceptor() { - mFramesRendered = 0; } ImagePerceptor::~ImagePerceptor() { } -#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"; \ - } - void ImagePerceptor::OnLink() { - mCamera = shared_dynamic_cast<Camera>( GetCore()->New("oxygen/Camera") ); - if ( 0 != mCamera.get() ) - { - AddChildReference(mCamera); - } - else - { - GetLog()->Error() - <<"(ImagePerceptor) ERROR: can not create camera\n"; - } - - RegisterCachedPath(mRenderServer, "/sys/server/render"); + mRender = shared_dynamic_cast<ImageRender > (GetCore()->New("ImageRender")); - if (mRenderServer.expired()) - { - GetLog()->Error() - << "(ImagePerceptor) ERROR: RenderServer not found\n"; - } + mCamera = shared_dynamic_cast<Camera > (GetCore()->New("oxygen/Camera")); + if (0 != mCamera.get()) + { + AddChildReference(mCamera); + } else + { + GetLog()->Error() + << "(ImagePerceptor) ERROR: can not create camera\n"; + } - RegisterCachedPath(mOpenGLServer,"/sys/server/opengl"); - - if (mOpenGLServer.expired()) - { - GetLog()->Error() - << "(ImagePerceptor) ERROR: OpenGLServer not found\n"; - } - - // create a framebuffer object - REG_GL_EXT_FUN( PFNGLGENFRAMEBUFFERSEXTPROC, glGenFramebuffersEXT ); - REG_GL_EXT_FUN( PFNGLGENRENDERBUFFERSEXTPROC, glGenRenderbuffersEXT); - - glGenFramebuffersEXT(1, &mFBOId); - glGenRenderbuffersEXT(1, &mRBOId); - glGenRenderbuffersEXT(1, &mDepthBuffer); - + mRender->SetCamera(mCamera); + AddChildReference(mRender); } -void ImagePerceptor::OnUnlink() -{ - REG_GL_EXT_FUN( PFNGLDELETEFRAMEBUFFERSEXTPROC, glDeleteFramebuffersEXT ); - REG_GL_EXT_FUN( PFNGLDELETERENDERBUFFERSEXTPROC, glDeleteRenderbuffersEXT ); - glDeleteFramebuffersEXT(1, &mFBOId); - glDeleteRenderbuffersEXT(1, &mRBOId); -} - bool ImagePerceptor::Percept(boost::shared_ptr<PredicateList> predList) { - if ( !Render() ) - return false; + mRender->Render(); Predicate &predicate = predList->AddPredicate(); predicate.name = "IMG"; @@ -120,107 +63,33 @@ ParameterList &sizeElement = predicate.parameter.AddList(); sizeElement.AddValue(std::string("s")); - sizeElement.AddValue(mCamera->GetViewportWidth()); - sizeElement.AddValue(mCamera->GetViewportHeight()); + sizeElement.AddValue(mRender->getWidth()); + sizeElement.AddValue(mRender->getHeight()); ParameterList &dataElement = predicate.parameter.AddList(); dataElement.AddValue(std::string("d")); - string datacode = mB64Encoder.encode(mData.get(), mDataSize); + const char* data = mRender->getData(); + string datacode = mB64Encoder.encode(data, mRender->getDataSize()); dataElement.AddValue(datacode); return true; } -bool ImagePerceptor::Render() -{ - if ( - (mOpenGLServer.expired()) || - (mRenderServer.expired()) - ) - { - return false; - } - - 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 ); - - - 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); - - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mDepthBuffer); - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, w, h); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepthBuffer); - - - // check FBO status - GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - if(status != GL_FRAMEBUFFER_COMPLETE_EXT){ - GetLog()->Error()<<"fbo error!\n"; - } -#endif - - // setup the camera - boost::shared_ptr<Camera> oldCamera = mRenderServer->GetCamera(); - mRenderServer->SetCamera(mCamera); - mRenderServer->Render(); - -#ifdef USE_FBO -#else - glReadBuffer(GL_BACK); -#endif - - glReadPixels(0, 0, - w, h, - GL_RGB, - GL_UNSIGNED_BYTE, - mData.get()); - - ++mFramesRendered; -#ifdef USE_FBO - // unbind FBO - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); -#endif - mRenderServer->SetCamera(oldCamera); - - return true; -} - void ImagePerceptor::SetViewport(unsigned int x, unsigned int y, unsigned int w, unsigned int h) { - if ( 0!= mCamera ){ - mCamera->SetViewport(x,y,w,h); - mDataSize = 3*w*h; - mData = boost::shared_array<char>(new char[mDataSize]); - } + mCamera->SetViewport(x, y, w, h); } void ImagePerceptor::SetFOV(float fov) { - if ( 0!= mCamera ){ - mCamera->SetFOV(fov); - } + mCamera->SetFOV(fov); } void ImagePerceptor::SetZNear(float zNear) { - if ( 0!= mCamera ){ - mCamera->SetZNear(zNear); - } + mCamera->SetZNear(zNear); } void ImagePerceptor::SetZFar(float zFar) { - if ( 0!= mCamera ){ - mCamera->SetZFar(zFar); - } + mCamera->SetZFar(zFar); } Modified: trunk/spark/plugin/imageperceptor/imageperceptor.h =================================================================== --- trunk/spark/plugin/imageperceptor/imageperceptor.h 2010-12-16 11:27:58 UTC (rev 232) +++ trunk/spark/plugin/imageperceptor/imageperceptor.h 2010-12-17 00:21:21 UTC (rev 233) @@ -23,11 +23,8 @@ #include <oxygen/agentaspect/perceptor.h> #include <oxygen/sceneserver/camera.h> -#include <oxygen/sceneserver/sceneserver.h> -#include <kerosin/renderserver/baserenderserver.h> -#include <kerosin/openglserver/openglserver.h> -#include <boost/shared_array.hpp> #include <libb64/encode.h> +#include "imagerender.h" class ImagePerceptor : public oxygen::Perceptor { @@ -37,11 +34,8 @@ //! \return true, if valid data is available and false otherwise. bool Percept(boost::shared_ptr<oxygen::PredicateList> predList); - - bool Render(); virtual void OnLink(); - virtual void OnUnlink(); void SetViewport(unsigned int x, unsigned int y, unsigned int w, unsigned int h); @@ -54,22 +48,8 @@ private: boost::shared_ptr<oxygen::Camera> mCamera; - /** cached reference to the RenderServer */ - CachedPath<kerosin::BaseRenderServer> mRenderServer; + boost::shared_ptr<ImageRender> mRender; - /** cached reference to the OpenGLServer */ - CachedPath<kerosin::OpenGLServer> mOpenGLServer; - - /** total frames rendered */ - int mFramesRendered; - - boost::shared_array<char> mData; - unsigned int mDataSize; - - unsigned int mFBOId; - unsigned int mRBOId; - unsigned int mDepthBuffer; - base64::Encoder mB64Encoder; }; Copied: trunk/spark/plugin/imageperceptor/imagerender.cpp (from rev 232, trunk/spark/plugin/imageperceptor/imageperceptor.cpp) =================================================================== --- trunk/spark/plugin/imageperceptor/imagerender.cpp (rev 0) +++ trunk/spark/plugin/imageperceptor/imagerender.cpp 2010-12-17 00:21:21 UTC (rev 233) @@ -0,0 +1,169 @@ +/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- + + this file is part of rcssserver3D + Copyright (C) 2008 RoboCup Soccer Server 3D Maintenance Group + $Id$ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef WIN32 +#if __APPLE__ +#include <OpenGL/gl.h> +#else +#include <GL/gl.h> +#endif +#else +#include <windows.h> +#include <GL/gl.h> +#include <GL/glext.h> +#endif + +#include "imagerender.h" +#include <zeitgeist/logserver/logserver.h> + +#define USE_FBO + +// using namespace kerosin; +using namespace oxygen; +using namespace boost; +using namespace zeitgeist; +using namespace salt; +using namespace std; + +ImageRender::ImageRender(): // kerosin::CustomRender(), + mDataSize(0), mWidth(0), mHeight(0) +{ +} + +ImageRender::~ImageRender() +{ +} +#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"; \ + } + +void ImageRender::SetCamera(boost::shared_ptr<oxygen::Camera> camera) +{ + mCamera = camera; +} + +void ImageRender::OnLink() +{ + RegisterCachedPath(mRenderServer, "/sys/server/render"); + + if (mRenderServer.expired()) + { + GetLog()->Error() + << "(ImagePerceptor) ERROR: RenderServer not found\n"; + } + + RegisterCachedPath(mOpenGLServer,"/sys/server/opengl"); + + if (mOpenGLServer.expired()) + { + GetLog()->Error() + << "(ImagePerceptor) ERROR: OpenGLServer not found\n"; + } + + // create a framebuffer object + REG_GL_EXT_FUN( PFNGLGENFRAMEBUFFERSEXTPROC, glGenFramebuffersEXT ); + REG_GL_EXT_FUN( PFNGLGENRENDERBUFFERSEXTPROC, glGenRenderbuffersEXT); + + glGenFramebuffersEXT(1, &mFBOId); + glGenRenderbuffersEXT(1, &mRBOId); + glGenRenderbuffersEXT(1, &mDepthBuffer); +} + +void ImageRender::OnUnlink() +{ + REG_GL_EXT_FUN( PFNGLDELETEFRAMEBUFFERSEXTPROC, glDeleteFramebuffersEXT ); + REG_GL_EXT_FUN( PFNGLDELETERENDERBUFFERSEXTPROC, glDeleteRenderbuffersEXT ); + glDeleteFramebuffersEXT(1, &mFBOId); + glDeleteRenderbuffersEXT(1, &mRBOId); +} + +void ImageRender::Render() +{ + if ( + (mOpenGLServer.expired()) || + (mRenderServer.expired()) + ) + { + return; + } + + 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 ); + + + 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); + + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mDepthBuffer); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, w, h); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepthBuffer); + + + // check FBO status + GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + if(status != GL_FRAMEBUFFER_COMPLETE_EXT){ +// GetLog()->Error()<<"fbo error!\n"; + } +#endif + + // setup the camera + boost::shared_ptr<Camera> oldCamera = mRenderServer->GetCamera(); + mRenderServer->SetCamera(mCamera); + mRenderServer->Render(); + +#ifdef USE_FBO +#else + glReadBuffer(GL_BACK); +#endif + + int size = w*h*3; + if ( size != mDataSize ) + { + mData = boost::shared_array<char>(new char[size]); + mDataSize = size; + } + + glReadPixels(0, 0, + w, h, + GL_RGB, + GL_UNSIGNED_BYTE, + mData.get()); + mWidth = w; + mHeight = h; + +#ifdef USE_FBO + // unbind FBO + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); +#endif +// mRenderServer->SetCamera(oldCamera); + +} Added: trunk/spark/plugin/imageperceptor/imagerender.h =================================================================== --- trunk/spark/plugin/imageperceptor/imagerender.h (rev 0) +++ trunk/spark/plugin/imageperceptor/imagerender.h 2010-12-17 00:21:21 UTC (rev 233) @@ -0,0 +1,76 @@ +/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- + + this file is part of rcssserver3D + Copyright (C) 2008 RoboCup Soccer Server 3D Maintenance Group + $Id$ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef IMAGERENDER_H +#define IMAGERENDER_H + +#include <oxygen/sceneserver/camera.h> +#include <oxygen/sceneserver/sceneserver.h> +#include <kerosin/renderserver/baserenderserver.h> +#include <kerosin/renderserver/customrender.h> +#include <kerosin/openglserver/openglserver.h> +#include <boost/shared_array.hpp> + +class ImageRender: public kerosin::CustomRender +{ +public: + ImageRender(); + + ~ImageRender(); + + void Render(); + + void SetCamera(boost::shared_ptr<oxygen::Camera> camera); + + void OnLink(); + + void OnUnlink(); + + const char* getData() const { return mData.get(); } + + int getDataSize() const { return mDataSize; } + + int getWidth() const { return mWidth; } + + int getHeight() const { return mHeight; } + +private: + boost::shared_ptr<oxygen::Camera> mCamera; + + /** cached reference to the RenderServer */ + zeitgeist::Leaf::CachedPath<kerosin::BaseRenderServer> mRenderServer; + + /** cached reference to the OpenGLServer */ + zeitgeist::Leaf::CachedPath<kerosin::OpenGLServer> mOpenGLServer; + + boost::shared_array<char> mData; + int mDataSize; + int mWidth; + int mHeight; + + unsigned int mFBOId; + unsigned int mRBOId; + unsigned int mDepthBuffer; +}; + +DECLARE_CLASS(ImageRender); + +#endif /* IMAGERENDER_H */ + Copied: trunk/spark/plugin/imageperceptor/imagerender_c.cpp (from rev 232, trunk/spark/plugin/imageperceptor/export.cpp) =================================================================== --- trunk/spark/plugin/imageperceptor/imagerender_c.cpp (rev 0) +++ trunk/spark/plugin/imageperceptor/imagerender_c.cpp 2010-12-17 00:21:21 UTC (rev 233) @@ -0,0 +1,26 @@ +/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- + + this file is part of rcssserver3D + Copyright (C) 2008 RoboCup Soccer Server 3D Maintenance Group + $Id:$ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "imagerender.h" + +void CLASS(ImageRender)::DefineClass() +{ + DEFINE_BASECLASS(kerosin/CustomRender); +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |