#include "quakedef.h"
-entity_render_t *currentrenderentity;
-
// used for dlight push checking and other things
int r_framecount;
mplane_t frustum[4];
-int c_brush_polys, c_alias_polys, c_light_polys, c_faces, c_nodes, c_leafs, c_models, c_bmodels, c_sprites, c_particles, c_dlights;
+matrix4x4_t r_identitymatrix;
+
+int c_alias_polys, c_light_polys, c_faces, c_nodes, c_leafs, c_models, c_bmodels, c_sprites, c_particles, c_dlights;
// true during envmap command capture
qboolean envmap;
//
refdef_t r_refdef;
-mleaf_t *r_viewleaf, *r_oldviewleaf;
-
// 8.8 fraction of base light value
unsigned short d_lightstylevalue[256];
cvar_t r_fullbright = {0, "r_fullbright","0"};
cvar_t r_wateralpha = {CVAR_SAVE, "r_wateralpha","1"};
cvar_t r_dynamic = {CVAR_SAVE, "r_dynamic","1"};
-cvar_t r_waterripple = {CVAR_SAVE, "r_waterripple","0"};
cvar_t r_fullbrights = {CVAR_SAVE, "r_fullbrights", "1"};
cvar_t gl_fogenable = {0, "gl_fogenable", "0"};
cvar_t gl_fogstart = {0, "gl_fogstart", "0"};
cvar_t gl_fogend = {0, "gl_fogend","0"};
-cvar_t r_multitexture = {0, "r_multitexture", "1"};
+cvar_t r_textureunits = {0, "r_textureunits", "32"};
+
+void R_ModulateColors(float *in, float *out, int verts, float r, float g, float b)
+{
+ int i;
+ for (i = 0;i < verts;i++)
+ {
+ out[0] = in[0] * r;
+ out[1] = in[1] * g;
+ out[2] = in[2] * b;
+ out[3] = in[3];
+ in += 4;
+ out += 4;
+ }
+}
+
+void R_FillColors(float *out, int verts, float r, float g, float b, float a)
+{
+ int i;
+ for (i = 0;i < verts;i++)
+ {
+ out[0] = r;
+ out[1] = g;
+ out[2] = b;
+ out[3] = a;
+ out += 4;
+ }
+}
/*
====================
Con_Printf ("%f seconds (%f fps)\n", time, 128/time);
}
-extern cvar_t r_drawportals;
-
-int R_VisibleCullBox (vec3_t mins, vec3_t maxs)
-{
- int sides;
- mnode_t *nodestack[8192], *node;
- int stack = 0;
-
- if (R_CullBox(mins, maxs))
- return true;
-
- node = cl.worldmodel->nodes;
-loc0:
- if (node->contents < 0)
- {
- if (((mleaf_t *)node)->visframe == r_framecount)
- return false;
- if (!stack)
- return true;
- node = nodestack[--stack];
- goto loc0;
- }
-
- sides = BOX_ON_PLANE_SIDE(mins, maxs, node->plane);
-
-// recurse down the contacted sides
- if (sides & 1)
- {
- if (sides & 2) // 3
- {
- // put second child on the stack for later examination
- nodestack[stack++] = node->children[1];
- node = node->children[0];
- goto loc0;
- }
- else // 1
- {
- node = node->children[0];
- goto loc0;
- }
- }
- // 2
- node = node->children[1];
- goto loc0;
-}
-
vec3_t fogcolor;
vec_t fogdensity;
float fog_density, fog_red, fog_green, fog_blue;
{
}
+extern void CL_ParseEntityLump(char *entitystring);
void gl_main_newmap(void)
{
+ if (cl.worldmodel && cl.worldmodel->entities)
+ CL_ParseEntityLump(cl.worldmodel->entities);
r_framecount = 1;
}
void GL_Main_Init(void)
{
+ Matrix4x4_CreateIdentity(&r_identitymatrix);
// FIXME: move this to client?
FOG_registercvars();
Cmd_AddCommand ("timerefresh", R_TimeRefresh_f);
Cvar_RegisterVariable (&r_fullbrights);
Cvar_RegisterVariable (&r_wateralpha);
Cvar_RegisterVariable (&r_dynamic);
- Cvar_RegisterVariable (&r_waterripple);
Cvar_RegisterVariable (&r_fullbright);
- Cvar_RegisterVariable (&r_multitexture);
+ Cvar_RegisterVariable (&r_textureunits);
if (gamemode == GAME_NEHAHRA)
Cvar_SetValue("r_fullbrights", 0);
R_RegisterModule("GL_Main", gl_main_start, gl_main_shutdown, gl_main_newmap);
R_NewMap
===============
*/
-void CL_ParseEntityLump(char *entitystring);
void R_NewMap (void)
{
- int i;
-
- for (i = 0;i < 256;i++)
- d_lightstylevalue[i] = 264; // normal light value
-
- r_viewleaf = NULL;
- if (cl.worldmodel->entities)
- CL_ParseEntityLump(cl.worldmodel->entities);
R_Modules_NewMap();
-
- r_farclip = 64.0f;
}
extern void R_Textures_Init(void);
extern void R_Explosion_Init(void);
extern void ui_init(void);
extern void gl_backend_init(void);
+extern void Sbar_Init(void);
void Render_Init(void)
{
R_Textures_Init();
Mod_RenderInit();
gl_backend_init();
+ R_MeshQueue_Init();
GL_Draw_Init();
GL_Main_Init();
GL_Models_Init();
R_Particles_Init();
R_Explosion_Init();
ui_init();
+ Sbar_Init();
R_Modules_Start();
}
qglEnable(GL_TEXTURE_2D);
}
+int R_CullBox(const vec3_t emins, const vec3_t emaxs)
+{
+ int i;
+ mplane_t *p;
+ for (i = 0;i < 4;i++)
+ {
+ p = frustum + i;
+ switch(p->signbits)
+ {
+ default:
+ case 0:
+ if (p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2] < p->dist)
+ return true;
+ break;
+ case 1:
+ if (p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2] < p->dist)
+ return true;
+ break;
+ case 2:
+ if (p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2] < p->dist)
+ return true;
+ break;
+ case 3:
+ if (p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2] < p->dist)
+ return true;
+ break;
+ case 4:
+ if (p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2] < p->dist)
+ return true;
+ break;
+ case 5:
+ if (p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2] < p->dist)
+ return true;
+ break;
+ case 6:
+ if (p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2] < p->dist)
+ return true;
+ break;
+ case 7:
+ if (p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2] < p->dist)
+ return true;
+ break;
+ }
+ }
+ return false;
+}
+
+int R_NotCulledBox(const vec3_t emins, const vec3_t emaxs)
+{
+ int i;
+ mplane_t *p;
+ for (i = 0;i < 4;i++)
+ {
+ p = frustum + i;
+ switch(p->signbits)
+ {
+ default:
+ case 0:
+ if (p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2] < p->dist)
+ return false;
+ break;
+ case 1:
+ if (p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2] < p->dist)
+ return false;
+ break;
+ case 2:
+ if (p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2] < p->dist)
+ return false;
+ break;
+ case 3:
+ if (p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2] < p->dist)
+ return false;
+ break;
+ case 4:
+ if (p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2] < p->dist)
+ return false;
+ break;
+ case 5:
+ if (p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2] < p->dist)
+ return false;
+ break;
+ case 6:
+ if (p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2] < p->dist)
+ return false;
+ break;
+ case 7:
+ if (p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2] < p->dist)
+ return false;
+ break;
+ }
+ }
+ return true;
+}
+
//==================================================================================
{
int i;
vec3_t v;
+ entity_render_t *ent;
+
+ ent = &cl_entities[0].render;
+ Matrix4x4_CreateIdentity(&ent->matrix);
+ Matrix4x4_CreateIdentity(&ent->inversematrix);
+
+ if (cl.worldmodel)
+ R_FarClip_Box(cl.worldmodel->normalmins, cl.worldmodel->normalmaxs);
if (!r_drawentities.integer)
return;
- R_FarClip_Box(cl.worldmodel->normalmins, cl.worldmodel->normalmaxs);
-
for (i = 0;i < r_refdef.numentities;i++)
{
- currentrenderentity = r_refdef.entities[i];
- Mod_CheckLoaded(currentrenderentity->model);
+ ent = r_refdef.entities[i];
+ Mod_CheckLoaded(ent->model);
// move view-relative models to where they should be
- if (currentrenderentity->flags & RENDER_VIEWMODEL)
+ if (ent->flags & RENDER_VIEWMODEL)
{
// remove flag so it will not be repeated incase RelinkEntities is not called again for a while
- currentrenderentity->flags -= RENDER_VIEWMODEL;
+ ent->flags -= RENDER_VIEWMODEL;
// transform origin
- VectorCopy(currentrenderentity->origin, v);
- currentrenderentity->origin[0] = v[0] * vpn[0] + v[1] * vright[0] + v[2] * vup[0] + r_origin[0];
- currentrenderentity->origin[1] = v[0] * vpn[1] + v[1] * vright[1] + v[2] * vup[1] + r_origin[1];
- currentrenderentity->origin[2] = v[0] * vpn[2] + v[1] * vright[2] + v[2] * vup[2] + r_origin[2];
+ VectorCopy(ent->origin, v);
+ ent->origin[0] = v[0] * vpn[0] + v[1] * vright[0] + v[2] * vup[0] + r_origin[0];
+ ent->origin[1] = v[0] * vpn[1] + v[1] * vright[1] + v[2] * vup[1] + r_origin[1];
+ ent->origin[2] = v[0] * vpn[2] + v[1] * vright[2] + v[2] * vup[2] + r_origin[2];
// adjust angles
- VectorAdd(currentrenderentity->angles, r_refdef.viewangles, currentrenderentity->angles);
+ VectorAdd(ent->angles, r_refdef.viewangles, ent->angles);
}
- if (currentrenderentity->angles[0] || currentrenderentity->angles[2])
- {
- VectorMA(currentrenderentity->origin, currentrenderentity->scale, currentrenderentity->model->rotatedmins, currentrenderentity->mins);
- VectorMA(currentrenderentity->origin, currentrenderentity->scale, currentrenderentity->model->rotatedmaxs, currentrenderentity->maxs);
- }
- else if (currentrenderentity->angles[1])
- {
- VectorMA(currentrenderentity->origin, currentrenderentity->scale, currentrenderentity->model->yawmins, currentrenderentity->mins);
- VectorMA(currentrenderentity->origin, currentrenderentity->scale, currentrenderentity->model->yawmaxs, currentrenderentity->maxs);
- }
- else
- {
- VectorMA(currentrenderentity->origin, currentrenderentity->scale, currentrenderentity->model->normalmins, currentrenderentity->mins);
- VectorMA(currentrenderentity->origin, currentrenderentity->scale, currentrenderentity->model->normalmaxs, currentrenderentity->maxs);
- }
- if (R_VisibleCullBox(currentrenderentity->mins, currentrenderentity->maxs))
+ if (R_CullBox(ent->mins, ent->maxs))
continue;
- R_LerpAnimation(currentrenderentity);
- currentrenderentity->visframe = r_framecount;
-
- R_FarClip_Box(currentrenderentity->mins, currentrenderentity->maxs);
+ ent->visframe = r_framecount;
+ VectorCopy(ent->angles, v);
+ if (!ent->model || ent->model->type != mod_brush)
+ v[0] = -v[0];
+ Matrix4x4_CreateFromQuakeEntity(&ent->matrix, ent->origin[0], ent->origin[1], ent->origin[2], v[0], v[1], v[2], ent->scale);
+ Matrix4x4_Invert_Simple(&ent->inversematrix, &ent->matrix);
+ R_LerpAnimation(ent);
+ R_UpdateEntLights(ent);
+ R_FarClip_Box(ent->mins, ent->maxs);
}
}
// only used if skyrendermasked, and normally returns false
-int R_DrawBModelSky (void)
+int R_DrawBrushModelsSky (void)
{
int i, sky;
+ entity_render_t *ent;
if (!r_drawentities.integer)
return false;
sky = false;
for (i = 0;i < r_refdef.numentities;i++)
{
- currentrenderentity = r_refdef.entities[i];
- if (currentrenderentity->visframe == r_framecount && currentrenderentity->model->DrawSky)
+ ent = r_refdef.entities[i];
+ if (ent->visframe == r_framecount && ent->model && ent->model->DrawSky)
{
- currentrenderentity->model->DrawSky();
+ ent->model->DrawSky(ent);
sky = true;
}
}
return sky;
}
-void R_DrawModels (void)
-{
- int i;
-
- if (!r_drawentities.integer)
- return;
-
- for (i = 0;i < r_refdef.numentities;i++)
- {
- currentrenderentity = r_refdef.entities[i];
- if (currentrenderentity->visframe == r_framecount && currentrenderentity->model->Draw)
- currentrenderentity->model->Draw();
- }
-}
-
/*
=============
R_DrawViewModel
*/
void R_DrawViewModel (void)
{
+ entity_render_t *ent;
+
// FIXME: move these checks to client
if (!r_drawviewmodel.integer || chase_active.integer || envmap || !r_drawentities.integer || cl.items & IT_INVISIBILITY || cl.stats[STAT_HEALTH] <= 0 || !cl.viewent.render.model)
return;
- currentrenderentity = &cl.viewent.render;
- Mod_CheckLoaded(currentrenderentity->model);
+ ent = &cl.viewent.render;
+ Mod_CheckLoaded(ent->model);
+ R_LerpAnimation(ent);
+ Matrix4x4_CreateFromQuakeEntity(&ent->matrix, ent->origin[0], ent->origin[1], ent->origin[2], -ent->angles[0], ent->angles[1], ent->angles[2], ent->scale);
+ Matrix4x4_Invert_Simple(&ent->inversematrix, &ent->matrix);
+ R_UpdateEntLights(ent);
+ ent->model->Draw(ent);
+}
+
+void R_DrawNoModel(entity_render_t *ent);
+void R_DrawModels (void)
+{
+ int i;
+ entity_render_t *ent;
- R_LerpAnimation(currentrenderentity);
+ if (!r_drawentities.integer)
+ return;
- currentrenderentity->model->Draw();
+ R_DrawViewModel();
+ for (i = 0;i < r_refdef.numentities;i++)
+ {
+ ent = r_refdef.entities[i];
+ if (ent->visframe == r_framecount)
+ {
+ if (ent->model)
+ {
+ if (ent->model->Draw)
+ ent->model->Draw(ent);
+ }
+ else
+ R_DrawNoModel(ent);
+ }
+ }
}
static void R_SetFrustum (void)
if (r_ambient.value != 0)
Cvar_Set ("r_ambient", "0");
}
- if (r_multitexture.integer && gl_textureunits < 2)
- Cvar_SetValue("r_multitexture", 0);
r_framecount++;
AngleVectors (r_refdef.viewangles, vpn, vright, vup);
-// current viewleaf
- r_oldviewleaf = r_viewleaf;
- r_viewleaf = Mod_PointInLeaf (r_origin, cl.worldmodel);
-
R_AnimateLight ();
}
-static int blendviewpolyindex[3] = {0, 1, 2};
-
static void R_BlendView(void)
{
- rmeshinfo_t m;
- float tvxyz[3][4], r;
+ rmeshstate_t m;
+ float r;
if (r_refdef.viewblend[3] < 0.01f)
return;
memset(&m, 0, sizeof(m));
- m.transparent = false;
m.blendfunc1 = GL_SRC_ALPHA;
m.blendfunc2 = GL_ONE_MINUS_SRC_ALPHA;
m.depthdisable = true; // magic
- m.numtriangles = 1;
- m.numverts = 3;
- m.index = blendviewpolyindex;
- m.vertex = &tvxyz[0][0];
- m.vertexstep = sizeof(float[4]);
- m.cr = r_refdef.viewblend[0];
- m.cg = r_refdef.viewblend[1];
- m.cb = r_refdef.viewblend[2];
- m.ca = r_refdef.viewblend[3];
+ R_Mesh_Matrix(&r_identitymatrix);
+ R_Mesh_State(&m);
+
+ varray_color[0] = varray_color[4] = varray_color[8] = r_refdef.viewblend[0];
+ varray_color[1] = varray_color[5] = varray_color[9] = r_refdef.viewblend[1];
+ varray_color[2] = varray_color[6] = varray_color[10] = r_refdef.viewblend[2];
+ varray_color[3] = varray_color[7] = varray_color[11] = r_refdef.viewblend[3];
r = 64000;
- tvxyz[0][0] = r_origin[0] + vpn[0] * 1.5 - vright[0] * r - vup[0] * r;
- tvxyz[0][1] = r_origin[1] + vpn[1] * 1.5 - vright[1] * r - vup[1] * r;
- tvxyz[0][2] = r_origin[2] + vpn[2] * 1.5 - vright[2] * r - vup[2] * r;
+ varray_vertex[0] = r_origin[0] + vpn[0] * 1.5 - vright[0] * r - vup[0] * r;
+ varray_vertex[1] = r_origin[1] + vpn[1] * 1.5 - vright[1] * r - vup[1] * r;
+ varray_vertex[2] = r_origin[2] + vpn[2] * 1.5 - vright[2] * r - vup[2] * r;
r *= 3;
- tvxyz[1][0] = tvxyz[0][0] + vup[0] * r;
- tvxyz[1][1] = tvxyz[0][1] + vup[1] * r;
- tvxyz[1][2] = tvxyz[0][2] + vup[2] * r;
- tvxyz[2][0] = tvxyz[0][0] + vright[0] * r;
- tvxyz[2][1] = tvxyz[0][1] + vright[1] * r;
- tvxyz[2][2] = tvxyz[0][2] + vright[2] * r;
- R_Mesh_Draw(&m);
+ varray_vertex[4] = varray_vertex[0] + vup[0] * r;
+ varray_vertex[5] = varray_vertex[1] + vup[1] * r;
+ varray_vertex[6] = varray_vertex[2] + vup[2] * r;
+ varray_vertex[8] = varray_vertex[0] + vright[0] * r;
+ varray_vertex[9] = varray_vertex[1] + vright[1] * r;
+ varray_vertex[10] = varray_vertex[2] + vright[2] * r;
+ R_Mesh_Draw(3, 1, polygonelements);
}
/*
*/
void R_RenderView (void)
{
- if (!cl.worldmodel)
+ entity_render_t *world;
+ if (!r_refdef.entities/* || !cl.worldmodel*/)
return; //Host_Error ("R_RenderView: NULL worldmodel");
+ world = &cl_entities[0].render;
+
// FIXME: move to client
R_MoveExplosions();
R_TimeReport("mexplosion");
+ R_Textures_Frame();
R_SetupFrame();
R_SetFrustum();
R_SetupFog();
R_SkyStartFrame();
R_BuildLightList();
-
- R_FarClip_Start(r_origin, vpn, 768.0f);
-
R_TimeReport("setup");
- R_DrawWorld();
- R_TimeReport("worldnode");
-
+ R_FarClip_Start(r_origin, vpn, 768.0f);
R_MarkEntities();
- R_TimeReport("markentity");
-
- R_MarkWorldLights();
- R_TimeReport("marklights");
-
r_farclip = R_FarClip_Finish() + 256.0f;
+ R_TimeReport("markentity");
- R_Mesh_Start(r_farclip);
-
- if (skyrendermasked)
- {
- if (R_DrawBModelSky())
- R_TimeReport("bmodelsky");
- }
- else
- {
- R_DrawViewModel();
- R_TimeReport("viewmodel");
- }
-
- R_SetupForWorldRendering();
- R_PrepareSurfaces();
- R_TimeReport("surfprep");
+ GL_SetupView_ViewPort(r_refdef.x, r_refdef.y, r_refdef.width, r_refdef.height);
+ GL_SetupView_Mode_Perspective((double) r_refdef.height / r_refdef.width, r_refdef.fov_x, r_refdef.fov_y, 1.0f, r_farclip);
+ GL_SetupView_Orientation_FromEntity (r_refdef.vieworg, r_refdef.viewangles);
+ GL_DepthFunc(GL_LEQUAL);
+
+ R_Mesh_Start();
+ R_MeshQueue_BeginScene();
- R_DrawSurfaces(SHADERSTAGE_SKY);
- R_DrawSurfaces(SHADERSTAGE_NORMAL);
- R_TimeReport("surfdraw");
+ if (R_DrawBrushModelsSky())
+ R_TimeReport("bmodelsky");
- if (r_drawportals.integer)
- {
- R_DrawPortals();
- R_TimeReport("portals");
- }
+ // must occur early because it can draw sky
+ R_DrawWorld(world);
+ R_TimeReport("world");
// don't let sound skip if going slow
if (!intimerefresh && !r_speeds.integer)
S_ExtraUpdate ();
- if (skyrendermasked)
- {
- R_DrawViewModel();
- R_TimeReport("viewmodel");
- }
-
R_DrawModels();
R_TimeReport("models");
R_DrawExplosions();
R_TimeReport("explosions");
- // draw transparent meshs
- R_Mesh_AddTransparent();
- R_TimeReport("addtrans");
+ R_MeshQueue_RenderTransparent();
+ R_TimeReport("drawtrans");
R_DrawCoronas();
R_TimeReport("coronas");
+ R_DrawWorldCrosshair();
+ R_TimeReport("crosshair");
+
R_BlendView();
R_TimeReport("blendview");
- R_DrawCrosshair();
- R_TimeReport("crosshair");
-
- // render any queued meshs
+ R_MeshQueue_Render();
+ R_MeshQueue_EndScene();
R_Mesh_Finish();
R_TimeReport("meshfinish");
}
+/*
+void R_DrawBBoxMesh(vec3_t mins, vec3_t maxs, float cr, float cg, float cb, float ca)
+{
+ int i;
+ float *v, *c, f1, f2, diff[3];
+ rmeshstate_t m;
+ m.blendfunc1 = GL_SRC_ALPHA;
+ m.blendfunc2 = GL_ONE_MINUS_SRC_ALPHA;
+ R_Mesh_Matrix(&r_identitymatrix);
+ R_Mesh_State(&m);
+
+ varray_vertex[ 0] = mins[0];varray_vertex[ 1] = mins[1];varray_vertex[ 2] = mins[2];
+ varray_vertex[ 4] = maxs[0];varray_vertex[ 5] = mins[1];varray_vertex[ 6] = mins[2];
+ varray_vertex[ 8] = mins[0];varray_vertex[ 9] = maxs[1];varray_vertex[10] = mins[2];
+ varray_vertex[12] = maxs[0];varray_vertex[13] = maxs[1];varray_vertex[14] = mins[2];
+ varray_vertex[16] = mins[0];varray_vertex[17] = mins[1];varray_vertex[18] = maxs[2];
+ varray_vertex[20] = maxs[0];varray_vertex[21] = mins[1];varray_vertex[22] = maxs[2];
+ varray_vertex[24] = mins[0];varray_vertex[25] = maxs[1];varray_vertex[26] = maxs[2];
+ varray_vertex[28] = maxs[0];varray_vertex[29] = maxs[1];varray_vertex[30] = maxs[2];
+ varray_color[ 0] = varray_color[ 4] = varray_color[ 8] = varray_color[12] = varray_color[16] = varray_color[20] = varray_color[24] = varray_color[28] = cr * r_colorscale;
+ varray_color[ 1] = varray_color[ 5] = varray_color[ 9] = varray_color[13] = varray_color[17] = varray_color[21] = varray_color[25] = varray_color[29] = cg * r_colorscale;
+ varray_color[ 2] = varray_color[ 6] = varray_color[10] = varray_color[14] = varray_color[18] = varray_color[22] = varray_color[26] = varray_color[30] = cb * r_colorscale;
+ varray_color[ 3] = varray_color[ 7] = varray_color[11] = varray_color[15] = varray_color[19] = varray_color[23] = varray_color[27] = varray_color[31] = ca;
+ if (fogenabled)
+ {
+ for (i = 0, v = varray_vertex, c = varray_color;i < 8;i++, v += 4, c += 4)
+ {
+ VectorSubtract(v, r_origin, diff);
+ f2 = exp(fogdensity/DotProduct(diff, diff));
+ f1 = 1 - f2;
+ f2 *= r_colorscale;
+ c[0] = c[0] * f1 + fogcolor[0] * f2;
+ c[1] = c[1] * f1 + fogcolor[1] * f2;
+ c[2] = c[2] * f1 + fogcolor[2] * f2;
+ }
+ }
+ R_Mesh_Draw(8, 12);
+}
+*/
+
+void R_DrawNoModelCallback(const void *calldata1, int calldata2)
+{
+ const entity_render_t *ent = calldata1;
+ int i, element[24];
+ float f1, f2, *c, diff[3];
+ rmeshstate_t m;
+ memset(&m, 0, sizeof(m));
+ if (ent->flags & EF_ADDITIVE)
+ {
+ m.blendfunc1 = GL_SRC_ALPHA;
+ m.blendfunc2 = GL_ONE;
+ }
+ else if (ent->alpha < 1)
+ {
+ m.blendfunc1 = GL_SRC_ALPHA;
+ m.blendfunc2 = GL_ONE_MINUS_SRC_ALPHA;
+ }
+ else
+ {
+ m.blendfunc1 = GL_ONE;
+ m.blendfunc2 = GL_ZERO;
+ }
+ R_Mesh_Matrix(&ent->matrix);
+ R_Mesh_State(&m);
+
+ element[ 0] = 5;element[ 1] = 2;element[ 2] = 0;
+ element[ 3] = 5;element[ 4] = 1;element[ 5] = 2;
+ element[ 6] = 5;element[ 7] = 0;element[ 8] = 3;
+ element[ 9] = 5;element[10] = 3;element[11] = 1;
+ element[12] = 0;element[13] = 2;element[14] = 4;
+ element[15] = 2;element[16] = 1;element[17] = 4;
+ element[18] = 3;element[19] = 0;element[20] = 4;
+ element[21] = 1;element[22] = 3;element[23] = 4;
+ varray_vertex[ 0] = -16;varray_vertex[ 1] = 0;varray_vertex[ 2] = 0;
+ varray_vertex[ 4] = 16;varray_vertex[ 5] = 0;varray_vertex[ 6] = 0;
+ varray_vertex[ 8] = 0;varray_vertex[ 9] = -16;varray_vertex[10] = 0;
+ varray_vertex[12] = 0;varray_vertex[13] = 16;varray_vertex[14] = 0;
+ varray_vertex[16] = 0;varray_vertex[17] = 0;varray_vertex[18] = -16;
+ varray_vertex[20] = 0;varray_vertex[21] = 0;varray_vertex[22] = 16;
+ varray_color[ 0] = 0.00f;varray_color[ 1] = 0.00f;varray_color[ 2] = 0.50f;varray_color[ 3] = ent->alpha;
+ varray_color[ 4] = 0.00f;varray_color[ 5] = 0.00f;varray_color[ 6] = 0.50f;varray_color[ 7] = ent->alpha;
+ varray_color[ 8] = 0.00f;varray_color[ 9] = 0.50f;varray_color[10] = 0.00f;varray_color[11] = ent->alpha;
+ varray_color[12] = 0.00f;varray_color[13] = 0.50f;varray_color[14] = 0.00f;varray_color[15] = ent->alpha;
+ varray_color[16] = 0.50f;varray_color[17] = 0.00f;varray_color[18] = 0.00f;varray_color[19] = ent->alpha;
+ varray_color[20] = 0.50f;varray_color[21] = 0.00f;varray_color[22] = 0.00f;varray_color[23] = ent->alpha;
+ if (fogenabled)
+ {
+ VectorSubtract(ent->origin, r_origin, diff);
+ f2 = exp(fogdensity/DotProduct(diff, diff));
+ f1 = 1 - f2;
+ for (i = 0, c = varray_color;i < 6;i++, c += 4)
+ {
+ c[0] = (c[0] * f1 + fogcolor[0] * f2) * r_colorscale;
+ c[1] = (c[1] * f1 + fogcolor[1] * f2) * r_colorscale;
+ c[2] = (c[2] * f1 + fogcolor[2] * f2) * r_colorscale;
+ }
+ }
+ else
+ {
+ for (i = 0, c = varray_color;i < 6;i++, c += 4)
+ {
+ c[0] *= r_colorscale;
+ c[1] *= r_colorscale;
+ c[2] *= r_colorscale;
+ }
+ }
+ R_Mesh_Draw(6, 8, element);
+}
+
+void R_DrawNoModel(entity_render_t *ent)
+{
+ //if ((ent->effects & EF_ADDITIVE) || (ent->alpha < 1))
+ R_MeshQueue_AddTransparent(ent->origin, R_DrawNoModelCallback, ent, 0);
+ //else
+ // R_DrawNoModelCallback(ent, 0);
+}
+
+void R_CalcBeamVerts (float *vert, vec3_t org1, vec3_t org2, float width)
+{
+ vec3_t right1, right2, diff, normal;
+
+ VectorSubtract (org2, org1, normal);
+ VectorNormalizeFast (normal);
+
+ // calculate 'right' vector for start
+ VectorSubtract (r_origin, org1, diff);
+ VectorNormalizeFast (diff);
+ CrossProduct (normal, diff, right1);
+
+ // calculate 'right' vector for end
+ VectorSubtract (r_origin, org2, diff);
+ VectorNormalizeFast (diff);
+ CrossProduct (normal, diff, right2);
+
+ vert[ 0] = org1[0] + width * right1[0];
+ vert[ 1] = org1[1] + width * right1[1];
+ vert[ 2] = org1[2] + width * right1[2];
+ vert[ 4] = org1[0] - width * right1[0];
+ vert[ 5] = org1[1] - width * right1[1];
+ vert[ 6] = org1[2] - width * right1[2];
+ vert[ 8] = org2[0] - width * right2[0];
+ vert[ 9] = org2[1] - width * right2[1];
+ vert[10] = org2[2] - width * right2[2];
+ vert[12] = org2[0] + width * right2[0];
+ vert[13] = org2[1] + width * right2[1];
+ vert[14] = org2[2] + width * right2[2];
+}