Sirikata
|
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_