18 Nov 2008
This commit is contained in:
parent
4ae70b2e3e
commit
c18b394fb6
3647
baserc/server.h
3647
baserc/server.h
File diff suppressed because it is too large
Load Diff
|
@ -32,7 +32,7 @@ infoParm_t infoParms[] =
|
|||
{"trigger", SURF_NODRAW, CONTENTS_TRIGGER, 1}, // trigger volume
|
||||
|
||||
// utility relevant attributes
|
||||
{"origin", SURF_NONE, CONTENTS_ORIGIN, 1}, // center of rotating brushes
|
||||
{"origin", SURF_NODRAW, CONTENTS_ORIGIN, 1}, // center of rotating brushes
|
||||
{"nolightmap", SURF_NOLIGHTMAP, CONTENTS_NONE, 0}, // don't generate a lightmap
|
||||
{"translucent", SURF_NONE, CONTENTS_TRANSLUCENT, 0}, // don't eat contained surfaces
|
||||
{"detail", SURF_NONE, CONTENTS_DETAIL, 0}, // don't include in structural bsp
|
||||
|
|
|
@ -238,17 +238,6 @@ void _MSG_WriteBits( sizebuf_t *msg, int value, const char *name, int net_type,
|
|||
union { long l; float f; } dat;
|
||||
byte *buf;
|
||||
|
||||
if((NWDesc[net_type].min_range + NWDesc[net_type].max_range) != 0 )
|
||||
{
|
||||
// check range first
|
||||
if( value < NWDesc[net_type].min_range || value > NWDesc[net_type].max_range )
|
||||
{
|
||||
MsgDev( D_INFO, "MSG_Write%s: ", NWDesc[net_type].name );
|
||||
if( name ) MsgDev( D_INFO, "variable '%s' ", name );
|
||||
MsgDev( D_INFO, "range error %i should be in range (%i", value, NWDesc[net_type].min_range );
|
||||
MsgDev( D_INFO, " %i)(called at %s:%i)\n", NWDesc[net_type].max_range, filename, fileline );
|
||||
}
|
||||
}
|
||||
// this isn't an exact overflow check, but close enough
|
||||
if( msg->maxsize - msg->cursize < 4 )
|
||||
{
|
||||
|
@ -267,7 +256,7 @@ void _MSG_WriteBits( sizebuf_t *msg, int value, const char *name, int net_type,
|
|||
break;
|
||||
case NET_COLOR:
|
||||
dat.l = value;
|
||||
value = dat.f * 255;
|
||||
value = bound( 0, dat.f, 255 );
|
||||
buf = MSG_GetSpace( msg, 1 );
|
||||
buf[0] = value;
|
||||
break;
|
||||
|
@ -300,6 +289,18 @@ void _MSG_WriteBits( sizebuf_t *msg, int value, const char *name, int net_type,
|
|||
Host_Error( "MSG_WriteBits: bad net.type (called at %s:%i)\n", filename, fileline );
|
||||
break;
|
||||
}
|
||||
|
||||
if((NWDesc[net_type].min_range + NWDesc[net_type].max_range) != 0 )
|
||||
{
|
||||
// check range
|
||||
if( value < NWDesc[net_type].min_range || value > NWDesc[net_type].max_range )
|
||||
{
|
||||
MsgDev( D_INFO, "MSG_Write%s: ", NWDesc[net_type].name );
|
||||
if( name ) MsgDev( D_INFO, "variable '%s' ", name );
|
||||
MsgDev( D_INFO, "range error %i should be in range (%i", value, NWDesc[net_type].min_range );
|
||||
MsgDev( D_INFO, " %i)(called at %s:%i)\n", NWDesc[net_type].max_range, filename, fileline );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -324,7 +325,7 @@ long _MSG_ReadBits( sizebuf_t *msg, int net_type, const char *filename, const in
|
|||
break;
|
||||
case NET_COLOR:
|
||||
value = (byte)(msg->data[msg->readcount]);
|
||||
dat.f = value / 255.0f;
|
||||
dat.f = value;
|
||||
value = dat.l;
|
||||
msg->readcount += 1;
|
||||
break;
|
||||
|
|
|
@ -94,12 +94,12 @@ static const net_desc_t NWDesc[] =
|
|||
{ NET_BYTE, "Byte", 0, 255 },
|
||||
{ NET_SHORT, "Short", -32767, 32767 },
|
||||
{ NET_WORD, "Word", 0, 65535 },
|
||||
{ NET_LONG, "Long", 0, 0 },
|
||||
{ NET_FLOAT, "Float", 0, 0 },
|
||||
{ NET_LONG, "Long", 0, 0 }, // can't overflow
|
||||
{ NET_FLOAT, "Float", 0, 0 }, // can't overflow
|
||||
{ NET_ANGLE, "Angle", -360, 360 },
|
||||
{ NET_SCALE, "Scale", 0, 0 },
|
||||
{ NET_SCALE, "Scale", 0, 255 },
|
||||
{ NET_COORD, "Coord", -262140, 262140 },
|
||||
{ NET_COLOR, "Color", 0, 0 },
|
||||
{ NET_COLOR, "Color", 0, 255 },
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -98,6 +98,7 @@ struct sv_entvars_s
|
|||
float style;
|
||||
float gaitsequence;
|
||||
float effects;
|
||||
float rendermode;
|
||||
float renderfx;
|
||||
float renderamt;
|
||||
float colormap;
|
||||
|
@ -143,6 +144,6 @@ struct sv_entvars_s
|
|||
float team;
|
||||
};
|
||||
|
||||
#define PROG_CRC_SERVER 9691
|
||||
#define PROG_CRC_SERVER 8066
|
||||
|
||||
#endif//SV_EDICT_H
|
|
@ -63,6 +63,7 @@ void SV_UpdateEntityState( edict_t *ent )
|
|||
ent->priv.sv->s.model.sequence = (byte)ent->progs.sv->sequence; // studio model sequence
|
||||
ent->priv.sv->s.effects = (uint)ent->progs.sv->effects; // shared client and render flags
|
||||
ent->priv.sv->s.renderfx = (int)ent->progs.sv->renderfx; // renderer flags
|
||||
ent->priv.sv->s.rendermode = ent->progs.sv->rendermode; // rendering mode
|
||||
ent->priv.sv->s.renderamt = ent->progs.sv->renderamt; // alpha value
|
||||
ent->priv.sv->s.model.framerate = ent->progs.sv->framerate;
|
||||
ent->priv.sv->s.model.animtime = (int)(1000.0 * ent->progs.sv->animtime) * 0.001; // sequence time
|
||||
|
|
|
@ -788,7 +788,7 @@ static bool PS_ReadName( script_t *script, scFlags_t flags, token_t *token )
|
|||
{
|
||||
if((c < 'a' || c > 'z') && (c < 'A' || c > 'Z') && (c < '0' || c > '9')
|
||||
&& c != '_' && c != '/' && c != '\\' && c != ':' && c != '.' && c != '+'
|
||||
&& c != '-' && c != '{' && c != '!' && c != '$' ) break;
|
||||
&& c != '-' && c != '{' && c != '!' && c != '$' && c != '&' ) break;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -271,6 +271,7 @@ bool CM_HeadnodeVisible( int nodenum, byte *visbits )
|
|||
{
|
||||
leafnum = -1-nodenum;
|
||||
cluster = CM_LeafCluster( leafnum );
|
||||
//cluster = cm.leafs[leafnum].cluster;
|
||||
if( cluster == -1 ) return false;
|
||||
if( visbits[cluster>>3] & (1<<(cluster&7)))
|
||||
return true;
|
||||
|
|
|
@ -121,6 +121,17 @@ typedef enum
|
|||
SURF_GLOW = BIT(14),// sprites glow
|
||||
} surfaceType_t;
|
||||
|
||||
// rendering constants
|
||||
enum
|
||||
{
|
||||
kRenderNormal, // src
|
||||
kRenderTransColor, // c*a+dest*(1-a)
|
||||
kRenderTransTexture, // src*a+dest*(1-a)
|
||||
kRenderGlow, // src*a+dest -- no Z buffer checks
|
||||
kRenderTransAlpha, // src*srca+dest*(1-srca)
|
||||
kRenderTransAdd, // src*a+dest
|
||||
} kRenderMode_t;
|
||||
|
||||
// engine physics constants
|
||||
#define COLLISION_SNAPSCALE (32.0f)
|
||||
#define COLLISION_SNAP (1.0f / COLLISION_SNAPSCALE)
|
||||
|
|
|
@ -67,5 +67,5 @@ if exist vsound\vsound.plg del /f /q vsound\vsound.plg
|
|||
echo Build succeeded!
|
||||
echo Please wait. Xash is now loading
|
||||
cd D:\Xash3D\
|
||||
quake.exe -game tmpQuArK -dev 3 -log +map qctest
|
||||
quake.exe -game tmpQuArK -dev 3 -log +map dm_qstyle
|
||||
:done
|
|
@ -738,7 +738,7 @@ static void RB_CalcVertexColors( shaderStage_t *stage )
|
|||
{
|
||||
f = DotProduct(vec, ref.normalArray[i] );
|
||||
if( f < 0 ) f = -f;
|
||||
ref.colorArray[i][3] = 1.0f * bound( alphaGen->params[0], 1.0 - f, alphaGen->params[1]);
|
||||
ref.colorArray[i][3] = bound( alphaGen->params[0], 1.0 - f, alphaGen->params[1]);
|
||||
}
|
||||
break;
|
||||
case ALPHAGEN_FADE:
|
||||
|
@ -749,7 +749,7 @@ static void RB_CalcVertexColors( shaderStage_t *stage )
|
|||
|
||||
f = bound( alphaGen->params[0], f, alphaGen->params[1] ) - alphaGen->params[0];
|
||||
f = f * alphaGen->params[2];
|
||||
ref.colorArray[i][3] = 1.0f * bound( 0.0, f, 1.0 );
|
||||
ref.colorArray[i][3] = bound( 0.0, f, 1.0 );
|
||||
}
|
||||
break;
|
||||
case ALPHAGEN_ONEMINUSFADE:
|
||||
|
@ -760,7 +760,7 @@ static void RB_CalcVertexColors( shaderStage_t *stage )
|
|||
|
||||
f = bound( alphaGen->params[0], f, alphaGen->params[1] ) - alphaGen->params[0];
|
||||
f = f * alphaGen->params[2];
|
||||
ref.colorArray[i][3] = 1.0f * bound( 0.0, 1.0 - f, 1.0 );
|
||||
ref.colorArray[i][3] = bound( 0.0, 1.0 - f, 1.0 );
|
||||
}
|
||||
break;
|
||||
case ALPHAGEN_LIGHTINGSPECULAR:
|
||||
|
@ -1669,6 +1669,10 @@ void RB_RenderMeshes( mesh_t *meshes, int numMeshes )
|
|||
case mod_brush:
|
||||
R_RotateForEntity( entity );
|
||||
break;
|
||||
case mod_studio:
|
||||
case mod_sprite:
|
||||
GL_LoadMatrix( r_worldMatrix );
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
|
179
render/r_image.c
179
render/r_image.c
|
@ -1715,6 +1715,179 @@ static rgbdata_t *R_ParseMakeGlow( script_t *script, int *samples, texFlags_t *f
|
|||
return R_MakeGlow( pic );
|
||||
}
|
||||
|
||||
static rgbdata_t *R_ParseStudioSkin( script_t *script, int *samples, texFlags_t *flags )
|
||||
{
|
||||
token_t token;
|
||||
rgbdata_t *pic;
|
||||
string model_path;
|
||||
string modelT_path;
|
||||
string skinname;
|
||||
dstudiohdr_t hdr;
|
||||
file_t *f;
|
||||
|
||||
Com_ReadToken( script, 0, &token );
|
||||
if( com.stricmp( token.string, "(" ))
|
||||
{
|
||||
MsgDev( D_WARN, "expected '(', found '%s' instead for 'Studio'\n", token.string );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if( !Com_ReadToken( script, SC_ALLOW_PATHNAMES2, &token ))
|
||||
{
|
||||
MsgDev( D_WARN, "missing parameters for 'Studio'\n" );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// NOTE: studio skin show as 'models/props/flame1.mdl/flame2a.bmp'
|
||||
FS_ExtractFilePath( token.string, model_path );
|
||||
FS_StripExtension( model_path );
|
||||
com.snprintf( modelT_path, MAX_STRING, "%sT.mdl", model_path );
|
||||
FS_DefaultExtension( model_path, ".mdl" );
|
||||
FS_FileBase( token.string, skinname );
|
||||
FS_DefaultExtension( skinname, ".bmp" );
|
||||
|
||||
f = FS_Open( model_path, "rb" );
|
||||
if( !f )
|
||||
{
|
||||
MsgDev( D_WARN, "'Studio' can't find studiomodel %s\n", model_path );
|
||||
return NULL;
|
||||
}
|
||||
if( FS_Read( f, &hdr, sizeof( hdr )) != sizeof( hdr ))
|
||||
{
|
||||
MsgDev( D_WARN, "'Studio' %s probably corrupted\n", model_path );
|
||||
FS_Close( f );
|
||||
return NULL;
|
||||
}
|
||||
SwapBlock( (int *)&hdr, sizeof( hdr ));
|
||||
|
||||
if( hdr.numtextures == 0 )
|
||||
{
|
||||
// textures are keep seperate
|
||||
FS_Close( f );
|
||||
f = FS_Open( modelT_path, "rb" );
|
||||
if( !f )
|
||||
{
|
||||
MsgDev( D_WARN, "'Studio' can't find studiotextures %s\n", modelT_path );
|
||||
return NULL;
|
||||
}
|
||||
if( FS_Read( f, &hdr, sizeof( hdr )) != sizeof( hdr ))
|
||||
{
|
||||
MsgDev( D_WARN, "'Studio' %s probably corrupted\n", modelT_path );
|
||||
FS_Close( f );
|
||||
return NULL;
|
||||
}
|
||||
SwapBlock( (int *)&hdr, sizeof( hdr ));
|
||||
}
|
||||
|
||||
if( hdr.textureindex > 0 && hdr.numtextures <= MAXSTUDIOSKINS )
|
||||
{
|
||||
// all ok, can load model into memory
|
||||
dstudiotexture_t *ptexture, *tex;
|
||||
size_t mdl_size, tex_size;
|
||||
rgbdata_t *pal;
|
||||
byte *pin;
|
||||
int i;
|
||||
|
||||
FS_Seek( f, 0, SEEK_END );
|
||||
mdl_size = FS_Tell( f );
|
||||
FS_Seek( f, 0, SEEK_SET );
|
||||
|
||||
pin = Mem_Alloc( r_imagepool, mdl_size );
|
||||
if( FS_Read( f, pin, mdl_size ) != mdl_size )
|
||||
{
|
||||
MsgDev( D_WARN, "'Studio' %s probably corrupted\n", model_path );
|
||||
Mem_Free( pin );
|
||||
FS_Close( f );
|
||||
return NULL;
|
||||
}
|
||||
ptexture = (dstudiotexture_t *)(pin + hdr.textureindex);
|
||||
|
||||
// find specified texture
|
||||
for( i = 0; i < hdr.numtextures; i++ )
|
||||
{
|
||||
if( !com.stricmp( ptexture[i].name, skinname ))
|
||||
break; // found
|
||||
}
|
||||
if( i == hdr.numtextures )
|
||||
{
|
||||
MsgDev( D_WARN, "'Studio' %s doesn't have skin %s\n", model_path, skinname );
|
||||
Mem_Free( pin );
|
||||
FS_Close( f );
|
||||
return NULL;
|
||||
}
|
||||
tex = ptexture + i;
|
||||
|
||||
// setup palette
|
||||
if( tex->flags & STUDIO_NF_TRANSPARENT )
|
||||
pal = FS_LoadImage( "#transparent.pal", pin + tex->index + (tex->width * tex->height), 768 );
|
||||
else pal = FS_LoadImage( "#normal.pal", pin + tex->width * tex->height + tex->index, 768 );
|
||||
FS_FreeImage( pal ); // external copy not needed
|
||||
|
||||
// NOTE: replace index with pointer to start of imagebuffer, ImageLib expected it
|
||||
tex->index = (int)pin + tex->index;
|
||||
tex_size = sizeof( dstudiotexture_t ) + tex->width * tex->height + 768;
|
||||
|
||||
// load studio texture and bind it
|
||||
FS_FileBase( skinname, skinname );
|
||||
|
||||
// load it in
|
||||
pic = R_LoadImage( script, va( "#%s.mdl", tex->name ), (byte *)tex, tex_size, samples, flags );
|
||||
|
||||
// shutdown operations
|
||||
Mem_Free( pin );
|
||||
FS_Close( f );
|
||||
|
||||
if( !pic ) return NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
MsgDev( D_WARN, "'Studio' %s has invalid skin count\n", model_path );
|
||||
FS_Close( f );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Com_ReadToken( script, 0, &token );
|
||||
if( com.stricmp( token.string, ")" ))
|
||||
{
|
||||
MsgDev( D_WARN, "expected ')', found '%s' instead for 'Studio'\n", token.string );
|
||||
FS_FreeImage( pic );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return pic;
|
||||
}
|
||||
|
||||
static rgbdata_t *R_ParseSpriteFrame( script_t *script, const byte *buf, size_t size, int *samples, texFlags_t *flags )
|
||||
{
|
||||
token_t token;
|
||||
rgbdata_t *pic;
|
||||
|
||||
Com_ReadToken( script, 0, &token );
|
||||
if( com.stricmp( token.string, "(" ))
|
||||
{
|
||||
MsgDev( D_WARN, "expected '(', found '%s' instead for 'Sprite'\n", token.string );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if( !Com_ReadToken( script, SC_ALLOW_PATHNAMES2, &token ))
|
||||
{
|
||||
MsgDev( D_WARN, "missing parameters for 'Sprite'\n" );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pic = R_LoadImage( script, va( "#%s.spr", token.string ), buf, size, samples, flags );
|
||||
if( !pic ) return NULL;
|
||||
|
||||
Com_ReadToken( script, 0, &token );
|
||||
if( com.stricmp( token.string, ")" ))
|
||||
{
|
||||
MsgDev( D_WARN, "expected ')', found '%s' instead for 'Sprite'\n", token.string );
|
||||
FS_FreeImage( pic );
|
||||
return NULL;
|
||||
}
|
||||
return pic;
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
R_ParseScrapBlock
|
||||
|
@ -2005,6 +2178,10 @@ static rgbdata_t *R_LoadImage( script_t *script, const char *name, const byte *b
|
|||
return R_ParseAddNormals( script, samples, flags );
|
||||
else if( !com.stricmp( name, "smoothNormals" ))
|
||||
return R_ParseSmoothNormals( script, samples, flags );
|
||||
else if( !com.stricmp( name, "Studio" ))
|
||||
return R_ParseStudioSkin( script, samples, flags );
|
||||
else if( !com.stricmp( name, "Sprite" ))
|
||||
return R_ParseSpriteFrame( script, buf, size, samples, flags );
|
||||
else
|
||||
{
|
||||
// loading form disk
|
||||
|
@ -2392,7 +2569,7 @@ texture_t *R_FindTexture( const char *name, const byte *buf, size_t size, texFla
|
|||
script = Com_OpenScript( name, name, com.strlen( name ));
|
||||
if( !script ) return NULL;
|
||||
|
||||
if( !Com_ReadToken( script, SC_ALLOW_PATHNAMES|(name[0] == '#') ? SC_PARSE_GENERIC : 0, &token ))
|
||||
if( !Com_ReadToken( script, SC_ALLOW_PATHNAMES2, &token ))
|
||||
{
|
||||
Com_CloseScript( script );
|
||||
return NULL;
|
||||
|
|
|
@ -8,6 +8,44 @@
|
|||
#include "matrixlib.h"
|
||||
#include "const.h"
|
||||
|
||||
/*
|
||||
=================
|
||||
R_LightNormalizeColor
|
||||
=================
|
||||
*/
|
||||
void R_LightNormalizeColor( vec3_t in, vec4_t out )
|
||||
{
|
||||
float max;
|
||||
|
||||
// catch negative colors
|
||||
if( in[0] < 0 ) in[0] = 0;
|
||||
if( in[1] < 0 ) in[1] = 0;
|
||||
if( in[2] < 0 ) in[2] = 0;
|
||||
|
||||
// determine the brightest of the three color components
|
||||
max = in[0];
|
||||
if( max < in[1] ) max = in[1];
|
||||
if( max < in[2] ) max = in[2];
|
||||
|
||||
// rescale all the color components if the intensity of the greatest
|
||||
// channel exceeds 1.0
|
||||
if( max > 255.0f )
|
||||
{
|
||||
max = (1.0f / max);
|
||||
|
||||
out[0] = in[0] * max;
|
||||
out[1] = in[1] * max;
|
||||
out[2] = in[2] * max;
|
||||
}
|
||||
else
|
||||
{
|
||||
out[0] = in[0] / 255;
|
||||
out[1] = in[1] / 255;
|
||||
out[2] = in[2] / 255;
|
||||
}
|
||||
out[3] = 1.0f;
|
||||
}
|
||||
|
||||
/*
|
||||
=======================================================================
|
||||
|
||||
|
@ -251,7 +289,7 @@ static void R_ReadLightGrid( const vec3_t origin, vec3_t lightDir )
|
|||
|
||||
if( !r_worldModel->lightGrid )
|
||||
{
|
||||
VectorSet( lightDir, 1, 0, -1 );
|
||||
VectorSet( lightDir, 1.0f, 0.0f, -1.0f );
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -336,7 +374,7 @@ void R_LightingAmbient( void )
|
|||
vec3_t end, dir;
|
||||
float add, dist, radius;
|
||||
int i, l;
|
||||
vec3_t ambientLight;
|
||||
vec4_t ambientLight;
|
||||
|
||||
// Set to full bright if no light data
|
||||
if(( r_refdef.rdflags & RDF_NOWORLDMODEL) || !r_worldModel->lightData || !m_pCurrentEntity )
|
||||
|
@ -390,7 +428,7 @@ void R_LightingAmbient( void )
|
|||
}
|
||||
|
||||
// normalize
|
||||
ColorNormalize( ambientLight, ambientLight );
|
||||
R_LightNormalizeColor( ambientLight, ambientLight );
|
||||
|
||||
for( i = 0; i < ref.numVertex; i++ )
|
||||
{
|
||||
|
@ -427,7 +465,7 @@ void R_LightingDiffuse( void )
|
|||
return;
|
||||
}
|
||||
|
||||
// Get lighting at this point
|
||||
// get lighting at this point
|
||||
VectorSet( end, m_pCurrentEntity->origin[0], m_pCurrentEntity->origin[1], m_pCurrentEntity->origin[2] - MAX_WORLD_COORD );
|
||||
VectorSet( r_pointColor, 1, 1, 1 );
|
||||
|
||||
|
@ -438,7 +476,7 @@ void R_LightingDiffuse( void )
|
|||
|
||||
R_ReadLightGrid( m_pCurrentEntity->origin, lightDir );
|
||||
|
||||
// Always have some light
|
||||
// always have some light
|
||||
if( m_pCurrentEntity->renderfx & RF_MINLIGHT )
|
||||
{
|
||||
for( i = 0; i < 3; i++ )
|
||||
|
@ -496,15 +534,9 @@ void R_LightingDiffuse( void )
|
|||
}
|
||||
}
|
||||
|
||||
// Normalize and convert to byte
|
||||
for (i = 0; i < ref.numVertex; i++)
|
||||
{
|
||||
ColorNormalize( r_lightColors[i], r_lightColors[i] );
|
||||
ref.colorArray[i][0] = r_lightColors[i][0];
|
||||
ref.colorArray[i][1] = r_lightColors[i][1];
|
||||
ref.colorArray[i][2] = r_lightColors[i][2];
|
||||
ref.colorArray[i][3] = 1.0f;
|
||||
}
|
||||
// normalize and convert to byte
|
||||
for( i = 0; i < ref.numVertex; i++ )
|
||||
R_LightNormalizeColor( r_lightColors[i], ref.colorArray[i] );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -149,7 +149,7 @@ extern int r_numShaders;
|
|||
|
||||
void R_EvaluateRegisters( ref_shader_t *shader, float time, const float *entityParms, const float *globalParms );
|
||||
ref_shader_t *R_FindShader( const char *name, int shaderType, uint surfaceParm );
|
||||
void R_SetInternalMap( texture_t *mipTex ); // internal textures (skins, spriteframes, etc)
|
||||
void R_ShaderSetSpriteTexture( texture_t *mipTex );
|
||||
void R_ShaderFreeUnused( void );
|
||||
void R_ShaderList_f( void );
|
||||
void R_InitShaders( void );
|
||||
|
@ -546,6 +546,7 @@ typedef struct ref_entity_s
|
|||
float backlerp; // 0.0 = current, 1.0 = old
|
||||
vec3_t rendercolor; // hl1 rendercolor
|
||||
float renderamt; // hl1 alphavalues
|
||||
int rendermode; // hl1 rendermode
|
||||
int renderfx; // server will be translate hl1 values into flags
|
||||
int colormap; // q1 and hl1 model colormap (can applied for sprites)
|
||||
int effects; // q1 effect flags, EF_ROTATE, EF_DIMLIGHT etc
|
||||
|
|
|
@ -985,12 +985,14 @@ static bool R_AddEntityToScene( entity_state_t *s1, entity_state_t *s2, float le
|
|||
case ED_VIEWMODEL: break;
|
||||
default: return false;
|
||||
}
|
||||
|
||||
// copy state to render
|
||||
refent->frame = s1->model.frame;
|
||||
refent->index = s1->number;
|
||||
refent->ent_type = s1->ed_type;
|
||||
refent->backlerp = 1.0f - lerpfrac;
|
||||
refent->renderamt = s1->renderamt;
|
||||
refent->renderamt = s1->renderamt / 255.0f;
|
||||
refent->rendermode = s1->rendermode;
|
||||
refent->body = s1->model.body;
|
||||
refent->sequence = s1->model.sequence;
|
||||
refent->movetype = s1->movetype;
|
||||
|
@ -999,7 +1001,7 @@ static bool R_AddEntityToScene( entity_state_t *s1, entity_state_t *s2, float le
|
|||
refent->framerate = s1->model.framerate;
|
||||
refent->effects = s1->effects;
|
||||
refent->animtime = s1->model.animtime;
|
||||
VectorCopy( s1->rendercolor, refent->rendercolor );
|
||||
VectorDivide( s1->rendercolor, 255.0f, refent->rendercolor );
|
||||
|
||||
// setup latchedvars
|
||||
refent->prev.frame = s2->model.frame;
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
// FIXME: remove it
|
||||
const char *r_skyBoxSuffix[6] = { "rt", "lf", "bk", "ft", "up", "dn" };
|
||||
static texture_t *r_internalMiptex;
|
||||
static texture_t *r_spriteTexture;
|
||||
|
||||
|
||||
typedef struct
|
||||
|
@ -64,7 +64,7 @@ shaderParm_t infoParms[] =
|
|||
{"trigger", SURF_NODRAW, CONTENTS_TRIGGER, 1}, // trigger volume
|
||||
|
||||
// utility relevant attributes
|
||||
{"origin", SURF_NONE, CONTENTS_ORIGIN, 1}, // center of rotating brushes
|
||||
{"origin", SURF_NODRAW, CONTENTS_ORIGIN, 1}, // center of rotating brushes
|
||||
{"nolightmap", SURF_NOLIGHTMAP, CONTENTS_NONE, 0}, // don't generate a lightmap
|
||||
{"translucent", SURF_NONE, CONTENTS_TRANSLUCENT, 0}, // don't eat contained surfaces
|
||||
{"detail", SURF_NONE, CONTENTS_DETAIL, 0}, // don't include in structural bsp
|
||||
|
@ -1796,8 +1796,6 @@ static bool R_ParseStageMap( ref_shader_t *shader, shaderStage_t *stage, script_
|
|||
bundle->textures[bundle->numTextures++] = r_whiteTexture;
|
||||
else if( !com.stricmp( tok.string, "$blackImage"))
|
||||
bundle->textures[bundle->numTextures++] = r_blackTexture;
|
||||
else if( !com.stricmp( tok.string, "$internal"))
|
||||
bundle->textures[bundle->numTextures++] = r_internalMiptex;
|
||||
else
|
||||
{
|
||||
while( 1 )
|
||||
|
@ -3936,7 +3934,7 @@ static ref_shader_t *R_CreateDefaultShader( const char *name, int shaderType, ui
|
|||
break;
|
||||
case SHADER_STUDIO:
|
||||
shader->stages[0]->bundles[0]->flags |= STAGEBUNDLE_MAP;
|
||||
shader->stages[0]->bundles[0]->textures[0] = r_internalMiptex; // internal spriteframe
|
||||
shader->stages[0]->bundles[0]->textures[0] = R_FindTexture( va( "Studio( %s )", shader->name ), NULL, 0, TF_GEN_MIPS, 0, 0 );
|
||||
if( !shader->stages[0]->bundles[0]->textures[0] )
|
||||
{
|
||||
MsgDev( D_WARN, "couldn't find texture for shader '%s', using default...\n", shader->name );
|
||||
|
@ -3947,26 +3945,21 @@ static ref_shader_t *R_CreateDefaultShader( const char *name, int shaderType, ui
|
|||
{
|
||||
shader->stages[0]->flags |= SHADERSTAGE_BLENDFUNC;
|
||||
shader->stages[0]->blendFunc.src = GL_SRC_ALPHA;
|
||||
shader->stages[0]->blendFunc.dst = GL_ONE_MINUS_SRC_ALPHA;
|
||||
shader->flags |= SHADER_ENTITYMERGABLE; // using renderamt
|
||||
shader->stages[0]->blendFunc.dst = GL_ONE;
|
||||
shader->sort = SORT_ADDITIVE;
|
||||
}
|
||||
if( shader->surfaceParm & SURF_ADDITIVE )
|
||||
else if( shader->surfaceParm & SURF_ADDITIVE )
|
||||
{
|
||||
shader->stages[0]->flags |= SHADERSTAGE_BLENDFUNC;
|
||||
shader->stages[0]->blendFunc.src = GL_SRC_ALPHA;
|
||||
shader->stages[0]->blendFunc.src = GL_ONE;
|
||||
shader->stages[0]->blendFunc.dst = GL_ONE;
|
||||
shader->flags |= SHADER_ENTITYMERGABLE; // using renderamt
|
||||
shader->sort = SORT_ADDITIVE;
|
||||
}
|
||||
if( shader->surfaceParm & SURF_ALPHA )
|
||||
else if( shader->surfaceParm & SURF_ALPHA )
|
||||
{
|
||||
shader->stages[0]->flags |= SHADERSTAGE_ALPHAFUNC;
|
||||
shader->stages[0]->blendFunc.src = GL_SRC_ALPHA;
|
||||
shader->stages[0]->blendFunc.dst = GL_ONE_MINUS_SRC_ALPHA;
|
||||
shader->stages[0]->alphaFunc.func = GL_GREATER;
|
||||
shader->stages[0]->alphaFunc.ref = 0.666;
|
||||
shader->flags |= SHADER_ENTITYMERGABLE; // using renderamt
|
||||
shader->sort = SORT_SEETHROUGH;
|
||||
}
|
||||
shader->stages[0]->bundles[0]->numTextures++;
|
||||
|
@ -3975,7 +3968,7 @@ static ref_shader_t *R_CreateDefaultShader( const char *name, int shaderType, ui
|
|||
break;
|
||||
case SHADER_SPRITE:
|
||||
shader->stages[0]->bundles[0]->flags |= STAGEBUNDLE_MAP;
|
||||
shader->stages[0]->bundles[0]->textures[0] = r_internalMiptex; // internal spriteframe
|
||||
shader->stages[0]->bundles[0]->textures[0] = r_spriteTexture;
|
||||
shader->stages[0]->bundles[0]->texType = TEX_GENERIC;
|
||||
if( !shader->stages[0]->bundles[0]->textures[0] )
|
||||
{
|
||||
|
@ -3984,20 +3977,32 @@ static ref_shader_t *R_CreateDefaultShader( const char *name, int shaderType, ui
|
|||
}
|
||||
if( shader->surfaceParm & SURF_BLEND )
|
||||
{
|
||||
// normal transparency
|
||||
shader->stages[0]->flags |= SHADERSTAGE_BLENDFUNC;
|
||||
shader->stages[0]->blendFunc.src = GL_SRC_ALPHA;
|
||||
shader->stages[0]->blendFunc.dst = GL_ONE_MINUS_SRC_ALPHA;
|
||||
shader->flags |= SHADER_ENTITYMERGABLE; // using renderamt
|
||||
shader->sort = SORT_ADDITIVE;
|
||||
}
|
||||
if( shader->surfaceParm & SURF_ALPHA )
|
||||
else if( shader->surfaceParm & SURF_ADDITIVE )
|
||||
{
|
||||
shader->stages[0]->flags |= SHADERSTAGE_BLENDFUNC|SHADERSTAGE_ALPHAGEN;
|
||||
shader->stages[0]->blendFunc.src = GL_ONE_MINUS_SRC_ALPHA;
|
||||
shader->stages[0]->blendFunc.dst = GL_ONE;
|
||||
shader->stages[0]->alphaGen.type = ALPHAGEN_ENTITY;
|
||||
shader->sort = SORT_ADDITIVE;
|
||||
}
|
||||
else if( shader->surfaceParm & SURF_GLOW )
|
||||
{
|
||||
shader->stages[0]->flags |= SHADERSTAGE_BLENDFUNC|SHADERSTAGE_ALPHAGEN;
|
||||
shader->stages[0]->blendFunc.src = GL_ONE_MINUS_SRC_ALPHA;
|
||||
shader->stages[0]->blendFunc.dst = GL_ONE;
|
||||
shader->stages[0]->alphaGen.type = ALPHAGEN_ENTITY;
|
||||
shader->sort = SORT_ADDITIVE;
|
||||
}
|
||||
else if( shader->surfaceParm & SURF_ALPHA )
|
||||
{
|
||||
shader->stages[0]->flags |= SHADERSTAGE_ALPHAFUNC;
|
||||
shader->stages[0]->blendFunc.src = GL_SRC_ALPHA;
|
||||
shader->stages[0]->blendFunc.dst = GL_ONE_MINUS_SRC_ALPHA;
|
||||
shader->stages[0]->alphaFunc.func = GL_GREATER;
|
||||
shader->stages[0]->alphaFunc.ref = 0.666;
|
||||
shader->flags |= SHADER_ENTITYMERGABLE; // using renderamt
|
||||
shader->sort = SORT_SEETHROUGH;
|
||||
}
|
||||
shader->stages[0]->bundles[0]->numTextures++;
|
||||
|
@ -4296,14 +4301,14 @@ static void R_FinishShader( ref_shader_t *shader )
|
|||
else stage->rgbGen.type = RGBGEN_IDENTITY;
|
||||
break;
|
||||
case SHADER_STUDIO:
|
||||
if( shader->surfaceParm & SURF_ADDITIVE )
|
||||
if( shader->surfaceParm & (SURF_ADDITIVE|SURF_GLOW))
|
||||
stage->rgbGen.type = RGBGEN_IDENTITYLIGHTING;
|
||||
else stage->rgbGen.type = RGBGEN_LIGHTINGAMBIENT;
|
||||
break;
|
||||
case SHADER_SPRITE:
|
||||
if( shader->surfaceParm & SURF_ALPHA|SURF_BLEND )
|
||||
stage->rgbGen.type = RGBGEN_LIGHTINGAMBIENT; // sprite colormod
|
||||
else if( shader->surfaceParm & SURF_ADDITIVE )
|
||||
if( shader->surfaceParm & (SURF_ALPHA|SURF_BLEND))
|
||||
stage->rgbGen.type = RGBGEN_LIGHTINGAMBIENT;
|
||||
else if( shader->surfaceParm & (SURF_ADDITIVE|SURF_GLOW))
|
||||
stage->rgbGen.type = RGBGEN_IDENTITYLIGHTING;
|
||||
break;
|
||||
case SHADER_NOMIP:
|
||||
|
@ -4332,10 +4337,10 @@ static void R_FinishShader( ref_shader_t *shader )
|
|||
else stage->alphaGen.type = ALPHAGEN_IDENTITY;
|
||||
break;
|
||||
case SHADER_STUDIO:
|
||||
stage->alphaGen.type = ALPHAGEN_IDENTITY;
|
||||
stage->alphaGen.type = ALPHAGEN_ENTITY;
|
||||
break;
|
||||
case SHADER_SPRITE:
|
||||
stage->alphaGen.type = ALPHAGEN_IDENTITY;
|
||||
stage->alphaGen.type = ALPHAGEN_ENTITY;
|
||||
break;
|
||||
case SHADER_NOMIP:
|
||||
case SHADER_GENERIC:
|
||||
|
@ -4817,10 +4822,10 @@ ref_shader_t *R_FindShader( const char *name, int shaderType, uint surfaceParm )
|
|||
return R_LoadShader( shader );
|
||||
}
|
||||
|
||||
void R_SetInternalMap( texture_t *mipTex )
|
||||
void R_ShaderSetSpriteTexture( texture_t *mipTex )
|
||||
{
|
||||
// never replace with NULL
|
||||
if( mipTex ) r_internalMiptex = mipTex;
|
||||
if( mipTex ) r_spriteTexture = mipTex;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -5090,6 +5095,9 @@ void R_ShaderList_f( void )
|
|||
case SHADER_STUDIO:
|
||||
Msg( "mdl " );
|
||||
break;
|
||||
case SHADER_FONT:
|
||||
Msg( "fnt " );
|
||||
break;
|
||||
case SHADER_SPRITE:
|
||||
Msg( "spr " );
|
||||
break;
|
||||
|
@ -5102,8 +5110,8 @@ void R_ShaderList_f( void )
|
|||
}
|
||||
|
||||
if( shader->surfaceParm )
|
||||
Msg( "%02X ", shader->surfaceParm );
|
||||
else Msg(" ");
|
||||
Msg( "%02p ", shader->surfaceParm );
|
||||
else Msg(" ");
|
||||
|
||||
Msg( "%2i ", shader->sort );
|
||||
Msg( ": %s%s\n", shader->name, (shader->flags & SHADER_DEFAULTED) ? " (DEFAULTED)" : "" );
|
||||
|
@ -5150,7 +5158,7 @@ void R_InitShaders( void )
|
|||
|
||||
// create built-in shaders
|
||||
R_CreateBuiltInShaders();
|
||||
r_internalMiptex = r_defaultTexture;
|
||||
r_spriteTexture = r_defaultTexture;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -138,6 +138,7 @@ typedef enum
|
|||
|
||||
typedef enum
|
||||
{
|
||||
WAVEFORM_NONE = 0,
|
||||
WAVEFORM_SIN,
|
||||
WAVEFORM_TRIANGLE,
|
||||
WAVEFORM_SQUARE,
|
||||
|
|
|
@ -32,7 +32,7 @@ dframetype_t *R_SpriteLoadFrame( rmodel_t *mod, void *pin, mspriteframe_t **ppfr
|
|||
|
||||
// build uinque frame name
|
||||
FS_FileBase( mod->name, mod->name );
|
||||
com.snprintf( name, MAX_STRING, "#%s_%s_%i%i.spr", mod->name, frame_prefix, framenum/10, framenum%10 );
|
||||
com.snprintf( name, MAX_STRING, "Sprite( %s_%s_%i%i )", mod->name, frame_prefix, framenum/10, framenum%10 );
|
||||
|
||||
pinframe = (dspriteframe_t *)pin;
|
||||
SwapBlock((int *)pinframe, sizeof( dspriteframe_t ));
|
||||
|
@ -49,7 +49,7 @@ dframetype_t *R_SpriteLoadFrame( rmodel_t *mod, void *pin, mspriteframe_t **ppfr
|
|||
pspriteframe->texture = R_FindTexture( name, (byte *)pin, pinframe->width * pinframe->height, TF_GEN_MIPS, 0, 0 );
|
||||
*ppframe = pspriteframe;
|
||||
|
||||
R_SetInternalMap( pspriteframe->texture );
|
||||
R_ShaderSetSpriteTexture( pspriteframe->texture );
|
||||
pspriteframe->shader = R_FindShader( name, SHADER_SPRITE, surfaceParm )->shadernum;
|
||||
|
||||
frames = Mem_Realloc( mod->mempool, frames, sizeof( ref_shader_t* ) * (mod->numShaders + 1));
|
||||
|
@ -137,6 +137,9 @@ void R_SpriteLoadModel( rmodel_t *mod, const void *buffer )
|
|||
switch( psprite->rendermode )
|
||||
{
|
||||
case SPR_ADDGLOW:
|
||||
pal = FS_LoadImage( "#normal.pal", src, 768 );
|
||||
surfaceParm |= SURF_GLOW;
|
||||
break;
|
||||
case SPR_ADDITIVE:
|
||||
pal = FS_LoadImage( "#normal.pal", src, 768 );
|
||||
surfaceParm |= SURF_ADDITIVE;
|
||||
|
@ -155,7 +158,6 @@ void R_SpriteLoadModel( rmodel_t *mod, const void *buffer )
|
|||
break;
|
||||
}
|
||||
pframetype = (dframetype_t *)(src + 768);
|
||||
surfaceParm |= SURF_NOLIGHTMAP;
|
||||
FS_FreeImage( pal ); // palette installed, no reason to keep this data
|
||||
}
|
||||
else
|
||||
|
@ -333,6 +335,13 @@ void R_DrawSpriteModel( void )
|
|||
break;
|
||||
}
|
||||
|
||||
if((m_pCurrentEntity->rendermode == kRenderGlow) || (m_pCurrentShader->surfaceParm & SURF_GLOW))
|
||||
{
|
||||
float dist = VectorDistance( m_pCurrentEntity->origin, r_refdef.vieworg );
|
||||
e->scale = bound( 1.0, dist * 0.005f, 10.0f );
|
||||
e->renderamt = bound( 0.0f, dist / 1000, 1.0f );
|
||||
}
|
||||
|
||||
// draw it
|
||||
RB_CheckMeshOverflow( 6, 4 );
|
||||
|
||||
|
|
|
@ -64,7 +64,6 @@ rmodel_t *m_pChromeSprite;
|
|||
// player gait sequence stuff
|
||||
int m_fGaitEstimation;
|
||||
float m_flGaitMovement;
|
||||
uint surfaceParm = 0;
|
||||
|
||||
/*
|
||||
====================
|
||||
|
@ -167,35 +166,18 @@ static void R_StudioBuildNeighbors( int numtris, mstudiotriangle_t *triangles, m
|
|||
Studio model loader
|
||||
====================
|
||||
*/
|
||||
texture_t *R_StudioLoadTexture( rmodel_t *mod, dstudiotexture_t *tex, byte *pin )
|
||||
uint R_StudioSurfaceParm( dstudiotexture_t *tex )
|
||||
{
|
||||
rgbdata_t *pal;
|
||||
size_t size;
|
||||
uint surfaceParm = 0;
|
||||
|
||||
surfaceParm = 0;
|
||||
|
||||
// install palette first
|
||||
if( tex->flags & STUDIO_NF_TRANSPARENT )
|
||||
{
|
||||
pal = FS_LoadImage( "#transparent.pal", pin + tex->width * tex->height + tex->index, 768 );
|
||||
surfaceParm |= SURF_ALPHA;
|
||||
}
|
||||
else pal = FS_LoadImage( "#normal.pal", pin + tex->width * tex->height + tex->index, 768 );
|
||||
|
||||
if( tex->flags & STUDIO_NF_ADDITIVE )
|
||||
else if( tex->flags & STUDIO_NF_ADDITIVE )
|
||||
surfaceParm |= SURF_ADDITIVE;
|
||||
else if( tex->flags & STUDIO_NF_BLENDED )
|
||||
surfaceParm |= SURF_BLEND;
|
||||
surfaceParm |= SURF_NOLIGHTMAP;
|
||||
FS_FreeImage( pal );
|
||||
|
||||
// NOTE: replace index with pointer to start of imagebuffer, ImageLib expected it
|
||||
tex->index = (int)pin + tex->index;
|
||||
size = sizeof( dstudiotexture_t ) + tex->width * tex->height + 768;
|
||||
|
||||
// load studio texture and bind it
|
||||
FS_FileBase( tex->name, tex->name );
|
||||
return R_FindTexture( va( "#%s.mdl", tex->name ), (byte *)tex, size, TF_GEN_MIPS, 0, 0 );
|
||||
return surfaceParm;
|
||||
}
|
||||
|
||||
dstudiohdr_t *R_StudioLoadHeader( rmodel_t *mod, const uint *buffer )
|
||||
|
@ -204,6 +186,8 @@ dstudiohdr_t *R_StudioLoadHeader( rmodel_t *mod, const uint *buffer )
|
|||
byte *pin;
|
||||
dstudiohdr_t *phdr;
|
||||
dstudiotexture_t *ptexture;
|
||||
string shadername;
|
||||
uint surfaceParm;
|
||||
|
||||
pin = (byte *)buffer;
|
||||
phdr = (dstudiohdr_t *)pin;
|
||||
|
@ -222,8 +206,10 @@ dstudiohdr_t *R_StudioLoadHeader( rmodel_t *mod, const uint *buffer )
|
|||
|
||||
for( i = 0; i < phdr->numtextures; i++ )
|
||||
{
|
||||
R_SetInternalMap(R_StudioLoadTexture( mod, &ptexture[i], pin ));
|
||||
ptexture[i].shader = R_FindShader( ptexture[i].name, SHADER_STUDIO, surfaceParm )->shadernum;
|
||||
surfaceParm = R_StudioSurfaceParm( &ptexture[i] );
|
||||
com.snprintf( shadername, MAX_STRING, "%s/%s", mod->name, ptexture[i].name );
|
||||
FS_StripExtension( shadername ); // doesn't produce shaders with .ext
|
||||
ptexture[i].shader = R_FindShader( shadername, SHADER_STUDIO, surfaceParm )->shadernum;
|
||||
mod->shaders[i] = &r_shaders[ptexture[i].shader];
|
||||
}
|
||||
}
|
||||
|
@ -1421,9 +1407,6 @@ void R_StudioDrawMeshes( dstudiotexture_t * ptexture, short *pskinref, int pass
|
|||
s = 1.0/(float)ptexture[pskinref[pmesh->skinref]].width;
|
||||
t = 1.0/(float)ptexture[pskinref[pmesh->skinref]].height;
|
||||
|
||||
//GL_BindTexture( m_pRenderModel->textures[ptexture[pskinref[pmesh->skinref]].index].image );
|
||||
// FIXME: test
|
||||
//m_pCurrentShader = m_pRenderModel->shaders[ptexture[pskinref[pmesh->skinref]].shader];
|
||||
m_pCurrentShader = &r_shaders[ptexture[pskinref[pmesh->skinref]].shader];
|
||||
|
||||
while( i = *(ptricmds++))
|
||||
|
@ -1445,6 +1428,8 @@ void R_StudioDrawMeshes( dstudiotexture_t * ptexture, short *pskinref, int pass
|
|||
else GL_TexCoord2f( ptricmds[2] * s, ptricmds[3] * t );
|
||||
|
||||
lv = m_pvlightvalues[ptricmds[1]];
|
||||
|
||||
GL_Normal3fv( vec3_origin ); // needs to clear normals
|
||||
|
||||
if ( m_pCurrentEntity->renderfx & RF_FULLBRIGHT )
|
||||
lv = &fbright[0];
|
||||
|
@ -1454,12 +1439,14 @@ void R_StudioDrawMeshes( dstudiotexture_t * ptexture, short *pskinref, int pass
|
|||
if ( r_refdef.rdflags & RDF_IRGOGGLES && m_pCurrentEntity->renderfx & RF_IR_VISIBLE)
|
||||
lv = &irgoggles[0];
|
||||
|
||||
//if( flags & STUDIO_NF_ADDITIVE ) // additive is self-lighting texture
|
||||
// GL_Color4f( 1.0f, 1.0f, 1.0f, 0.8f );
|
||||
//else if( m_pCurrentEntity->renderfx & RF_TRANSLUCENT )
|
||||
// GL_Color4f( 1.0f, 1.0f, 1.0f, m_pCurrentEntity->renderamt );
|
||||
//else GL_Color3fv( lv ); // get light from floor
|
||||
|
||||
/*
|
||||
if( flags & STUDIO_NF_ADDITIVE ) // additive is self-lighting texture
|
||||
GL_Color4f( 1.0f, 1.0f, 1.0f, 0.8f );
|
||||
else if( m_pCurrentEntity->renderfx & RF_TRANSLUCENT )
|
||||
GL_Color4f( 1.0f, 1.0f, 1.0f, m_pCurrentEntity->renderamt );
|
||||
else GL_Color3fv( lv ); // get light from floor
|
||||
*/
|
||||
|
||||
av = m_pxformverts[ptricmds[0]]; // verts
|
||||
GL_Vertex3f( av[0], av[1], av[2] );
|
||||
}
|
||||
|
|
6
todo.log
6
todo.log
|
@ -36,15 +36,17 @@ GLOBAL:
|
|||
14. зачинить небо OK
|
||||
15. наладить отрисовку энтить
|
||||
16. починить PhysWorld OK
|
||||
17. íàëàäèòü StudioModelRender
|
||||
17. íàëàäèòü StudioModelRender OK
|
||||
18. энумератор текстур OK
|
||||
19. наладить удаление ключей из HashTable OK
|
||||
20. CM_HeadnodeVisible OK
|
||||
20. CM_HeadnodeVisible
|
||||
21. Matrix3x3_Compare crashed OK
|
||||
22. SpriteCulling OK
|
||||
23. LightSwitch OK
|
||||
24. ParticleDrawing OK
|
||||
25. CM_LeafCluster crashing
|
||||
26. StudioLighting OK
|
||||
27. SurfaceParm äëÿ ñïðàéòîâ è ìîäåëåé
|
||||
|
||||
операция "Полная отладка менеджера текстур"
|
||||
0. анализ менеджера egl и q2e_068
|
||||
|
|
|
@ -502,7 +502,7 @@ word PR_WriteProgdefs( void )
|
|||
|
||||
switch( crc )
|
||||
{
|
||||
case 9691:
|
||||
case 8066:
|
||||
PR_Message("Xash3D unmodified server.dat\n");
|
||||
if(!com.strcmp(progsoutname, "unknown.dat")) com.strcpy(progsoutname, "server.dat");
|
||||
break;
|
||||
|
|
Reference in New Issue