mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-01-29 20:20:43 +00:00
first stab at colored alias model lighting
This commit is contained in:
parent
1afd2d95b2
commit
8e97d6279a
3 changed files with 70 additions and 30 deletions
|
@ -173,5 +173,6 @@ typedef struct edge_s
|
||||||
|
|
||||||
#define NUMVERTEXNORMALS 162
|
#define NUMVERTEXNORMALS 162
|
||||||
extern float r_avertexnormals[NUMVERTEXNORMALS][3];
|
extern float r_avertexnormals[NUMVERTEXNORMALS][3];
|
||||||
|
extern vec3_t ambientcolor;
|
||||||
|
|
||||||
#endif // _R_SHARED_H
|
#endif // _R_SHARED_H
|
||||||
|
|
|
@ -85,8 +85,7 @@ float r_avertexnormal_dots[SHADEDOT_QUANT][256] =
|
||||||
#include "anorm_dots.h"
|
#include "anorm_dots.h"
|
||||||
;
|
;
|
||||||
|
|
||||||
float shadelight;
|
float shadelight, ambientlight;
|
||||||
float *shadedots = r_avertexnormal_dots[0];
|
|
||||||
vec3_t shadevector;
|
vec3_t shadevector;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -117,7 +116,7 @@ GL_DrawAliasFrame (vert_order_t *vo)
|
||||||
order += 2;
|
order += 2;
|
||||||
|
|
||||||
// normals and vertexes come from the frame list
|
// normals and vertexes come from the frame list
|
||||||
VectorScale (shadecolor, verts->lightdot, color);
|
VectorMA (ambientcolor, verts->lightdot, shadecolor, color);
|
||||||
|
|
||||||
qfglColor4fv (color);
|
qfglColor4fv (color);
|
||||||
|
|
||||||
|
@ -193,7 +192,7 @@ GL_DrawAliasFrameMulti (vert_order_t *vo)
|
||||||
order += 2;
|
order += 2;
|
||||||
|
|
||||||
// normals and vertexes come from the frame list
|
// normals and vertexes come from the frame list
|
||||||
VectorScale (shadecolor, verts->lightdot, color);
|
VectorMA (ambientcolor, verts->lightdot, shadecolor, color);
|
||||||
|
|
||||||
qfglColor4fv (color);
|
qfglColor4fv (color);
|
||||||
|
|
||||||
|
@ -336,11 +335,15 @@ GL_GetAliasFrameVerts16 (int frame, aliashdr_t *paliashdr, entity_t *e)
|
||||||
|
|
||||||
for (i = 0, vo_v = vo->verts; i < count;
|
for (i = 0, vo_v = vo->verts; i < count;
|
||||||
i++, vo_v++, verts1++, verts2++) {
|
i++, vo_v++, verts1++, verts2++) {
|
||||||
|
float *n1, *n2;
|
||||||
|
float d1, d2;
|
||||||
VectorBlend (v1, v2, blend, vo_v->vert);
|
VectorBlend (v1, v2, blend, vo_v->vert);
|
||||||
VectorScale (vo_v->vert, 1.0 / 256.0, vo_v->vert);
|
VectorScale (vo_v->vert, 1.0 / 256.0, vo_v->vert);
|
||||||
vo_v->lightdot =
|
n1 = r_avertexnormals[verts1->lightnormalindex];
|
||||||
shadedots[verts1->lightnormalindex] * (1.0 - blend)
|
n2 = r_avertexnormals[verts2->lightnormalindex];
|
||||||
+ shadedots[verts2->lightnormalindex] * blend;
|
d1 = DotProduct (shadevector, n1);
|
||||||
|
d2 = DotProduct (shadevector, n2);
|
||||||
|
vo_v->lightdot = max (0, d1 * (1.0 - blend) + d2 * blend);
|
||||||
}
|
}
|
||||||
return vo;
|
return vo;
|
||||||
}
|
}
|
||||||
|
@ -348,8 +351,13 @@ GL_GetAliasFrameVerts16 (int frame, aliashdr_t *paliashdr, entity_t *e)
|
||||||
verts += pose * count;
|
verts += pose * count;
|
||||||
}
|
}
|
||||||
for (i = 0, vo_v = vo->verts; i < count; i++, vo_v++, verts++) {
|
for (i = 0, vo_v = vo->verts; i < count; i++, vo_v++, verts++) {
|
||||||
|
float *n;
|
||||||
|
float d;
|
||||||
|
|
||||||
VectorScale (verts->v, 1.0 / 256.0, vo_v->vert);
|
VectorScale (verts->v, 1.0 / 256.0, vo_v->vert);
|
||||||
vo_v->lightdot = shadedots[verts->lightnormalindex];
|
n = r_avertexnormals[verts->lightnormalindex];
|
||||||
|
d = DotProduct (shadevector, n);
|
||||||
|
vo_v->lightdot = max (0, d);
|
||||||
}
|
}
|
||||||
return vo;
|
return vo;
|
||||||
}
|
}
|
||||||
|
@ -429,10 +437,15 @@ GL_GetAliasFrameVerts (int frame, aliashdr_t *paliashdr, entity_t *e)
|
||||||
|
|
||||||
for (i = 0, vo_v = vo->verts; i < count;
|
for (i = 0, vo_v = vo->verts; i < count;
|
||||||
i++, vo_v++, verts1++, verts2++) {
|
i++, vo_v++, verts1++, verts2++) {
|
||||||
|
float *n1, *n2;
|
||||||
|
float d1, d2;
|
||||||
|
|
||||||
VectorBlend (verts1->v, verts2->v, blend, vo_v->vert);
|
VectorBlend (verts1->v, verts2->v, blend, vo_v->vert);
|
||||||
vo_v->lightdot =
|
n1 = r_avertexnormals[verts1->lightnormalindex];
|
||||||
shadedots[verts1->lightnormalindex] * (1 - blend)
|
n2 = r_avertexnormals[verts2->lightnormalindex];
|
||||||
+ shadedots[verts2->lightnormalindex] * blend;
|
d1 = DotProduct (shadevector, n1);
|
||||||
|
d2 = DotProduct (shadevector, n2);
|
||||||
|
vo_v->lightdot = max (0, d1 * (1.0 - blend) + d2 * blend);
|
||||||
}
|
}
|
||||||
return vo;
|
return vo;
|
||||||
}
|
}
|
||||||
|
@ -440,8 +453,13 @@ GL_GetAliasFrameVerts (int frame, aliashdr_t *paliashdr, entity_t *e)
|
||||||
verts += pose * count;
|
verts += pose * count;
|
||||||
}
|
}
|
||||||
for (i = 0, vo_v = vo->verts; i < count; i++, vo_v++, verts++) {
|
for (i = 0, vo_v = vo->verts; i < count; i++, vo_v++, verts++) {
|
||||||
|
float *n;
|
||||||
|
float d;
|
||||||
|
|
||||||
VectorCopy (verts->v, vo_v->vert);
|
VectorCopy (verts->v, vo_v->vert);
|
||||||
vo_v->lightdot = shadedots[verts->lightnormalindex];
|
n = r_avertexnormals[verts->lightnormalindex];
|
||||||
|
d = DotProduct (shadevector, n);
|
||||||
|
vo_v->lightdot = max (0, d);
|
||||||
}
|
}
|
||||||
return vo;
|
return vo;
|
||||||
}
|
}
|
||||||
|
@ -509,38 +527,56 @@ R_DrawAliasModel (entity_t *e, qboolean cull)
|
||||||
|
|
||||||
VectorSubtract (r_origin, e->origin, modelorg);
|
VectorSubtract (r_origin, e->origin, modelorg);
|
||||||
|
|
||||||
if (clmodel->fullbright) {
|
if (!clmodel->fullbright) {
|
||||||
shadelight = 1.0; // make certain models full brightness always
|
|
||||||
} else {
|
|
||||||
// get lighting information
|
// get lighting information
|
||||||
shadelight = R_LightPoint (e->origin);
|
ambientlight = shadelight = R_LightPoint (e->origin);
|
||||||
|
ambientcolor[0] *= e->colormod[0];
|
||||||
|
ambientcolor[1] *= e->colormod[1];
|
||||||
|
ambientcolor[2] *= e->colormod[2];
|
||||||
|
VectorScale (ambientcolor, 0.005, shadecolor);
|
||||||
|
|
||||||
// always give the gun some light
|
// always give the gun some light
|
||||||
if (e == r_view_model)
|
if (e == r_view_model && shadelight < 24) {
|
||||||
shadelight = max (shadelight, 24);
|
VectorScale (shadecolor, 24 / (shadelight + 0.1), shadecolor);
|
||||||
|
shadelight = 24;
|
||||||
|
}
|
||||||
|
|
||||||
for (lnum = 0; lnum < r_maxdlights; lnum++) {
|
for (lnum = 0; lnum < r_maxdlights; lnum++) {
|
||||||
if (r_dlights[lnum].die >= r_realtime) {
|
if (r_dlights[lnum].die >= r_realtime) {
|
||||||
VectorSubtract (e->origin, r_dlights[lnum].origin, dist);
|
VectorSubtract (e->origin, r_dlights[lnum].origin, dist);
|
||||||
add = (r_dlights[lnum].radius * r_dlights[lnum].radius * 8) /
|
add = ((r_dlights[lnum].radius
|
||||||
(DotProduct (dist, dist)); // FIXME Deek
|
* r_dlights[lnum].radius * 8)
|
||||||
|
/ DotProduct (dist, dist)); // FIXME Deek
|
||||||
|
|
||||||
if (add > 0)
|
if (add > 0) {
|
||||||
shadelight += add;
|
VectorMA (ambientcolor, add, r_dlights[lnum].color,
|
||||||
|
ambientcolor);
|
||||||
|
ambientlight += add;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// clamp lighting so it doesn't overbright as much
|
// clamp lighting so it doesn't overbright as much
|
||||||
shadelight = min (shadelight, 100); // was 200
|
if (ambientlight > 128) {
|
||||||
|
VectorScale (ambientcolor, 128 / ambientlight, ambientcolor);
|
||||||
|
ambientlight = 128;
|
||||||
|
}
|
||||||
|
if (ambientlight + shadelight > 200) {
|
||||||
|
VectorScale (shadecolor, (200 - ambientlight) / shadelight,
|
||||||
|
shadecolor);
|
||||||
|
shadelight = 200 - ambientlight;
|
||||||
|
}
|
||||||
|
VectorScale (ambientcolor, 0.005, ambientcolor);
|
||||||
|
|
||||||
// never allow players to go totally black
|
// never allow players to go totally black
|
||||||
shadelight = max (shadelight, clmodel->min_light);
|
if (shadelight < clmodel->min_light) {
|
||||||
|
VectorScale (shadecolor, clmodel->min_light / (shadelight + 0.1),
|
||||||
|
shadecolor);
|
||||||
|
shadelight = clmodel->min_light;
|
||||||
|
}
|
||||||
|
|
||||||
shadelight *= 0.005;
|
shadelight *= 0.005;
|
||||||
|
|
||||||
shadedots = r_avertexnormal_dots[(int) (e->angles[1] *
|
|
||||||
(SHADEDOT_QUANT / 360.0)) &
|
|
||||||
(SHADEDOT_QUANT - 1)];
|
|
||||||
an = e->angles[1] * (M_PI / 180);
|
an = e->angles[1] * (M_PI / 180);
|
||||||
shadevector[0] = cos (-an);
|
shadevector[0] = cos (-an);
|
||||||
shadevector[1] = sin (-an);
|
shadevector[1] = sin (-an);
|
||||||
|
@ -548,7 +584,6 @@ R_DrawAliasModel (entity_t *e, qboolean cull)
|
||||||
VectorNormalize (shadevector);
|
VectorNormalize (shadevector);
|
||||||
}
|
}
|
||||||
|
|
||||||
VectorScale (e->colormod, 2.0 * shadelight, shadecolor);
|
|
||||||
modelalpha = e->colormod[3];
|
modelalpha = e->colormod[3];
|
||||||
|
|
||||||
// locate the proper data
|
// locate the proper data
|
||||||
|
@ -591,7 +626,11 @@ R_DrawAliasModel (entity_t *e, qboolean cull)
|
||||||
if (modelalpha < 1.0)
|
if (modelalpha < 1.0)
|
||||||
qfglDepthMask (GL_FALSE);
|
qfglDepthMask (GL_FALSE);
|
||||||
|
|
||||||
if (!fb_texture) { // Model has no fullbrights, don't bother with multi
|
if (clmodel->fullbright) {
|
||||||
|
qfglBindTexture (GL_TEXTURE_2D, texture);
|
||||||
|
GL_DrawAliasFrame_fb (vo);
|
||||||
|
} else if (!fb_texture) {
|
||||||
|
// Model has no fullbrights, don't bother with multi
|
||||||
qfglBindTexture (GL_TEXTURE_2D, texture);
|
qfglBindTexture (GL_TEXTURE_2D, texture);
|
||||||
GL_DrawAliasFrame (vo);
|
GL_DrawAliasFrame (vo);
|
||||||
} else { // try multitexture
|
} else { // try multitexture
|
||||||
|
|
|
@ -368,7 +368,7 @@ calc_lighting_3 (msurface_t *surf, int ds, int dt)
|
||||||
|
|
||||||
lightmap = surf->samples;
|
lightmap = surf->samples;
|
||||||
if (lightmap) {
|
if (lightmap) {
|
||||||
lightmap += dt * se_s * 3 + ds;
|
lightmap += (dt * se_s + ds) * 3;
|
||||||
|
|
||||||
for (maps = 0; maps < MAXLIGHTMAPS && surf->styles[maps] != 255;
|
for (maps = 0; maps < MAXLIGHTMAPS && surf->styles[maps] != 255;
|
||||||
maps++) {
|
maps++) {
|
||||||
|
|
Loading…
Reference in a new issue