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