1
0
forked from 0ad/0ad
0ad/source/renderer/RenderModifiers.h
bb 157c6af18e Make the space in 0 A.D. non-breaking throughout the codebase.
Avoid cases of filenames
Update years in terms and other legal(ish) documents
Don't update years in license headers, since change is not meaningful

Will add linter rule in seperate commit

Happy recompiling everyone!

Original Patch By: Nescio
Comment By: Gallaecio
Differential Revision: D2620
This was SVN commit r27786.
2023-07-27 20:54:46 +00:00

139 lines
3.9 KiB
C++

/* Copyright (C) 2022 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. 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 2 of the License, or
* (at your option) any later version.
*
* 0 A.D. 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 0 A.D. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* RenderModifiers can affect the fragment stage behaviour of some
* ModelRenderers. This file defines some common RenderModifiers in
* addition to the base class.
*
* TODO: See comment in CRendererInternals::Models - we no longer use multiple
* subclasses of RenderModifier, so most of the stuff here is unnecessary
* abstraction which should probably be cleaned up.
*/
#ifndef INCLUDED_RENDERMODIFIERS
#define INCLUDED_RENDERMODIFIERS
#include "ModelRenderer.h"
#include "graphics/Color.h"
#include "graphics/ShaderProgram.h"
#include "graphics/ShaderTechnique.h"
#include "graphics/Texture.h"
class CLightEnv;
class CModel;
class ShadowMap;
/**
* Class RenderModifier: Some ModelRenderer implementations provide vertex
* management behaviour but allow fragment stages to be modified by a plugged in
* RenderModifier.
*
* You should use RenderModifierPtr when referencing RenderModifiers.
*/
class RenderModifier
{
public:
RenderModifier() { }
virtual ~RenderModifier() { }
/**
* BeginPass: Setup OpenGL for the given rendering pass.
*
* Must be implemented by derived classes.
*/
virtual void BeginPass(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
Renderer::Backend::IShaderProgram* shader) = 0;
/**
* PrepareModel: Called before rendering the given model.
*
* Default behaviour does nothing.
*
* @param model The model that is about to be rendered.
*/
virtual void PrepareModel(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
CModel* model) = 0;
};
/**
* Class LitRenderModifier: Abstract base class for RenderModifiers that apply
* a shadow map.
* LitRenderModifiers expect the diffuse brightness in the primary color (instead of ambient + diffuse).
*/
class LitRenderModifier : public RenderModifier
{
public:
LitRenderModifier();
~LitRenderModifier();
/**
* SetShadowMap: Set the shadow map that will be used for rendering.
* Must be called by the user of the RenderModifier.
*
* The shadow map must be non-null and use depth texturing, or subsequent rendering
* using this RenderModifier will fail.
*
* @param shadow the shadow map
*/
void SetShadowMap(const ShadowMap* shadow);
/**
* SetLightEnv: Set the light environment that will be used for rendering.
* Must be called by the user of the RenderModifier.
*
* @param lightenv the light environment (must be non-null)
*/
void SetLightEnv(const CLightEnv* lightenv);
const ShadowMap* GetShadowMap() const { return m_Shadow; }
const CLightEnv* GetLightEnv() const { return m_LightEnv; }
private:
const ShadowMap* m_Shadow;
const CLightEnv* m_LightEnv;
};
/**
* A RenderModifier that sets uniforms and textures appropriately for rendering models.
*/
class ShaderRenderModifier : public LitRenderModifier
{
public:
ShaderRenderModifier();
// Implementation
void BeginPass(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
Renderer::Backend::IShaderProgram* shader) override;
void PrepareModel(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
CModel* model) override;
private:
int32_t m_BindingInstancingTransform = -1;
int32_t m_BindingShadingColor = -1;
int32_t m_BindingPlayerColor = -1;
CColor m_ShadingColor, m_PlayerColor;
};
#endif // INCLUDED_RENDERMODIFIERS