Annotation of quake1/gl_rlight.c, revision 1.1

1.1     ! root        1: // r_light.c
        !             2: 
        !             3: #include "quakedef.h"
        !             4: 
        !             5: int    r_dlightframecount;
        !             6: 
        !             7: 
        !             8: /*
        !             9: ==================
        !            10: R_AnimateLight
        !            11: ==================
        !            12: */
        !            13: void R_AnimateLight (void)
        !            14: {
        !            15:        int                     i,j,k;
        !            16:        
        !            17: //
        !            18: // light animations
        !            19: // 'm' is normal light, 'a' is no light, 'z' is double bright
        !            20:        i = (int)(cl.time*10);
        !            21:        for (j=0 ; j<MAX_LIGHTSTYLES ; j++)
        !            22:        {
        !            23:                if (!cl_lightstyle[j].length)
        !            24:                {
        !            25:                        d_lightstylevalue[j] = 256;
        !            26:                        continue;
        !            27:                }
        !            28:                k = i % cl_lightstyle[j].length;
        !            29:                k = cl_lightstyle[j].map[k] - 'a';
        !            30:                k = k*22;
        !            31:                d_lightstylevalue[j] = k;
        !            32:        }       
        !            33: }
        !            34: 
        !            35: /*
        !            36: =============================================================================
        !            37: 
        !            38: DYNAMIC LIGHTS BLEND RENDERING
        !            39: 
        !            40: =============================================================================
        !            41: */
        !            42: 
        !            43: void AddLightBlend (float r, float g, float b, float a2)
        !            44: {
        !            45:        float   a;
        !            46: 
        !            47:        v_blend[3] = a = v_blend[3] + a2*(1-v_blend[3]);
        !            48: 
        !            49:        a2 = a2/a;
        !            50: 
        !            51:        v_blend[0] = v_blend[1]*(1-a2) + r*a2;
        !            52:        v_blend[1] = v_blend[1]*(1-a2) + g*a2;
        !            53:        v_blend[2] = v_blend[2]*(1-a2) + b*a2;
        !            54: }
        !            55: 
        !            56: void R_RenderDlight (dlight_t *light)
        !            57: {
        !            58:        int             i, j;
        !            59:        float   a;
        !            60:        vec3_t  v;
        !            61:        float   rad;
        !            62: 
        !            63:        rad = light->radius * 0.35;
        !            64: 
        !            65:        VectorSubtract (light->origin, r_origin, v);
        !            66:        if (Length (v) < rad)
        !            67:        {       // view is inside the dlight
        !            68:                AddLightBlend (1, 0.5, 0, light->radius * 0.0003);
        !            69:                return;
        !            70:        }
        !            71: 
        !            72:        glBegin (GL_TRIANGLE_FAN);
        !            73:        glColor3f (0.2,0.1,0.0);
        !            74:        for (i=0 ; i<3 ; i++)
        !            75:                v[i] = light->origin[i] - vpn[i]*rad;
        !            76:        glVertex3fv (v);
        !            77:        glColor3f (0,0,0);
        !            78:        for (i=16 ; i>=0 ; i--)
        !            79:        {
        !            80:                a = i/16.0 * M_PI*2;
        !            81:                for (j=0 ; j<3 ; j++)
        !            82:                        v[j] = light->origin[j] + vright[j]*cos(a)*rad
        !            83:                                + vup[j]*sin(a)*rad;
        !            84:                glVertex3fv (v);
        !            85:        }
        !            86:        glEnd ();
        !            87: }
        !            88: 
        !            89: /*
        !            90: =============
        !            91: R_RenderDlights
        !            92: =============
        !            93: */
        !            94: void R_RenderDlights (void)
        !            95: {
        !            96:        int             i;
        !            97:        dlight_t        *l;
        !            98: 
        !            99:        if (!gl_flashblend.value)
        !           100:                return;
        !           101: 
        !           102:        r_dlightframecount = r_framecount + 1;  // because the count hasn't
        !           103:                                                                                        //  advanced yet for this frame
        !           104:        glDepthMask (0);
        !           105:        glDisable (GL_TEXTURE_2D);
        !           106:        glShadeModel (GL_SMOOTH);
        !           107:        glEnable (GL_BLEND);
        !           108:        glBlendFunc (GL_ONE, GL_ONE);
        !           109: 
        !           110:        l = cl_dlights;
        !           111:        for (i=0 ; i<MAX_DLIGHTS ; i++, l++)
        !           112:        {
        !           113:                if (l->die < cl.time || !l->radius)
        !           114:                        continue;
        !           115:                R_RenderDlight (l);
        !           116:        }
        !           117: 
        !           118:        glColor3f (1,1,1);
        !           119:        glDisable (GL_BLEND);
        !           120:        glEnable (GL_TEXTURE_2D);
        !           121:        glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        !           122:        glDepthMask (1);
        !           123: }
        !           124: 
        !           125: 
        !           126: /*
        !           127: =============================================================================
        !           128: 
        !           129: DYNAMIC LIGHTS
        !           130: 
        !           131: =============================================================================
        !           132: */
        !           133: 
        !           134: /*
        !           135: =============
        !           136: R_MarkLights
        !           137: =============
        !           138: */
        !           139: void R_MarkLights (dlight_t *light, int bit, mnode_t *node)
        !           140: {
        !           141:        mplane_t        *splitplane;
        !           142:        float           dist;
        !           143:        msurface_t      *surf;
        !           144:        int                     i;
        !           145:        
        !           146:        if (node->contents < 0)
        !           147:                return;
        !           148: 
        !           149:        splitplane = node->plane;
        !           150:        dist = DotProduct (light->origin, splitplane->normal) - splitplane->dist;
        !           151:        
        !           152:        if (dist > light->radius)
        !           153:        {
        !           154:                R_MarkLights (light, bit, node->children[0]);
        !           155:                return;
        !           156:        }
        !           157:        if (dist < -light->radius)
        !           158:        {
        !           159:                R_MarkLights (light, bit, node->children[1]);
        !           160:                return;
        !           161:        }
        !           162:                
        !           163: // mark the polygons
        !           164:        surf = cl.worldmodel->surfaces + node->firstsurface;
        !           165:        for (i=0 ; i<node->numsurfaces ; i++, surf++)
        !           166:        {
        !           167:                if (surf->dlightframe != r_dlightframecount)
        !           168:                {
        !           169:                        surf->dlightbits = 0;
        !           170:                        surf->dlightframe = r_dlightframecount;
        !           171:                }
        !           172:                surf->dlightbits |= bit;
        !           173:        }
        !           174: 
        !           175:        R_MarkLights (light, bit, node->children[0]);
        !           176:        R_MarkLights (light, bit, node->children[1]);
        !           177: }
        !           178: 
        !           179: 
        !           180: /*
        !           181: =============
        !           182: R_PushDlights
        !           183: =============
        !           184: */
        !           185: void R_PushDlights (void)
        !           186: {
        !           187:        int             i;
        !           188:        dlight_t        *l;
        !           189: 
        !           190:        if (gl_flashblend.value)
        !           191:                return;
        !           192: 
        !           193:        r_dlightframecount = r_framecount + 1;  // because the count hasn't
        !           194:                                                                                        //  advanced yet for this frame
        !           195:        l = cl_dlights;
        !           196: 
        !           197:        for (i=0 ; i<MAX_DLIGHTS ; i++, l++)
        !           198:        {
        !           199:                if (l->die < cl.time || !l->radius)
        !           200:                        continue;
        !           201:                R_MarkLights ( l, 1<<i, cl.worldmodel->nodes );
        !           202:        }
        !           203: }
        !           204: 
        !           205: 
        !           206: /*
        !           207: =============================================================================
        !           208: 
        !           209: LIGHT SAMPLING
        !           210: 
        !           211: =============================================================================
        !           212: */
        !           213: 
        !           214: mplane_t               *lightplane;
        !           215: vec3_t                 lightspot;
        !           216: 
        !           217: int RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end)
        !           218: {
        !           219:        int                     r;
        !           220:        float           front, back, frac;
        !           221:        int                     side;
        !           222:        mplane_t        *plane;
        !           223:        vec3_t          mid;
        !           224:        msurface_t      *surf;
        !           225:        int                     s, t, ds, dt;
        !           226:        int                     i;
        !           227:        mtexinfo_t      *tex;
        !           228:        byte            *lightmap;
        !           229:        unsigned        scale;
        !           230:        int                     maps;
        !           231: 
        !           232:        if (node->contents < 0)
        !           233:                return -1;              // didn't hit anything
        !           234:        
        !           235: // calculate mid point
        !           236: 
        !           237: // FIXME: optimize for axial
        !           238:        plane = node->plane;
        !           239:        front = DotProduct (start, plane->normal) - plane->dist;
        !           240:        back = DotProduct (end, plane->normal) - plane->dist;
        !           241:        side = front < 0;
        !           242:        
        !           243:        if ( (back < 0) == side)
        !           244:                return RecursiveLightPoint (node->children[side], start, end);
        !           245:        
        !           246:        frac = front / (front-back);
        !           247:        mid[0] = start[0] + (end[0] - start[0])*frac;
        !           248:        mid[1] = start[1] + (end[1] - start[1])*frac;
        !           249:        mid[2] = start[2] + (end[2] - start[2])*frac;
        !           250:        
        !           251: // go down front side  
        !           252:        r = RecursiveLightPoint (node->children[side], start, mid);
        !           253:        if (r >= 0)
        !           254:                return r;               // hit something
        !           255:                
        !           256:        if ( (back < 0) == side )
        !           257:                return -1;              // didn't hit anuthing
        !           258:                
        !           259: // check for impact on this node
        !           260:        VectorCopy (mid, lightspot);
        !           261:        lightplane = plane;
        !           262: 
        !           263:        surf = cl.worldmodel->surfaces + node->firstsurface;
        !           264:        for (i=0 ; i<node->numsurfaces ; i++, surf++)
        !           265:        {
        !           266:                if (surf->flags & SURF_DRAWTILED)
        !           267:                        continue;       // no lightmaps
        !           268: 
        !           269:                tex = surf->texinfo;
        !           270:                
        !           271:                s = DotProduct (mid, tex->vecs[0]) + tex->vecs[0][3];
        !           272:                t = DotProduct (mid, tex->vecs[1]) + tex->vecs[1][3];;
        !           273: 
        !           274:                if (s < surf->texturemins[0] ||
        !           275:                t < surf->texturemins[1])
        !           276:                        continue;
        !           277:                
        !           278:                ds = s - surf->texturemins[0];
        !           279:                dt = t - surf->texturemins[1];
        !           280:                
        !           281:                if ( ds > surf->extents[0] || dt > surf->extents[1] )
        !           282:                        continue;
        !           283: 
        !           284:                if (!surf->samples)
        !           285:                        return 0;
        !           286: 
        !           287:                ds >>= 4;
        !           288:                dt >>= 4;
        !           289: 
        !           290:                lightmap = surf->samples;
        !           291:                r = 0;
        !           292:                if (lightmap)
        !           293:                {
        !           294: 
        !           295:                        lightmap += dt * ((surf->extents[0]>>4)+1) + ds;
        !           296: 
        !           297:                        for (maps = 0 ; maps < MAXLIGHTMAPS && surf->styles[maps] != 255 ;
        !           298:                                        maps++)
        !           299:                        {
        !           300:                                scale = d_lightstylevalue[surf->styles[maps]];
        !           301:                                r += *lightmap * scale;
        !           302:                                lightmap += ((surf->extents[0]>>4)+1) *
        !           303:                                                ((surf->extents[1]>>4)+1);
        !           304:                        }
        !           305:                        
        !           306:                        r >>= 8;
        !           307:                }
        !           308:                
        !           309:                return r;
        !           310:        }
        !           311: 
        !           312: // go down back side
        !           313:        return RecursiveLightPoint (node->children[!side], mid, end);
        !           314: }
        !           315: 
        !           316: int R_LightPoint (vec3_t p)
        !           317: {
        !           318:        vec3_t          end;
        !           319:        int                     r;
        !           320:        
        !           321:        if (!cl.worldmodel->lightdata)
        !           322:                return 255;
        !           323:        
        !           324:        end[0] = p[0];
        !           325:        end[1] = p[1];
        !           326:        end[2] = p[2] - 2048;
        !           327:        
        !           328:        r = RecursiveLightPoint (cl.worldmodel->nodes, p, end);
        !           329:        
        !           330:        if (r == -1)
        !           331:                r = 0;
        !           332: 
        !           333:        return r;
        !           334: }
        !           335: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.