mirror of
https://github.com/YGGverse/xash3d-fwgs.git
synced 2025-01-29 16:24:16 +00:00
ref_soft: Decals support
This commit is contained in:
parent
6eae7acd34
commit
1871f39b2b
31
r_context.c
31
r_context.c
@ -387,27 +387,6 @@ qboolean VID_CubemapShot(const char *base, uint size, const float *vieworg, qboo
|
||||
// cubemaps? in my softrender???
|
||||
}
|
||||
|
||||
void R_DecalShoot(int textureIndex, int entityIndex, int modelIndex, vec3_t pos, int flags, float scale)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void R_DecalRemoveAll(int texture)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int R_CreateDecalList(decallist_t *pList)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void R_ClearAllDecals()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
void R_InitSkyClouds(mip_t *mt, texture_t *tx, qboolean custom_palette)
|
||||
{
|
||||
|
||||
@ -448,16 +427,6 @@ void DrawSingleDecal(decal_t *pDecal, msurface_t *fa)
|
||||
|
||||
}
|
||||
|
||||
float *R_DecalSetupVerts(decal_t *pDecal, msurface_t *surf, int texture, int *outCount)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void R_EntityRemoveDecals(model_t *mod)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void GL_SelectTexture(int texture)
|
||||
{
|
||||
|
||||
|
1296
r_decals.c
Normal file
1296
r_decals.c
Normal file
File diff suppressed because it is too large
Load Diff
10
r_local.h
10
r_local.h
@ -406,18 +406,18 @@ int R_CullModel( cl_entity_t *e, const vec3_t absmin, const vec3_t absmax );
|
||||
qboolean R_CullBox( const vec3_t mins, const vec3_t maxs );
|
||||
qboolean R_CullSphere( const vec3_t centre, const float radius );
|
||||
//int R_CullSurface( msurface_t *surf, gl_frustum_t *frustum, uint clipflags );
|
||||
|
||||
#endif
|
||||
//
|
||||
// gl_decals.c
|
||||
//
|
||||
void DrawSurfaceDecals( msurface_t *fa, qboolean single, qboolean reverse );
|
||||
float *R_DecalSetupVerts( decal_t *pDecal, msurface_t *surf, int texture, int *outCount );
|
||||
void DrawSingleDecal( decal_t *pDecal, msurface_t *fa );
|
||||
//void DrawSingleDecal( decal_t *pDecal, msurface_t *fa );
|
||||
void R_EntityRemoveDecals( model_t *mod );
|
||||
void DrawDecalsBatch( void );
|
||||
//void DrawDecalsBatch( void );
|
||||
void R_ClearDecals( void );
|
||||
|
||||
|
||||
#if 0
|
||||
|
||||
//
|
||||
// gl_drawhulls.c
|
||||
@ -1223,6 +1223,8 @@ extern cvar_t *sw_stipplealpha;
|
||||
extern cvar_t *sw_surfcacheoverride;
|
||||
extern cvar_t *sw_waterwarp;
|
||||
extern cvar_t *sw_texfilt;
|
||||
extern cvar_t *r_decals;
|
||||
|
||||
|
||||
extern vec3_t modelorg;
|
||||
extern vec3_t r_origin;
|
||||
|
4
r_main.c
4
r_main.c
@ -104,6 +104,8 @@ cvar_t *vid_gamma;
|
||||
cvar_t *sw_lockpvs;
|
||||
//PGM
|
||||
|
||||
cvar_t *r_decals;
|
||||
|
||||
|
||||
mleaf_t *r_viewleaf;
|
||||
int r_viewcluster, r_oldviewcluster;
|
||||
@ -1925,7 +1927,7 @@ qboolean R_Init()
|
||||
sw_texfilt = gEngfuncs.Cvar_Get ("sw_texfilt", "0", 0, "texture dither");
|
||||
//r_lefthand = ri.Cvar_Get( "hand", "0", FCVAR_USERINFO | FCVAR_ARCHIVE );
|
||||
// r_speeds = ri.Cvar_Get ("r_speeds", "0", 0);
|
||||
|
||||
r_decals = gEngfuncs.pfnGetCvarPointer( "r_decals", 0 );
|
||||
//r_drawworld = ri.Cvar_Get ("r_drawworld", "1", 0);
|
||||
//r_dspeeds = ri.Cvar_Get ("r_dspeeds", "0", 0);
|
||||
// r_lightlevel = ri.Cvar_Get ("r_lightlevel", "0", 0);
|
||||
|
128
r_surf.c
128
r_surf.c
@ -147,9 +147,9 @@ void R_AddDynamicLights( msurface_t *surf )
|
||||
|
||||
if( dist < minlight )
|
||||
{
|
||||
printf("dlight %f\n", dist);
|
||||
//printf("dlight %f\n", dist);
|
||||
//*(void**)0 = 0;
|
||||
bl[0] += ((int)((rad - dist) * 256) * 7.5) / 256;
|
||||
bl[0] += ((int)((rad - dist) * 256) * 7.5);
|
||||
//bl[1] += ((int)((rad - dist) * 256) * 2.5) / 256;
|
||||
//bl[2] += ((int)((rad - dist) * 256) * 2.5) / 256;
|
||||
}
|
||||
@ -237,7 +237,7 @@ static void R_BuildLightMap( )
|
||||
t = 0;
|
||||
if( t > 65535 * 3 )
|
||||
t = 65535 * 3;
|
||||
t = t * 31 / 65535 / 3;//(255*256 - t) >> (8 - VID_CBITS);
|
||||
t = t / 2048 / 3;//(255*256 - t) >> (8 - VID_CBITS);
|
||||
|
||||
//if (t < (1 << 6))
|
||||
//t = (1 << 6);
|
||||
@ -961,6 +961,127 @@ int D_log2 (int num)
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
void R_DecalComputeBasis( msurface_t *surf, int flags, vec3_t textureSpaceBasis[3] );
|
||||
void R_DrawSurfaceDecals()
|
||||
{
|
||||
msurface_t *fa = r_drawsurf.surf;
|
||||
decal_t *p;
|
||||
|
||||
for( p = fa->pdecals; p; p = p->pnext)
|
||||
{
|
||||
pixel_t *dest, *source;
|
||||
vec4_t textureU, textureV;
|
||||
image_t *tex = R_GetTexture( p->texture );
|
||||
int s1 = 0,t1 = 0, s2 = tex->width, t2 = tex->height;
|
||||
unsigned int height;
|
||||
unsigned int f, fstep;
|
||||
int skip;
|
||||
pixel_t *buffer;
|
||||
qboolean transparent;
|
||||
int x, y, u,v, sv, w, h;
|
||||
vec3_t basis[3];
|
||||
|
||||
Vector4Copy( fa->texinfo->vecs[0], textureU );
|
||||
Vector4Copy( fa->texinfo->vecs[1], textureV );
|
||||
|
||||
R_DecalComputeBasis( fa, 0, basis );
|
||||
|
||||
w = fabs( tex->width * DotProduct( textureU, basis[0] )) +
|
||||
fabs( tex->height * DotProduct( textureU, basis[1] ));
|
||||
h = fabs( tex->width * DotProduct( textureV, basis[0] )) +
|
||||
fabs( tex->height * DotProduct( textureV, basis[1] ));
|
||||
|
||||
// project decal center into the texture space of the surface
|
||||
x = DotProduct( p->position, textureU ) + textureU[3] - fa->texturemins[0] - w/2;
|
||||
y = DotProduct( p->position, textureV ) + textureV[3] - fa->texturemins[1] - h/2;
|
||||
|
||||
x = x >> r_drawsurf.surfmip;
|
||||
y = y >> r_drawsurf.surfmip;
|
||||
w = w >> r_drawsurf.surfmip;
|
||||
h = h >> r_drawsurf.surfmip;
|
||||
|
||||
if( x < 0 )
|
||||
{
|
||||
s1 += (-x)*(s2-s1) / w;
|
||||
x = 0;
|
||||
}
|
||||
if( x + w > r_drawsurf.surfwidth )
|
||||
{
|
||||
s2 -= (x + w - r_drawsurf.surfwidth) * (s2 - s1)/ w ;
|
||||
w = r_drawsurf.surfwidth - x;
|
||||
}
|
||||
if( y + h > r_drawsurf.surfheight )
|
||||
{
|
||||
t2 -= (y + h - r_drawsurf.surfheight) * (t2 - t1) / h;
|
||||
h = r_drawsurf.surfheight - y;
|
||||
}
|
||||
|
||||
if( !tex->pixels[0] || s1 >= s2 || t1 >= t2 )
|
||||
continue;
|
||||
|
||||
if( tex->alpha_pixels )
|
||||
{
|
||||
buffer = tex->alpha_pixels;
|
||||
transparent = true;
|
||||
}
|
||||
else
|
||||
buffer = tex->pixels[0];
|
||||
|
||||
height = h;
|
||||
if (y < 0)
|
||||
{
|
||||
skip = -y;
|
||||
height += y;
|
||||
y = 0;
|
||||
}
|
||||
else
|
||||
skip = 0;
|
||||
|
||||
dest = ((pixel_t*)r_drawsurf.surfdat) + y * r_drawsurf.rowbytes + x;
|
||||
|
||||
for (v=0 ; v<height ; v++)
|
||||
{
|
||||
//int alpha1 = vid.alpha;
|
||||
sv = (skip + v)*(t2-t1)/h + t1;
|
||||
source = buffer + sv*tex->width + s1;
|
||||
|
||||
{
|
||||
f = 0;
|
||||
fstep = s2*0x10000/w;
|
||||
if( w == s2 - s1 )
|
||||
fstep = 0x10000;
|
||||
|
||||
for (u=0 ; u<w ; u++)
|
||||
{
|
||||
pixel_t src = source[f>>16];
|
||||
int alpha = 7;
|
||||
f += fstep;
|
||||
|
||||
if( transparent )
|
||||
{
|
||||
alpha &= src >> 16 - 3;
|
||||
src = src << 3;
|
||||
}
|
||||
|
||||
if( alpha <= 0 )
|
||||
continue;
|
||||
|
||||
if( alpha < 7) // && (vid.rendermode == kRenderTransAlpha || vid.rendermode == kRenderTransTexture ) )
|
||||
{
|
||||
pixel_t screen = dest[u]; // | 0xff & screen & src ;
|
||||
dest[u] = vid.alphamap[( alpha << 16)|(src & 0xff00)|(screen>>8)] << 8 | (screen & 0xff) | ((src & 0xff) >> 3);
|
||||
|
||||
}
|
||||
else
|
||||
dest[u] = src;
|
||||
|
||||
}
|
||||
}
|
||||
dest += r_drawsurf.rowbytes;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
@ -1054,6 +1175,7 @@ surfcache_t *D_CacheSurface (msurface_t *surface, int miplevel)
|
||||
|
||||
// rasterize the surface into the cache
|
||||
R_DrawSurface ();
|
||||
R_DrawSurfaceDecals();
|
||||
|
||||
return cache;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user