mirror of
https://github.com/blendogames/thirtyflightsofloving.git
synced 2024-11-15 00:41:21 +00:00
123 lines
3.4 KiB
C
123 lines
3.4 KiB
C
|
/*
|
||
|
Copyright (C) 1997-2001 Id Software, Inc.
|
||
|
|
||
|
This program 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.
|
||
|
|
||
|
This program 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 this program; if not, write to the Free Software
|
||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||
|
|
||
|
*/
|
||
|
|
||
|
// r_beam.c -- beam rendering
|
||
|
// moved from r_main.c
|
||
|
|
||
|
#include "r_local.h"
|
||
|
|
||
|
|
||
|
/*
|
||
|
=======================
|
||
|
R_RenderBeam
|
||
|
=======================
|
||
|
*/
|
||
|
void R_RenderBeam (vec3_t start, vec3_t end, float size, float red, float green, float blue, float alpha)
|
||
|
{
|
||
|
float len;
|
||
|
vec3_t up = {vup[0] * 0.75f, vup[1] * 0.75f, vup[2] * 0.75f};
|
||
|
vec3_t right = {vright[0] * 0.75f, vright[1] * 0.75f, vright[2] * 0.75f};
|
||
|
vec3_t vert[4], ang_up, ang_right, vdelta;
|
||
|
vec2_t texCoord[4];
|
||
|
vec4_t beamColor;
|
||
|
int oldrender=0, rendertype=0, i;
|
||
|
|
||
|
c_alias_polys += 2;
|
||
|
|
||
|
GL_TexEnv (GL_MODULATE);
|
||
|
GL_DepthMask (false);
|
||
|
GL_BlendFunc (GL_SRC_ALPHA, GL_ONE); // this fixes the black background
|
||
|
GL_Enable (GL_BLEND);
|
||
|
GL_ShadeModel (GL_SMOOTH);
|
||
|
GL_Bind(glMedia.particlebeam->texnum);
|
||
|
Vector4Set(beamColor, red/255, green/255, blue/255, alpha/255);
|
||
|
|
||
|
VectorSubtract(start, end, ang_up);
|
||
|
len = VectorNormalize(ang_up);
|
||
|
|
||
|
VectorSubtract(r_newrefdef.vieworg, start, vdelta);
|
||
|
CrossProduct(ang_up, vdelta, ang_right);
|
||
|
if (!VectorCompare(ang_right, vec3_origin))
|
||
|
VectorNormalize(ang_right);
|
||
|
|
||
|
VectorScale (ang_right, size*2, ang_right); // Knightmare- a little narrower, please
|
||
|
|
||
|
VectorAdd(start, ang_right, vert[0]);
|
||
|
VectorAdd(end, ang_right, vert[1]);
|
||
|
VectorSubtract(end, ang_right, vert[2]);
|
||
|
VectorSubtract(start, ang_right, vert[3]);
|
||
|
|
||
|
Vector2Set(texCoord[0], 0, 1);
|
||
|
Vector2Set(texCoord[1], 0, 0);
|
||
|
Vector2Set(texCoord[2], 1, 0);
|
||
|
Vector2Set(texCoord[3], 1, 1);
|
||
|
|
||
|
rb_vertex = rb_index = 0;
|
||
|
indexArray[rb_index++] = rb_vertex+0;
|
||
|
indexArray[rb_index++] = rb_vertex+1;
|
||
|
indexArray[rb_index++] = rb_vertex+2;
|
||
|
indexArray[rb_index++] = rb_vertex+0;
|
||
|
indexArray[rb_index++] = rb_vertex+2;
|
||
|
indexArray[rb_index++] = rb_vertex+3;
|
||
|
for (i=0; i<4; i++) {
|
||
|
VA_SetElem2(texCoordArray[0][rb_vertex], texCoord[i][0], texCoord[i][1]);
|
||
|
VA_SetElem3(vertexArray[rb_vertex], vert[i][0], vert[i][1], vert[i][2]);
|
||
|
VA_SetElem4(colorArray[rb_vertex], beamColor[0], beamColor[1], beamColor[2], beamColor[3]);
|
||
|
rb_vertex++;
|
||
|
}
|
||
|
RB_DrawArrays ();
|
||
|
|
||
|
GL_BlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||
|
GL_TexEnv (GL_MODULATE);
|
||
|
GL_DepthMask (true);
|
||
|
GL_Disable (GL_BLEND);
|
||
|
|
||
|
RB_DrawMeshTris ();
|
||
|
rb_vertex = rb_index = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
=======================
|
||
|
R_DrawBeam
|
||
|
=======================
|
||
|
*/
|
||
|
void R_DrawBeam( entity_t *e )
|
||
|
{
|
||
|
qboolean fog_on = false;
|
||
|
|
||
|
// Knightmare- no fog on lasers
|
||
|
if (qglIsEnabled(GL_FOG)) // check if fog is enabled
|
||
|
{
|
||
|
fog_on = true;
|
||
|
qglDisable(GL_FOG); // if so, disable it
|
||
|
}
|
||
|
|
||
|
R_RenderBeam( e->origin, e->oldorigin, e->frame,
|
||
|
( d_8to24table[e->skinnum & 0xFF] ) & 0xFF,
|
||
|
( d_8to24table[e->skinnum & 0xFF] >> 8 ) & 0xFF,
|
||
|
( d_8to24table[e->skinnum & 0xFF] >> 16 ) & 0xFF,
|
||
|
e->alpha*255 );
|
||
|
|
||
|
// re-enable fog if it was on
|
||
|
if (fog_on)
|
||
|
qglEnable(GL_FOG);
|
||
|
}
|