void R_DrawLightningBeams(void) { int i; beam_t *b; if (!cl_beams_polygons.integer) return; beamrepeatscale = 1.0f / r_lightningbeam_repeatdistance.value; for (i = 0, b = cl.beams;i < cl.num_beams;i++, b++) { if (b->model && b->lightning) { 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_refdef.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(TRANSPARENTSORT_DISTANCE, org, R_DrawLightningBeam_TransparentCallback, NULL, i, NULL); } } }
void R_Model_Sprite_Draw(entity_render_t *ent) { vec3_t org; if (ent->frameblend[0].subframe < 0) return; Matrix4x4_OriginFromMatrix(&ent->matrix, org); R_MeshQueue_AddTransparent((ent->flags & RENDER_WORLDOBJECT) ? TRANSPARENTSORT_SKY : (ent->flags & RENDER_NODEPTHTEST) ? TRANSPARENTSORT_HUD : TRANSPARENTSORT_DISTANCE, org, R_Model_Sprite_Draw_TransparentCallback, ent, 0, rsurface.rtlight); }
void R_DrawExplosions(void) { #ifdef MAX_EXPLOSIONS int i; if (!r_drawexplosions.integer) return; for (i = 0;i < numexplosions;i++) { if (explosion[i].alpha) { R_MoveExplosion(&explosion[i]); if (explosion[i].alpha) R_MeshQueue_AddTransparent(TRANSPARENTSORT_DISTANCE, explosion[i].origin, R_DrawExplosion_TransparentCallback, NULL, i, NULL); } } while (numexplosions > 0 && explosion[i-1].alpha <= 0) numexplosions--; #endif }