#ifndef WRAPPER_H #define WRAPPER_H #include #include #include #include "client/engine/shader/ShaderProgram.h" #include "client/math/Vector3D.h" #include "client/math/Matrix3D.h" #include "client/engine/shader/WorldShader.h" #include "client/engine/shader/SSAOShader.h" #include "client/engine/shader/SSAOBlurShader.h" #include "client/engine/shader/FramebufferRectangle.h" #include "client/engine/shader/WorldPostShader.h" #include "client/engine/shader/OverlayShader.h" #include "client/engine/Mesh.h" #include "client/engine/Shader.h" using namespace std; class IClient { public: virtual ~IClient() = default; virtual void tick() = 0; virtual void render3DTick(float lag) = 0; virtual void render2DTick(float lag) = 0; virtual void onKeyEvent(int key, int scancode, int action, int mods) = 0; virtual void onMouseMove(double x, double y) = 0; virtual void onMouseClick(int button, int action, int mods) = 0; }; class DummyClient : public IClient { public: static DummyClient dummy; void tick() override { cout << "Dummy tick" << endl; }; void render3DTick(float lag) override { cout << "Dummy render3DTick" << endl; }; void render2DTick(float lag) override { cout << "Dummy render3DTick" << endl; }; void onKeyEvent(int key, int scancode, int action, int mods) override { cout << "Dummy onKeyEvent" << endl; }; void onMouseMove(double x, double y) override { cout << "Dummy onMouseMove" << endl; }; void onMouseClick(int button, int action, int mods) override { cout << "Dummy onMouseClick" << endl; }; private: DummyClient() {}; }; class Engine { public: static bool init(int width, int height, const char* name); static void start(IClient* client); static void stop(); static void printError(); static int getScale(); static int getWidth(); static int getHeight(); static float getScaledWidth(); static float getScaledHeight(); static float getFieldOfView(); static float getNearClip(); static float getFarClip(); static void setMouseTrapped(bool mode); static void setMixMode(); static void setColorMode(); static void setTextureMode(); private: friend void Shader::updateModelMatrix(); static const uint64_t NANOS_PER_FRAME = 1000000000 / 60; static const uint64_t NANOS_PER_TICK = 50000000; static const int MAX_TICKS_PER_FRAME = 1; static void sleep(uint64_t nanos); static bool initOverlayShader(); static void onRenderTick(float lag); static void onKeyEvent(GLFWwindow* w, int key, int scancode, int action, int mods); static void onMouseMove(GLFWwindow* w, double x, double y); static void onMouseClick(GLFWwindow* w, int button, int action, int mods); static void onWindowResize(GLFWwindow* w, int width, int height); static void setViewMatrix(const float* data); static void setModelMatrix(const float* data); static void updateScale(); static IClient* client; // window data static GLFWwindow* window; static int scale; static int width; static int height; static int resizeTicks; // projection data static float fovY; static float nearClip; static float farClip; static Matrix3D projMatrix; // rectangle for framebuffer drawing static FramebufferRectangle rectangle; static int stage; // shader stage 1 - world static WorldShader worldShader; // shader stage 2 - world ssao static SSAOShader ssaoShader; // shader stage 3 - world ssao blur static SSAOBlurShader ssaoBlurShader; // shader stage 4 - world post static WorldPostShader worldPostShader; // shader stage 5 - 2D overlay static OverlayShader overlayShader; }; #endif