#include "quakedef.h"
#include "image.h"
-cvar_t r_lightningbeam_thickness = {CVAR_SAVE, "r_lightningbeam_thickness", "4"};
-cvar_t r_lightningbeam_scroll = {CVAR_SAVE, "r_lightningbeam_scroll", "5"};
-cvar_t r_lightningbeam_repeatdistance = {CVAR_SAVE, "r_lightningbeam_repeatdistance", "128"};
-cvar_t r_lightningbeam_color_red = {CVAR_SAVE, "r_lightningbeam_color_red", "1"};
-cvar_t r_lightningbeam_color_green = {CVAR_SAVE, "r_lightningbeam_color_green", "1"};
-cvar_t r_lightningbeam_color_blue = {CVAR_SAVE, "r_lightningbeam_color_blue", "1"};
-cvar_t r_lightningbeam_qmbtexture = {CVAR_SAVE, "r_lightningbeam_qmbtexture", "0"};
+cvar_t r_lightningbeam_thickness = {CVAR_SAVE, "r_lightningbeam_thickness", "4", "thickness of the lightning beam effect"};
+cvar_t r_lightningbeam_scroll = {CVAR_SAVE, "r_lightningbeam_scroll", "5", "speed of texture scrolling on the lightning beam effect"};
+cvar_t r_lightningbeam_repeatdistance = {CVAR_SAVE, "r_lightningbeam_repeatdistance", "128", "how far to stretch the texture along the lightning beam effect"};
+cvar_t r_lightningbeam_color_red = {CVAR_SAVE, "r_lightningbeam_color_red", "1", "color of the lightning beam effect"};
+cvar_t r_lightningbeam_color_green = {CVAR_SAVE, "r_lightningbeam_color_green", "1", "color of the lightning beam effect"};
+cvar_t r_lightningbeam_color_blue = {CVAR_SAVE, "r_lightningbeam_color_blue", "1", "color of the lightning beam effect"};
+cvar_t r_lightningbeam_qmbtexture = {CVAR_SAVE, "r_lightningbeam_qmbtexture", "0", "load the qmb textures/particles/lightning.pcx texture instead of generating one, can look better"};
rtexture_t *r_lightningbeamtexture;
rtexture_t *r_lightningbeamqmbtexture;
#define PATHPOINTS 8
int i, j, px, py, nearestpathindex, imagenumber;
float particlex, particley, particlexv, particleyv, dx, dy, s, maxpathstrength;
- qbyte *pixels;
+ unsigned char *pixels;
int *image;
- struct {float x, y, strength;} path[PATHPOINTS], temppath;
+ struct lightningpathnode_s
+ {
+ float x, y, strength;
+ }
+ path[PATHPOINTS], temppath;
image = Mem_Alloc(tempmempool, BEAMWIDTH * BEAMHEIGHT * sizeof(int));
- pixels = Mem_Alloc(tempmempool, BEAMWIDTH * BEAMHEIGHT * sizeof(qbyte[4]));
+ pixels = Mem_Alloc(tempmempool, BEAMWIDTH * BEAMHEIGHT * sizeof(unsigned char[4]));
for (imagenumber = 0, maxpathstrength = 0.0339476;maxpathstrength < 0.5;imagenumber++, maxpathstrength += 0.01)
{
#define BEAMHEIGHT 128
float r, g, b, intensity, fx, width, center;
int x, y;
- qbyte *data, *noise1, *noise2;
+ unsigned char *data, *noise1, *noise2;
- data = Mem_Alloc(tempmempool, BEAMWIDTH * BEAMHEIGHT * 4);
- noise1 = Mem_Alloc(tempmempool, BEAMHEIGHT * BEAMHEIGHT);
- noise2 = Mem_Alloc(tempmempool, BEAMHEIGHT * BEAMHEIGHT);
+ data = (unsigned char *)Mem_Alloc(tempmempool, BEAMWIDTH * BEAMHEIGHT * 4);
+ noise1 = (unsigned char *)Mem_Alloc(tempmempool, BEAMHEIGHT * BEAMHEIGHT);
+ noise2 = (unsigned char *)Mem_Alloc(tempmempool, BEAMHEIGHT * BEAMHEIGHT);
fractalnoise(noise1, BEAMHEIGHT, BEAMHEIGHT / 8);
fractalnoise(noise2, BEAMHEIGHT, BEAMHEIGHT / 16);
r = intensity * 1.0f;
g = intensity * 1.0f;
b = intensity * 1.0f;
- data[(y * BEAMWIDTH + x) * 4 + 0] = (qbyte)(bound(0, r, 1) * 255.0f);
- data[(y * BEAMWIDTH + x) * 4 + 1] = (qbyte)(bound(0, g, 1) * 255.0f);
- data[(y * BEAMWIDTH + x) * 4 + 2] = (qbyte)(bound(0, b, 1) * 255.0f);
- data[(y * BEAMWIDTH + x) * 4 + 3] = (qbyte)255;
+ data[(y * BEAMWIDTH + x) * 4 + 0] = (unsigned char)(bound(0, r, 1) * 255.0f);
+ data[(y * BEAMWIDTH + x) * 4 + 1] = (unsigned char)(bound(0, g, 1) * 255.0f);
+ data[(y * BEAMWIDTH + x) * 4 + 2] = (unsigned char)(bound(0, b, 1) * 255.0f);
+ data[(y * BEAMWIDTH + x) * 4 + 3] = (unsigned char)255;
}
}
void R_FogLightningBeam_Vertex3f_Color4f(const float *v, float *c, int numverts, float r, float g, float b, float a)
{
int i;
- vec3_t fogvec;
float ifog;
for (i = 0;i < numverts;i++, v += 3, c += 4)
{
- VectorSubtract(v, r_vieworigin, fogvec);
- ifog = 1 - exp(fogdensity/DotProduct(fogvec,fogvec));
+ ifog = 1 - VERTEXFOGTABLE(VectorDistance(v, r_vieworigin));
c[0] = r * ifog;
c[1] = g * ifog;
c[2] = b * ifog;
float beamrepeatscale;
-void R_DrawLightningBeamCallback(const void *calldata1, int calldata2)
+void R_DrawLightningBeam_TransparentCallback(const entity_render_t *ent, int surfacenumber, const rtlight_t *rtlight)
{
- const beam_t *b = calldata1;
+ const beam_t *b = cl.beams + surfacenumber;
rmeshstate_t m;
vec3_t beamdir, right, up, offset;
float length, t1, t2;
+ float vertex3f[12*3];
+ float texcoord2f[12*2];
+ float color4f[12*4];
- R_Mesh_Matrix(&r_identitymatrix);
+ R_Mesh_Matrix(&identitymatrix);
// calculate beam direction (beamdir) vector and beam length
// get difference vector
m.tex[0] = R_GetTexture(r_lightningbeamqmbtexture);
else
m.tex[0] = R_GetTexture(r_lightningbeamtexture);
- m.pointer_texcoord[0] = varray_texcoord2f[0];
- m.pointer_vertex = varray_vertex3f;
+ m.pointer_texcoord[0] = texcoord2f;
+ m.pointer_vertex = vertex3f;
GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
GL_DepthMask(false);
// polygon 1, verts 0-3
VectorScale(right, r_lightningbeam_thickness.value, offset);
- R_CalcLightningBeamPolygonVertex3f(varray_vertex3f + 0, b->start, b->end, offset);
+ R_CalcLightningBeamPolygonVertex3f(vertex3f + 0, b->start, b->end, offset);
// polygon 2, verts 4-7
VectorAdd(right, up, offset);
VectorScale(offset, r_lightningbeam_thickness.value * 0.70710681f, offset);
- R_CalcLightningBeamPolygonVertex3f(varray_vertex3f + 12, b->start, b->end, offset);
+ R_CalcLightningBeamPolygonVertex3f(vertex3f + 12, b->start, b->end, offset);
// polygon 3, verts 8-11
VectorSubtract(right, up, offset);
VectorScale(offset, r_lightningbeam_thickness.value * 0.70710681f, offset);
- R_CalcLightningBeamPolygonVertex3f(varray_vertex3f + 24, b->start, b->end, offset);
- R_CalcLightningBeamPolygonTexCoord2f(varray_texcoord2f[0] + 0, t1, t2);
- R_CalcLightningBeamPolygonTexCoord2f(varray_texcoord2f[0] + 8, t1 + 0.33, t2 + 0.33);
- R_CalcLightningBeamPolygonTexCoord2f(varray_texcoord2f[0] + 16, t1 + 0.66, t2 + 0.66);
+ R_CalcLightningBeamPolygonVertex3f(vertex3f + 24, b->start, b->end, offset);
+ R_CalcLightningBeamPolygonTexCoord2f(texcoord2f + 0, t1, t2);
+ R_CalcLightningBeamPolygonTexCoord2f(texcoord2f + 8, t1 + 0.33, t2 + 0.33);
+ R_CalcLightningBeamPolygonTexCoord2f(texcoord2f + 16, t1 + 0.66, t2 + 0.66);
if (fogenabled)
{
// per vertex colors if fog is used
- m.pointer_color = varray_color4f;
- R_FogLightningBeam_Vertex3f_Color4f(varray_vertex3f, varray_color4f, 12, r_lightningbeam_color_red.value, r_lightningbeam_color_green.value, r_lightningbeam_color_blue.value, 1);
+ m.pointer_color = color4f;
+ R_FogLightningBeam_Vertex3f_Color4f(vertex3f, color4f, 12, r_lightningbeam_color_red.value, r_lightningbeam_color_green.value, r_lightningbeam_color_blue.value, 1);
}
else
{
return;
beamrepeatscale = 1.0f / r_lightningbeam_repeatdistance.value;
- for (i = 0, b = cl_beams;i < cl_max_beams;i++, b++)
+ for (i = 0, b = cl.beams;i < cl.num_beams;i++, b++)
{
if (b->model && b->endtime >= r_refdef.time && b->lightning)
{
VectorAdd(b->start, b->end, org);
VectorScale(org, 0.5f, org);
- R_MeshQueue_AddTransparent(org, R_DrawLightningBeamCallback, b, 0);
+ R_MeshQueue_AddTransparent(org, R_DrawLightningBeam_TransparentCallback, NULL, i, NULL);
}
}
}