#ifndef __RENDER_MANAGER_H__ #define __RENDER_MANAGER_H__ //======================================================================== // Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved. // // Component: RenderManager // // Description: The RenderManager Controller provides all interfaces // neccessary for interaction with the render systems from // Systems external to the Render directory. [4/17/2002] // // History: + Implemented Initial interfaces -- Devin [4/17/2002] // //======================================================================== //================================================= // System Includes //================================================= //================================================= // Project Includes //================================================= //#include #include #include #include #include #include #include //fwd dec's class IEntityDSG; class RenderLayer; class WorldRenderLayer; class WorldScene; class tLightGroup; class ZoneEventLocator; //MS7: Cary added this to make the clouds go. class tMultiController; //================================================= // TODOs: Re-encapsulate (into other file(s)) the // data-sets below: //================================================= //======================================================================== // // Synopsis: The RenderManager; // -The entry point for all non render systems // -Supports // -ContextSwitch Interface --Devin[4/17/2002] // -DSG Interface //======================================================================== class RenderManager : public ChunkListenerCallback, public LoadingManager::ProcessRequestsCallback, public EventListener { public: // Static Methods (for creating, destroying and acquiring an instance // of the RenderManager) static RenderManager* CreateInstance(); static RenderManager* GetInstance(); static void DestroyInstance(); /////////////////////////////////////////////////////////////////////// // Accessors /////////////////////////////////////////////////////////////////////// WorldScene* pWorldScene(); WorldRenderLayer* pWorldRenderLayer(); inline int& rCurWorldRenderLayer(); // Context Interface bool LoadAllNeededData(); void SetLoadData( RenderEnums::LayerEnum isLayer, RenderEnums::LevelEnum isLevel, RenderEnums::MissionEnum isMission ); void InitLevel(); // Copies light values from the given sun group into the RenderManager // Dynamic allocations on GMA_LEVEL_OTHER // Pass in NULL to disable void SetLevelLayerLights( tLightGroup* SunGroup ); // Releases sun group information set in SetLevelLayerLights void ClearLevelLayerLights(); void SetLightMod( const tColour& LightMod ); void ResetMoodLighting( bool Immediate = false ); void DumpAllLoadedData(); void ContextUpdate( unsigned int iElapsedTime ); // Layer Interface RenderLayer* mpLayer( RenderEnums::LayerEnum isLayer ); void FreezeAllLayers(); void FreezeForPresentation( void ); void ThawFromPresentation( void ); void RedirectChunks( int ChunkDestinationMask ); /////////////////////////////////////////////////////////////////////// // ChunkListenerCallback's /////////////////////////////////////////////////////////////////////// virtual void OnChunkLoaded( tEntity* ipEntity, int iUserData, unsigned iChunkID ); /////////////////////////////////////////////////////////////////////// // LoadingManager::ProcessRequestsCallback's /////////////////////////////////////////////////////////////////////// void OnProcessRequestsComplete( void* pUserData ); bool DoneInitialLoad(); void DoPostLevelLoad(); /////////////////////////////////////////////////////////////////////// // EventListener /////////////////////////////////////////////////////////////////////// void HandleEvent( EventEnum id, void* pEventData ); void FlushDelList(); void MunchDelList(unsigned howManyMicroseconds); SwapArray mEntityDeletionList; void SetBlurAlpha( float alpha ) { mBlurAlpha = alpha; } private: //Initialize the mpLayers void InitLayers(); // Private: it's a fuckin singleton. RenderManager(); ~RenderManager(); // Private Member Data RenderLayer* mpRenderLayers[RenderEnums::numLayers]; tMultiController* mClouds; // Static Private Render Data static RenderManager* mspInstance; int msLayer; //RenderEnums::LayerEnum int msLevel; //RenderEnums::LevelEnum int msMission; //RenderEnums::MissionEnum int mCurWorldLayer; bool mDoneInitialLoad; SwapArray mZELs; ZoneEventLocator* mpZEL; bool mbDynaLoading; bool mbFirstDynamicZone; bool mbDrivingTooFastLoad; bool mbLoadZonesDumped; bool mbIgnoreVisibilityClear; bool mbInVsibilityVolume; // Motion blur accessors / mutator functions void SetMotionBlurEnable( bool enable ) { mEnableMotionBlur = enable; } bool IsBlurEnabled() const { return mEnableMotionBlur; } #ifdef RAD_PS2 void ApplyPS2Blur(); #endif void AdjustBlurByFrameRate( unsigned int elapsedTime ); #ifdef DEBUGWATCH unsigned int mDebugSwapTime, mDebugRenderTime; bool mDebugDumpAllZones; #endif bool mEnableMotionBlur; float mBlurAlpha; // Simple class to log the time it took each frame and // average it out class AvgTimeCounter { public: AvgTimeCounter(); void Tick( unsigned int elapsedTime ); unsigned int GetAverageTimePerFrame()const; enum { ELAPSED_TIME_ARRAY_SIZE = 32 }; private: // Index to the current spot in mElapsedTimeCount. Increment every tick int mCurrentArrayIndex; // Sum of all values in the mElapsedTimeCount array unsigned int mElapsedTimeSum; // Array holds the elapsed time counts for the past N updates SwapArray< unsigned int > mElapsedTimeCount; }; struct MoodLighting { MoodLighting(); ~MoodLighting(); tLightGroup* mSunGroup; tColour mSrcModulus; tColour mDstModulus; tColour* mOriginals; float mTransition; int mVolumeCount; // Count how many volumes of the same modulus we've entered. tColour CalculateModulus( void ); }; MoodLighting mMood; void TransitionMoodLighting( unsigned int elapsedTime ); }; // // A little syntactic sugar for getting at this singleton. // inline RenderManager* GetRenderManager() { return( RenderManager::GetInstance() ); } inline int& RenderManager::rCurWorldRenderLayer() { return mCurWorldLayer; } #endif