Sirikata
libogre/include/sirikata/ogre/OgreRenderer.hpp
Go to the documentation of this file.
00001 /*  Sirikata
00002  *  OgreRenderer.hpp
00003  *
00004  *  Copyright (c) 2011, Stanford University
00005  *  All rights reserved.
00006  *
00007  *  Redistribution and use in source and binary forms, with or without
00008  *  modification, are permitted provided that the following conditions are
00009  *  met:
00010  *  * Redistributions of source code must retain the above copyright
00011  *    notice, this list of conditions and the following disclaimer.
00012  *  * Redistributions in binary form must reproduce the above copyright
00013  *    notice, this list of conditions and the following disclaimer in
00014  *    the documentation and/or other materials provided with the
00015  *    distribution.
00016  *  * Neither the name of Sirikata nor the names of its contributors may
00017  *    be used to endorse or promote products derived from this software
00018  *    without specific prior written permission.
00019  *
00020  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
00021  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
00022  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00023  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
00024  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00025  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00026  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00027  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00028  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00029  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00030  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00031  */
00032 
00033 #ifndef _SIRIKATA_OGRE_OGRE_RENDERER_HPP_
00034 #define _SIRIKATA_OGRE_OGRE_RENDERER_HPP_
00035 
00036 #include <sirikata/ogre/Platform.hpp>
00037 #include <sirikata/ogre/OgreHeaders.hpp>
00038 #include "OgreResource.h"
00039 #include <sirikata/mesh/Visual.hpp>
00040 #include <sirikata/core/service/Context.hpp>
00041 #include <sirikata/core/transfer/TransferMediator.hpp>
00042 #include <sirikata/oh/TimeSteppedSimulation.hpp>
00043 #include <OgreWindowEventUtilities.h>
00044 #include <sirikata/core/util/Liveness.hpp>
00045 #include <sirikata/ogre/Skybox.hpp>
00046 
00047 namespace Sirikata {
00048 
00049 namespace Input {
00050 class SDLInputManager;
00051 }
00052 
00053 namespace Mesh {
00054 class Filter;
00055 }
00056 class ModelsSystem;
00057 
00058 namespace Graphics {
00059 
00060 class Camera;
00061 class Entity;
00062 
00063 class ResourceLoader;
00064 class CDNArchivePlugin;
00065 class ResourceDownloadPlanner;
00066 class PriorityDownloadPlanner;
00067 
00068 using Input::SDLInputManager;
00069 
00070 class ParseMeshTaskInfo {
00071 public:
00072     ParseMeshTaskInfo()
00073      : mProcess(true)
00074     {}
00075 
00076     void cancel() {
00077         mProcess = false;
00078     }
00079 
00080     bool process() const { return mProcess; }
00081 private:
00082     bool mProcess;
00083 };
00084 typedef std::tr1::shared_ptr<ParseMeshTaskInfo> ParseMeshTaskHandle;
00085 
00086 
00088 class SIRIKATA_OGRE_EXPORT OgreRenderer :
00089         public TimeSteppedSimulation,
00090         public Ogre::WindowEventListener,
00091         public virtual Liveness
00092 {
00093 public:
00094     OgreRenderer(Context* ctx,Network::IOStrandPtr sStrand);
00095     virtual ~OgreRenderer();
00096 
00097     virtual bool initialize(const String& options, bool with_berkelium = true);
00098 
00099     Context* context() const { return mContext; }
00100 
00101     void toggleSuspend();
00102     void suspend();
00103     void resume();
00104 
00105     // Initiate quiting by indicating to the main loop that we want to shut down
00106     void quit();
00107 
00108     // Event injection for SDL created windows.
00109     void injectWindowResized(uint32 w, uint32 h);
00110 
00111     const Vector3d& getOffset() const { return mFloatingPointOffset; }
00112 
00113     virtual Transfer::TransferPoolPtr transferPool();
00114 
00115     ResourceDownloadPlanner* downloadPlanner();
00116 
00117     virtual Ogre::RenderTarget* createRenderTarget(const String &name, uint32 width, uint32 height, bool automipmap, int pixelFmt);
00118     virtual Ogre::RenderTarget* createRenderTarget(String name,uint32 width=0, uint32 height=0);
00119     virtual void destroyRenderTarget(Ogre::ResourcePtr& name);
00120     virtual void destroyRenderTarget(const String &name);
00121 
00122     Network::IOStrandPtr renderStrand()
00123     {
00124         return simStrand;
00125     }
00126 
00127 
00128     Ogre::SceneManager* getSceneManager() {
00129         return mSceneManager;
00130     }
00131 
00132     Ogre::SceneManager* getOverlaySceneManager() {
00133         return mOverlaySceneManager;
00134     }
00135 
00136     Ogre::RenderTarget* getRenderTarget() {
00137         return mRenderTarget;
00138     }
00139 
00140     SDLInputManager *getInputManager() {
00141         return mInputManager;
00142     }
00143 
00144     ResourceLoader* getResourceLoader() const {
00145         return mResourceLoader;
00146     }
00147 
00148     // TimeSteppedSimulation Interface
00149     virtual void poll();
00150     virtual void stop();
00151 
00152     // Invokable Interface
00153     //should only invoke from within simStrand
00154     virtual boost::any invoke(std::vector<boost::any>& params);
00155 
00156 
00157     // Ogre::WindowEventListener Interface overloads
00158     virtual void windowResized(Ogre::RenderWindow *rw);
00159     virtual void windowFocusChange(Ogre::RenderWindow *rw);
00160 
00161     // Options values
00162     virtual float32 nearPlane();
00163     virtual float32 farPlane();
00164     virtual float32 parallaxSteps();
00165     virtual int32 parallaxShadowSteps();
00166 
00168     virtual void attachCamera(const String& renderTargetName, Camera*);
00170     virtual void detachCamera(Camera*);
00171 
00172     void addObject(Entity* ent, const Transfer::URI& mesh);
00173     void removeObject(Entity* ent);
00174 
00175     typedef std::tr1::function<void(Mesh::VisualPtr)> ParseMeshCallback;
00176 
00190     ParseMeshTaskHandle parseMesh(const Transfer::RemoteFileMetadata& metadata, const Transfer::Fingerprint& fp, Transfer::DenseDataPtr data, bool isAggregate, ParseMeshCallback cb);
00191 
00195     virtual Mesh::VisualPtr defaultMesh() const { return Mesh::VisualPtr(); }
00196 
00197     void screenshot(const String& filename);
00198     void screenshotNextFrame(const String& filename);
00199   protected:
00200     Network::IOStrandPtr simStrand;
00201     static Ogre::Root *getRoot();
00202 
00203     bool loadBuiltinPlugins();
00204     // Loads system lights if they are being used.
00205     void loadSystemLights();
00206     // Helper for loadSystemLights.
00207     void constructSystemLight(const String& name, const Vector3f& direction, float brightness);
00208 
00209     bool useModelLights() const;
00210 
00211     virtual bool renderOneFrame(Task::LocalTime, Duration frameTime);
00213     virtual void preFrame(Task::LocalTime, Duration);
00215     virtual void postFrame(Task::LocalTime, Duration);
00216 
00217     void iStop(Liveness::Token rendererAlive);
00218 
00219     void parseMeshWork(
00220         Liveness::Token rendererAlive,
00221         ParseMeshTaskHandle handle,
00222         const Transfer::RemoteFileMetadata& metadata,
00223         const Transfer::Fingerprint& fp, Transfer::DenseDataPtr data,
00224         bool isAggregate, ParseMeshCallback cb);
00225 
00226     Mesh::VisualPtr parseMeshWorkSync(const Transfer::RemoteFileMetadata& metadata, const Transfer::Fingerprint& fp, Transfer::DenseDataPtr data, bool isAggregate);
00227 
00228 
00229     // Invokable helpers
00230     typedef std::tr1::function<boost::any(std::vector<boost::any>& params)> InvokableHandler;
00231     typedef std::tr1::unordered_map<String, InvokableHandler> InvokableHandlerMap;
00232     InvokableHandlerMap mInvokableHandlers;
00233 
00234     // Set handler to be called on each tick, i.e. before each frame
00235     boost::any setOnTick(std::vector<boost::any>& params);
00236     boost::any maxObjects(std::vector<boost::any>& params);
00237     boost::any objectPrioritization(std::vector<boost::any>& params);
00238     boost::any rendererStats(std::vector<boost::any>& params);
00239 
00240     static Ogre::Root* sRoot;
00241     static Ogre::Plugin* sCDNArchivePlugin;
00242     static CDNArchivePlugin* mCDNArchivePlugin;
00243     static std::list<OgreRenderer*> sActiveOgreScenes;
00244     static uint32 sNumOgreSystems;
00245     static Ogre::RenderTarget *sRenderTarget; // FIXME why a static render target?
00246 
00247     Context* mContext;
00248 
00249     bool mQuitRequested;
00250     bool mQuitRequestHandled;
00251 
00252     bool mSuspended;
00253 
00254     // FIXME because we don't have proper multithreaded support in cppoh, we
00255     // need to allocate our own thread dedicated to parsing
00256     Network::IOService* mParsingIOService;
00257     Network::IOWork* mParsingWork;
00258     Thread* mParsingThread;
00259 
00260     SDLInputManager *mInputManager;
00261     Ogre::SceneManager *mSceneManager;
00262     Ogre::SceneManager *mOverlaySceneManager;
00263     bool mOgreOwnedRenderWindow;
00264 
00265     Ogre::RenderTarget *mRenderTarget;
00266     Ogre::RenderWindow *mRenderWindow; // Should be the same as mRenderTarget,
00267                                        // but we need the RenderWindow form to
00268                                        // deal with window events.
00269 
00270 
00271     OptionValue*mWindowWidth;
00272     OptionValue*mWindowHeight;
00273     OptionValue*mWindowDepth;
00274     OptionValue*mFullScreen;
00275     OptionValue* mOgreRootDir;
00277     OptionValue*mFrameDuration;
00278     OptionValue *mParallaxSteps;
00279     OptionValue *mParallaxShadowSteps;
00280     OptionValue* mModelLights; // Use model or basic lights
00281     OptionSet* mOptions;
00282     std::vector<String> mSearchPaths;
00283     Vector4f mBackgroundColor;
00284     Vector3d mFloatingPointOffset;
00285 
00286     Task::LocalTime mLastFrameTime;
00287     Invokable* mOnTickCallback;
00288 
00289 
00290     String mResourcesDir;
00291 
00292     TimeProfiler::Stage* mParserProfiler;
00293     ModelsSystem* mModelParser;
00294     Mesh::Filter* mModelFilter;
00295     Mesh::Filter* mCenteringFilter;
00296 
00297     Transfer::TransferPoolPtr mTransferPool;
00298 
00299     ResourceLoader* mResourceLoader;
00300     PriorityDownloadPlanner* mDownloadPlanner;
00301 
00302     typedef std::tr1::unordered_map<String,Entity*> SceneEntitiesMap;
00303     SceneEntitiesMap mSceneEntities;
00304     std::list<Entity*> mMovingEntities; // FIXME used to call extrapolate
00305                                         // location. register by Entity, but
00306                                         // only ProxyEntities use it
00307 
00308     typedef std::tr1::unordered_set<Camera*> CameraSet;
00309     CameraSet mAttachedCameras;
00310 
00311     SkyboxPtr mSkybox;
00312 
00313     friend class Entity; //Entity will insert/delete itself from these arrays.
00314     friend class Camera; //CameraEntity will insert/delete itself from the scene
00315                          //cameras array.
00316 
00317     // To simplify taking screenshots after a specific event has occurred, we
00318     // allow them to be taken on the next frame.
00319     String mNextFrameScreenshotFile;
00320     bool initialized;
00321     bool stopped;
00322 
00323 };
00324 
00325 } // namespace Graphics
00326 } // namespace Sirikata
00327 
00328 #endif //_SIRIKATA_OGRE_OGRE_RENDERER_HPP_