18 Nov 2008

This commit is contained in:
g-cont 2008-11-18 00:00:00 +03:00 committed by Alibek Omarov
parent 4ae70b2e3e
commit c18b394fb6
21 changed files with 2176 additions and 1935 deletions

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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;

View File

@ -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 },
};
/*

View File

@ -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

View File

@ -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

View File

@ -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
{

View File

@ -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;

View File

@ -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)

View File

@ -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

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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] );
}

View File

@ -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

View File

@ -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;

View File

@ -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;
}
/*

View File

@ -138,6 +138,7 @@ typedef enum
typedef enum
{
WAVEFORM_NONE = 0,
WAVEFORM_SIN,
WAVEFORM_TRIANGLE,
WAVEFORM_SQUARE,

View File

@ -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 );

View File

@ -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] );
}

View File

@ -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

View File

@ -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;