File: tr_ghost.h

package info (click to toggle)
openmohaa 0.81.1%2Bdfsg-2
  • links: PTS, VCS
  • area: contrib
  • in suites: trixie
  • size: 29,124 kB
  • sloc: ansic: 270,865; cpp: 250,173; sh: 234; asm: 141; xml: 64; makefile: 7
file content (300 lines) | stat: -rw-r--r-- 7,151 bytes parent folder | download | duplicates (4)
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
/*
===========================================================================
Copyright (C) 2023-2024 the OpenMoHAA team

This file is part of OpenMoHAA source code.

OpenMoHAA source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.

OpenMoHAA source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
===========================================================================
*/

#pragma once

#include "tr_local.h"
#include "../qcommon/vector.h"
#include "../qcommon/container.h"
#include "../qcommon/str.h"

using outcode = unsigned int;

class Particle
{
private:
    float m_startTime;
    float m_dieTime;

    Vector m_velocity;
    Vector m_acceleration;
    Vector m_perp;

    qboolean m_wavy;
    float    m_wavyDist;
    float    m_wavyOffset;

    int   m_srcColor;
    int   m_dstColor;
    int   m_deltaR;
    int   m_deltaG;
    int   m_deltaB;
    int   m_srcR;
    int   m_srcG;
    int   m_srcB;
    int   m_dstR;
    int   m_dstG;
    int   m_dstB;
    float m_colorRate;

    Vector m_realposition;

    float m_life;
    float m_maxspeed;

    qboolean m_swarm;
    int      m_swarmfrequency;
    int      m_swarmdelta;

    Vector m_parentOrigin;

public:
    Vector m_position;
    int    m_color;

public:
    Particle(
        Vector   pos,
        Vector   vel,
        Vector   acc,
        int      srcColor,
        int      dstColor,
        float    colorRate,
        qboolean wavy,
        float    wavyDist,
        float    currentTime,
        float    dieTime,
        float    maxspeed,
        Vector   parentOrg,
        qboolean swarm,
        int      freq,
        int      delta
    );

    void  Update(float currentTime);
    float GetDieTime();
};

class ParticleEmitter
{
private:
    float m_time;
    float m_lasttime;

    Vector m_position;

    int   m_srcColor;
    int   m_dstColor;
    float m_minColorRate;
    float m_maxColorRate;

    float m_minRate;
    float m_maxRate;

    float m_minLife;
    float m_maxLife;

    float m_angle;
    float m_angleVar;

    float m_minSpeed;
    float m_maxSpeed;
    float m_accAngle;
    float m_accAngleVar;
    float m_minAccSpeed;
    float m_maxAccSpeed;

    float    m_minWavyDist;
    float    m_maxWavyDist;
    qboolean m_wavy;

    qboolean m_gravityWell;
    float    m_gravityWellStrength;

    qboolean m_particles;
    Vector   m_gravityEffectVector;

    qboolean m_ballLightning;
    int      m_minBallLightningRadius;
    int      m_maxBallLightningRadius;
    float    m_lightningVar;
    int      m_lightningSubdivisions;

    qboolean m_swarm;
    int      m_swarmfrequency;
    int      m_swarmdelta;

    int m_maxspeed;

public:
    Container<Particle *> particleList;

public:
    ParticleEmitter(
        Vector   position,
        float    minSpeed,
        float    maxSpeed,
        float    angle,
        float    angleVar,
        float    minAccSpeed,
        float    maxAccSpeed,
        float    accAngle,
        float    accAngleVar,
        float    minRate,
        float    maxRate,
        int      srcColor,
        int      dstColor,
        float    minColorRate,
        float    maxColorRate,
        qboolean wavy,
        float    minWavyDist,
        float    maxWavyDist,
        float    minLife,
        float    maxLife,
        qboolean particles,
        qboolean gravityWell,
        float    gravityWellStrength,
        qboolean ballLightning,
        int      minBallLightningRadius,
        int      maxBallLightningRadius,
        float    lightningVar,
        int      lightningSubdivisions,
        qboolean swarm,
        int      swarmfreq,
        int      swarmdelta
    );
    ParticleEmitter();
    ~ParticleEmitter();

    void Emit(float currentTime);
    void UpdateValues();

    Vector GetPosition();
    Vector GetVelocity();
    Vector GetVelocityDirection();
    Vector GetVelocityDirectionMin();
    Vector GetVelocityDirectionMax();
    Vector GetAcceleration();
    Vector GetAccelerationDirection();
    Vector GetAccelerationDirectionMin();
    Vector GetAccelerationDirectionMax();

    int GetSrcColor();
    int GetDstColor();

    float GetGravityWellStrength();
    float GetRate();
    float GetColorRate();

    float GetWavyDistance();
    float GetDieTime(float currentTime);
    int   GetBallLightningRadius();
    float GetLightningVar();
    int   GetLightningSubdivisions();

    qboolean IsWavy();
    qboolean IsGravityWell();
    qboolean IsParticles();
    qboolean IsBallLightning();
    qboolean IsSwarm();

    void SetMinSpeed(float value);
    void SetMaxSpeed(float value);

    void SetAngle(float value);
    void SetAngleVar(float value);

    void SetMinAccSpeed(float value);
    void SetMaxAccSpeed(float value);
    void SetAccAngle(float value);
    void SetAccAngleVar(float value);

    void SetMinRate(float value);
    void SetMaxRate(float value);

    void SetSrcColor(int value);
    void SetDstColor(int value);
    void SetMinColorRate(float value);
    void SetMaxColorRate(float value);

    void SetWavy(int value);

    void SetParticles(int value);
    void SetGravityWell(int value);

    void SetMinWavyDist(float value);
    void SetMaxWavyDist(float value);

    void SetMinLife(float value);
    void SetMaxLife(float value);

    void SetGravityWellStrength(float value);
    void SetGravityEffectVector(Vector value);

    void SetBallLightning(int value);
    void SetMinBallLightningRadius(int value);
    void SetMaxBallLightningRadius(int value);
    void SetLightningVar(float value);
    void SetLightningSubdivisions(int value);

    float RandomizeRange(float minRange, float maxRange);
    float RandomizeAngle(float minAngle, float maxAngle);

    Vector CalculateDirection(float value);

    void Load(char **buf_p);
};

class GhostTexture
{
public:
    Container<ParticleEmitter *> m_emitterList;

    int m_width;
    int m_height;

    image_t      *m_image;
    unsigned int *m_texture;
    str           m_name;

    qboolean m_isburn;
    qboolean m_isfade;
    int      m_faderate;
    int      m_burnrate;

public:
    GhostTexture();

    void   Update();
    void   SetTexel(int x, int y, unsigned int color);
    void   Burn();
    void   GenerateLightning(Vector p1, Vector p2, int color, float angleVar, int numSubdivisions, int maxSubdivisions);
    Vector RotateVector(Vector v, float angle);
    void   ClipAndDrawLine(Vector p0, Vector p1, int color);
    outcode ComputeOutCode(int x, int y, int xmin, int xmax, int ymin, int ymax);
};

class GhostManager
{
public:
    Container<GhostTexture *> m_textureList;
};