69 lines
2.5 KiB
C++
69 lines
2.5 KiB
C++
/* -----------------------------------------------------------------------------
|
|
GSFramework
|
|
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
|
----------------------------------------------------------------------------- */
|
|
|
|
|
|
#include "gpu/gpu_triangle_batch.h"
|
|
#include "gpu/gpu_renderer.h"
|
|
|
|
using namespace GS;
|
|
using namespace GS::GPU;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
void TriangleBatch::Flush()
|
|
{
|
|
if (batch_triangle_count > 0)
|
|
renderer.DrawTriangle(batch_triangle_count, batch_vtx, batch_idx, batch_col, batch_uv, batch_t, batch_blend_op, batch_render_word);
|
|
|
|
batch_triangle_count = 0;
|
|
batch_attrib_offset = 0;
|
|
}
|
|
void TriangleBatch::DrawTriangle(uint triangle_count, uint attrib_count, const Vector4 *vtx, const ushort *idx, const Color *col, const Vector2 *uv, const Render::Texture *t, Core::Material::BlendOperator blend_op, Core::Material::RenderWord render_word)
|
|
{
|
|
bool batch_broken = (batch_triangle_count == 0) || (batch_t != t) || (batch_blend_op != blend_op) || (batch_render_word != render_word);
|
|
|
|
if (batch_triangle_count + triangle_count > batch_max_triangle_count)
|
|
batch_broken = true;
|
|
|
|
if (batch_broken)
|
|
Flush();
|
|
|
|
// Transfer and fix-up indices.
|
|
for (uint n = 0; n < triangle_count; ++n)
|
|
{
|
|
batch_idx[batch_triangle_count * 3 + 0] = (ushort)(idx[n * 3 + 0] + batch_attrib_offset);
|
|
batch_idx[batch_triangle_count * 3 + 1] = (ushort)(idx[n * 3 + 1] + batch_attrib_offset);
|
|
batch_idx[batch_triangle_count * 3 + 2] = (ushort)(idx[n * 3 + 2] + batch_attrib_offset);
|
|
++batch_triangle_count;
|
|
}
|
|
|
|
// Transfer attributes.
|
|
Memory::Copy(&batch_vtx[batch_attrib_offset], vtx, sizeof(Vector4) * attrib_count);
|
|
Memory::Copy(&batch_col[batch_attrib_offset], col, sizeof(Color) * attrib_count);
|
|
Memory::Copy(&batch_uv[batch_attrib_offset], uv, sizeof(Vector2) * attrib_count);
|
|
batch_attrib_offset += attrib_count;
|
|
|
|
batch_render_word = render_word;
|
|
batch_blend_op = blend_op;
|
|
batch_t = t;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
TriangleBatch::TriangleBatch(Renderer &r, uint max) : renderer(r)
|
|
{
|
|
batch_t = NULL;
|
|
batch_render_word = Core::Material::Render_None;
|
|
batch_blend_op = Core::Material::Blend_None;
|
|
|
|
batch_max_triangle_count = max;
|
|
batch_triangle_count = 0;
|
|
batch_attrib_offset = 0;
|
|
|
|
batch_idx.Allocate(3 * batch_max_triangle_count);
|
|
batch_vtx.Allocate(3 * batch_max_triangle_count);
|
|
batch_col.Allocate(3 * batch_max_triangle_count);
|
|
batch_uv.Allocate(3 * batch_max_triangle_count);
|
|
}
|