#pragma once #include "../../core/flags.hpp" #include "buffer/Abstract.hpp" #include #include #include #include #include class Window; class Camera; namespace render { /// Pass options struct passOptions { /// Apply light properties bool pbr = true; /// Triplanar texture mapping bool triplanar = false; /// Transform texture UV bool stochastic = false; /// Active geometry pass bool geometry = false; /// Blend voxel with mixed materials (requires geometry) bool blend = true; /// Depth fog bool fog = true; /// Map planets to sphere bool curvature = true; /// Keep depth in sphere bool curv_depth = true; }; /// Rendering options struct renderOptions { /// Voxel passes passOptions voxel; /// Display skybox bool skybox = true; /// Display only wires bool wireframe = false; /// Texture pack name std::string textures = "1024-realistic"; /// Textures quality float mipMapLOD = -.5; /// Textures anisotropic mapping int anisotropy = 0; /// Depth color glm::vec4 clear_color; /// Parallel processing frames /// Incease FPS but also a bit latency (Vulkan only) int inFlightFrames = 2; }; /// Rendering plateform interface class Renderer { public: virtual ~Renderer() { } glm::vec3 LightInvDir = glm::vec3(0.5f, 2, 2); /// Start new frame and setup virtual void beginFrame() = 0; /// Get started world program virtual std::function beginWorldPass() = 0; /// Get started entity program virtual std::function &)> beginEntityPass() = 0; /// Draw cube indicator virtual size_t drawIndicatorCube(glm::mat4 model) = 0; /// Apply postprocessing virtual void endPass() = 0; /// Swap displayed image virtual void swapBuffer(Window &) = 0; /// Apply camera matrices virtual void lookFrom(const Camera &) = 0; virtual void setClearColor(glm::vec4) = 0; virtual void setCurvature(glm::vec4, float) = 0; virtual void reloadShaders(const passOptions &) = 0; virtual void reloadTextures(const std::string &, float mipMapLOD, float anisotropy) = 0; virtual void loadUI(Window&) = 0; static _FORCE_INLINE_ Renderer *Get() { assert(sInstance != nullptr && "Uninitialized renderer"); return sInstance; } static void Unload(); protected: static Renderer *sInstance; }; }