//TODO: Rework this file to only contain functions the frontend will need to access #pragma once #include #include #include #include #include "Config.h" #include "Utility.h" #include "IntroGamestate.h" #include "Assets.h" #include "Entity.h" #include "Light.h" #include "Cubemap.h" #include "Text.h" #include "UITexture.h" #include "Button.h" #include "Sound.h" #include "Input.h" namespace nf { class Drawable; class Shader; class Model; class GBuffer; class AudioEngine; class Renderer { public: Renderer(Application* app); void setFade(bool in, bool out, bool noText); bool isFadeOutComplete(); void render(Entity& in); void render(UIElement& in); void render(Light& in); void render(Cubemap& in); void doFrame(Camera* camera, double dT); ~Renderer(); private: void renderShadowMaps(unsigned int count); void loadBaseAssets(); void createShadowMaps(); Application* m_app; HDC m_hdc; HGLRC m_hglrc; AssetPack m_baseAP; GBuffer* m_gBuffer; unsigned int m_shadowMapFBO; int m_directionalDepthTexSize; int m_pointDepthTexSize; std::vector m_directionalShadowMaps; std::vector m_pointShadowMaps; unsigned int m_texSlots; std::vector m_lights; std::vector m_lGame; Cubemap* m_cubemap; std::vector m_lUI; Shader* m_gBufferShader; Shader* m_lightingShader; Shader* m_textShader; Shader* m_uiTextureShader; Shader* m_cubemapShader; Shader* m_fadeShader; Shader* m_directionalShadowShader; Shader* m_pointShadowShader; bool m_fadeIn, m_fadeOut; bool m_fadeNoText; bool m_fadeOutComplete; Text m_loadingText; VertexArray* m_quadVAO; IndexBuffer* m_quadIB; }; class Application { public: Application(Config& conf); Application() = delete; Application(Application& other) = delete; void setWindowIcon(HANDLE hIcon); void setWindowCursor(HCURSOR hCursor); AudioEngine* getAudioEngine() const; void addState(Gamestate* state, const std::string& stateName); void addDefaultState(const std::string& stateName); const std::string& getDefaultState(); void run(); bool isCustomWindowIcon(); void changeState(const std::string& stateName); Gamestate* getCurrentState(); void showWindow(bool show); const HWND& getWindow(); void changeConfig(const Config& in); const Config& getConfig() const; int getFPS() const; bool isKeyHeld(unsigned int code); bool isKeyPressed(unsigned int code); bool isMouse(unsigned int code); void trackMouse(bool track); void getMouseDiff(int& x, int& y); Vec2 getMousePos(); static Application* getApp(); void quit(); ~Application(); private: void registerWindowClass(); RECT getWindowRect() const; void calculateNewWindowPos(int& x, int& y); void toggleFullscreen(); void updateMouse(); void runMainGameThread(); void doStateChange(); static void setApp(Application* app); static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static Application* currentApp; Config m_currentConfig; bool m_running; bool m_quit; HINSTANCE m_hInst; LPCWSTR m_wclassName; HWND m_window; bool m_customWindowIconSet; LONG m_defaultWindowStyle; unsigned int m_altWidth, m_altHeight; std::chrono::duration m_fpsDuration; double m_deltaTime; std::chrono::steady_clock::time_point m_fpsClock1 = std::chrono::steady_clock::now(); std::chrono::steady_clock::time_point m_fpsClock2 = m_fpsClock1; const int m_targetFPS = 60; const double m_minFrametime = 1.0 / m_targetFPS; int m_FPS; //Inactive states to potentially be active during the Application's lifetime //Mapped to const char* to be referenced later in the frontend std::unordered_map m_states; Gamestate* m_sIntro; std::string m_defaultState; bool m_defaultStateAdded; Gamestate* m_currentState; bool m_stateChange; std::string m_nextState; //Array of booleans that represent keyboard and mouse input minus the scrollwheel std::array m_keysPressed; unsigned int m_mouseX, m_mouseY; bool m_trackingMouse; bool m_mouseTrackFirst; int m_mouseDiffX, m_mouseDiffY; //Renderer object to use OpenGL to render the current state Renderer* m_renderer; AudioEngine* m_audio; }; }