#pragma once #include "GfxBase/ViewBase.h" #include "rbx/Boost.hpp" #include #include #include "GfxBase/Type.h" #include "RbxG3D/Frustum.h" #include "RenderCamera.h" namespace RBX { class ContentProvider; class MeshContentProvider; class Lighting; class RenderStats; class FrameRateManager; class Camera; class RenderCaps; class Typesetter; } namespace RBX { namespace Graphics { class Device; class Water; class TextureCompositor; class ShaderManager; class TextureManager; class SceneUpdater; class SceneManager; class TextureAtlas; class MaterialGenerator; class LightGrid; class AdornRender; class VertexStreamer; class TypesetterBitmap; class Material; class VertexLayout; struct EmitterShared; class VisualEngine { public: VisualEngine(Device* device, CRenderSettings* renderSettings); virtual ~VisualEngine(); void bindWorkspace(const shared_ptr& dm); void setViewport(int width, int height); void setCamera(const Camera& value, const G3D::Vector3& poi); void reloadShaders(); void queueAssetReload(const std::string& filePath); void immediateAssetReload(const std::string& filePath); void reloadQueuedAssets(); Device* getDevice() { return device; } SceneManager *getSceneManager() { return sceneManager.get(); } FrameRateManager* getFrameRateManager() { return frameRateManager.get(); } RenderCamera& getCameraMutable() { return camera; } const RenderCamera& getCamera() { return camera; } const RenderCamera& getCameraCull() { return cameraCull; } const RenderCamera& getCameraCullFrm() { return cameraCullFrm; } int getViewWidth() const { return viewWidth; } int getViewHeight() const { return viewHeight; } AdornRender* getAdorn() { return adorn.get(); } VertexStreamer* getVertexStreamer() { return vertexStreamer.get(); } TextureCompositor * getTextureCompositor() { return textureCompositor.get(); } TextureManager* getTextureManager() { return textureManager.get(); } EmitterShared* getEmitterSharedState() { return emitterShared.get(); } ShaderManager* getShaderManager() { return shaderManager.get(); } LightGrid* getLightGrid() { return lightGrid.get(); } Water* getWater() { return water.get(); } SceneUpdater* getSceneUpdater() { return sceneUpdater.get(); } CRenderSettings* getSettings() { return settings; }; // returns area of interest that needs to be computed for next frame. slighly bigger than camera frustrum. // rendering of primitives outside this area is not allowed, since objects outside this area are not guaranteed to // be valid. const Frustum* getUpdateFrustum() { return &updateFrustum; } RenderStats* getRenderStats() { return renderStats.get(); } ContentProvider* getContentProvider() { return contentProvider; } MeshContentProvider* getMeshContentProvider() { return meshContentProvider; } Lighting* getLighting() { return lighting; } const shared_ptr& getTypesetter(Text::Font font); const RenderCaps* getRenderCaps() { return renderCaps.get(); } MaterialGenerator* getMaterialGenerator() { return materialGenerator.get(); } shared_ptr& getFastClusterLayout() { return fastClusterLayout; } shared_ptr& getFastClusterShadowLayout() { return fastClusterShadowLayout; } TextureAtlas* getGlyphAtlas() const { return glyphAtlas.get(); } private: Device* device; RenderCamera camera; RenderCamera cameraCull; RenderCamera cameraCullFrm; int viewWidth, viewHeight; Frustum updateFrustum; scoped_ptr adorn; scoped_ptr sceneUpdater; scoped_ptr vertexStreamer; scoped_ptr textureCompositor; scoped_ptr textureManager; scoped_ptr shaderManager; scoped_ptr sceneManager; scoped_ptr frameRateManager; scoped_ptr emitterShared; RBX::CRenderSettings* settings; RBX::MeshContentProvider* meshContentProvider; RBX::ContentProvider* contentProvider; RBX::Lighting* lighting; scoped_ptr renderCaps; scoped_ptr renderStats; scoped_ptr lightGrid; scoped_ptr water; shared_ptr typesetters[Text::FONT_LAST]; scoped_ptr glyphAtlas; scoped_ptr materialGenerator; shared_ptr fastClusterLayout; shared_ptr fastClusterShadowLayout; typedef boost::unordered_map FilenameCountdown; FilenameCountdown assetsToReload; }; } }