0ad/source/renderer/ModelDefRData.cpp
prefect a05e712319 Added VertexArray & co. classes to simplify a flexible, render path dependent
vertex array layout.
Add CModelDefRData, a per-CModelDef render data class.

This was SVN commit r2826.
2005-10-02 21:11:11 +00:00

90 lines
1.9 KiB
C++

#include "precompiled.h"
#include "ogl.h"
#include "Vector3D.h"
#include "Vector4D.h"
#include "ps/CLogger.h"
#include "graphics/Color.h"
#include "graphics/Model.h"
#include "renderer/ModelRData.h"
#include "renderer/ModelDefRData.h"
#define LOG_CATEGORY "graphics"
// Shared list of all submitted models this frame, sorted by CModelDef
CModelDefRData* CModelDefRData::m_Submissions = 0;
CModelDefRData::CModelDefRData(CModelDef* mdef)
: m_ModelDef(mdef)
{
m_SubmissionNext = 0;
m_SubmissionSlots = 0;
Build();
}
CModelDefRData::~CModelDefRData()
{
}
// Create and upload shared vertex arrays
void CModelDefRData::Build()
{
}
// Submit one model.
// Models are sorted into a hash-table to avoid ping-ponging between
// different render states later on.
void CModelDefRData::Submit(CModelRData* data)
{
debug_assert(data->GetModel()->GetModelDef()->GetRenderData() == this);
if (!m_SubmissionSlots)
{
m_SubmissionNext = m_Submissions;
m_Submissions = this;
}
Handle htex = data->GetModel()->GetTexture()->GetHandle();
uint idx;
for(idx = 0; idx < m_SubmissionSlots; ++idx)
{
CModelRData* in = m_SubmissionModels[idx];
if (in->GetModel()->GetTexture()->GetHandle() == htex)
break;
}
if (idx >= m_SubmissionSlots)
{
++m_SubmissionSlots;
if (m_SubmissionSlots > m_SubmissionModels.size())
{
m_SubmissionModels.push_back(0);
debug_assert(m_SubmissionModels.size() == m_SubmissionSlots);
}
m_SubmissionModels[idx] = 0;
}
data->m_SubmissionNext = m_SubmissionModels[idx];
m_SubmissionModels[idx] = data;
}
// Clear all submissions for this CModelDef
// Do not shrink the submissions array immediately to avoid unnecessary
// allocate/free roundtrips through memory management.
void CModelDefRData::ClearSubmissions()
{
static uint mostslots = 1;
if (m_SubmissionSlots > mostslots)
{
mostslots = m_SubmissionSlots;
debug_printf("CModelDefRData: SubmissionSlots maximum: %u\n", mostslots);
}
m_SubmissionSlots = 0;
}