X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=r_lightning.c;h=6b38c35b5bf1874b5c83a44c2f7cac23bdd9f9b4;hp=916256005b62070499781f9f5f30ad12b0de3dc3;hb=cb872df2ca589d4b30c733dc239986dfd64f0c12;hpb=045c0de16a295c2599bc83dfa8942c393eed3903 diff --git a/r_lightning.c b/r_lightning.c index 91625600..6b38c35b 100644 --- a/r_lightning.c +++ b/r_lightning.c @@ -2,13 +2,13 @@ #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; @@ -38,12 +38,16 @@ void r_lightningbeams_setuptexture(void) #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) { @@ -112,11 +116,11 @@ void r_lightningbeams_setuptexture(void) #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); @@ -134,10 +138,10 @@ void r_lightningbeams_setuptexture(void) 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; } } @@ -212,12 +216,10 @@ void R_CalcLightningBeamPolygonTexCoord2f(float *tc, float t1, float t2) 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; @@ -227,14 +229,17 @@ void R_FogLightningBeam_Vertex3f_Color4f(const float *v, float *c, int numverts, 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 @@ -253,14 +258,14 @@ void R_DrawLightningBeamCallback(const void *calldata1, int calldata2) // (this leaves only a vector pointing directly away from the beam) t1 = -DotProduct(up, beamdir); VectorMA(up, t1, beamdir, up); - // now we have a vector pointing away from the beam, now we need to normalize it - VectorNormalizeFast(up); - // generate right vector from forward and up, the result is already normalized - // (CrossProduct returns a vector of multiplied length of the two inputs) + // generate right vector from forward and up, the result is unnormalized CrossProduct(beamdir, up, right); + // now normalize the right vector and up vector + VectorNormalize(right); + VectorNormalize(up); // calculate T coordinate scrolling (start and end texcoord along the beam) - t1 = cl.time * -r_lightningbeam_scroll.value;// + beamrepeatscale * DotProduct(b->start, beamdir); + t1 = r_refdef.time * -r_lightningbeam_scroll.value;// + beamrepeatscale * DotProduct(b->start, beamdir); t1 = t1 - (int) t1; t2 = t1 + beamrepeatscale * length; @@ -280,8 +285,8 @@ void R_DrawLightningBeamCallback(const void *calldata1, int calldata2) m.tex[0] = R_GetTexture(r_lightningbeamqmbtexture); else m.tex[0] = R_GetTexture(r_lightningbeamtexture); - m.pointer_texcoord[0] = varray_texcoord2f[0]; - R_Mesh_State_Texture(&m); + m.pointer_texcoord[0] = texcoord2f; + m.pointer_vertex = vertex3f; GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); GL_DepthMask(false); @@ -293,35 +298,36 @@ void R_DrawLightningBeamCallback(const void *calldata1, int calldata2) // 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); - GL_VertexPointer(varray_vertex3f); + 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 - GL_ColorPointer(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 { // solid color if fog is not used - GL_ColorPointer(NULL); GL_Color(r_lightningbeam_color_red.value, r_lightningbeam_color_green.value, r_lightningbeam_color_blue.value, 1); } + R_Mesh_State(&m); // draw the 3 polygons as one batch of 6 triangles using the 12 vertices - R_Mesh_Draw(12, 6, r_lightningbeamelements); + GL_LockArrays(0, 12); + R_Mesh_Draw(0, 12, 6, r_lightningbeamelements); + GL_LockArrays(0, 0); } void R_DrawLightningBeams(void) @@ -334,13 +340,13 @@ void R_DrawLightningBeams(void) 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 >= cl.time && b->lightning) + 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); } } }