forked from 0ad/0ad
This was SVN commit r1805.
This commit is contained in:
parent
bdafae6453
commit
b2e50cfea9
@ -87,8 +87,8 @@ CGameAttributes::CGameAttributes():
|
||||
|
||||
AddProperty(L"players", (GetFn)&CGameAttributes::JSGetPlayers);
|
||||
|
||||
m_Players.resize(3);
|
||||
for (int i=0;i<3;i++)
|
||||
m_Players.resize(4);
|
||||
for (int i=0;i<4;i++)
|
||||
m_Players[i]=new CPlayer(i);
|
||||
|
||||
m_Players[0]->SetName(L"Gaia");
|
||||
@ -99,6 +99,9 @@ CGameAttributes::CGameAttributes():
|
||||
|
||||
m_Players[2]->SetName(L"Boco the Insignificant");
|
||||
m_Players[2]->SetColour(SPlayerColour(0.0f, 0.0f, 1.0f));
|
||||
|
||||
m_Players[3]->SetName(L"NoMonkey");
|
||||
m_Players[3]->SetColour(SPlayerColour(0.5f, 0.0f, 1.0f));
|
||||
}
|
||||
|
||||
CGameAttributes::~CGameAttributes()
|
||||
|
@ -333,12 +333,8 @@ void CModelRData::RenderModels(u32 streamflags,u32 flags)
|
||||
const CVertexBuffer::Batch* batch=batches[i];
|
||||
if (batch->m_IndexData.size()>0) {
|
||||
if (streamflags & STREAM_UV0)
|
||||
{
|
||||
// TODO: If not doing player-colours, only bind this to
|
||||
// the first texture unit
|
||||
g_Renderer.BindTexture(0,tex_id(batch->m_Texture));
|
||||
//g_Renderer.BindTexture(1,tex_id(batch->m_Texture));
|
||||
}
|
||||
|
||||
for (uint j=0;j<batch->m_IndexData.size();j++) {
|
||||
glDrawElements(GL_TRIANGLES,(GLsizei)batch->m_IndexData[j].first,GL_UNSIGNED_SHORT,batch->m_IndexData[j].second);
|
||||
g_Renderer.m_Stats.m_DrawCalls++;
|
||||
|
@ -17,10 +17,16 @@
|
||||
#include "Model.h"
|
||||
#include "Game.h"
|
||||
|
||||
#include "CConsole.h"
|
||||
|
||||
extern CConsole *g_Console;
|
||||
|
||||
CPlayerRenderer g_PlayerRenderer;
|
||||
|
||||
|
||||
//TODO: Clean up code!
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// SortObjectsByDist: sorting class used for back-to-front sort of transparent passes
|
||||
struct SortObjectsByDist {
|
||||
@ -43,73 +49,116 @@ void CPlayerRenderer::Render()
|
||||
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
|
||||
}
|
||||
|
||||
// set up texture environment for base pass - modulate texture and primary color
|
||||
glActiveTexture(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_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PRIMARY_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
//TODO: Possibly remove render states from the loop that don't need to be
|
||||
// initialized for each model. Also, possibly combine the loops.
|
||||
|
||||
// Set the proper LOD bias
|
||||
glTexEnvf(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, g_Renderer.m_Options.m_LodBias);
|
||||
for (uint i=0;i<m_Objects.size();++i) {
|
||||
if (!0 || (m_Objects[i].m_Model->GetFlags() & 0)) {
|
||||
CModelRData* modeldata=(CModelRData*) m_Objects[i].m_Model->GetRenderData();
|
||||
|
||||
// Render two passes: first, render the unit as normal. Second,
|
||||
// render it again but modulated with the player-colour, using
|
||||
// the alpha channel as a mask.
|
||||
//
|
||||
// Assume the alpha channel is 1-bit, so there's no need for blending.
|
||||
//
|
||||
// This probably ought to be done in a single pass on hardware that
|
||||
// supports register combiners / fragment programs / etc.
|
||||
// Get the models player ID
|
||||
PS_uint playerid = m_Objects[i].m_Model->GetPlayerID();
|
||||
|
||||
glEnableClientState(GL_VERTEX_ARRAY);
|
||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
glEnableClientState(GL_COLOR_ARRAY);
|
||||
// Get the player color
|
||||
const SPlayerColour& colour = g_Game->GetPlayer( playerid )->GetColour();
|
||||
float color[] = { colour.r, colour.g, colour.b, colour.a };
|
||||
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_CONSTANT);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
// set up texture environment for base pass - modulate texture and primary color
|
||||
glActiveTexture(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_SRC_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PRIMARY_COLOR);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
|
||||
// Set the proper LOD bias
|
||||
glTexEnvf(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, g_Renderer.m_Options.m_LodBias);
|
||||
|
||||
// Render two passes: first, render the unit as normal. Second,
|
||||
// render it again but modulated with the player-colour, using
|
||||
// the alpha channel as a mask.
|
||||
//
|
||||
// Assume the alpha channel is 1-bit, so there's no need for blending.
|
||||
//
|
||||
// This probably ought to be done in a single pass on hardware that
|
||||
// supports register combiners / fragment programs / etc.
|
||||
|
||||
glEnableClientState(GL_VERTEX_ARRAY);
|
||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
glEnableClientState(GL_COLOR_ARRAY);
|
||||
|
||||
// Set the texture environment color the player color
|
||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);
|
||||
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_CONSTANT);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
|
||||
|
||||
glDisable(GL_ALPHA_TEST);
|
||||
|
||||
// Render the model
|
||||
modeldata->RenderStreams(STREAM_POS|STREAM_COLOR|STREAM_UV0, true);
|
||||
}
|
||||
}
|
||||
|
||||
glDisable(GL_ALPHA_TEST);
|
||||
|
||||
// Render first pass
|
||||
RenderObjectsStreams(STREAM_POS|STREAM_COLOR|STREAM_UV0);
|
||||
//RenderObjectsStreams(STREAM_POS|STREAM_COLOR|STREAM_UV0);
|
||||
|
||||
// Set up second pass: first texture unit carries on doing texture*lighting,
|
||||
// but passes alpha through inverted; the second texture unit modulates
|
||||
// with the player colour.
|
||||
for (uint i=0;i<m_Objects.size();++i) {
|
||||
if (!0 || (m_Objects[i].m_Model->GetFlags() & 0)) {
|
||||
CModelRData* modeldata=(CModelRData*) m_Objects[i].m_Model->GetRenderData();
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
// Get the models player ID
|
||||
PS_uint playerid = m_Objects[i].m_Model->GetPlayerID();
|
||||
|
||||
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_ONE_MINUS_SRC_ALPHA);
|
||||
// Get the player color
|
||||
const SPlayerColour& colour = g_Game->GetPlayer( playerid )->GetColour();
|
||||
float color[] = { colour.r, colour.g, colour.b, colour.a };
|
||||
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
// Set up second pass: first texture unit carries on doing texture*lighting,
|
||||
// but passes alpha through inverted; the second texture unit modulates
|
||||
// with the player colour.
|
||||
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
|
||||
// t1 = t0 * playercolor
|
||||
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_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_TEXTURE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
// Continue passing through alpha from texture
|
||||
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);
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
|
||||
// Only render high-alpha parts
|
||||
glEnable(GL_ALPHA_TEST);
|
||||
glAlphaFunc(GL_GREATER,0.5f);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
|
||||
// t1 = t0 * playercolor
|
||||
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_CONSTANT);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
|
||||
|
||||
// Set the texture environment color the player color
|
||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);
|
||||
|
||||
// Continue passing through alpha from texture
|
||||
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);
|
||||
|
||||
|
||||
// Only render high-alpha parts
|
||||
glEnable(GL_ALPHA_TEST);
|
||||
glAlphaFunc(GL_GREATER,0.5f);
|
||||
|
||||
// Render the model
|
||||
modeldata->RenderStreams(STREAM_POS|STREAM_COLOR|STREAM_UV0, true);
|
||||
}
|
||||
}
|
||||
|
||||
// Render second pass
|
||||
RenderObjectsStreams(STREAM_POS|STREAM_COLOR|STREAM_UV0);
|
||||
//RenderObjectsStreams(STREAM_POS|STREAM_COLOR|STREAM_UV0);
|
||||
|
||||
// Restore states
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
@ -220,24 +269,24 @@ void CPlayerRenderer::Add(CModel* model)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// RenderObjectsStreams: render given streams on all objects
|
||||
void CPlayerRenderer::RenderObjectsStreams(u32 streamflags,u32 mflags)
|
||||
{
|
||||
for (uint i=0;i<m_Objects.size();++i) {
|
||||
if (!mflags || (m_Objects[i].m_Model->GetFlags() & mflags)) {
|
||||
CModelRData* modeldata=(CModelRData*) m_Objects[i].m_Model->GetRenderData();
|
||||
|
||||
// Get the models player ID
|
||||
PS_uint playerid = m_Objects[i].m_Model->GetPlayerID();
|
||||
|
||||
// Get the player color
|
||||
const SPlayerColour& colour = g_Game->GetPlayer( playerid )->GetColour();
|
||||
float color[] = { colour.r, colour.g, colour.b, colour.a };
|
||||
|
||||
// Set the texture environment color the player color
|
||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);
|
||||
|
||||
// Render the model
|
||||
modeldata->RenderStreams(streamflags, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
//void CPlayerRenderer::RenderObjectsStreams(u32 streamflags,u32 mflags)
|
||||
//{
|
||||
// for (uint i=0;i<m_Objects.size();++i) {
|
||||
// if (!mflags || (m_Objects[i].m_Model->GetFlags() & mflags)) {
|
||||
// CModelRData* modeldata=(CModelRData*) m_Objects[i].m_Model->GetRenderData();
|
||||
//
|
||||
// // Get the models player ID
|
||||
// PS_uint playerid = m_Objects[i].m_Model->GetPlayerID();
|
||||
//
|
||||
// // Get the player color
|
||||
// const SPlayerColour& colour = g_Game->GetPlayer( playerid )->GetColour();
|
||||
// float color[] = { colour.r, colour.g, colour.b, colour.a };
|
||||
//
|
||||
// // Set the texture environment color the player color
|
||||
// glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);
|
||||
//
|
||||
// // Render the model
|
||||
// modeldata->RenderStreams(streamflags, true);
|
||||
// }
|
||||
// }
|
||||
//}
|
@ -32,13 +32,13 @@ public:
|
||||
// render all deferred objects
|
||||
void Render();
|
||||
// render shadows from all deferred objects
|
||||
void RenderShadows();
|
||||
//void RenderShadows();
|
||||
// empty object list
|
||||
void Clear();
|
||||
|
||||
private:
|
||||
// render given streams on all objects
|
||||
void RenderObjectsStreams(u32 streamflags,u32 mflags=0);
|
||||
//void RenderObjectsStreams(u32 streamflags,u32 mflags=0);
|
||||
// list of transparent objects to render
|
||||
std::vector<SObject> m_Objects;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user