Renderer simplification: Remove fixed-function shadowing. Remove now-unused diffuse-only model lighting mode.
This was SVN commit r9187.
This commit is contained in:
parent
8753f881ee
commit
7339a346e3
@ -102,18 +102,14 @@ struct FixedFunctionModelRendererInternals
|
||||
|
||||
/// Previously prepared modeldef
|
||||
FFModelDef* ffmodeldef;
|
||||
|
||||
/// If true, primary color will only contain the diffuse term
|
||||
bool colorIsDiffuseOnly;
|
||||
};
|
||||
|
||||
|
||||
// Construction and Destruction
|
||||
FixedFunctionModelRenderer::FixedFunctionModelRenderer(bool colorIsDiffuseOnly)
|
||||
FixedFunctionModelRenderer::FixedFunctionModelRenderer()
|
||||
{
|
||||
m = new FixedFunctionModelRendererInternals;
|
||||
m->ffmodeldef = 0;
|
||||
m->colorIsDiffuseOnly = colorIsDiffuseOnly;
|
||||
}
|
||||
|
||||
FixedFunctionModelRenderer::~FixedFunctionModelRenderer()
|
||||
@ -173,7 +169,7 @@ void FixedFunctionModelRenderer::UpdateModelData(CModel* model, void* data, int
|
||||
|
||||
VertexArrayIterator<SColor4ub> Color = ffmodel->m_Color.GetIterator<SColor4ub>();
|
||||
|
||||
ModelRenderer::BuildColor4ub(model, Normal, Color, m->colorIsDiffuseOnly);
|
||||
ModelRenderer::BuildColor4ub(model, Normal, Color);
|
||||
|
||||
// upload everything to vertex buffer
|
||||
ffmodel->m_Array.Upload();
|
||||
|
@ -34,13 +34,7 @@ struct FixedFunctionModelRendererInternals;
|
||||
class FixedFunctionModelRenderer : public ModelVertexRenderer
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* FixedFunctionModelRenderer: Constructor.
|
||||
*
|
||||
* @param colorIsDiffuseOnly if true, the primary color sent to the fragment stage
|
||||
* contains only the diffuse term, and not the ambient
|
||||
*/
|
||||
FixedFunctionModelRenderer(bool colorIsDiffuseOnly);
|
||||
FixedFunctionModelRenderer();
|
||||
~FixedFunctionModelRenderer();
|
||||
|
||||
// Implementations
|
||||
|
@ -106,8 +106,7 @@ void ModelRenderer::BuildPositionAndNormals(
|
||||
void ModelRenderer::BuildColor4ub(
|
||||
CModel* model,
|
||||
const VertexArrayIterator<CVector3D>& Normal,
|
||||
const VertexArrayIterator<SColor4ub>& Color,
|
||||
bool onlyDiffuse)
|
||||
const VertexArrayIterator<SColor4ub>& Color)
|
||||
{
|
||||
PROFILE( "lighting vertices" );
|
||||
|
||||
@ -117,27 +116,13 @@ void ModelRenderer::BuildColor4ub(
|
||||
CColor shadingColor = model->GetShadingColor();
|
||||
RGBColor tempcolor;
|
||||
|
||||
if (onlyDiffuse)
|
||||
for (size_t j=0; j<numVertices; j++)
|
||||
{
|
||||
for (size_t j=0; j<numVertices; j++)
|
||||
{
|
||||
lightEnv.EvaluateDirect(Normal[j], tempcolor);
|
||||
tempcolor.X *= shadingColor.r;
|
||||
tempcolor.Y *= shadingColor.g;
|
||||
tempcolor.Z *= shadingColor.b;
|
||||
Color[j] = ConvertRGBColorTo4ub(tempcolor);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (size_t j=0; j<numVertices; j++)
|
||||
{
|
||||
lightEnv.EvaluateUnit(Normal[j], tempcolor);
|
||||
tempcolor.X *= shadingColor.r;
|
||||
tempcolor.Y *= shadingColor.g;
|
||||
tempcolor.Z *= shadingColor.b;
|
||||
Color[j] = ConvertRGBColorTo4ub(tempcolor);
|
||||
}
|
||||
lightEnv.EvaluateUnit(Normal[j], tempcolor);
|
||||
tempcolor.X *= shadingColor.r;
|
||||
tempcolor.Y *= shadingColor.g;
|
||||
tempcolor.Z *= shadingColor.b;
|
||||
Color[j] = ConvertRGBColorTo4ub(tempcolor);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -213,14 +213,11 @@ public:
|
||||
* @param Color Points to the array that will receive the lit vertex color.
|
||||
* The array behind the iterator must large enough to hold
|
||||
* model->GetModelDef()->GetNumVertices() vertices.
|
||||
* @param onlyDiffuse if true, color will only contain the diffuse term (instead
|
||||
* of both ambient and diffuse)
|
||||
*/
|
||||
static void BuildColor4ub(
|
||||
CModel* model,
|
||||
const VertexArrayIterator<CVector3D>& Normal,
|
||||
const VertexArrayIterator<SColor4ub>& Color,
|
||||
bool onlyDiffuse);
|
||||
const VertexArrayIterator<SColor4ub>& Color);
|
||||
|
||||
/**
|
||||
* BuildUV: Copy UV coordinates into the given vertex array.
|
||||
|
@ -254,161 +254,6 @@ void SlowPlayerColorRender::PrepareModel(int pass, CModel* model)
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// LitPlayerColorRender
|
||||
|
||||
LitPlayerColorRender::LitPlayerColorRender()
|
||||
{
|
||||
}
|
||||
|
||||
LitPlayerColorRender::~LitPlayerColorRender()
|
||||
{
|
||||
}
|
||||
|
||||
int LitPlayerColorRender::BeginPass(int pass)
|
||||
{
|
||||
debug_assert(GetShadowMap() && GetShadowMap()->GetUseDepthTexture());
|
||||
|
||||
if (pass == 0)
|
||||
{
|
||||
// First pass: Lay down the material color
|
||||
// We calculate:
|
||||
// Material = Texture*(PlayerColor*(1.0-Texture.a) + 1.0*Texture.a))
|
||||
// = (1 - ((1 - PlayerColor) * (1 - Texture.a)))*Texture
|
||||
|
||||
// Incoming Color holds the player color
|
||||
// Texture 0 holds the model's texture
|
||||
|
||||
// TexEnv #0
|
||||
pglActiveTextureARB(GL_TEXTURE0);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_ONE_MINUS_SRC_COLOR);
|
||||
|
||||
// Don't care about alpha; set it to something harmless
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
// TexEnv #1
|
||||
pglActiveTextureARB(GL_TEXTURE0+1);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glBindTexture(GL_TEXTURE_2D, GetShadowMap()->GetTexture());
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_ONE_MINUS_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE0);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
|
||||
// Don't care about alpha; set it to something harmless
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
pglActiveTextureARB(GL_TEXTURE0);
|
||||
|
||||
return STREAM_POS|STREAM_UV0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Second pass: Multiply with lighting
|
||||
//
|
||||
// We calculate:
|
||||
// Lighting = Ambient + Diffuse * Shadow
|
||||
// and modulate with frame buffer contents
|
||||
//
|
||||
// Incoming color is diffuse
|
||||
// Texture 1 is the shadow map
|
||||
|
||||
// TexEnv #0
|
||||
pglActiveTextureARB(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, GetShadowMap()->GetTexture());
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PRIMARY_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE1);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
// TexEnv #1
|
||||
pglActiveTextureARB(GL_TEXTURE1);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glBindTexture(GL_TEXTURE_2D, GetShadowMap()->GetTexture());
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &GetLightEnv()->m_UnitsAmbientColor.X);
|
||||
|
||||
pglActiveTextureARB(GL_TEXTURE0);
|
||||
|
||||
// Blending, Z settings
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_DST_COLOR, GL_ZERO);
|
||||
|
||||
glDepthMask(0);
|
||||
|
||||
return STREAM_POS|STREAM_COLOR|STREAM_TEXGENTOUV1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool LitPlayerColorRender::EndPass(int pass)
|
||||
{
|
||||
if (pass == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Restore state
|
||||
pglActiveTextureARB(GL_TEXTURE1);
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
pglActiveTextureARB(GL_TEXTURE0);
|
||||
|
||||
glDisable(GL_BLEND);
|
||||
glDepthMask(1);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
const CMatrix3D* LitPlayerColorRender::GetTexGenMatrix(int UNUSED(pass))
|
||||
{
|
||||
return &GetShadowMap()->GetTextureMatrix();
|
||||
}
|
||||
|
||||
void LitPlayerColorRender::PrepareTexture(int pass, CTexturePtr& texture)
|
||||
{
|
||||
if (pass == 0)
|
||||
texture->Bind(0);
|
||||
}
|
||||
|
||||
void LitPlayerColorRender::PrepareModel(int pass, CModel* model)
|
||||
{
|
||||
if (pass == 0)
|
||||
{
|
||||
// Get the player color
|
||||
SMaterialColor colour = model->GetMaterial().GetObjectColor();
|
||||
|
||||
// Send the player color
|
||||
glColor3f(colour.r, colour.g, colour.b);
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// SolidPlayerColorRender
|
||||
|
||||
|
@ -78,28 +78,6 @@ public:
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Class LitPlayerColorRender: Render models fully textured and lit including shadows
|
||||
* and player color.
|
||||
*
|
||||
* @note Only use a LitPlayerColorRenderer instance when depth texture based shadows
|
||||
* are supported by the OpenGL implementation (as verified by CRenderer::m_Caps::m_DepthTextureShadows).
|
||||
*/
|
||||
class LitPlayerColorRender : public LitRenderModifier
|
||||
{
|
||||
public:
|
||||
LitPlayerColorRender();
|
||||
~LitPlayerColorRender();
|
||||
|
||||
// Implementation
|
||||
int BeginPass(int pass);
|
||||
bool EndPass(int pass);
|
||||
const CMatrix3D* GetTexGenMatrix(int pass);
|
||||
void PrepareTexture(int pass, CTexturePtr& texture);
|
||||
void PrepareModel(int pass, CModel* model);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Render all models using their player color without lighting.
|
||||
*/
|
||||
|
@ -132,90 +132,6 @@ void PlainRenderModifier::PrepareTexture(int UNUSED(pass), CTexturePtr& texture)
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// PlainLitRenderModifier implementation
|
||||
|
||||
PlainLitRenderModifier::PlainLitRenderModifier()
|
||||
{
|
||||
}
|
||||
|
||||
PlainLitRenderModifier::~PlainLitRenderModifier()
|
||||
{
|
||||
}
|
||||
|
||||
int PlainLitRenderModifier::BeginPass(int pass)
|
||||
{
|
||||
debug_assert(pass == 0);
|
||||
debug_assert(GetShadowMap() && GetShadowMap()->GetUseDepthTexture());
|
||||
|
||||
// Ambient + Diffuse * Shadow
|
||||
pglActiveTextureARB(GL_TEXTURE0);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PRIMARY_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE1);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
pglActiveTextureARB(GL_TEXTURE1);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glBindTexture(GL_TEXTURE_2D, GetShadowMap()->GetTexture());
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &GetLightEnv()->m_UnitsAmbientColor.X);
|
||||
|
||||
// Incoming color is ambient + diffuse light
|
||||
pglActiveTextureARB(GL_TEXTURE2);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glBindTexture(GL_TEXTURE_2D, GetShadowMap()->GetTexture());
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE0);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
pglActiveTextureARB(GL_TEXTURE0);
|
||||
|
||||
return STREAM_POS|STREAM_COLOR|STREAM_UV0|STREAM_TEXGENTOUV1;
|
||||
}
|
||||
|
||||
const CMatrix3D* PlainLitRenderModifier::GetTexGenMatrix(int UNUSED(pass))
|
||||
{
|
||||
return &GetShadowMap()->GetTextureMatrix();
|
||||
}
|
||||
|
||||
bool PlainLitRenderModifier::EndPass(int UNUSED(pass))
|
||||
{
|
||||
g_Renderer.BindTexture(1, 0);
|
||||
g_Renderer.BindTexture(2, 0);
|
||||
pglActiveTextureARB(GL_TEXTURE0);
|
||||
pglClientActiveTextureARB(GL_TEXTURE0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void PlainLitRenderModifier::PrepareTexture(int UNUSED(pass), CTexturePtr& texture)
|
||||
{
|
||||
texture->Bind(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// WireframeRenderModifier implementation
|
||||
|
||||
|
@ -176,25 +176,6 @@ public:
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Class PlainLitRenderModifier: Use an opaque color texture for a lit object that is shadowed
|
||||
* using a depth texture.
|
||||
* Expects the diffuse brightness in the primary color.
|
||||
*/
|
||||
class PlainLitRenderModifier : public LitRenderModifier
|
||||
{
|
||||
public:
|
||||
PlainLitRenderModifier();
|
||||
~PlainLitRenderModifier();
|
||||
|
||||
// Implementation
|
||||
int BeginPass(int pass);
|
||||
const CMatrix3D* GetTexGenMatrix(int pass);
|
||||
bool EndPass(int pass);
|
||||
void PrepareTexture(int pass, CTexturePtr& texture);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Class WireframeRenderModifier: RenderModifier that renders wireframe models.
|
||||
*/
|
||||
|
@ -205,13 +205,6 @@ AbstractProfileTable* CRendererStatsTable::GetChild(size_t UNUSED(row))
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
// CRenderer implementation
|
||||
|
||||
enum {
|
||||
AmbientDiffuse = 0,
|
||||
OnlyDiffuse,
|
||||
|
||||
NumVertexTypes
|
||||
};
|
||||
|
||||
/**
|
||||
* Struct CRendererInternals: Truly hide data that is supposed to be hidden
|
||||
* in this structure so it won't even appear in header files.
|
||||
@ -269,9 +262,9 @@ public:
|
||||
|
||||
// "Palette" of available ModelRenderers. Do not use these directly for
|
||||
// rendering and submission; use the aliases above instead.
|
||||
ModelRenderer* pal_NormalFF[NumVertexTypes];
|
||||
ModelRenderer* pal_PlayerFF[NumVertexTypes];
|
||||
ModelRenderer* pal_TranspFF[NumVertexTypes];
|
||||
ModelRenderer* pal_NormalFF;
|
||||
ModelRenderer* pal_PlayerFF;
|
||||
ModelRenderer* pal_TranspFF;
|
||||
ModelRenderer* pal_TranspSortAll;
|
||||
|
||||
ModelRenderer* pal_NormalShader;
|
||||
@ -280,7 +273,7 @@ public:
|
||||
ModelRenderer* pal_PlayerInstancingShader;
|
||||
ModelRenderer* pal_TranspShader;
|
||||
|
||||
ModelVertexRendererPtr VertexFF[NumVertexTypes];
|
||||
ModelVertexRendererPtr VertexFF;
|
||||
ModelVertexRendererPtr VertexPolygonSort;
|
||||
ModelVertexRendererPtr VertexRendererShader;
|
||||
ModelVertexRendererPtr VertexInstancingShader;
|
||||
@ -304,12 +297,9 @@ public:
|
||||
RenderModifierPtr ModTransparent;
|
||||
|
||||
// Palette of available RenderModifiers
|
||||
RenderModifierPtr ModPlain;
|
||||
LitRenderModifierPtr ModPlainLit;
|
||||
RenderModifierPtr ModPlainUnlit;
|
||||
RenderModifierPtr ModPlayerUnlit;
|
||||
LitRenderModifierPtr ModPlayerLit;
|
||||
RenderModifierPtr ModTransparentUnlit;
|
||||
LitRenderModifierPtr ModTransparentLit;
|
||||
|
||||
RenderModifierPtr ModShaderSolidColor;
|
||||
RenderModifierPtr ModShaderSolidColorInstancing;
|
||||
@ -331,12 +321,9 @@ public:
|
||||
terrainRenderer = new TerrainRenderer();
|
||||
shadow = new ShadowMap();
|
||||
|
||||
for(int vertexType = 0; vertexType < NumVertexTypes; ++vertexType)
|
||||
{
|
||||
Model.pal_NormalFF[vertexType] = 0;
|
||||
Model.pal_PlayerFF[vertexType] = 0;
|
||||
Model.pal_TranspFF[vertexType] = 0;
|
||||
}
|
||||
Model.pal_NormalFF = 0;
|
||||
Model.pal_PlayerFF = 0;
|
||||
Model.pal_TranspFF = 0;
|
||||
Model.pal_TranspSortAll = 0;
|
||||
|
||||
Model.pal_NormalShader = 0;
|
||||
@ -359,9 +346,9 @@ public:
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the OpenGL projection and modelview matrices and the viewport according
|
||||
* to the given camera.
|
||||
*/
|
||||
* Load the OpenGL projection and modelview matrices and the viewport according
|
||||
* to the given camera.
|
||||
*/
|
||||
void SetOpenGLCamera(const CCamera& camera)
|
||||
{
|
||||
CMatrix3D view;
|
||||
@ -455,12 +442,9 @@ CRenderer::~CRenderer()
|
||||
UnregisterFileReloadFunc(ReloadChangedFileCB, this);
|
||||
|
||||
// model rendering
|
||||
for(int vertexType = 0; vertexType < NumVertexTypes; ++vertexType)
|
||||
{
|
||||
delete m->Model.pal_NormalFF[vertexType];
|
||||
delete m->Model.pal_PlayerFF[vertexType];
|
||||
delete m->Model.pal_TranspFF[vertexType];
|
||||
}
|
||||
delete m->Model.pal_NormalFF;
|
||||
delete m->Model.pal_PlayerFF;
|
||||
delete m->Model.pal_TranspFF;
|
||||
delete m->Model.pal_TranspSortAll;
|
||||
|
||||
delete m->Model.pal_NormalShader;
|
||||
@ -617,18 +601,14 @@ bool CRenderer::Open(int width, int height)
|
||||
|
||||
|
||||
// model rendering
|
||||
m->Model.VertexFF[AmbientDiffuse] = ModelVertexRendererPtr(new FixedFunctionModelRenderer(false));
|
||||
m->Model.VertexFF[OnlyDiffuse] = ModelVertexRendererPtr(new FixedFunctionModelRenderer(true));
|
||||
m->Model.VertexFF = ModelVertexRendererPtr(new FixedFunctionModelRenderer);
|
||||
m->Model.VertexPolygonSort = ModelVertexRendererPtr(new PolygonSortModelRenderer);
|
||||
m->Model.VertexRendererShader = ModelVertexRendererPtr(new ShaderModelRenderer);
|
||||
m->Model.VertexInstancingShader = ModelVertexRendererPtr(new InstancingModelRenderer);
|
||||
|
||||
for(int vertexType = 0; vertexType < NumVertexTypes; ++vertexType)
|
||||
{
|
||||
m->Model.pal_NormalFF[vertexType] = new BatchModelRenderer(m->Model.VertexFF[vertexType]);
|
||||
m->Model.pal_PlayerFF[vertexType] = new BatchModelRenderer(m->Model.VertexFF[vertexType]);
|
||||
m->Model.pal_TranspFF[vertexType] = new SortModelRenderer(m->Model.VertexFF[vertexType]);
|
||||
}
|
||||
m->Model.pal_NormalFF = new BatchModelRenderer(m->Model.VertexFF);
|
||||
m->Model.pal_PlayerFF = new BatchModelRenderer(m->Model.VertexFF);
|
||||
m->Model.pal_TranspFF = new SortModelRenderer(m->Model.VertexFF);
|
||||
|
||||
m->Model.pal_TranspSortAll = new SortModelRenderer(m->Model.VertexPolygonSort);
|
||||
|
||||
@ -639,14 +619,11 @@ bool CRenderer::Open(int width, int height)
|
||||
m->Model.pal_TranspShader = new SortModelRenderer(m->Model.VertexRendererShader);
|
||||
|
||||
m->Model.ModWireframe = RenderModifierPtr(new WireframeRenderModifier);
|
||||
m->Model.ModPlain = RenderModifierPtr(new PlainRenderModifier);
|
||||
m->Model.ModPlainLit = LitRenderModifierPtr(new PlainLitRenderModifier);
|
||||
m->Model.ModPlainUnlit = RenderModifierPtr(new PlainRenderModifier);
|
||||
SetFastPlayerColor(true);
|
||||
m->Model.ModPlayerLit = LitRenderModifierPtr(new LitPlayerColorRender);
|
||||
m->Model.ModSolidColor = RenderModifierPtr(new SolidColorRenderModifier);
|
||||
m->Model.ModSolidPlayerColor = RenderModifierPtr(new SolidPlayerColorRender);
|
||||
m->Model.ModTransparentUnlit = RenderModifierPtr(new TransparentRenderModifier);
|
||||
m->Model.ModTransparentLit = LitRenderModifierPtr(new LitTransparentRenderModifier);
|
||||
m->Model.ModTransparentShadow = RenderModifierPtr(new TransparentShadowRenderModifier);
|
||||
m->Model.ModTransparentDepthShadow = RenderModifierPtr(new TransparentDepthShadowModifier);
|
||||
|
||||
@ -840,7 +817,8 @@ void CRenderer::BeginFrame()
|
||||
// zero out all the per-frame stats
|
||||
m_Stats.Reset();
|
||||
|
||||
// handle the new shader-based approach
|
||||
// choose model renderers for this frame
|
||||
|
||||
if (m_Options.m_RenderPath == RP_SHADER)
|
||||
{
|
||||
if (m->ShadersDirty)
|
||||
@ -878,55 +856,31 @@ void CRenderer::BeginFrame()
|
||||
m->Model.PlayerInstancing = m->Model.pal_PlayerInstancingShader;
|
||||
|
||||
m->Model.Transp = m->Model.pal_TranspShader;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// choose model renderers for this frame
|
||||
int vertexType;
|
||||
|
||||
if (m_Caps.m_Shadows && m_Options.m_Shadows && m->shadow->GetUseDepthTexture())
|
||||
{
|
||||
vertexType = OnlyDiffuse;
|
||||
m->Model.ModNormal = m->Model.ModPlainLit;
|
||||
m->Model.ModNormalInstancing = m->Model.ModPlainLit;
|
||||
m->Model.ModPlainLit->SetShadowMap(m->shadow);
|
||||
m->Model.ModPlainLit->SetLightEnv(m_LightEnv);
|
||||
|
||||
m->Model.ModPlayer = m->Model.ModPlayerLit;
|
||||
m->Model.ModPlayerInstancing = m->Model.ModPlayerLit;
|
||||
m->Model.ModPlayerLit->SetShadowMap(m->shadow);
|
||||
m->Model.ModPlayerLit->SetLightEnv(m_LightEnv);
|
||||
|
||||
m->Model.ModTransparent = m->Model.ModTransparentLit;
|
||||
m->Model.ModTransparentLit->SetShadowMap(m->shadow);
|
||||
m->Model.ModTransparentLit->SetLightEnv(m_LightEnv);
|
||||
}
|
||||
else
|
||||
{
|
||||
vertexType = AmbientDiffuse;
|
||||
m->Model.ModNormal = m->Model.ModPlain;
|
||||
m->Model.ModNormalInstancing = m->Model.ModPlain;
|
||||
m->Model.ModNormal = m->Model.ModPlainUnlit;
|
||||
m->Model.ModNormalInstancing = m->Model.ModPlainUnlit;
|
||||
m->Model.ModPlayer = m->Model.ModPlayerUnlit;
|
||||
m->Model.ModPlayerInstancing = m->Model.ModPlayerUnlit;
|
||||
m->Model.ModTransparent = m->Model.ModTransparentUnlit;
|
||||
|
||||
m->Model.NormalInstancing = m->Model.pal_NormalFF;
|
||||
m->Model.Normal = m->Model.pal_NormalFF;
|
||||
|
||||
m->Model.PlayerInstancing = m->Model.pal_PlayerFF;
|
||||
m->Model.Player = m->Model.pal_PlayerFF;
|
||||
|
||||
m->Model.ModSolid = m->Model.ModSolidColor;
|
||||
m->Model.ModSolidInstancing = m->Model.ModSolidColor;
|
||||
m->Model.ModSolidPlayer = m->Model.ModSolidPlayerColor;
|
||||
m->Model.ModSolidPlayerInstancing = m->Model.ModSolidPlayerColor;
|
||||
|
||||
if (m_SortAllTransparent)
|
||||
m->Model.Transp = m->Model.pal_TranspSortAll;
|
||||
else
|
||||
m->Model.Transp = m->Model.pal_TranspFF;
|
||||
}
|
||||
|
||||
m->Model.NormalInstancing = m->Model.pal_NormalFF[vertexType];
|
||||
m->Model.Normal = m->Model.pal_NormalFF[vertexType];
|
||||
|
||||
m->Model.PlayerInstancing = m->Model.pal_PlayerFF[vertexType];
|
||||
m->Model.Player = m->Model.pal_PlayerFF[vertexType];
|
||||
|
||||
m->Model.ModSolid = m->Model.ModSolidColor;
|
||||
m->Model.ModSolidInstancing = m->Model.ModSolidColor;
|
||||
m->Model.ModSolidPlayer = m->Model.ModSolidPlayerColor;
|
||||
m->Model.ModSolidPlayerInstancing = m->Model.ModSolidPlayerColor;
|
||||
|
||||
if (m_SortAllTransparent)
|
||||
m->Model.Transp = m->Model.pal_TranspSortAll;
|
||||
else
|
||||
m->Model.Transp = m->Model.pal_TranspFF[vertexType];
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -1010,7 +964,7 @@ void CRenderer::RenderPatches()
|
||||
if (GetRenderPath() == RP_SHADER)
|
||||
m->terrainRenderer->RenderTerrainShader((m_Caps.m_Shadows && m_Options.m_Shadows) ? m->shadow : 0);
|
||||
else
|
||||
m->terrainRenderer->RenderTerrain((m_Caps.m_Shadows && m_Options.m_Shadows) ? m->shadow : 0);
|
||||
m->terrainRenderer->RenderTerrain();
|
||||
|
||||
|
||||
if (m_TerrainRenderMode == WIREFRAME)
|
||||
@ -1494,7 +1448,7 @@ void CRenderer::RenderSubmissions()
|
||||
m->particleRenderer.PrepareForRendering();
|
||||
PROFILE_END("prepare particles");
|
||||
|
||||
if (m_Caps.m_Shadows && m_Options.m_Shadows)
|
||||
if (m_Caps.m_Shadows && m_Options.m_Shadows && GetRenderPath() == RP_SHADER)
|
||||
{
|
||||
RenderShadowMap();
|
||||
}
|
||||
@ -1661,7 +1615,7 @@ void CRenderer::SetSceneCamera(const CCamera& viewCamera, const CCamera& cullCam
|
||||
m_ViewCamera = viewCamera;
|
||||
m_CullCamera = cullCamera;
|
||||
|
||||
if (m_Caps.m_Shadows && m_Options.m_Shadows)
|
||||
if (m_Caps.m_Shadows && m_Options.m_Shadows && GetRenderPath() == RP_SHADER)
|
||||
m->shadow->SetupFrame(m_CullCamera, m_LightEnv->GetSunDir());
|
||||
}
|
||||
|
||||
|
@ -165,7 +165,7 @@ void TerrainRenderer::EndFrame()
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Full-featured terrain rendering with blending and everything
|
||||
void TerrainRenderer::RenderTerrain(ShadowMap* shadow)
|
||||
void TerrainRenderer::RenderTerrain()
|
||||
{
|
||||
debug_assert(m->phase == Phase_Render);
|
||||
|
||||
@ -280,169 +280,44 @@ void TerrainRenderer::RenderTerrain(ShadowMap* shadow)
|
||||
|
||||
int streamflags = STREAM_POS|STREAM_COLOR|STREAM_POSTOUV0;
|
||||
|
||||
if (!shadow)
|
||||
{
|
||||
pglActiveTextureARB(GL_TEXTURE0);
|
||||
// We're not going to use a texture here, but we have to have a valid texture
|
||||
// bound else the texture unit will be disabled.
|
||||
// We should still have a bound splat texture from some earlier rendering,
|
||||
// so assume that's still valid to use.
|
||||
// (TODO: That's a bit of an ugly hack.)
|
||||
pglActiveTextureARB(GL_TEXTURE0);
|
||||
// We're not going to use a texture here, but we have to have a valid texture
|
||||
// bound else the texture unit will be disabled.
|
||||
// We should still have a bound splat texture from some earlier rendering,
|
||||
// so assume that's still valid to use.
|
||||
// (TODO: That's a bit of an ugly hack.)
|
||||
|
||||
// Shadow rendering disabled: (Ambient + Diffuse) * LOS
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
// Shadow rendering disabled: (Ambient + Diffuse) * LOS
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, terrainAmbientColor);
|
||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, terrainAmbientColor);
|
||||
|
||||
losTexture.BindTexture(1);
|
||||
pglClientActiveTextureARB(GL_TEXTURE1);
|
||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
streamflags |= STREAM_POSTOUV1;
|
||||
losTexture.BindTexture(1);
|
||||
pglClientActiveTextureARB(GL_TEXTURE1);
|
||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
streamflags |= STREAM_POSTOUV1;
|
||||
|
||||
glMatrixMode(GL_TEXTURE);
|
||||
glLoadMatrixf(losTexture.GetTextureMatrix());
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glMatrixMode(GL_TEXTURE);
|
||||
glLoadMatrixf(losTexture.GetTextureMatrix());
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_ALPHA);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
}
|
||||
else
|
||||
{
|
||||
losTexture.BindTexture(1);
|
||||
|
||||
g_Renderer.BindTexture(0, shadow->GetTexture());
|
||||
|
||||
const CMatrix3D& texturematrix = shadow->GetTextureMatrix();
|
||||
pglActiveTextureARB(GL_TEXTURE0);
|
||||
glMatrixMode(GL_TEXTURE);
|
||||
glLoadMatrixf(&texturematrix._11);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
|
||||
if (shadow->GetUseDepthTexture())
|
||||
{
|
||||
// (Ambient + ShTranslucency * Diffuse * (1 - Shadow) + Diffuse * Shadow) * LOS
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PRIMARY_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
float shadowTransp = g_Renderer.GetLightEnv().GetTerrainShadowTransparency();
|
||||
float color[4] = { shadowTransp, shadowTransp, shadowTransp, 1.0 };
|
||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);
|
||||
|
||||
pglActiveTextureARB(GL_TEXTURE1);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PRIMARY_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_TEXTURE0);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
pglActiveTextureARB(GL_TEXTURE2);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glBindTexture(GL_TEXTURE_2D, shadow->GetTexture()); // Need a valid texture or the unit will be disabled
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, terrainAmbientColor);
|
||||
|
||||
losTexture.BindTexture(3);
|
||||
pglClientActiveTextureARB(GL_TEXTURE3);
|
||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
streamflags |= STREAM_POSTOUV3;
|
||||
|
||||
glMatrixMode(GL_TEXTURE);
|
||||
glLoadMatrixf(losTexture.GetTextureMatrix());
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_ALPHA);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
}
|
||||
else
|
||||
{
|
||||
// (Ambient + Diffuse * Shadow) * LOS
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
pglActiveTextureARB(GL_TEXTURE1); // + Ambient
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, terrainAmbientColor);
|
||||
|
||||
losTexture.BindTexture(2);
|
||||
pglClientActiveTextureARB(GL_TEXTURE2);
|
||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
streamflags |= STREAM_POSTOUV2;
|
||||
|
||||
glMatrixMode(GL_TEXTURE);
|
||||
glLoadMatrixf(losTexture.GetTextureMatrix());
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_ALPHA);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
}
|
||||
}
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_ALPHA);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
pglActiveTextureARB(GL_TEXTURE0);
|
||||
pglClientActiveTextureARB(GL_TEXTURE0);
|
||||
@ -457,38 +332,12 @@ void TerrainRenderer::RenderTerrain(ShadowMap* shadow)
|
||||
|
||||
// restore OpenGL state
|
||||
g_Renderer.BindTexture(1, 0);
|
||||
if (!shadow)
|
||||
{
|
||||
pglClientActiveTextureARB(GL_TEXTURE1);
|
||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
glMatrixMode(GL_TEXTURE);
|
||||
glLoadIdentity();
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (shadow->GetUseDepthTexture())
|
||||
{
|
||||
g_Renderer.BindTexture(2, 0);
|
||||
g_Renderer.BindTexture(3, 0);
|
||||
|
||||
pglClientActiveTextureARB(GL_TEXTURE3);
|
||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
glMatrixMode(GL_TEXTURE);
|
||||
glLoadIdentity();
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_Renderer.BindTexture(2, 0);
|
||||
|
||||
pglClientActiveTextureARB(GL_TEXTURE2);
|
||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
glMatrixMode(GL_TEXTURE);
|
||||
glLoadIdentity();
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
}
|
||||
}
|
||||
pglClientActiveTextureARB(GL_TEXTURE1);
|
||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
glMatrixMode(GL_TEXTURE);
|
||||
glLoadIdentity();
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
|
||||
pglClientActiveTextureARB(GL_TEXTURE0);
|
||||
pglActiveTextureARB(GL_TEXTURE0);
|
||||
|
@ -77,14 +77,14 @@ public:
|
||||
*
|
||||
* preconditions : PrepareForRendering must have been called this
|
||||
* frame before calling RenderTerrain.
|
||||
*
|
||||
* @param shadow A prepared shadow map, in case rendering with shadows is enabled.
|
||||
*/
|
||||
void RenderTerrain(ShadowMap* shadow);
|
||||
void RenderTerrain();
|
||||
|
||||
/**
|
||||
* Render textured terrain, as with RenderTerrain, but using shaders
|
||||
* instead of multitexturing.
|
||||
*
|
||||
* @param shadow A prepared shadow map, in case rendering with shadows is enabled.
|
||||
*/
|
||||
void RenderTerrainShader(ShadowMap* shadow);
|
||||
|
||||
|
@ -247,7 +247,7 @@ void PolygonSortModelRenderer::UpdateModelData(CModel* model, void* data, int up
|
||||
|
||||
VertexArrayIterator<SColor4ub> Color = psmdl->m_Color.GetIterator<SColor4ub>();
|
||||
|
||||
ModelRenderer::BuildColor4ub(model, Normal, Color, false);
|
||||
ModelRenderer::BuildColor4ub(model, Normal, Color);
|
||||
|
||||
// upload everything to vertex buffer
|
||||
psmdl->m_Array.Upload();
|
||||
@ -672,143 +672,6 @@ void TransparentRenderModifier::PrepareModel(int UNUSED(pass), CModel* UNUSED(mo
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// LitTransparentRenderModifier implementation
|
||||
|
||||
LitTransparentRenderModifier::LitTransparentRenderModifier()
|
||||
{
|
||||
}
|
||||
|
||||
LitTransparentRenderModifier::~LitTransparentRenderModifier()
|
||||
{
|
||||
}
|
||||
|
||||
int LitTransparentRenderModifier::BeginPass(int pass)
|
||||
{
|
||||
debug_assert(GetShadowMap() && GetShadowMap()->GetUseDepthTexture());
|
||||
|
||||
if (pass == 0)
|
||||
{
|
||||
// First pass: Put down Z for opaque parts of the model,
|
||||
// don't touch the color buffer.
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_CONSTANT);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
|
||||
// just pass through texture's alpha
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
// Set the proper LOD bias
|
||||
glTexEnvf(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, g_Renderer.m_Options.m_LodBias);
|
||||
|
||||
glEnable(GL_ALPHA_TEST);
|
||||
glAlphaFunc(GL_GREATER,0.975f);
|
||||
|
||||
// render everything with color writes off to setup depth buffer correctly
|
||||
glColorMask(0,0,0,0);
|
||||
|
||||
return STREAM_POS|STREAM_UV0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Second pass: Put down color, disable Z write
|
||||
glColorMask(1,1,1,1);
|
||||
|
||||
glDepthMask(0);
|
||||
|
||||
// Ambient + Diffuse * Shadow
|
||||
pglActiveTextureARB(GL_TEXTURE0);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PRIMARY_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE1);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
pglActiveTextureARB(GL_TEXTURE1);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glBindTexture(GL_TEXTURE_2D, GetShadowMap()->GetTexture());
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &GetLightEnv()->m_UnitsAmbientColor.X);
|
||||
|
||||
// Incoming color is ambient + diffuse light
|
||||
pglActiveTextureARB(GL_TEXTURE2);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glBindTexture(GL_TEXTURE_2D, GetShadowMap()->GetTexture());
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE0);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE0);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
pglActiveTextureARB(GL_TEXTURE0);
|
||||
|
||||
glAlphaFunc(GL_GREATER,0);
|
||||
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
// Set the proper LOD bias
|
||||
glTexEnvf(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, g_Renderer.m_Options.m_LodBias);
|
||||
|
||||
return STREAM_POS|STREAM_COLOR|STREAM_UV0|STREAM_TEXGENTOUV1;
|
||||
}
|
||||
}
|
||||
|
||||
bool LitTransparentRenderModifier::EndPass(int pass)
|
||||
{
|
||||
if (pass == 0)
|
||||
return false; // multi-pass
|
||||
|
||||
pglActiveTextureARB(GL_TEXTURE1);
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
pglActiveTextureARB(GL_TEXTURE2);
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
pglActiveTextureARB(GL_TEXTURE0);
|
||||
|
||||
glDisable(GL_BLEND);
|
||||
glDisable(GL_ALPHA_TEST);
|
||||
glDepthMask(1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const CMatrix3D* LitTransparentRenderModifier::GetTexGenMatrix(int UNUSED(pass))
|
||||
{
|
||||
return &GetShadowMap()->GetTextureMatrix();
|
||||
}
|
||||
|
||||
void LitTransparentRenderModifier::PrepareTexture(int UNUSED(pass), CTexturePtr& texture)
|
||||
{
|
||||
texture->Bind(0);
|
||||
}
|
||||
|
||||
void LitTransparentRenderModifier::PrepareModel(int UNUSED(pass), CModel* UNUSED(model))
|
||||
{
|
||||
// No per-model setup necessary
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// TransparentShadowRenderModifier implementation
|
||||
|
||||
|
@ -110,29 +110,6 @@ public:
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Class LitTransparentRenderModifier: Modifier for transparent models,
|
||||
* including alpha blending and shadowed lighting.
|
||||
*
|
||||
* @note Use only when depth textures are used for shadows and thus supported by the OpenGL
|
||||
* implementation.
|
||||
*/
|
||||
class LitTransparentRenderModifier : public LitRenderModifier
|
||||
{
|
||||
public:
|
||||
LitTransparentRenderModifier();
|
||||
~LitTransparentRenderModifier();
|
||||
|
||||
// Implementation
|
||||
int BeginPass(int pass);
|
||||
bool EndPass(int pass);
|
||||
const CMatrix3D* GetTexGenMatrix(int pass);
|
||||
void PrepareTexture(int pass, CTexturePtr& texture);
|
||||
void PrepareModel(int pass, CModel* model);
|
||||
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Class TransparentShadowRenderModifier: Use to render shadow data for
|
||||
* transparent models into a luminance map.
|
||||
|
Loading…
Reference in New Issue
Block a user