mirror of
https://git.code.sf.net/p/quake/quakeforge-old
synced 2025-02-15 00:10:54 +00:00
Supposedly models should be shaded with colored light now. They don't
seem like they are to me but supposedly they are shaded.
This commit is contained in:
parent
a060d2818c
commit
cc8e1219bd
4 changed files with 176 additions and 81 deletions
|
@ -268,24 +268,33 @@ LIGHT SAMPLING
|
|||
|
||||
mplane_t *lightplane;
|
||||
vec3_t lightspot;
|
||||
|
||||
int RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end)
|
||||
static int myr[4];
|
||||
/*
|
||||
RecursiveLightPoint
|
||||
*/
|
||||
int *
|
||||
RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end)
|
||||
{
|
||||
int r;
|
||||
int *r = myr;
|
||||
float front, back, frac;
|
||||
int side;
|
||||
int side;
|
||||
mplane_t *plane;
|
||||
vec3_t mid;
|
||||
msurface_t *surf;
|
||||
int s, t, ds, dt;
|
||||
int i;
|
||||
int s, t, ds, dt;
|
||||
int i;
|
||||
mtexinfo_t *tex;
|
||||
byte *lightmap;
|
||||
unsigned scale;
|
||||
int maps;
|
||||
int maps;
|
||||
|
||||
r[0] = r[1] = r[2] = r[3] = 0;
|
||||
|
||||
if (node->contents < 0)
|
||||
return -1; // didn't hit anything
|
||||
{
|
||||
r[3] = -1;
|
||||
return r; // didn't hit anything
|
||||
}
|
||||
|
||||
// calculate mid point
|
||||
|
||||
|
@ -305,11 +314,14 @@ int RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end)
|
|||
|
||||
// go down front side
|
||||
r = RecursiveLightPoint (node->children[side], start, mid);
|
||||
if (r >= 0)
|
||||
if (r[3] >= 0)
|
||||
return r; // hit something
|
||||
|
||||
if ( (back < 0) == side )
|
||||
return -1; // didn't hit anuthing
|
||||
{
|
||||
r[3] = -1;
|
||||
return r; // didn't hit anuthing
|
||||
}
|
||||
|
||||
// check for impact on this node
|
||||
VectorCopy (mid, lightspot);
|
||||
|
@ -337,30 +349,53 @@ int RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end)
|
|||
continue;
|
||||
|
||||
if (!surf->samples)
|
||||
return 0;
|
||||
return r;
|
||||
|
||||
ds >>= 4;
|
||||
dt >>= 4;
|
||||
|
||||
lightmap = surf->samples;
|
||||
r = 0;
|
||||
if (lightmap)
|
||||
{
|
||||
if (bspver == CBSPVERSION)
|
||||
lightmap += (dt * ((surf->extents[0]>>4)+1)
|
||||
+ ds) * 4;
|
||||
else
|
||||
lightmap += (dt * ((surf->extents[0]>>4)+1)
|
||||
+ ds);
|
||||
|
||||
|
||||
lightmap += dt * ((surf->extents[0]>>4)+1) + ds;
|
||||
|
||||
for (maps = 0 ; maps < MAXLIGHTMAPS && surf->styles[maps] != 255 ;
|
||||
for (maps = 0 ; (maps < MAXLIGHTMAPS)
|
||||
&& (surf->styles[maps] != 255) ;
|
||||
maps++)
|
||||
{
|
||||
scale = d_lightstylevalue[surf->styles[maps]];
|
||||
r += *lightmap * scale;
|
||||
lightmap += ((surf->extents[0]>>4)+1) *
|
||||
((surf->extents[1]>>4)+1);
|
||||
if (bspver == CBSPVERSION)
|
||||
{
|
||||
// calc color's effect for model
|
||||
r[0] += lightmap[0] * scale;
|
||||
r[1] += lightmap[1] * scale;
|
||||
r[2] += lightmap[2] * scale;
|
||||
r[3] += lightmap[3] * scale;
|
||||
lightmap += (((surf->extents[0]>>4)+1)
|
||||
* ((surf->extents[1]
|
||||
>>4)+1)) * 4;
|
||||
} else {
|
||||
r[3] += *lightmap * scale;
|
||||
lightmap += ((surf->extents[0]>>4)+1)
|
||||
* ((surf->extents[1]>>4)+1);
|
||||
}
|
||||
}
|
||||
|
||||
r >>= 8;
|
||||
if (bspver == CBSPVERSION)
|
||||
{
|
||||
r[0] = r[1] = r[2] = 0;
|
||||
} else {
|
||||
r[0] >>= 8;
|
||||
r[1] >>= 8;
|
||||
r[2] >>= 8;
|
||||
}
|
||||
r[3] >>= 8;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -368,13 +403,20 @@ int RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end)
|
|||
return RecursiveLightPoint (node->children[!side], mid, end);
|
||||
}
|
||||
|
||||
int R_LightPoint (vec3_t p)
|
||||
/*
|
||||
R_LightPoint
|
||||
*/
|
||||
int *
|
||||
R_LightPoint (vec3_t p)
|
||||
{
|
||||
vec3_t end;
|
||||
int r;
|
||||
int *r = myr;
|
||||
|
||||
if (!cl.worldmodel->lightdata)
|
||||
return 255;
|
||||
{
|
||||
r[0] = r[1] = r[2] = r[3] = 255;
|
||||
return r;
|
||||
}
|
||||
|
||||
end[0] = p[0];
|
||||
end[1] = p[1];
|
||||
|
@ -382,8 +424,8 @@ int R_LightPoint (vec3_t p)
|
|||
|
||||
r = RecursiveLightPoint (cl.worldmodel->nodes, p, end);
|
||||
|
||||
if (r == -1)
|
||||
r = 0;
|
||||
if (r[3] == -1)
|
||||
r[3] = 0;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -270,11 +270,12 @@ R_DrawSpriteModel (entity_t *e) {
|
|||
#define NUMVERTEXNORMALS 162
|
||||
|
||||
float r_avertexnormals[NUMVERTEXNORMALS][3] = {
|
||||
#include "anorms.h"
|
||||
#include "anorms.-c"
|
||||
};
|
||||
|
||||
vec3_t shadevector;
|
||||
float shadelight, ambientlight;
|
||||
float shadelight[4];
|
||||
float ambientlight;
|
||||
|
||||
// precalculated dot products for quantized angles
|
||||
#define SHADEDOT_QUANT 16
|
||||
|
@ -290,9 +291,10 @@ int lastposenum;
|
|||
GL_DrawAliasFrame
|
||||
*/
|
||||
void
|
||||
GL_DrawAliasFrame (aliashdr_t *paliashdr, int posenum) {
|
||||
GL_DrawAliasFrame (aliashdr_t *paliashdr, int posenum)
|
||||
{
|
||||
|
||||
float l;
|
||||
float l;
|
||||
trivertx_t *verts;
|
||||
int *order;
|
||||
int count;
|
||||
|
@ -303,25 +305,36 @@ GL_DrawAliasFrame (aliashdr_t *paliashdr, int posenum) {
|
|||
verts += posenum * paliashdr->poseverts;
|
||||
order = (int *)((byte *)paliashdr + paliashdr->commands);
|
||||
|
||||
while (1) {
|
||||
while (1)
|
||||
{
|
||||
// get the vertex count and primitive type
|
||||
count = *order++;
|
||||
if (!count)
|
||||
break; // done
|
||||
if (count < 0) {
|
||||
if (count < 0)
|
||||
{
|
||||
count = -count;
|
||||
glBegin (GL_TRIANGLE_FAN);
|
||||
} else {
|
||||
glBegin (GL_TRIANGLE_STRIP);
|
||||
}
|
||||
|
||||
do { // texture coordinates come from the draw list
|
||||
glTexCoord2f (((float *)order)[0], ((float *)order)[1]);
|
||||
do
|
||||
{ // texture coordinates come from the draw list
|
||||
glTexCoord2f (((float *)order)[0],
|
||||
((float *)order)[1]);
|
||||
order += 2;
|
||||
|
||||
// normals and vertexes come from the frame list
|
||||
l = shadedots[verts->lightnormalindex] * shadelight;
|
||||
glColor3f (l, l, l);
|
||||
|
||||
l = shadedots[verts->lightnormalindex]
|
||||
* shadelight[3];
|
||||
if (shadelight[0] || shadelight[1] || shadelight[2])
|
||||
glColor3f (l*shadelight[0], l*shadelight[1],
|
||||
l*shadelight[2]);
|
||||
else
|
||||
glColor3f (l, l, l);
|
||||
|
||||
glVertex3f (verts->v[0], verts->v[1], verts->v[2]);
|
||||
verts++;
|
||||
} while (--count);
|
||||
|
@ -416,15 +429,16 @@ void R_SetupAliasFrame (int frame, aliashdr_t *paliashdr) {
|
|||
void
|
||||
R_DrawAliasModel (entity_t *e) {
|
||||
|
||||
int i;
|
||||
int lnum;
|
||||
int i;
|
||||
int *j;
|
||||
int lnum;
|
||||
vec3_t dist;
|
||||
float add;
|
||||
model_t *clmodel;
|
||||
vec3_t mins, maxs;
|
||||
aliashdr_t *paliashdr;
|
||||
float an;
|
||||
int anim;
|
||||
int anim;
|
||||
|
||||
clmodel = currententity->model;
|
||||
|
||||
|
@ -440,49 +454,65 @@ R_DrawAliasModel (entity_t *e) {
|
|||
/*
|
||||
get lighting information
|
||||
*/
|
||||
ambientlight = shadelight = R_LightPoint (currententity->origin);
|
||||
|
||||
j = R_LightPoint (currententity->origin);
|
||||
shadelight[0] = (float)j[0];
|
||||
shadelight[1] = (float)j[1];
|
||||
shadelight[2] = (float)j[2];
|
||||
shadelight[3] = (float)j[3];
|
||||
ambientlight = shadelight[3];
|
||||
|
||||
// allways give the gun some light
|
||||
if (e == &cl.viewent && ambientlight < 24)
|
||||
ambientlight = shadelight = 24;
|
||||
ambientlight = shadelight[3] = 24;
|
||||
|
||||
for (lnum=0 ; lnum<MAX_DLIGHTS ; lnum++) {
|
||||
if (cl_dlights[lnum].die >= cl.time) {
|
||||
for (lnum=0 ; lnum<MAX_DLIGHTS ; lnum++)
|
||||
{
|
||||
if (cl_dlights[lnum].die >= cl.time)
|
||||
{
|
||||
VectorSubtract (currententity->origin,
|
||||
cl_dlights[lnum].origin,
|
||||
dist);
|
||||
cl_dlights[lnum].origin,
|
||||
dist);
|
||||
add = cl_dlights[lnum].radius - Length(dist);
|
||||
if (add > 0) {
|
||||
|
||||
if (add > 0)
|
||||
{
|
||||
ambientlight += add;
|
||||
//ZOID models should be affected by dlights as well
|
||||
shadelight += add;
|
||||
// ZOID: models should be affected by
|
||||
// dlights as well
|
||||
shadelight[0] += cl_dlights[lnum].color[0];
|
||||
shadelight[1] += cl_dlights[lnum].color[1];
|
||||
shadelight[2] += cl_dlights[lnum].color[2];
|
||||
shadelight[3] += add;
|
||||
}
|
||||
}
|
||||
}
|
||||
// clamp lighting so it doesn't overbright as much
|
||||
if (ambientlight > 128)
|
||||
ambientlight = 128;
|
||||
if (ambientlight + shadelight > 192)
|
||||
shadelight = 192 - ambientlight;
|
||||
if (ambientlight + shadelight[3] > 192)
|
||||
shadelight[3] = 192 - ambientlight;
|
||||
|
||||
// ZOID: never allow players to go totally black
|
||||
#ifdef QUAKEWORLD
|
||||
if (!strcmp(clmodel->name, "progs/player.mdl")) {
|
||||
if (!strcmp(clmodel->name, "progs/player.mdl"))
|
||||
#else
|
||||
i = currententity - cl_entities;
|
||||
// if (i >= 1 && i <= cl.maxclients && !strcmp (currententity->model->name, "progs/player.mdl")) {
|
||||
if (i >= 1 && i <= cl.maxclients) {
|
||||
if (i >= 1 && i <= cl.maxclients
|
||||
/*&& !strcmp (currententity->model->name,
|
||||
"progs/player.mdl")*/ )
|
||||
#endif
|
||||
if (ambientlight < 8) {
|
||||
ambientlight = shadelight = 8;
|
||||
}
|
||||
{
|
||||
if (ambientlight < 8)
|
||||
ambientlight = shadelight[3] = 8;
|
||||
} else if (!strcmp (clmodel->name, "progs/flame2.mdl")
|
||||
|| !strcmp (clmodel->name, "progs/flame.mdl") )
|
||||
// HACK HACK HACK -- no fullbright colors, so make torches full light
|
||||
ambientlight = shadelight = 256;
|
||||
ambientlight = shadelight[3] = 256;
|
||||
|
||||
shadedots = r_avertexnormal_dots[((int)(e->angles[1] * (SHADEDOT_QUANT / 360.0))) & (SHADEDOT_QUANT - 1)];
|
||||
shadelight = shadelight / 200.0;
|
||||
shadedots = r_avertexnormal_dots[((int)(e->angles[1]
|
||||
* (SHADEDOT_QUANT / 360.0)))
|
||||
& (SHADEDOT_QUANT - 1)];
|
||||
shadelight[3] /= 200.0;
|
||||
|
||||
an = e->angles[1]/180*M_PI;
|
||||
shadevector[0] = cos(-an);
|
||||
|
@ -501,21 +531,28 @@ R_DrawAliasModel (entity_t *e) {
|
|||
draw all the triangles
|
||||
*/
|
||||
GL_DisableMultitexture();
|
||||
|
||||
glPushMatrix ();
|
||||
glPushMatrix ();
|
||||
R_RotateForEntity (e);
|
||||
|
||||
if (!strcmp (clmodel->name, "progs/eyes.mdl") && gl_doubleeyes->value) {
|
||||
glTranslatef (paliashdr->scale_origin[0], paliashdr->scale_origin[1], paliashdr->scale_origin[2] - (22 + 8));
|
||||
if (!strcmp (clmodel->name, "progs/eyes.mdl") &&
|
||||
gl_doubleeyes->value)
|
||||
{
|
||||
glTranslatef (paliashdr->scale_origin[0],
|
||||
paliashdr->scale_origin[1],
|
||||
paliashdr->scale_origin[2] - (22 + 8));
|
||||
// double size of eyes, since they are really hard to see in gl
|
||||
glScalef (paliashdr->scale[0]*2, paliashdr->scale[1]*2, paliashdr->scale[2]*2);
|
||||
glScalef (paliashdr->scale[0]*2, paliashdr->scale[1]*2,
|
||||
paliashdr->scale[2]*2);
|
||||
} else {
|
||||
glTranslatef (paliashdr->scale_origin[0], paliashdr->scale_origin[1], paliashdr->scale_origin[2]);
|
||||
glScalef (paliashdr->scale[0], paliashdr->scale[1], paliashdr->scale[2]);
|
||||
glTranslatef (paliashdr->scale_origin[0],
|
||||
paliashdr->scale_origin[1],
|
||||
paliashdr->scale_origin[2]);
|
||||
glScalef (paliashdr->scale[0], paliashdr->scale[1],
|
||||
paliashdr->scale[2]);
|
||||
}
|
||||
|
||||
anim = (int)(cl.time*10) & 3;
|
||||
GL_Bind(paliashdr->gl_texturenum[currententity->skinnum][anim]);
|
||||
GL_Bind(paliashdr->gl_texturenum[currententity->skinnum][anim]);
|
||||
|
||||
// we can't dynamically colormap textures, so they are cached
|
||||
// seperately for the players. Heads are just uncolored.
|
||||
|
@ -533,8 +570,9 @@ R_DrawAliasModel (entity_t *e) {
|
|||
#else
|
||||
if (currententity->colormap != vid.colormap && !gl_nocolors->value) {
|
||||
i = currententity - cl_entities;
|
||||
//if (i >= 1 && i<=cl.maxclients && !strcmp (currententity->model->name, "progs/player.mdl"))
|
||||
if (i >= 1 && i<=cl.maxclients)
|
||||
if (i >= 1 && i<=cl.maxclients
|
||||
/*&& !strcmp (currententity->model->name,
|
||||
"progs/player.mdl")*/ )
|
||||
GL_Bind(playertextures - 1 + i);
|
||||
}
|
||||
#endif
|
||||
|
@ -617,15 +655,17 @@ R_DrawEntitiesOnList ( void ) {
|
|||
R_DrawViewModel
|
||||
*/
|
||||
void
|
||||
R_DrawViewModel ( void ) {
|
||||
R_DrawViewModel ( void )
|
||||
{
|
||||
|
||||
float ambient[4], diffuse[4];
|
||||
int j;
|
||||
int lnum;
|
||||
int *j;
|
||||
int shadelight[4];
|
||||
int lnum;
|
||||
vec3_t dist;
|
||||
float add;
|
||||
dlight_t *dl;
|
||||
int ambientlight, shadelight;
|
||||
int ambientlight;
|
||||
|
||||
#ifdef QUAKEWORLD
|
||||
if (!r_drawviewmodel->value || !Cam_DrawViewModel())
|
||||
|
@ -643,6 +683,7 @@ R_DrawViewModel ( void ) {
|
|||
|
||||
if (!r_drawentities->value)
|
||||
return;
|
||||
|
||||
if (cl.stats[STAT_ITEMS] & IT_INVISIBILITY)
|
||||
return;
|
||||
|
||||
|
@ -655,10 +696,13 @@ R_DrawViewModel ( void ) {
|
|||
|
||||
j = R_LightPoint (currententity->origin);
|
||||
|
||||
if (j < 24)
|
||||
j = 24; // allways give some light on gun
|
||||
ambientlight = j;
|
||||
shadelight = j;
|
||||
if (j[3] < 24)
|
||||
j[3] = 24; // allways give some light on gun
|
||||
ambientlight = j[3];
|
||||
shadelight[0] = j[0];
|
||||
shadelight[1] = j[1];
|
||||
shadelight[2] = j[2];
|
||||
shadelight[3] = j[3];
|
||||
|
||||
// add dynamic lights
|
||||
for (lnum=0 ; lnum<MAX_DLIGHTS ; lnum++) {
|
||||
|
@ -673,11 +717,20 @@ R_DrawViewModel ( void ) {
|
|||
VectorSubtract (currententity->origin, dl->origin, dist);
|
||||
add = dl->radius - Length(dist);
|
||||
if (add > 0)
|
||||
{
|
||||
shadelight[0] += dl->color[0];
|
||||
shadelight[1] += dl->color[1];
|
||||
shadelight[2] += dl->color[2];
|
||||
shadelight[3] += add;
|
||||
ambientlight += add;
|
||||
}
|
||||
}
|
||||
|
||||
ambient[0] = ambient[1] = ambient[2] = ambient[3] = (float)ambientlight / 128;
|
||||
diffuse[0] = diffuse[1] = diffuse[2] = diffuse[3] = (float)shadelight / 128;
|
||||
ambient[0] = ambient[1] = ambient[2] = ambient[3] =
|
||||
(float)ambientlight / 128;
|
||||
|
||||
diffuse[0] = diffuse[1] = diffuse[2] = diffuse[3] =
|
||||
(float)shadelight[3] / 128;
|
||||
|
||||
// hack the depth range to prevent view model from poking into walls
|
||||
glDepthRange (gldepthmin, gldepthmin + 0.3*(gldepthmax-gldepthmin));
|
||||
|
|
|
@ -263,7 +263,7 @@ void R_RotateForEntity (entity_t *e);
|
|||
void R_MarkLights (dlight_t *light, int bit, mnode_t *node);
|
||||
void R_AnimateLight (void);
|
||||
void R_RenderDlights (void);
|
||||
int R_LightPoint (vec3_t p);
|
||||
int * R_LightPoint (vec3_t p);
|
||||
|
||||
//
|
||||
// gl_refrag.c
|
||||
|
|
Loading…
Reference in a new issue