2019-12-12 17:32:41 +01:00
// Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
2021-08-27 17:55:04 +02:00
# ifndef IRR_C_OPENGL_SHADER_MATERIAL_RENDERER_H_INCLUDED
# define IRR_C_OPENGL_SHADER_MATERIAL_RENDERER_H_INCLUDED
2019-12-12 17:32:41 +01:00
# include "IrrCompileConfig.h"
# ifdef _IRR_COMPILE_WITH_OPENGL_
# include "IMaterialRenderer.h"
# include "COpenGLCommon.h"
namespace irr
{
namespace video
{
class COpenGLDriver ;
class IShaderConstantSetCallBack ;
2020-01-03 15:58:46 +01:00
//! Class for using vertex and pixel shaders with OpenGL (asm not glsl!)
2019-12-12 17:32:41 +01:00
class COpenGLShaderMaterialRenderer : public IMaterialRenderer
{
public :
//! Constructor
COpenGLShaderMaterialRenderer ( COpenGLDriver * driver ,
s32 & outMaterialTypeNr , const c8 * vertexShaderProgram , const c8 * pixelShaderProgram ,
IShaderConstantSetCallBack * callback , E_MATERIAL_TYPE baseMaterial , s32 userData ) ;
//! Destructor
virtual ~ COpenGLShaderMaterialRenderer ( ) ;
virtual void OnSetMaterial ( const SMaterial & material , const SMaterial & lastMaterial ,
2021-08-27 14:55:10 +02:00
bool resetAllRenderstates , IMaterialRendererServices * services ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
2021-08-27 14:55:10 +02:00
virtual bool OnRender ( IMaterialRendererServices * service , E_VERTEX_TYPE vtxtype ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
2021-08-27 14:55:10 +02:00
virtual void OnUnsetMaterial ( ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! Returns if the material is transparent.
2021-08-27 14:55:10 +02:00
virtual bool isTransparent ( ) const IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! Access the callback provided by the users when creating shader materials
2021-08-27 14:55:10 +02:00
virtual IShaderConstantSetCallBack * getShaderConstantSetCallBack ( ) const IRR_OVERRIDE
2019-12-12 17:32:41 +01:00
{
return CallBack ;
}
protected :
//! constructor only for use by derived classes who want to
//! create a fall back material for example.
COpenGLShaderMaterialRenderer ( COpenGLDriver * driver ,
IShaderConstantSetCallBack * callback ,
E_MATERIAL_TYPE baseMaterial , s32 userData = 0 ) ;
// must not be called more than once!
void init ( s32 & outMaterialTypeNr , const c8 * vertexShaderProgram ,
const c8 * pixelShaderProgram , E_VERTEX_TYPE type ) ;
bool createPixelShader ( const c8 * pxsh ) ;
bool createVertexShader ( const c8 * vtxsh ) ;
bool checkError ( const irr : : c8 * type ) ;
COpenGLDriver * Driver ;
IShaderConstantSetCallBack * CallBack ;
2020-01-02 16:34:52 +01:00
// I didn't write this, but here's my understanding:
// Those flags seem to be exclusive so far (so could be an enum).
// Maybe the idea was to make them non-exclusive in future (basically having a shader-material)
// Actually currently there's not even any need to cache them (probably even slower than not doing so).
// They seem to be mostly for downward compatibility.
// I suppose the idea is to use SMaterial.BlendOperation + SMaterial.BlendFactor and a simple non-transparent type as base for more flexibility in the future.
// Note that SMaterial.BlendOperation + SMaterial.BlendFactor are in some drivers already evaluated before OnSetMaterial.
2019-12-12 17:32:41 +01:00
bool Alpha ;
bool Blending ;
bool FixedBlending ;
bool AlphaTest ;
GLuint VertexShader ;
// We have 4 values here, [0] is the non-fog version, the other three are
// ARB_fog_linear, ARB_fog_exp, and ARB_fog_exp2 in that order
core : : array < GLuint > PixelShader ;
s32 UserData ;
} ;
} // end namespace video
} // end namespace irr
# endif
# endif