Files
fs2open.github.com/code/graphics/grbatch.h
T
bobboau b95880ac6b fixing some minnor errors with the batcher code
git-svn-id: svn://svn.icculus.org/fs2open/trunk/fs2_open@3910 387891d4-d844-0410-90c0-e4c51a9137d3
2015-04-29 18:42:47 +10:00

90 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.
*
*/
#ifndef __GRBATCH_H__
#define __GRBATCH_H__
#define LOCAL_SPACE 0
#define WORLD_SPACE 1
#include "graphics/2d.h"
class geometry_batcher
{
private:
// vec3d* cam_position;
// matrix* cam_matrix;
int n_to_render; // the number of primitives to render
int n_allocated; // the number of verts allocated
vertex *vert;
vertex **vert_list; // V's stupid rendering functions need this
// makes sure we have enough space in the memory buffer for the geometry we are about to put into it
// you need to figure out how many verts are going to be required
void allocate_internal(int n_verts);
protected:
void clone(const geometry_batcher &geo);
public:
int space;
geometry_batcher(): n_to_render(0), n_allocated(0), vert(NULL), vert_list(NULL),space(LOCAL_SPACE){};
~geometry_batcher();
geometry_batcher(const geometry_batcher &geo) { clone(geo); }
const geometry_batcher &operator=(const geometry_batcher &geo);
// initial memory space needed
// NOTE: This MUST be called BEFORE calling any of the draw_*() functions!!
void allocate(int quad, int n_tri = 0);
// allocate an additional block of memory to what we already have (this is a resize function)
void add_allocate(int quad, int n_tri = 0);
// draw a bitmap into the geometry batcher
void draw_bitmap(vertex *position, int orient, float rad, float depth = 0);
// draw a rotated bitmap
void draw_bitmap(vertex *position, int orient, float rad, float angle, float depth);
// draw a simple 3 vert polygon
void draw_tri(vertex *verts);
// draw a simple 4 vert polygon
void draw_quad(vertex *verts);
// draw a beam
void draw_beam(vec3d *start, vec3d *end, float width, float intensity = 1.0f);
//draw a laser
float draw_laser(vec3d *p0, float width1, vec3d *p1, float width2, int r, int g, int b);
// draw all of the batched geometry to the back buffer and flushes the cache
// accepts tmap flags so you can use anything you want really
void render(int flags);
// determine if we even need to try and render this (helpful for particle system)
int need_to_render() { return n_to_render; };
void operator =(int){};
};
float batch_add_laser(int texture, vec3d *p0, float width1, vec3d *p1, float width2, int r = 255, int g = 255, int b = 255);
int batch_add_bitmap(int texture, int tmap_flags, vertex *pnt, int orient, float rad, int alpha = GR_ALPHABLEND_FILTER, float depth = 0.0f);
geometry_batcher* batch_get_geometry(uint geo);
void batch_render_all();
void batch_reset();
uint find_good_batch_item(int texture, int flags=0, int alpha = GR_ALPHABLEND_FILTER);
void batch_add_flag(uint geo, int flag);
void batch_remove_flag(uint geo, int flag);
void batch_set_flag(uint geo, int flag);
#endif