diff --git a/r_bsp.c b/r_bsp.c index 01229af4..d78efbcc 100644 --- a/r_bsp.c +++ b/r_bsp.c @@ -35,8 +35,8 @@ int r_currentbkey; typedef enum {touchessolid, drawnode, nodrawnode} solidstate_t; -#define MAX_BMODEL_VERTS 500 // 6K -#define MAX_BMODEL_EDGES 1000 // 12K +#define MAX_BMODEL_VERTS 1000 // 12K +#define MAX_BMODEL_EDGES 2000 // 24K static mvertex_t *pbverts; static bedge_t *pbedges; @@ -421,7 +421,7 @@ void R_RecursiveClipBPoly (bedge_t *pedges, mnode_t *pnode, msurface_t *psurf) // FIXME: share the clip edge by having a winding direction flag? if (numbedges >= (MAX_BMODEL_EDGES - 1)) { - gEngfuncs.Con_Printf ("Out of edges for bmodel\n"); + //gEngfuncs.Con_Printf ("Out of edges for bmodel\n"); return; } @@ -465,7 +465,7 @@ void R_RecursiveClipBPoly (bedge_t *pedges, mnode_t *pnode, msurface_t *psurf) { if (numbedges >= (MAX_BMODEL_EDGES - 2)) { - gEngfuncs.Con_Printf ("Out of edges for bmodel\n"); + //gEngfuncs.Con_Printf ("Out of edges for bmodel\n"); return; } diff --git a/r_edge.c b/r_edge.c index e48495ca..97cc7985 100644 --- a/r_edge.c +++ b/r_edge.c @@ -821,8 +821,17 @@ void D_CalcGradients (msurface_t *pface) mipscale = 1.0 / (float)(1 << miplevel); + + if( pface->texinfo->flags & TEX_WORLD_LUXELS ) + { + TransformVector (pface->texinfo->vecs[0], p_saxis); + TransformVector (pface->texinfo->vecs[1], p_taxis); + } + else + { TransformVector (pface->info->lmvecs[0], p_saxis); TransformVector (pface->info->lmvecs[1], p_taxis); + } t = xscaleinv * mipscale; d_sdivzstepu = p_saxis[0] * t; @@ -840,12 +849,24 @@ void D_CalcGradients (msurface_t *pface) VectorScale (transformed_modelorg, mipscale, p_temp1); t = 0x10000*mipscale; + if( pface->texinfo->flags & TEX_WORLD_LUXELS ) + { + sadjust = ((fixed16_t)(DotProduct (p_temp1, p_saxis) * 0x10000 + 0.5)) - + ((pface->texturemins[0] << 16) >> miplevel) + + pface->texinfo->vecs[0][3]*t; + tadjust = ((fixed16_t)(DotProduct (p_temp1, p_taxis) * 0x10000 + 0.5)) - + ((pface->texturemins[1] << 16) >> miplevel) + + pface->texinfo->vecs[1][3]*t; + } + else + { sadjust = ((fixed16_t)(DotProduct (p_temp1, p_saxis) * 0x10000 + 0.5)) - ((pface->info->lightmapmins[0] << 16) >> miplevel) + pface->info->lmvecs[0][3]*t; tadjust = ((fixed16_t)(DotProduct (p_temp1, p_taxis) * 0x10000 + 0.5)) - ((pface->info->lightmapmins[1] << 16) >> miplevel) + pface->info->lmvecs[1][3]*t; + } // PGM - changing flow speed for non-warping textures. if (pface->flags & SURF_CONVEYOR) { @@ -859,6 +880,12 @@ void D_CalcGradients (msurface_t *pface) else bbextents = ((pface->info->lightextents[0] << 16) >> miplevel) - 1; bbextentt = ((pface->info->lightextents[1] << 16) >> miplevel) - 1; + + if( pface->texinfo->flags & TEX_WORLD_LUXELS ) + { + bbextents = ((pface->extents[0] << 16) >> miplevel) - 1; + bbextentt = ((pface->extents[1] << 16) >> miplevel) - 1; + } } @@ -1139,8 +1166,6 @@ void D_SolidSurf (surf_t *s) if( !pface ) return; #if 1 - - if( pface->flags & SURF_CONVEYOR ) miplevel = 1; else diff --git a/r_surf.c b/r_surf.c index 4a95293a..23e5efa0 100644 --- a/r_surf.c +++ b/r_surf.c @@ -20,6 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // r_surf.c: surface-related refresh code #include "r_local.h" +#include "mod_local.h" drawsurf_t r_drawsurf; @@ -41,6 +42,9 @@ void R_DrawSurfaceBlock8_mip1 (void); void R_DrawSurfaceBlock8_mip2 (void); void R_DrawSurfaceBlock8_mip3 (void); void R_DrawSurfaceBlock8_Generic (void); +void R_DrawSurfaceBlock8_World (void); + +static float worldlux_s, worldlux_t; static void (*surfmiptable[4])(void) = { R_DrawSurfaceBlock8_mip0, @@ -93,8 +97,8 @@ void R_AddDynamicLights( msurface_t *surf ) { if( surf->texinfo->faceinfo ) sample_frac = surf->texinfo->faceinfo->texture_step; - //else if( FBitSet( surf->texinfo->flags, TEX_EXTRA_LIGHTMAP )) - // sample_frac = LM_SAMPLE_EXTRASIZE; + else if( FBitSet( surf->texinfo->flags, TEX_EXTRA_LIGHTMAP )) + sample_frac = LM_SAMPLE_EXTRASIZE; else sample_frac = LM_SAMPLE_SIZE; } @@ -504,7 +508,6 @@ void R_DrawSurface (void) else sample_pot = 1 << sample_bits; } - mt = r_drawsurf.image; r_source = mt->pixels[r_drawsurf.surfmip]; @@ -526,6 +529,7 @@ void R_DrawSurface (void) r_numhblocks = r_drawsurf.surfwidth >> blockdivshift; r_numvblocks = r_drawsurf.surfheight >> blockdivshift; + //============================== if( sample_size == 16 ) @@ -544,8 +548,46 @@ void R_DrawSurface (void) r_sourcemax = r_source + (tmax * smax); - //soffset = r_drawsurf.surf->texturemins[0]; - //basetoffset = r_drawsurf.surf->texturemins[1]; + // glitchy and slow way to draw some lightmap + if( r_drawsurf.surf->texinfo->flags & TEX_WORLD_LUXELS ) + { + worldlux_s = r_drawsurf.surf->extents[0] / r_drawsurf.surf->info->lightextents[0]; + worldlux_t = r_drawsurf.surf->extents[1] / r_drawsurf.surf->info->lightextents[1]; + if( worldlux_s == 0 ) + worldlux_s = 1; + if( worldlux_t == 0 ) + worldlux_t = 1; + + soffset = r_drawsurf.surf->texturemins[0]; + basetoffset = r_drawsurf.surf->texturemins[1]; + //soffset = r_drawsurf.surf->info->lightmapmins[0] * worldlux_s; + //basetoffset = r_drawsurf.surf->info->lightmapmins[1] * worldlux_t; + // << 16 components are to guarantee positive values for % + soffset = ((soffset >> r_drawsurf.surfmip) + (smax << 16)) % smax; + basetptr = &r_source[((((basetoffset >> r_drawsurf.surfmip) + + (tmax << 16)) % tmax) * twidth)]; + + pcolumndest = r_drawsurf.surfdat; + + for (u=0 ; u= smax) + soffset = 0; + + pcolumndest += horzblockstep; + } + return; + } + soffset = r_drawsurf.surf->info->lightmapmins[0]; basetoffset = r_drawsurf.surf->info->lightmapmins[1]; @@ -566,7 +608,7 @@ void R_DrawSurface (void) (*pblockdrawer)(); - soffset = soffset + blocksize; + soffset = soffset + horzblockstep; if (soffset >= smax) soffset = 0; @@ -582,6 +624,63 @@ void R_DrawSurface (void) #if !id386 #define BLEND_LM(pix, light) vid.colormap[(pix >> 3) | ((light & 0x1f00) << 5)] | pix & 7; +/* +================ +R_DrawSurfaceBlock8_World + +Does not draw lightmap correclty, but scale it correctly. Better than nothing +================ +*/ +void R_DrawSurfaceBlock8_World (void) +{ + int v, i, b; + uint lightstep, lighttemp, light; + pixel_t pix, *psource, *prowdest; + int lightpos = 0; + + psource = pbasesource; + prowdest = prowdestbase; + + for (v=0 ; v> (4-r_drawsurf.surfmip); + lightrightstep =(r_lightptr[(lightpos/r_lightwidth) * r_lightwidth+1] - lightright) >> (4-r_drawsurf.surfmip); + + for (i=0 ; i> (4-r_drawsurf.surfmip); + + light = lightright; + + for (b=blocksize-1; b>=0; b--) + { + //pix = psource[(uint)(b * worldlux_s)]; + pix = psource[b]; + prowdest[b] = BLEND_LM(pix, light); + if( pix == TRANSPARENT_COLOR ) + prowdest[b] = TRANSPARENT_COLOR; + //((unsigned char *)vid.colormap) + //[(light & 0xFF00) + pix]; + light += lightstep; + } + + psource += sourcetstep; + lightright += lightrightstep; + lightleft += lightleftstep; + prowdest += surfrowbytes; + } + + if (psource >= r_sourcemax) + psource -= r_stepback; + } +} + /* ================ @@ -1208,7 +1307,11 @@ surfcache_t *D_CacheSurface (msurface_t *surface, int miplevel) // r_drawsurf.image = R_GetTexture(R_TextureAnimation (surface)->gl_texturenum); - if( surface->flags & SURF_CONVEYOR ) + // does not support conveyors with world luxels now + if( surface->texinfo->flags & TEX_WORLD_LUXELS ) + surface->flags &= ~SURF_CONVEYOR; + + if( surface->flags & SURF_CONVEYOR) { if( miplevel >= 1) { @@ -1271,7 +1374,14 @@ surfcache_t *D_CacheSurface (msurface_t *surface, int miplevel) r_drawsurf.surfwidth = surface->info->lightextents[0] >> miplevel; r_drawsurf.rowbytes = r_drawsurf.surfwidth; r_drawsurf.surfheight = surface->info->lightextents[1] >> miplevel; - //surface->extents[1] >> miplevel; + + // use texture space if world luxels used + if( surface->texinfo->flags & TEX_WORLD_LUXELS ) + { + r_drawsurf.surfwidth = surface->extents[0] >> miplevel; + r_drawsurf.rowbytes = r_drawsurf.surfwidth; + r_drawsurf.surfheight = surface->extents[1] >> miplevel; + } //