1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
// renderparticles.cpp
#include "cube.h"
#import "DynamicEntity.h"
const int MAXPARTICLES = 10500;
const int NUMPARTCUTOFF = 20;
struct particle {
OFVector3D o, d;
int fade, type;
int millis;
particle *next;
};
particle particles[MAXPARTICLES], *parlist = NULL, *parempty = NULL;
bool parinit = false;
VARP(maxparticles, 100, 2000, MAXPARTICLES - 500);
static void
newparticle(const OFVector3D *o, const OFVector3D *d, int fade, int type)
{
if (!parinit) {
loopi(MAXPARTICLES)
{
particles[i].next = parempty;
parempty = &particles[i];
}
parinit = true;
}
if (parempty) {
particle *p = parempty;
parempty = p->next;
p->o = *o;
p->d = *d;
p->fade = fade;
p->type = type;
p->millis = lastmillis;
p->next = parlist;
|
|
|
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
// renderparticles.cpp
#include "cube.h"
#import "DynamicEntity.h"
const int MAXPARTICLES = 10500;
const int NUMPARTCUTOFF = 20;
struct particle {
OFVector3D o, d;
int fade, type;
int millis;
struct particle *next;
};
struct particle particles[MAXPARTICLES], *parlist = NULL, *parempty = NULL;
bool parinit = false;
VARP(maxparticles, 100, 2000, MAXPARTICLES - 500);
static void
newparticle(const OFVector3D *o, const OFVector3D *d, int fade, int type)
{
if (!parinit) {
loopi(MAXPARTICLES)
{
particles[i].next = parempty;
parempty = &particles[i];
}
parinit = true;
}
if (parempty) {
struct particle *p = parempty;
parempty = p->next;
p->o = *o;
p->d = *d;
p->fade = fade;
p->type = type;
p->millis = lastmillis;
p->next = parlist;
|
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
{ 1.0f, 1.0f, 1.0f, 20, 8, 1.2f }, // blue: fireball2
{ 1.0f, 1.0f, 1.0f, 20, 9, 1.2f }, // green: fireball3
{ 1.0f, 0.1f, 0.1f, 0, 7, 0.2f }, // red: demotrack
};
int numrender = 0;
for (particle *p, **pp = &parlist; p = *pp;) {
parttype *pt = &parttypes[p->type];
glBindTexture(GL_TEXTURE_2D, pt->tex);
glBegin(GL_QUADS);
glColor3d(pt->r, pt->g, pt->b);
float sz = pt->sz * particlesize / 100.0f;
// perf varray?
|
|
|
|
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
{ 1.0f, 1.0f, 1.0f, 20, 8, 1.2f }, // blue: fireball2
{ 1.0f, 1.0f, 1.0f, 20, 9, 1.2f }, // green: fireball3
{ 1.0f, 0.1f, 0.1f, 0, 7, 0.2f }, // red: demotrack
};
int numrender = 0;
for (struct particle *p, **pp = &parlist; (p = *pp) != NULL;) {
struct parttype *pt = &parttypes[p->type];
glBindTexture(GL_TEXTURE_2D, pt->tex);
glBegin(GL_QUADS);
glColor3d(pt->r, pt->g, pt->b);
float sz = pt->sz * particlesize / 100.0f;
// perf varray?
|