From 0cd0afa9459c958d921ba18b362129ed5bfdf84a Mon Sep 17 00:00:00 2001 From: plagman Date: Fri, 27 Mar 2009 12:56:42 +0000 Subject: [PATCH] Cast light on models and self-shadowing. git-svn-id: https://svn.eduke32.com/eduke32@1273 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/build/include/polymer.h | 2 ++ polymer/eduke32/build/src/polymer.c | 23 ++++++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/polymer/eduke32/build/include/polymer.h b/polymer/eduke32/build/include/polymer.h index 5a3bdb2dd..6701df21c 100644 --- a/polymer/eduke32/build/include/polymer.h +++ b/polymer/eduke32/build/include/polymer.h @@ -80,6 +80,8 @@ typedef struct s_prmaterial { GLuint mirrormap; // PR_BIT_DIFFUSE_GLOW_MAP GLuint glowmap; + // PR_BIT_SHADOW_MAP + GLboolean mdspritespace; } _prmaterial; typedef struct s_prrograminfo { diff --git a/polymer/eduke32/build/src/polymer.c b/polymer/eduke32/build/src/polymer.c index d9a3047ce..46e892bd8 100644 --- a/polymer/eduke32/build/src/polymer.c +++ b/polymer/eduke32/build/src/polymer.c @@ -2690,7 +2690,6 @@ static void polymer_drawmdsprite(spritetype *tspr) float sradius, lradius; char modellights[PR_MAXLIGHTS]; char modellightcount; - int32_t oldoverridematerial; m = (md3model_t*)models[tile2model[Ptile2tile(tspr->picnum,sprite[tspr->owner].pal)].modelid]; updateanimation((md2model_t *)m,tspr); @@ -2708,11 +2707,9 @@ static void polymer_drawmdsprite(spritetype *tspr) if (((tspr->cstat>>4) & 3) == 2) ang -= 90.0f; - oldoverridematerial = overridematerial; - overridematerial &= ~prprogrambits[PR_BIT_SHADOW_MAP].bit; - bglMatrixMode(GL_MODELVIEW); bglPushMatrix(); + bglLoadIdentity(); scale = (1.0/4.0); scale *= m->scale; scale *= m->bscale; @@ -2743,6 +2740,9 @@ static void polymer_drawmdsprite(spritetype *tspr) bglTranslatef(0.0f, 0.0, m->zadd * 64); bglGetFloatv(GL_MODELVIEW_MATRIX, spritemodelview); + bglPopMatrix(); + bglPushMatrix(); + bglMultMatrixf(spritemodelview); // debug code for drawing the model bounding sphere // bglDisable(GL_TEXTURE_2D); @@ -2807,6 +2807,8 @@ static void polymer_drawmdsprite(spritetype *tspr) if (pr_gpusmoothing) mdspritematerial.frameprogress = m->interpol; + mdspritematerial.mdspritespace = GL_TRUE; + modellightcount = 0; // light culling @@ -2826,6 +2828,7 @@ static void polymer_drawmdsprite(spritetype *tspr) (m->head.frames[m->nframe].cen.z * m->interpol); polymer_transformpoint(spos, tspos, spritemodelview); + polymer_transformpoint(tspos, spos, rootmodelviewmatrix); i = 0; while (i < lightcount) @@ -2838,11 +2841,11 @@ static void polymer_drawmdsprite(spritetype *tspr) polymer_transformpoint(lpos, tlpos, rootmodelviewmatrix); - vec[0] = tlpos[0] - tspos[0]; + vec[0] = tlpos[0] - spos[0]; vec[0] *= vec[0]; - vec[1] = tlpos[1] - tspos[1]; + vec[1] = tlpos[1] - spos[1]; vec[1] *= vec[1]; - vec[2] = tlpos[2] - tspos[2]; + vec[2] = tlpos[2] - spos[2]; vec[2] *= vec[2]; if ((vec[0] + vec[1] + vec[2]) <= @@ -2965,8 +2968,6 @@ static void polymer_drawmdsprite(spritetype *tspr) bglPopMatrix(); - overridematerial = oldoverridematerial; - globalnoeffect=0; } @@ -3031,6 +3032,8 @@ static void polymer_getscratchmaterial(_prmaterial* material) material->mirrormap = 0; // PR_BIT_DIFFUSE_GLOW_MAP material->glowmap = 0; + // PR_BIT_SHADOW_MAP + material->mdspritespace = GL_FALSE; } static void polymer_getbuildmaterial(_prmaterial* material, int16_t tilenum, char pal, int8_t shade) @@ -3324,6 +3327,8 @@ static int32_t polymer_bindmaterial(_prmaterial material, char* lights, int bglLoadMatrixf(shadowBias); bglMultMatrixf(prlights[lights[curlight]].proj); bglMultMatrixf(prlights[lights[curlight]].transform); + if (material.mdspritespace == GL_TRUE) + bglMultMatrixf(spritemodelview); bglGetFloatv(GL_TEXTURE_MATRIX, matrix); bglLoadIdentity(); bglMatrixMode(GL_MODELVIEW);