X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=r_lightning.c;h=eabf768f2f6cc56e9a3cf235d094868d1a09748f;hb=16dee271a7e503a49993c5f934aeb6eb45c19ae1;hp=7226b8a1381512aaf1a031155f851977c6756fe6;hpb=d159736a199e4043ed98cde48f6d5716ec40845c;p=xonotic%2Fdarkplaces.git diff --git a/r_lightning.c b/r_lightning.c index 7226b8a1..eabf768f 100644 --- a/r_lightning.c +++ b/r_lightning.c @@ -219,7 +219,7 @@ void R_FogLightningBeam_Vertex3f_Color4f(const float *v, float *c, int numverts, float ifog; for (i = 0;i < numverts;i++, v += 3, c += 4) { - ifog = 1 - VERTEXFOGTABLE(VectorDistance(v, r_vieworigin)); + ifog = 1 - VERTEXFOGTABLE(VectorDistance(v, r_view.origin)); c[0] = r * ifog; c[1] = g * ifog; c[2] = b * ifog; @@ -229,62 +229,14 @@ void R_FogLightningBeam_Vertex3f_Color4f(const float *v, float *c, int numverts, float beamrepeatscale; -void R_DrawLightningBeam_TransparentCallback(const entity_render_t *ent, int surfacenumber, const rtlight_t *rtlight) +void R_DrawLightningBeam_TransparentCallback(const entity_render_t *ent, const rtlight_t *rtlight, int numsurfaces, int *surfacelist) { - const beam_t *b = cl_beams + surfacenumber; + int surfacelistindex; rmeshstate_t m; - vec3_t beamdir, right, up, offset; - float length, t1, t2; - - R_Mesh_Matrix(&r_identitymatrix); - - // calculate beam direction (beamdir) vector and beam length - // get difference vector - VectorSubtract(b->end, b->start, beamdir); - // find length of difference vector - length = sqrt(DotProduct(beamdir, beamdir)); - // calculate scale to make beamdir a unit vector (normalized) - t1 = 1.0f / length; - // scale beamdir so it is now normalized - VectorScale(beamdir, t1, beamdir); - - // calculate up vector such that it points toward viewer, and rotates around the beamdir - // get direction from start of beam to viewer - VectorSubtract(r_vieworigin, b->start, up); - // remove the portion of the vector that moves along the beam - // (this leaves only a vector pointing directly away from the beam) - t1 = -DotProduct(up, beamdir); - VectorMA(up, t1, beamdir, up); - // 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 = r_refdef.time * -r_lightningbeam_scroll.value;// + beamrepeatscale * DotProduct(b->start, beamdir); - t1 = t1 - (int) t1; - t2 = t1 + beamrepeatscale * length; - - // the beam is 3 polygons in this configuration: - // * 2 - // * * - // 1****** - // * * - // * 3 - // they are showing different portions of the beam texture, creating an - // illusion of a beam that appears to curl around in 3D space - // (and realize that the whole polygon assembly orients itself to face - // the viewer) - - memset(&m, 0, sizeof(m)); - if (r_lightningbeam_qmbtexture.integer) - 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; - + float vertex3f[12*3]; + float texcoord2f[12*2]; + float color4f[12*4]; + R_Mesh_Matrix(&identitymatrix); GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); GL_DepthMask(false); GL_DepthTest(true); @@ -293,56 +245,124 @@ void R_DrawLightningBeam_TransparentCallback(const entity_render_t *ent, int sur if (!r_lightningbeam_qmbtexture.integer && r_lightningbeamtexture == NULL) r_lightningbeams_setuptexture(); - // polygon 1, verts 0-3 - VectorScale(right, r_lightningbeam_thickness.value, offset); - R_CalcLightningBeamPolygonVertex3f(varray_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); - // 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); - - if (fogenabled) + R_Mesh_VertexPointer(vertex3f); + if (r_refdef.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); + R_Mesh_ColorPointer(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 + R_Mesh_ColorPointer(NULL); GL_Color(r_lightningbeam_color_red.value, r_lightningbeam_color_green.value, r_lightningbeam_color_blue.value, 1); } - R_Mesh_State(&m); + memset(&m, 0, sizeof(m)); + if (r_lightningbeam_qmbtexture.integer) + m.tex[0] = R_GetTexture(r_lightningbeamqmbtexture); + else + m.tex[0] = R_GetTexture(r_lightningbeamtexture); + m.pointer_texcoord[0] = texcoord2f; + R_Mesh_TextureState(&m); + + for (surfacelistindex = 0;surfacelistindex < numsurfaces;surfacelistindex++) + { + const beam_t *b = cl.beams + surfacelist[surfacelistindex]; + vec3_t beamdir, right, up, offset, start, end; + float length, t1, t2; + + CL_Beam_CalculatePositions(b, start, end); + + // calculate beam direction (beamdir) vector and beam length + // get difference vector + VectorSubtract(end, start, beamdir); + // find length of difference vector + length = sqrt(DotProduct(beamdir, beamdir)); + // calculate scale to make beamdir a unit vector (normalized) + t1 = 1.0f / length; + // scale beamdir so it is now normalized + VectorScale(beamdir, t1, beamdir); + + // calculate up vector such that it points toward viewer, and rotates around the beamdir + // get direction from start of beam to viewer + VectorSubtract(r_view.origin, start, up); + // remove the portion of the vector that moves along the beam + // (this leaves only a vector pointing directly away from the beam) + t1 = -DotProduct(up, beamdir); + VectorMA(up, t1, beamdir, up); + // 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 = r_refdef.time * -r_lightningbeam_scroll.value;// + beamrepeatscale * DotProduct(start, beamdir); + t1 = t1 - (int) t1; + t2 = t1 + beamrepeatscale * length; + + // the beam is 3 polygons in this configuration: + // * 2 + // * * + // 1****** + // * * + // * 3 + // they are showing different portions of the beam texture, creating an + // illusion of a beam that appears to curl around in 3D space + // (and realize that the whole polygon assembly orients itself to face + // the viewer) + + // polygon 1, verts 0-3 + VectorScale(right, r_lightningbeam_thickness.value, offset); + R_CalcLightningBeamPolygonVertex3f(vertex3f + 0, start, end, offset); + // polygon 2, verts 4-7 + VectorAdd(right, up, offset); + VectorScale(offset, r_lightningbeam_thickness.value * 0.70710681f, offset); + R_CalcLightningBeamPolygonVertex3f(vertex3f + 12, start, end, offset); + // polygon 3, verts 8-11 + VectorSubtract(right, up, offset); + VectorScale(offset, r_lightningbeam_thickness.value * 0.70710681f, offset); + R_CalcLightningBeamPolygonVertex3f(vertex3f + 24, start, 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 (r_refdef.fogenabled) + { + // per vertex colors if fog is used + R_FogLightningBeam_Vertex3f_Color4f(vertex3f, color4f, 12, r_lightningbeam_color_red.value, r_lightningbeam_color_green.value, r_lightningbeam_color_blue.value, 1); + } - // draw the 3 polygons as one batch of 6 triangles using the 12 vertices - GL_LockArrays(0, 12); - R_Mesh_Draw(0, 12, 6, r_lightningbeamelements); - GL_LockArrays(0, 0); + // draw the 3 polygons as one batch of 6 triangles using the 12 vertices + GL_LockArrays(0, 12); + R_Mesh_Draw(0, 12, 6, r_lightningbeamelements); + GL_LockArrays(0, 0); + } } +extern cvar_t cl_beams_polygons; void R_DrawLightningBeams(void) { int i; beam_t *b; - vec3_t org; if (!cl_beams_polygons.integer) 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) + if (b->model && b->lightning) { - VectorAdd(b->start, b->end, org); - VectorScale(org, 0.5f, org); + vec3_t org, start, end, dir; + vec_t dist; + CL_Beam_CalculatePositions(b, start, end); + // calculate the nearest point on the line (beam) for depth sorting + VectorSubtract(end, start, dir); + dist = (DotProduct(r_view.origin, dir) - DotProduct(start, dir)) / (DotProduct(end, dir) - DotProduct(start, dir)); + dist = bound(0, dist, 1); + VectorLerp(start, dist, end, org); + // now we have the nearest point on the line, so sort with it R_MeshQueue_AddTransparent(org, R_DrawLightningBeam_TransparentCallback, NULL, i, NULL); } }