1/*
2 * Copyright 2012-2013 Tri-Edge AI <triedgeai@gmail.com>
3 * All rights reserved. Distributed under the terms of the MIT license.
4 */
5
6
7#include "Particle.h"
8
9#include <List.h>
10
11#include <stdlib.h>
12
13
14#define frand() ((float)rand() / (float)RAND_MAX)
15
16
17BList* Particle::list;
18
19
20void
21Particle::Initialize(int32 size, int32 shade)
22{
23	list = new BList();
24
25	for (int32 i = 0; i < size; i++) {
26		Particle* p = new Particle();
27
28		p->x = frand() * 30.0f - 15.0f;
29		p->y = frand() * 30.0f - 15.0f;
30		p->z = frand() * 5.0f;
31		p->r = frand() * 360.0f;
32
33		p->vx = frand() - 0.5f;
34		p->vy = frand() - 0.5f;
35		p->vz = frand() - 0.5f;
36		p->vr = (frand() - 0.5f) * 180.0f;
37
38		if (shade == 0) {
39			// Red
40			p->red = 0.1f + frand() * 0.2f;
41			p->green = 0.0f;
42			p->blue = frand() * 0.05f;
43		} else if (shade == 1) {
44			// Green
45			p->red = 0;
46			p->green =  0.1f + frand() * 0.2f;
47			p->blue = frand() * 0.05f;
48		} else if (shade == 2) {
49			// Blue
50			p->red = 0;
51			p->green = frand() * 0.05f;
52			p->blue = 0.1f + frand() * 0.2f;
53		} else if (shade == 3) {
54			// Orange
55			p->red = 0.1f + frand() * 0.1f;
56			p->green =  0.05f + frand() * 0.1f;
57			p->blue = 0.0f;
58		} else if (shade == 4) {
59			// Purple
60			p->red = 0.1f + frand() * 0.2f;
61			p->green = 0.0f;
62			p->blue = 0.1f + frand() * 0.2f;
63		} else if (shade == 5) {
64			// White
65			p->red = p->green = p->blue = 0.1f + frand() * 0.2f;
66		} else if (shade == 6) {
67			// Rainbow
68			p->red = 0.1f + frand() * 0.2f;
69			p->green = 0.1f + frand() * 0.2f;
70			p->blue = 0.1f + frand() * 0.2f;
71		} else {
72			// Man, this shouldn't even happen.. Blue.
73			p->red = 0;
74			p->green = frand() * 0.05f;
75			p->blue = 0.1f + frand() * 0.2f;
76		}
77
78		list->AddItem(p);
79	}
80}
81
82
83void
84Particle::Terminate()
85{
86	for (int32 i = 0; i < list->CountItems(); i++)
87		delete (Particle*)list->ItemAt(i);
88
89	list->MakeEmpty();
90	delete list;
91}
92
93
94void
95Particle::Tick()
96{
97	for (int32 i = 0; i < list->CountItems(); i++) {
98		Particle* p = (Particle*)list->ItemAt(i);
99		p->_Logic();
100		p->_Render();
101	}
102}
103
104
105void
106Particle::_Logic()
107{
108	// Motion
109	x += vx;
110	y += vy;
111	z += vz;
112	r += vr;
113
114	// Friction
115	vx *= 0.98f;
116	vy *= 0.98f;
117	vz *= 0.98f;
118	vr *= 0.98f;
119}
120
121
122void
123Particle::_Render() const
124{
125	glPushMatrix();
126	glTranslatef(x, y, z);
127	glRotatef(r, 0.0f, 0.0f, 1.0f);
128	glColor3f(red, green, blue);
129	glBegin(GL_QUADS);
130	glVertex3f(-0.25f,  0.25f,  0.0f);
131	glVertex3f(-0.25f, -0.25f,  0.0f);
132	glVertex3f( 0.25f, -0.25f,  0.0f);
133	glVertex3f( 0.25f,  0.25f,  0.0f);
134	glEnd();
135	glPopMatrix();
136}
137