💿🐜 Antkeeper source code https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

323 lines
8.2 KiB

/*
* Copyright (C) 2017 Christopher J. Howard
*
* This file is part of Antkeeper Source Code.
*
* Antkeeper Source Code is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Antkeeper Source Code is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Antkeeper Source Code. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef RENDER_PASSES_HPP
#define RENDER_PASSES_HPP
#include <emergent/emergent.hpp>
using namespace Emergent;
#include "material-loader.hpp"
#include "model-loader.hpp"
#include <cstdint>
/**
* Clears framebuffers
*/
class ClearRenderPass: public RenderPass
{
public:
ClearRenderPass();
virtual bool load(const RenderContext* renderContext);
virtual void unload();
virtual void render(RenderContext* renderContext);
void setClear(bool color, bool depth, bool stencil);
void setClearColor(const Vector4& color);
void setClearDepth(float depth);
void setClearStencil(int index);
private:
bool clearColor;
bool clearDepth;
bool clearStencil;
Vector4 color;
float depth;
int index;
};
/**
* Blurs a texture
*/
class BlurRenderPass: public RenderPass
{
public:
BlurRenderPass();
virtual bool load(const RenderContext* renderContext);
virtual void unload();
virtual void render(RenderContext* renderContext);
inline void setGammaCorrect(bool gammaCorrect) { this->gammaCorrect = gammaCorrect; }
/**
* Sets the texture to blur.
*/
inline void setTexture(const Texture2D* texture) { textureParam.setValue(texture); }
/**
* Sets the direction of the blur.
*/
inline void setDirection(const Vector2& direction) { directionParam.setValue(direction); }
private:
bool gammaCorrect;
Shader shader;
std::uint32_t permutation;
ShaderTexture2D textureParam;
ShaderVector2 resolutionParam;
ShaderVector2 directionParam;
int quadVertexCount;
int quadIndexCount;
GLuint quadVAO;
GLuint quadVBO;
GLuint quadIBO;
};
/**
* Renders the distance from the view frustum's near clipping plane to scene geometry. The render target should have a depth only framebuffer.
*/
class ShadowMapRenderPass: public RenderPass
{
public:
ShadowMapRenderPass();
virtual bool load(const RenderContext* renderContext);
virtual void unload();
virtual void render(RenderContext* renderContext);
inline void setViewCamera(const Camera* camera) { this->viewCamera = camera; }
inline void setLightCamera(Camera* camera) { this->lightCamera = camera; }
inline const SplitViewFrustum& getSplitViewFrustum() const { return *splitViewFrustum; }
inline const Matrix4& getCropMatrix(std::size_t index) const { return cropMatrices[index]; }
inline const Matrix4& getTileMatrix(std::size_t index) const { return tileMatrices[index]; }
private:
class RenderOpCompare
{
public:
// Sort render opations
bool operator()(const RenderOperation& opA, const RenderOperation& opB) const;
};
Shader shader;
std::uint32_t unskinnedPermutation;
std::uint32_t skinnedPermutation;
ShaderMatrix4 modelViewProjectionParam;
ShaderMatrix4* matrixPaletteParam; // data not used, just getConnectedInput() then pass pose matrix palette pointer directly
int maxBoneCount;
int shadowMapResolution;
int croppedShadowMapResolution;
Vector4* croppedShadowMapViewports;
Matrix4* cropMatrices;
Matrix4* tileMatrices;
const Camera* viewCamera;
Camera* lightCamera;
SplitViewFrustum* splitViewFrustum;
};
/**
* Renders scene geometry.
*/
class LightingRenderPass: public RenderPass
{
public:
LightingRenderPass();
virtual bool load(const RenderContext* renderContext);
virtual void unload();
virtual void render(RenderContext* renderContext);
inline void setShadowMap(const Texture2D* shadowMap) { this->shadowMap = shadowMap; }
inline void setShadowCamera(const Camera* camera) { this->shadowCamera = camera; }
inline void setShadowMapPass(const ShadowMapRenderPass* shadowMapPass) { this->shadowMapPass = shadowMapPass; }
inline void setDiffuseCubemap(const TextureCube* cubemap) { this->diffuseCubemap = cubemap; }
inline void setSpecularCubemap(const TextureCube* cubemap) { this->specularCubemap = cubemap; }
private:
class RenderOpCompare
{
public:
// Sort render opations
bool operator()(const RenderOperation& opA, const RenderOperation& opB) const;
};
struct ParameterSet
{
ShaderMatrix4* matrixPalette;
ShaderMatrix4 modelMatrix;
ShaderMatrix4 modelViewMatrix;
ShaderMatrix4 modelViewProjectionMatrix;
ShaderMatrix3 normalModelViewMatrix;
ShaderMatrix3 normalModelMatrix;
ShaderMatrix4* lightViewProjectionMatrices;
ShaderVector4 splitDistances;
ShaderTexture2D shadowMap;
ShaderVector3 cameraPosition;
ShaderTextureCube diffuseCubemap;
ShaderTextureCube specularCubemap;
ShaderInt directionalLightCount;
ShaderVector3* directionalLightColors;
ShaderVector3* directionalLightDirections;
ShaderInt spotlightCount;
ShaderVector3 spotlightColors;
ShaderVector3 spotlightPositions;
ShaderVector3 spotlightAttenuations;
ShaderVector3 spotlightDirections;
ShaderFloat spotlightCutoffs;
ShaderFloat spotlightExponents;
ShaderTexture2D albedoOpacityMap;
ShaderTexture2D metalnessRoughnessMap;
ShaderTexture2D normalOcclusionMap;
// Material shader parameters (uploaded by material directly)
//ShaderTexture2D albedoOpacityMap;
//ShaderTexture2D metalnessRoughnessMap;
//ShaderTexture2D normalOcclusionMap;
};
//std::map<Shader* shader, ParameterSet> parameterSets;
Shader shader;
ParameterSet parameters;
std::uint32_t unskinnedPermutation;
std::uint32_t skinnedPermutation;
int maxBoneCount;
int maxDirectionalLightCount;
int maxSpotlightCount;
Matrix4 biasMatrix;
const Texture2D* shadowMap;
const TextureCube* diffuseCubemap;
const TextureCube* specularCubemap;
const Camera* shadowCamera;
float time;
const ShadowMapRenderPass* shadowMapPass;
};
/**
* Renders bounding boxes, skeletons
*/
class DebugRenderPass: public RenderPass
{
public:
DebugRenderPass();
virtual bool load(const RenderContext* renderContext);
virtual void unload();
virtual void render(RenderContext* renderContext);
//void setDrawBounds(bool enabled);
//void setDrawSkeletons(bool enabled);
//void setDrawCameras(bool enabled);
//void setDrawLights(bool enabled);
private:
Shader shader;
std::uint32_t permutation;
ShaderMatrix4 modelViewProjectionMatrixParam;
int aabbVertexCount;
int aabbIndexCount;
GLuint aabbVAO;
GLuint aabbVBO;
GLuint aabbIBO;
};
/**
* Renders the user interface
*/
class UIRenderPass: public RenderPass
{
public:
UIRenderPass();
virtual bool load(const RenderContext* renderContext);
virtual void unload();
virtual void render(RenderContext* renderContext);
private:
Shader shader;
std::uint32_t texturedPermutation;
std::uint32_t untexturedPermutation;
ShaderMatrix4 modelViewProjectionMatrixParam;
ShaderTexture2D textureParam;
ShaderVector2 textureOffsetParam;
ShaderVector2 textureScaleParam;
};
/**
* Renders a vignette
*/
/*
class VignetteRenderPass: public RenderPass
{
public:
VignetteRenderPass();
virtual bool load(const RenderContext* renderContext);
virtual void unload();
virtual void render(RenderContext* renderContext);
private:
ShaderParameterSet parameterSet;
const ShaderParameter* modelViewProjectionParam;
const ShaderParameter* bayerTextureParam;
ShaderLoader shaderLoader;
Shader* shader;
GLuint bayerTextureID;
};
*/
/**
* Renders a skybox
*/
class SkyboxRenderPass: public RenderPass
{
public:
SkyboxRenderPass();
inline void setCubemap(TextureCube* cubemap) { this->cubemap = cubemap; }
virtual bool load(const RenderContext* renderContext);
virtual void unload();
virtual void render(RenderContext* renderContext);
private:
Shader shader;
std::uint32_t permutation;
ShaderMatrix4 matrixParam;
ShaderTextureCube cubemapParam;
TextureCube* cubemap;
int quadVertexCount;
int quadIndexCount;
GLuint quadVAO;
GLuint quadVBO;
GLuint quadIBO;
};
#endif // RENDER_PASSES_HPP