1
0
forked from 0ad/0ad

This was SVN commit r1805.

This commit is contained in:
NoMonkey 2005-01-24 08:28:03 +00:00
parent bdafae6453
commit b2e50cfea9
4 changed files with 128 additions and 80 deletions

View File

@ -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()

View File

@ -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++;

View File

@ -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,6 +49,20 @@ void CPlayerRenderer::Render()
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
}
//TODO: Possibly remove render states from the loop that don't need to be
// initialized for each model. Also, possibly combine the loops.
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();
// 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 up texture environment for base pass - modulate texture and primary color
glActiveTexture(GL_TEXTURE0);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
@ -68,14 +88,34 @@ void CPlayerRenderer::Render()
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);
}
}
// Render first pass
RenderObjectsStreams(STREAM_POS|STREAM_COLOR|STREAM_UV0);
//RenderObjectsStreams(STREAM_POS|STREAM_COLOR|STREAM_UV0);
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();
// 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 up second pass: first texture unit carries on doing texture*lighting,
// but passes alpha through inverted; the second texture unit modulates
@ -99,17 +139,26 @@ void CPlayerRenderer::Render()
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);
// }
// }
//}

View File

@ -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;
};