mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-07 08:15:59 -10:00
131 lines
2.8 KiB
C++
131 lines
2.8 KiB
C++
/*
|
|
* Code created by Thomas Whittaker (RT) for a Freespace 2 source code project
|
|
*
|
|
* You may not sell or otherwise commercially exploit the source or things you
|
|
* created based on the source.
|
|
*
|
|
*/
|
|
|
|
#include "globalincs/pstypes.h"
|
|
#include "graphics/grbatch.h"
|
|
#include "graphics/2d.h"
|
|
#include "cmdline/cmdline.h"
|
|
|
|
typedef struct {
|
|
int start, length;
|
|
int flags;
|
|
int bitmap;
|
|
} BatchNode;
|
|
|
|
const int BATCH_MAX_VERTEX = 500;
|
|
const int BATCH_MAX = 50;
|
|
|
|
vertex *Batch_vertex_array = NULL;
|
|
BatchNode *Batch_array = NULL;
|
|
bool Batch_in_process = false;
|
|
int Batch_current = 0;
|
|
int Batch_vertex_current = 0;
|
|
|
|
bool batch_init()
|
|
{
|
|
if(!Cmdline_batch_3dunlit) return true;
|
|
|
|
Batch_vertex_array = (vertex *) malloc(sizeof(vertex) * BATCH_MAX_VERTEX);
|
|
Batch_array = (BatchNode *) malloc(sizeof(vertex) * BATCH_MAX);
|
|
|
|
return (Batch_array != 0);
|
|
}
|
|
|
|
void batch_deinit()
|
|
{
|
|
if(!Cmdline_batch_3dunlit) return;
|
|
|
|
if(Batch_array)
|
|
free(Batch_array);
|
|
}
|
|
|
|
void batch_start()
|
|
{
|
|
Batch_in_process = true;
|
|
Batch_current = 0;
|
|
Batch_vertex_current = 0;
|
|
}
|
|
|
|
void batch_end()
|
|
{
|
|
Batch_in_process = false;
|
|
}
|
|
|
|
void batch_render()
|
|
{
|
|
if(!Cmdline_batch_3dunlit) return;
|
|
if(Batch_current == 0) return;
|
|
|
|
// Sort
|
|
// Batch up again
|
|
// Send to renderer
|
|
for(int i = 0; i < Batch_current; i++)
|
|
{
|
|
vertex *vlist = &Batch_vertex_array[Batch_array[i].start];
|
|
|
|
gr_set_bitmap(Batch_array[i].bitmap);
|
|
|
|
void gr_d3d_tmapper_internal_batch_3d_unlit( int nverts, vertex *verts, uint flags);
|
|
gr_d3d_tmapper_internal_batch_3d_unlit(Batch_array[i].length, vlist, Batch_array[i].flags);
|
|
}
|
|
|
|
Batch_current = 0;
|
|
Batch_vertex_current = 0;
|
|
}
|
|
|
|
vertex *batch_get_block(int num_verts, int flags)
|
|
{
|
|
if(!Cmdline_batch_3dunlit) return NULL;
|
|
|
|
if(Batch_vertex_array == NULL || Batch_array == NULL) {
|
|
Assert(0);
|
|
return NULL;
|
|
}
|
|
|
|
int vcurrent = 0;
|
|
|
|
// We've run out of vertex slots!
|
|
if(num_verts >= (BATCH_MAX_VERTEX - Batch_vertex_current))
|
|
{
|
|
batch_render();
|
|
}
|
|
|
|
// Not the first batch
|
|
if(Batch_current > 0)
|
|
{
|
|
int last_batch = Batch_current - 1;
|
|
|
|
// Can add to current batch
|
|
if( Batch_array[last_batch].flags == flags &&
|
|
Batch_array[last_batch].bitmap == gr_screen.current_bitmap)
|
|
{
|
|
int pos = Batch_array[last_batch].start + Batch_array[last_batch].length;
|
|
vertex *block = &Batch_vertex_array[pos];
|
|
Batch_array[last_batch].length += num_verts;
|
|
Batch_vertex_current += num_verts;
|
|
return block;
|
|
}
|
|
}
|
|
|
|
// We've run out of batch slots!
|
|
if(Batch_current >= BATCH_MAX)
|
|
{
|
|
batch_render();
|
|
}
|
|
|
|
// Make a new batch
|
|
Batch_array[Batch_current].flags = flags;
|
|
Batch_array[Batch_current].start = Batch_vertex_current;
|
|
Batch_array[Batch_current].length = num_verts;
|
|
Batch_array[Batch_current].bitmap = gr_screen.current_bitmap;
|
|
vertex *block = &Batch_vertex_array[Batch_array[Batch_current].start];
|
|
Batch_current++;
|
|
|
|
Batch_vertex_current += num_verts;
|
|
return block;
|
|
} |