02 Sep 2009
This commit is contained in:
parent
45d0c492dc
commit
d71ae7d5a6
|
@ -7,14 +7,13 @@
|
|||
|
||||
typedef enum
|
||||
{
|
||||
TRI_FRONT = 0,
|
||||
TRI_FRONT = 1,
|
||||
TRI_BACK,
|
||||
TRI_NONE,
|
||||
} TRI_CULL;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TRI_TRIANGLES = 0,
|
||||
TRI_TRIANGLES = 1,
|
||||
TRI_TRIANGLE_FAN,
|
||||
TRI_TRIANGLE_STRIP,
|
||||
TRI_POLYGON,
|
||||
|
@ -24,7 +23,8 @@ typedef enum
|
|||
|
||||
typedef enum
|
||||
{
|
||||
TRI_SHADER = 0,
|
||||
TRI_NONE = 0,
|
||||
TRI_SHADER,
|
||||
TRI_CLIP_PLANE,
|
||||
} TRI_CAPS;
|
||||
|
||||
|
|
|
@ -171,7 +171,7 @@ public:
|
|||
}
|
||||
int DirToBits( void )
|
||||
{
|
||||
int max, bits, numBits = 15; // pack as unsigned short ( state->skin supports this )
|
||||
int max, bits, numBits = 8; // pack as unsigned char ( state->skin supports this )
|
||||
float bias;
|
||||
|
||||
numBits /= 3;
|
||||
|
@ -190,7 +190,7 @@ public:
|
|||
Vector BitsToDir( int bits )
|
||||
{
|
||||
static float sign[2] = { 1.0f, -1.0f };
|
||||
int max, numBits = 15; // pack as unsigned short
|
||||
int max, numBits = 8; // pack as unsigned char
|
||||
float invMax;
|
||||
|
||||
numBits /= 3;
|
||||
|
|
|
@ -347,6 +347,41 @@ void SCR_DrawFPS( void )
|
|||
SCR_DrawBigStringColor( SCREEN_WIDTH - 146, SCREEN_HEIGHT - 32, fpsstring, color );
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
SCR_RSpeeds
|
||||
================
|
||||
*/
|
||||
void SCR_RSpeeds( void )
|
||||
{
|
||||
char msg[MAX_SYSPATH];
|
||||
|
||||
if( re->RSpeedsMessage( msg, sizeof( msg )))
|
||||
{
|
||||
int x, y, height;
|
||||
char *p, *start, *end;
|
||||
vec4_t color;
|
||||
|
||||
x = SCREEN_WIDTH - 320;
|
||||
y = 64;
|
||||
height = SMALLCHAR_HEIGHT;
|
||||
Vector4Set( color, 1.0f, 1.0f, 1.0f, 1.0f );
|
||||
|
||||
p = start = msg;
|
||||
do
|
||||
{
|
||||
end = com.strchr( p, '\n' );
|
||||
if( end ) msg[end-start] = '\0';
|
||||
|
||||
SCR_DrawStringExt( x, y, SMALLCHAR_WIDTH, SMALLCHAR_HEIGHT, p, color, true );
|
||||
y += height;
|
||||
|
||||
if( end ) p = end + 1;
|
||||
else break;
|
||||
} while( 1 );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
SCR_UpdateScreen
|
||||
|
|
|
@ -222,6 +222,7 @@ V_PostRender
|
|||
*/
|
||||
void V_PostRender( void )
|
||||
{
|
||||
SCR_RSpeeds();
|
||||
SCR_DrawNet();
|
||||
SCR_DrawFPS();
|
||||
UI_Draw();
|
||||
|
|
|
@ -556,6 +556,7 @@ void SCR_DrawSmallStringExt( int x, int y, const char *string, float *setColor,
|
|||
void SCR_DrawStringExt( int x, int y, float w, float h, const char *string, float *setColor, bool forceColor );
|
||||
void SCR_DrawBigString( int x, int y, const char *s, float alpha );
|
||||
void SCR_DrawBigStringColor( int x, int y, const char *s, vec4_t color );
|
||||
void SCR_RSpeeds( void );
|
||||
void SCR_DrawFPS( void );
|
||||
void SCR_DrawNet( void );
|
||||
|
||||
|
|
|
@ -637,9 +637,11 @@ void SV_InitEdict( edict_t *pEdict )
|
|||
{
|
||||
Com_Assert( pEdict == NULL );
|
||||
Com_Assert( pEdict->pvPrivateData != NULL );
|
||||
// Com_Assert( pEdict->pvServerData != NULL );
|
||||
|
||||
pEdict->v.pContainingEntity = pEdict; // make cross-links for consistency
|
||||
pEdict->pvServerData = (sv_priv_t *)Mem_Alloc( svgame.mempool, sizeof( sv_priv_t ));
|
||||
if( !pEdict->pvServerData ) // FIXME
|
||||
pEdict->pvServerData = (sv_priv_t *)Mem_Alloc( svgame.mempool, sizeof( sv_priv_t ));
|
||||
pEdict->pvPrivateData = NULL; // will be alloced later by pfnAllocPrivateData
|
||||
pEdict->serialnumber = NUM_FOR_EDICT( pEdict );
|
||||
pEdict->free = false;
|
||||
|
|
|
@ -342,6 +342,13 @@ void Callback_ApplyTransform( const NewtonBody* body, const float* matrix );
|
|||
//
|
||||
void CM_InitMaterials( void );
|
||||
|
||||
//
|
||||
// cm_model.c
|
||||
//
|
||||
|
||||
void CM_CreateMeshBuffer( cmodel_t *mod );
|
||||
void CM_FreeMeshBuffer( cmodel_t *mod );
|
||||
|
||||
//
|
||||
// cm_collision.c
|
||||
//
|
||||
|
|
|
@ -119,28 +119,17 @@ const char *CM_TexName( int index ){ return cm.shaders[index].name; }
|
|||
BSP_CreateMeshBuffer
|
||||
=================
|
||||
*/
|
||||
void BSP_CreateMeshBuffer( int modelnum )
|
||||
void BSP_CreateMeshBuffer( cmodel_t *mod )
|
||||
{
|
||||
csurface_t *m_surface;
|
||||
int d, i, j, k;
|
||||
int flags;
|
||||
|
||||
// ignore world or bsplib instance
|
||||
if( app_name == HOST_BSPLIB || modelnum >= cms.numbmodels )
|
||||
return;
|
||||
|
||||
loadmodel = &cms.bmodels[modelnum];
|
||||
if( modelnum ) loadmodel->type = mod_brush;
|
||||
else loadmodel->type = mod_world; // level static geometry
|
||||
loadmodel->TraceBox = CM_TraceBmodel;
|
||||
loadmodel->PointContents = CM_PointContents;
|
||||
|
||||
// because world loading collision tree from LUMP_COLLISION
|
||||
if( modelnum < 1 ) return;
|
||||
if( mod->col[0] ) return; // already loaded
|
||||
studio.m_pVerts = &studio.vertices[0]; // using studio vertex buffer for bmodels too
|
||||
studio.numverts = 0; // clear current count
|
||||
|
||||
for( d = 0, i = loadmodel->firstface; d < loadmodel->numfaces; i++, d++ )
|
||||
for( d = 0, i = mod->firstface; d < mod->numfaces; i++, d++ )
|
||||
{
|
||||
m_surface = cm.surfaces + i;
|
||||
flags = cm.shaders[m_surface->shadernum].flags;
|
||||
|
@ -162,11 +151,11 @@ void BSP_CreateMeshBuffer( int modelnum )
|
|||
if( studio.numverts )
|
||||
{
|
||||
// grab vertices
|
||||
loadmodel->col[loadmodel->numbodies] = (cmesh_t *)Mem_Alloc( loadmodel->mempool, sizeof(*loadmodel->col[0]));
|
||||
loadmodel->col[loadmodel->numbodies]->verts = Mem_Alloc( loadmodel->mempool, studio.numverts * sizeof(vec3_t));
|
||||
Mem_Copy( loadmodel->col[loadmodel->numbodies]->verts, studio.m_pVerts, studio.numverts * sizeof(vec3_t));
|
||||
loadmodel->col[loadmodel->numbodies]->numverts = studio.numverts;
|
||||
loadmodel->numbodies++;
|
||||
mod->col[mod->numbodies] = (cmesh_t *)Mem_Alloc( mod->mempool, sizeof(*mod->col[0]));
|
||||
mod->col[mod->numbodies]->verts = Mem_Alloc( mod->mempool, studio.numverts * sizeof(vec3_t));
|
||||
Mem_Copy( mod->col[loadmodel->numbodies]->verts, studio.m_pVerts, studio.numverts * sizeof(vec3_t));
|
||||
mod->col[mod->numbodies]->numverts = studio.numverts;
|
||||
mod->numbodies++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -214,9 +203,16 @@ void BSP_LoadModels( lump_t *l )
|
|||
out->numbrushes = c = LittleLong( in->numbrushes );
|
||||
if( n < 0 || n + c > cm.numbrushes )
|
||||
Host_Error( "BSP_LoadModels: invalid brush range %i : %i (%i brushes)\n", n, n+c, cm.numsurfaces );
|
||||
com.strncpy( out->name, va("*%i", i ), sizeof(out->name));
|
||||
com.strncpy( out->name, va("*%i", i ), sizeof( out->name ));
|
||||
out->mempool = Mem_AllocPool( va("^3%s^7", out->name )); // difference with render and cm pools
|
||||
BSP_CreateMeshBuffer( i ); // bsp physic
|
||||
|
||||
if( i >= cms.numbmodels ) continue;
|
||||
|
||||
loadmodel = &cms.bmodels[i];
|
||||
if( i ) loadmodel->type = mod_brush;
|
||||
else loadmodel->type = mod_world; // level static geometry
|
||||
loadmodel->TraceBox = CM_TraceBmodel;
|
||||
loadmodel->PointContents = CM_PointContents;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1102,16 +1098,7 @@ void CM_LoadBSP( const void *buffer )
|
|||
|
||||
void CM_FreeBSP( void )
|
||||
{
|
||||
int i;
|
||||
cmodel_t *mod;
|
||||
|
||||
CM_FreeWorld();
|
||||
|
||||
for( i = 0, mod = cms.cmodels; i < cms.numcmodels; i++, mod++)
|
||||
{
|
||||
if( !mod->name[0] ) continue;
|
||||
CM_FreeModel( mod );
|
||||
}
|
||||
}
|
||||
|
||||
static void CM_AddCollision( file_t *f, const void* buffer, size_t size )
|
||||
|
@ -1334,9 +1321,9 @@ void CM_EndRegistration( void )
|
|||
cmodel_t *mod;
|
||||
int i;
|
||||
|
||||
for( i = 0, mod = &cms.cmodels[0]; i < cms.numcmodels; i++, mod++)
|
||||
for( i = 0, mod = &cms.cmodels[0]; i < cms.numcmodels; i++, mod++ )
|
||||
{
|
||||
if(!mod->name[0]) continue;
|
||||
if( !mod->name[0] ) continue;
|
||||
if( mod->registration_sequence != registration_sequence )
|
||||
CM_FreeModel( mod );
|
||||
}
|
||||
|
@ -1553,26 +1540,39 @@ void CM_StudioGetVertices( void )
|
|||
CM_StudioLookMeshes();
|
||||
}
|
||||
|
||||
void CM_CreateMeshBuffer( byte *buffer )
|
||||
void CM_CreateMeshBuffer( cmodel_t *mod )
|
||||
{
|
||||
int i, j;
|
||||
|
||||
Com_Assert( mod == NULL );
|
||||
|
||||
switch( mod->type )
|
||||
{
|
||||
case mod_world:
|
||||
case mod_brush:
|
||||
BSP_CreateMeshBuffer( mod );
|
||||
return;
|
||||
case mod_studio:
|
||||
break;
|
||||
default: return;
|
||||
}
|
||||
|
||||
// setup global pointers
|
||||
studio.hdr = (dstudiohdr_t *)buffer;
|
||||
studio.hdr = (dstudiohdr_t *)mod->extradata;
|
||||
studio.m_pVerts = &studio.vertices[0];
|
||||
|
||||
CM_GetBodyCount();
|
||||
|
||||
for( i = 0; i < studio.bodycount; i++)
|
||||
for( i = 0; i < studio.bodycount; i++ )
|
||||
{
|
||||
// already loaded
|
||||
if( loadmodel->col[i] ) continue;
|
||||
if( mod->col[i] ) continue;
|
||||
|
||||
CM_StudioSetUpTransform();
|
||||
CM_StudioSetupBones();
|
||||
|
||||
// lookup all bodies
|
||||
for (j = 0; j < studio.hdr->numbodyparts; j++)
|
||||
for( j = 0; j < studio.hdr->numbodyparts; j++ )
|
||||
{
|
||||
CM_StudioSetupModel( j, i );
|
||||
CM_StudioGetVertices();
|
||||
|
@ -1589,6 +1589,24 @@ void CM_CreateMeshBuffer( byte *buffer )
|
|||
}
|
||||
}
|
||||
|
||||
void CM_FreeMeshBuffer( cmodel_t *mod )
|
||||
{
|
||||
int i;
|
||||
|
||||
Com_Assert( mod == NULL );
|
||||
|
||||
for( i = 0; i < mod->numbodies; i++ )
|
||||
{
|
||||
if( mod->col[i] )
|
||||
{
|
||||
if( mod->col[i]->verts ) Mem_Free( mod->col[i]->verts );
|
||||
Mem_Free( mod->col[i] );
|
||||
mod->col[i] = NULL;
|
||||
}
|
||||
}
|
||||
mod->numbodies = 0;
|
||||
}
|
||||
|
||||
bool CM_StudioModel( byte *buffer, uint filesize )
|
||||
{
|
||||
dstudiohdr_t *phdr;
|
||||
|
@ -1603,6 +1621,7 @@ bool CM_StudioModel( byte *buffer, uint filesize )
|
|||
|
||||
loadmodel->numbodies = 0;
|
||||
loadmodel->type = mod_studio;
|
||||
loadmodel->registration_sequence = registration_sequence;
|
||||
loadmodel->extradata = Mem_Alloc( loadmodel->mempool, filesize );
|
||||
Mem_Copy( loadmodel->extradata, buffer, filesize );
|
||||
|
||||
|
@ -1620,8 +1639,6 @@ bool CM_StudioModel( byte *buffer, uint filesize )
|
|||
VectorCopy( loadmodel->mins, loadmodel->yawmins );
|
||||
VectorCopy( loadmodel->maxs, loadmodel->yawmaxs );
|
||||
|
||||
CM_CreateMeshBuffer( buffer ); // newton collision mesh
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1640,6 +1657,7 @@ bool CM_SpriteModel( byte *buffer, uint filesize )
|
|||
loadmodel->type = mod_sprite;
|
||||
loadmodel->numbodies = 0; // sprites don't have bodies
|
||||
loadmodel->numframes = phdr->numframes;
|
||||
loadmodel->registration_sequence = registration_sequence;
|
||||
loadmodel->mins[0] = loadmodel->mins[1] = -phdr->bounds[0] / 2;
|
||||
loadmodel->maxs[0] = loadmodel->maxs[1] = phdr->bounds[0] / 2;
|
||||
loadmodel->mins[2] = -phdr->bounds[1] / 2;
|
||||
|
@ -1683,8 +1701,7 @@ cmodel_t *CM_RegisterModel( const char *name )
|
|||
}
|
||||
|
||||
// FIXME: use registration_sequence for worldmodel
|
||||
if( !com.strcmp( name, cm.name ))
|
||||
return &cms.bmodels[0];
|
||||
if( !com.strcmp( name, cm.name )) return &cms.bmodels[0];
|
||||
|
||||
for( i = 0; i < cms.numcmodels; i++ )
|
||||
{
|
||||
|
@ -1699,7 +1716,7 @@ cmodel_t *CM_RegisterModel( const char *name )
|
|||
}
|
||||
|
||||
// find a free model slot spot
|
||||
for( i = 0, mod = cms.cmodels; i < cms.numcmodels; i++, mod++)
|
||||
for( i = 0, mod = cms.cmodels; i < cms.numcmodels; i++, mod++ )
|
||||
if( !mod->name[0] ) break; // free spot
|
||||
if( i == cms.numcmodels )
|
||||
{
|
||||
|
@ -1716,7 +1733,7 @@ cmodel_t *CM_RegisterModel( const char *name )
|
|||
if( !buf )
|
||||
{
|
||||
MsgDev( D_ERROR, "CM_LoadModel: %s not found\n", name );
|
||||
Mem_Set(mod->name, 0, sizeof(mod->name));
|
||||
Mem_Set( mod->name, 0, sizeof( mod->name ));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include "mathlib.h"
|
||||
#include "matrix_lib.h"
|
||||
#include "cm_local.h"
|
||||
#include "entity_def.h"
|
||||
|
||||
physbody_t *Phys_CreateBody( edict_t *ed, cmodel_t *mod, const vec3_t org, const matrix3x3 m, int solid, int move )
|
||||
{
|
||||
|
@ -85,8 +86,11 @@ physbody_t *Phys_CreateBody( edict_t *ed, cmodel_t *mod, const vec3_t org, const
|
|||
break;
|
||||
case SOLID_BSP:
|
||||
case SOLID_MESH:
|
||||
vertices = pi.GetModelVerts( ed, &numvertices );
|
||||
if(!vertices || !numvertices ) return NULL;
|
||||
if( mod->col[bound( 0, ed->v.body, mod->numbodies )] == NULL )
|
||||
CM_CreateMeshBuffer( mod );
|
||||
if( mod->col[bound( 0, ed->v.body, mod->numbodies )] == NULL ) return NULL; // I_Error()
|
||||
vertices = (float *)mod->col[bound( 0, ed->v.body, mod->numbodies )]->verts;
|
||||
numvertices = mod->col[bound( 0, ed->v.body, mod->numbodies )]->numverts;
|
||||
col = NewtonCreateConvexHull( gWorld, numvertices, vertices, sizeof(vec3_t), &offset[0][0] );
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -43,9 +43,6 @@ typedef struct cl_globalvars_s cl_globalvars_t;
|
|||
typedef struct ui_globalvars_s ui_globalvars_t;
|
||||
typedef struct physbody_s physbody_t;
|
||||
|
||||
// FIXME: get rid of this
|
||||
typedef vec_t gl_matrix[16];
|
||||
|
||||
// platform instances
|
||||
typedef enum
|
||||
{
|
||||
|
|
|
@ -90,6 +90,9 @@ typedef struct render_exp_s
|
|||
void (*DrawStretchRaw)( int x, int y, int w, int h, int cols, int rows, byte *data, bool redraw );
|
||||
void (*DrawStretchPic)( float x, float y, float w, float h, float s1, float t1, float s2, float t2, shader_t shader );
|
||||
int (*GetFragments)( const vec3_t org, float rad, vec3_t axis[3], int maxverts, vec3_t *verts, int maxfrags, fragment_t *frags );
|
||||
int (*WorldToScreen)( const float *world, float *screen );
|
||||
void (*ScreenToWorld)( const float *screen, float *world );
|
||||
bool (*RSpeedsMessage)( char *out, size_t size );
|
||||
} render_exp_t;
|
||||
|
||||
typedef struct render_imp_s
|
||||
|
|
|
@ -467,7 +467,7 @@ static void R_DrawAliasFrameLerp( const meshbuffer_t *mb, float backlerp )
|
|||
maliasmesh_t *mesh;
|
||||
maliasvertex_t *v, *ov;
|
||||
ref_entity_t *e = RI.currententity;
|
||||
ref_model_t *mod = Mod_ForHandle( mb->LODModelHandle );
|
||||
ref_model_t *mod = Mod_ForHandle( mb->modhandle );
|
||||
maliasmodel_t *model = ( maliasmodel_t * )mod->extradata;
|
||||
ref_shader_t *shader;
|
||||
static maliasmesh_t *alias_prevmesh;
|
||||
|
@ -739,7 +739,7 @@ bool R_CullAliasModel( ref_entity_t *e )
|
|||
if( shader && ( shader->sort <= SORT_ALPHATEST ))
|
||||
{
|
||||
mb = R_AddMeshToList( MB_MODEL, NULL, R_PlanarShadowShader(), -( i+1 ));
|
||||
if( mb ) mb->LODModelHandle = modhandle;
|
||||
if( mb ) mb->modhandle = modhandle;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -664,7 +664,7 @@ static void R_DrawAliasFrameLerp( const meshbuffer_t *mb, float backlerp )
|
|||
maliasmesh_t *mesh;
|
||||
maliasvertex_t *v, *ov;
|
||||
ref_entity_t *e = RI.currententity;
|
||||
ref_model_t *mod = Mod_ForHandle( mb->LODModelHandle );
|
||||
ref_model_t *mod = Mod_ForHandle( mb->modhandle );
|
||||
maliasmodel_t *model = ( maliasmodel_t * )mod->extradata;
|
||||
ref_shader_t *shader;
|
||||
static maliasmesh_t *alias_prevmesh;
|
||||
|
@ -918,9 +918,7 @@ bool R_CullAliasModel( ref_entity_t *e )
|
|||
{
|
||||
shader = NULL;
|
||||
|
||||
if( e->skinfile )
|
||||
shader = R_FindShaderForSkinFile( e->skinfile, mesh->name );
|
||||
else if(( e->skin >= 0 ) && ( e->skin < aliasmodel->numskins ))
|
||||
if(( e->skin >= 0 ) && ( e->skin < aliasmodel->numskins ))
|
||||
shader = aliasmodel->skins[e->skin].shader;
|
||||
else if( mesh->numskins )
|
||||
{
|
||||
|
@ -936,7 +934,7 @@ bool R_CullAliasModel( ref_entity_t *e )
|
|||
if( shader && ( shader->sort <= SORT_ALPHATEST ))
|
||||
{
|
||||
mb = R_AddMeshToList( MB_MODEL, NULL, R_PlanarShadowShader(), -( i+1 ));
|
||||
if( mb ) mb->LODModelHandle = modhandle;
|
||||
if( mb ) mb->modhandle = modhandle;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -995,8 +993,7 @@ void R_AddAliasModelToList( ref_entity_t *e )
|
|||
{
|
||||
shader = NULL;
|
||||
|
||||
if( e->skinfile ) shader = R_FindShaderForSkinFile( e->skinfile, mesh->name );
|
||||
else if( ( e->skin >= 0 ) && ( e->skin < aliasmodel->numskins ))
|
||||
if(( e->skin >= 0 ) && ( e->skin < aliasmodel->numskins ))
|
||||
shader = aliasmodel->skins[e->skin].shader;
|
||||
else if( mesh->numskins )
|
||||
{
|
||||
|
|
|
@ -409,7 +409,7 @@ void R_BackendEndFrame( void )
|
|||
case 1:
|
||||
default:
|
||||
com.snprintf( r_speeds_msg, sizeof( r_speeds_msg ),
|
||||
"%4i wpoly %4i leafs %4i verts %4i tris %4i flushes %3i locks",
|
||||
"%4i wpoly %4i leafs %4i verts\n%4i tris %4i flushes %4i locks",
|
||||
c_brush_polys,
|
||||
c_world_leafs,
|
||||
r_backacc.c_totalVerts,
|
||||
|
@ -420,7 +420,7 @@ void R_BackendEndFrame( void )
|
|||
break;
|
||||
case 2:
|
||||
com.snprintf( r_speeds_msg, sizeof( r_speeds_msg ),
|
||||
"lvs: %5i node: %5i farclip: %6.f",
|
||||
"lvs: %5i node: %5i\nfarclip: %6.f",
|
||||
r_mark_leaves,
|
||||
r_world_node,
|
||||
RI.farClip
|
||||
|
@ -428,7 +428,7 @@ void R_BackendEndFrame( void )
|
|||
break;
|
||||
case 3:
|
||||
com.snprintf( r_speeds_msg, sizeof( r_speeds_msg ),
|
||||
"polys\\ents: %5i\\%5i sort\\draw: %5i\\%i",
|
||||
"polys\\ents: %5i\\%5i\nsort\\draw: %5i\\%i",
|
||||
r_add_polys, r_add_entities,
|
||||
r_sort_meshes, r_draw_meshes
|
||||
);
|
||||
|
@ -449,7 +449,7 @@ void R_BackendEndFrame( void )
|
|||
break;
|
||||
case 5:
|
||||
com.snprintf( r_speeds_msg, sizeof( r_speeds_msg ),
|
||||
"%.1f %.1f %.1f (%.1f,%.1f,%.1f)",
|
||||
"%.1f %.1f %.1f\n(%.1f,%.1f,%.1f)",
|
||||
RI.refdef.vieworg[0], RI.refdef.vieworg[1], RI.refdef.vieworg[2],
|
||||
RI.refdef.viewangles[0], RI.refdef.viewangles[1], RI.refdef.viewangles[2]
|
||||
);
|
||||
|
@ -2976,15 +2976,14 @@ R_SetColorForOutlines
|
|||
*/
|
||||
static _inline void R_SetColorForOutlines( void )
|
||||
{
|
||||
int type = r_currentMeshBuffer->sortkey & 3;
|
||||
int type = r_currentMeshBuffer->sortkey & 3;
|
||||
|
||||
switch( type )
|
||||
{
|
||||
case MB_MODEL:
|
||||
if( r_currentMeshBuffer->infokey < 0 )
|
||||
pglColor4fv( colorRed );
|
||||
else
|
||||
pglColor4fv( colorWhite );
|
||||
else pglColor4fv( colorWhite );
|
||||
break;
|
||||
case MB_SPRITE:
|
||||
pglColor4fv( colorBlue );
|
||||
|
@ -3017,7 +3016,7 @@ R_DrawNormals
|
|||
*/
|
||||
static void R_DrawNormals( void )
|
||||
{
|
||||
unsigned int i;
|
||||
uint i;
|
||||
|
||||
if( r_shownormals->integer == 2 )
|
||||
R_SetColorForOutlines();
|
||||
|
@ -3062,9 +3061,14 @@ void R_DrawPhysDebug( void )
|
|||
if( r_physbdebug->integer )
|
||||
{
|
||||
// physic debug
|
||||
pglDisable( GL_TEXTURE_2D );
|
||||
GL_SetState( GLSTATE_SRCBLEND_SRC_ALPHA|GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA );
|
||||
|
||||
GL_LoadMatrix( RI.worldviewMatrix );
|
||||
pglBegin( GL_LINES );
|
||||
ri.ShowCollision( R_DrawLine );
|
||||
|
||||
pglEnd();
|
||||
pglEnable( GL_TEXTURE_2D );
|
||||
}
|
||||
}
|
|
@ -300,9 +300,9 @@ void R_LightForOrigin( const vec3_t origin, vec3_t dir, vec4_t ambient, vec4_t d
|
|||
{
|
||||
int i, j;
|
||||
int k, s;
|
||||
int vi[3], elem[4];
|
||||
float dot, t[8];
|
||||
vec3_t vf, vf2, tdir;
|
||||
int vi[3], elem[4];
|
||||
vec3_t ambientLocal, diffuseLocal;
|
||||
vec_t *gridSize, *gridMins;
|
||||
int *gridBounds;
|
||||
|
@ -337,7 +337,7 @@ void R_LightForOrigin( const vec3_t origin, vec3_t dir, vec4_t ambient, vec4_t d
|
|||
|
||||
for( i = 0; i < 4; i++ )
|
||||
{
|
||||
if( elem[i] < 0 || elem[i] >= ( r_worldbrushmodel->numlightarrayelems-1 ) )
|
||||
if( elem[i] < 0 || elem[i] >= ( r_worldbrushmodel->numlightarrayelems - 1 ))
|
||||
{
|
||||
VectorSet( dir, 0.5f, 0.2f, -1.0f );
|
||||
goto dynamic;
|
||||
|
|
200
render/r_local.h
200
render/r_local.h
|
@ -36,7 +36,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
# define ALIGN(x)
|
||||
#endif
|
||||
|
||||
#include "r_public.h"
|
||||
#include "r_opengl.h"
|
||||
|
||||
extern stdlib_api_t com; // engine toolbox
|
||||
|
@ -45,9 +44,9 @@ extern byte *r_temppool;
|
|||
#define Host_Error com.error
|
||||
|
||||
typedef unsigned int elem_t;
|
||||
typedef enum { RT_MODEL, RT_SPRITE, RT_PORTALSURFACE, NUM_RTYPES } refEntityType_t;
|
||||
|
||||
/*
|
||||
|
||||
skins will be outline flood filled and mip mapped
|
||||
pics and sprites with alpha will be outline flood filled
|
||||
pic won't be mip mapped
|
||||
|
@ -130,6 +129,10 @@ enum
|
|||
#define SHADOW_PLANAR 1
|
||||
#define SHADOW_MAPPING 2
|
||||
|
||||
#define MAX_ENTITIES 2048
|
||||
#define MAX_POLY_VERTS 3000
|
||||
#define MAX_POLYS 2048
|
||||
|
||||
//===================================================================
|
||||
|
||||
#include "r_math.h"
|
||||
|
@ -196,6 +199,12 @@ typedef struct
|
|||
const ref_shader_t *shader;
|
||||
} dlight_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
float rgb[3]; // 0.0 - 2.0
|
||||
|
||||
} lightstyle_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int features;
|
||||
|
@ -205,6 +214,122 @@ typedef struct
|
|||
float stOffset[LM_STYLES][2];
|
||||
} superLightStyle_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
byte open; // 0 = mouth closed, 255 = mouth agape
|
||||
byte sndcount; // counter for running average
|
||||
int sndavg; // running average
|
||||
} mouth_t;
|
||||
|
||||
typedef struct latchedvars_s
|
||||
{
|
||||
float animtime; // ???
|
||||
float sequencetime;
|
||||
vec3_t origin; // edict->v.old_origin
|
||||
vec3_t angles;
|
||||
|
||||
vec3_t gaitorigin;
|
||||
int sequence; // ???
|
||||
float frame;
|
||||
} latchedvars_t;
|
||||
|
||||
typedef struct studiolatched_s
|
||||
{
|
||||
float blending[MAXSTUDIOBLENDS];
|
||||
float seqblending[MAXSTUDIOBLENDS];
|
||||
float controller[MAXSTUDIOCONTROLLERS];
|
||||
|
||||
} studiolatched_t;
|
||||
|
||||
typedef struct studiolight_s
|
||||
{
|
||||
vec3_t lightvec; // light vector
|
||||
vec4_t lightcolor; // ambient light color
|
||||
vec4_t lightdiffuse; // diffuse light color
|
||||
|
||||
vec3_t bonelightvec[MAXSTUDIOBONES]; // ambient lightvectors per bone
|
||||
vec3_t dynlightcolor[MAX_DLIGHTS]; // ambient dynamic light colors
|
||||
vec3_t dynlightvec[MAX_DLIGHTS][MAXSTUDIOBONES];
|
||||
int numdynlights;
|
||||
} studiolight_t;
|
||||
|
||||
typedef struct studiovars_s
|
||||
{
|
||||
studiolatched_t prev;
|
||||
|
||||
mouth_t mouth; // for synchronizing mouth movements.
|
||||
float blending[MAXSTUDIOBLENDS];
|
||||
float controller[MAXSTUDIOCONTROLLERS];
|
||||
|
||||
// cached bones, valid only for current frame
|
||||
char bonenames[MAXSTUDIOBONES][32];// used for attached entities
|
||||
matrix4x4 *bonestransform;
|
||||
int numbones;
|
||||
|
||||
// StudioBoneLighting (fast but ugly)
|
||||
studiolight_t *light; // FIXME: alloc match size not maximum
|
||||
} studiovars_t;
|
||||
|
||||
typedef struct ref_entity_s
|
||||
{
|
||||
edtype_t ent_type; // entity type
|
||||
uint m_nCachedFrameCount;// keep current render frame
|
||||
int index; // viewmodel has entindex -1
|
||||
refEntityType_t rtype;
|
||||
|
||||
struct ref_model_s *model; // opaque type outside refresh
|
||||
struct ref_model_s *weaponmodel; // opaque type outside refresh
|
||||
|
||||
latchedvars_t prev; // previous frame values for lerping
|
||||
|
||||
float framerate; // custom framerate
|
||||
float animtime; // lerping animtime
|
||||
float frame; // also used as RF_BEAM's diameter
|
||||
|
||||
int body;
|
||||
int skin;
|
||||
|
||||
int movetype; // entity moving type
|
||||
int sequence;
|
||||
float scale;
|
||||
|
||||
void *extradata; // studiomodel bones, etc
|
||||
|
||||
// misc
|
||||
float backlerp; // 0.0 = current, 1.0 = old
|
||||
rgb_t rendercolor; // hl1 rendercolor
|
||||
byte 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 flags; // q1 effect flags, EF_ROTATE, EF_DIMLIGHT etc
|
||||
|
||||
// EF_ANIMATE stuff
|
||||
int m_fSequenceLoops;
|
||||
int m_fSequenceFinished;
|
||||
|
||||
// client gait sequence (local stuff)
|
||||
int gaitsequence; // client->sequence + yaw
|
||||
float gaitframe; // client->frame + yaw
|
||||
float gaityaw; // local value
|
||||
|
||||
// most recent data
|
||||
vec3_t axis[3];
|
||||
vec3_t angles;
|
||||
vec3_t movedir; // forward vector that computed on a server
|
||||
vec3_t origin, origin2;
|
||||
vec3_t lightingOrigin;
|
||||
|
||||
// RT_SPRITE stuff
|
||||
struct ref_shader_s *spriteshader; // client drawing stuff
|
||||
float radius; // used as RT_SPRITE's radius
|
||||
|
||||
// outilne stuff
|
||||
float outlineHeight;
|
||||
rgba_t outlineColor;
|
||||
|
||||
} ref_entity_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int params; // rendering parameters
|
||||
|
@ -435,11 +560,9 @@ void NormToLatLong( const vec3_t normal, byte latlong[2] );
|
|||
//
|
||||
// r_alias.c
|
||||
//
|
||||
bool R_CullAliasModel( ref_entity_t *e );
|
||||
bool R_CullAliasModel( ref_entity_t *e );
|
||||
void R_AddAliasModelToList( ref_entity_t *e );
|
||||
void R_DrawAliasModel( const meshbuffer_t *mb );
|
||||
bool R_AliasModelLerpTag( orientation_t *orient, maliasmodel_t *aliasmodel, int framenum, int oldframenum,
|
||||
float lerpfrac, const char *name );
|
||||
float R_AliasModelBBox( ref_entity_t *e, vec3_t mins, vec3_t maxs );
|
||||
|
||||
//
|
||||
|
@ -527,6 +650,9 @@ void R_ShowTextures( void );
|
|||
texture_t *R_LoadTexture( const char *name, rgbdata_t *pic, int samples, texFlags_t flags );
|
||||
texture_t *R_FindTexture( const char *name, const byte *buf, size_t size, texFlags_t flags );
|
||||
|
||||
bool VID_ScreenShot( const char *filename, bool levelshot );
|
||||
bool VID_CubemapShot( const char *base, uint size, bool skyshot );
|
||||
|
||||
//
|
||||
// r_light.c
|
||||
//
|
||||
|
@ -536,33 +662,34 @@ texture_t *R_FindTexture( const char *name, const byte *buf, size_t size, texFl
|
|||
extern int r_numSuperLightStyles;
|
||||
extern superLightStyle_t r_superLightStyles[MAX_SUPER_STYLES];
|
||||
|
||||
void R_LightBounds( const vec3_t origin, float intensity, vec3_t mins, vec3_t maxs );
|
||||
void R_LightBounds( const vec3_t origin, float intensity, vec3_t mins, vec3_t maxs );
|
||||
bool R_SurfPotentiallyLit( msurface_t *surf );
|
||||
unsigned int R_AddSurfDlighbits( msurface_t *surf, unsigned int dlightbits );
|
||||
void R_AddDynamicLights( unsigned int dlightbits, int state );
|
||||
void R_LightForEntity( ref_entity_t *e, byte *bArray );
|
||||
void R_LightForOrigin( const vec3_t origin, vec3_t dir, vec4_t ambient, vec4_t diffuse, float radius );
|
||||
void R_BuildLightmaps( int numLightmaps, int w, int h, const byte *data, mlightmapRect_t *rects );
|
||||
void R_InitLightStyles( void );
|
||||
int R_AddSuperLightStyle( const int *lightmaps, const byte *lightmapStyles, const byte *vertexStyles,
|
||||
uint R_AddSurfDlighbits( msurface_t *surf, unsigned int dlightbits );
|
||||
void R_AddDynamicLights( unsigned int dlightbits, int state );
|
||||
void R_LightForEntity( ref_entity_t *e, byte *bArray );
|
||||
void R_LightForOrigin( const vec3_t origin, vec3_t dir, vec4_t ambient, vec4_t diffuse, float radius );
|
||||
void R_BuildLightmaps( int numLightmaps, int w, int h, const byte *data, mlightmapRect_t *rects );
|
||||
void R_InitLightStyles( void );
|
||||
int R_AddSuperLightStyle( const int *lightmaps, const byte *lightmapStyles, const byte *vertexStyles,
|
||||
mlightmapRect_t **lmRects );
|
||||
void R_SortSuperLightStyles( void );
|
||||
void R_SortSuperLightStyles( void );
|
||||
|
||||
void R_InitCoronas( void );
|
||||
void R_DrawCoronas( void );
|
||||
void R_InitCoronas( void );
|
||||
void R_DrawCoronas( void );
|
||||
|
||||
//
|
||||
// r_main.c
|
||||
//
|
||||
void GL_Cull( int cull );
|
||||
void GL_SetState( int state );
|
||||
void GL_FrontFace( int front );
|
||||
void R_Set2DMode( bool enable );
|
||||
void GL_Cull( int cull );
|
||||
void GL_SetState( int state );
|
||||
void GL_FrontFace( int front );
|
||||
void R_Set2DMode( bool enable );
|
||||
|
||||
void R_BeginFrame( void );
|
||||
void R_EndFrame( void );
|
||||
void R_RenderView( const ref_params_t *fd );
|
||||
const char *R_SpeedsMessage( char *out, size_t size );
|
||||
void R_BeginFrame( void );
|
||||
void R_EndFrame( void );
|
||||
void R_RenderScene( const ref_params_t *fd );
|
||||
void R_RenderView( const ref_params_t *fd );
|
||||
void R_ClearScene( void );
|
||||
|
||||
bool R_CullBox( const vec3_t mins, const vec3_t maxs, const uint clipflags );
|
||||
bool R_CullSphere( const vec3_t centre, const float radius, const uint clipflags );
|
||||
|
@ -573,12 +700,12 @@ int R_CullModel( ref_entity_t *e, vec3_t mins, vec3_t maxs, float radius );
|
|||
mfog_t *R_FogForSphere( const vec3_t centre, const float radius );
|
||||
bool R_CompletelyFogged( mfog_t *fog, vec3_t origin, float radius );
|
||||
|
||||
void R_LoadIdentity( void );
|
||||
void R_RotateForEntity( ref_entity_t *e );
|
||||
void R_TranslateForEntity( ref_entity_t *e );
|
||||
void R_TransformToScreen_Vec3( vec3_t in, vec3_t out );
|
||||
void R_TransformVectorToScreen( const ref_params_t *rd, const vec3_t in, vec2_t out );
|
||||
void R_TransformEntityBBox( ref_entity_t *e, vec3_t mins, vec3_t maxs, vec3_t bbox[8], bool local );
|
||||
void R_LoadIdentity( void );
|
||||
void R_RotateForEntity( ref_entity_t *e );
|
||||
void R_TranslateForEntity( ref_entity_t *e );
|
||||
bool R_TransformToScreen_Vec3( const vec3_t in, vec3_t out );
|
||||
void R_TransformVectorToScreen( const ref_params_t *rd, const vec3_t in, vec2_t out );
|
||||
void R_TransformEntityBBox( ref_entity_t *e, vec3_t mins, vec3_t maxs, vec3_t bbox[8], bool local );
|
||||
|
||||
bool R_SpriteOverflow( void );
|
||||
bool R_PushSpriteModel( const meshbuffer_t *mb );
|
||||
|
@ -693,13 +820,17 @@ mspriteframe_t *R_GetSpriteFrame( ref_entity_t *ent );
|
|||
//
|
||||
// r_studio.c
|
||||
//
|
||||
extern byte *studiopool;
|
||||
|
||||
void R_AddStudioModelToList( ref_entity_t *e );
|
||||
void R_DrawStudioModel( const meshbuffer_t *mb );
|
||||
void R_StudioResetSequenceInfo( ref_entity_t *ent );
|
||||
float R_StudioFrameAdvance( ref_entity_t *ent, float flInterval );
|
||||
void R_StudioModelBBox( ref_entity_t *e, vec3_t mins, vec3_t maxs );
|
||||
bool R_CullStudioModel( ref_entity_t *e );
|
||||
void R_StudioDrawDebug( void );
|
||||
void R_StudioInit( void );
|
||||
void R_StudioNewMap( void );
|
||||
void R_StudioShutdown( void );
|
||||
|
||||
//
|
||||
|
@ -731,15 +862,6 @@ void R_ClearSurfOcclusionQueryKeys( void );
|
|||
int R_SurfOcclusionQueryKey( ref_entity_t *e, msurface_t *surf );
|
||||
void R_SurfIssueOcclusionQueries( void );
|
||||
|
||||
//
|
||||
// r_skin.c
|
||||
//
|
||||
void R_InitSkinFiles( void );
|
||||
void R_ShutdownSkinFiles( void );
|
||||
struct skinfile_s *R_SkinFile_Load( const char *name );
|
||||
struct skinfile_s *R_RegisterSkinFile( const char *name );
|
||||
ref_shader_t *R_FindShaderForSkinFile( const struct skinfile_s *skinfile, const char *meshname );
|
||||
|
||||
//
|
||||
// r_sky.c
|
||||
//
|
||||
|
|
112
render/r_main.c
112
render/r_main.c
|
@ -426,7 +426,7 @@ R_InitCustomColors
|
|||
*/
|
||||
void R_InitCustomColors( void )
|
||||
{
|
||||
memset( r_customColors, 255, sizeof( r_customColors ) );
|
||||
Mem_Set( r_customColors, 255, sizeof( r_customColors ));
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -936,7 +936,7 @@ R_AddModelMeshOutline
|
|||
void R_AddModelMeshOutline( unsigned int modhandle, mfog_t *fog, int meshnum )
|
||||
{
|
||||
meshbuffer_t *mb = R_AddMeshToList( MB_MODEL, fog, r_outlineShader, -( meshnum+1 ) );
|
||||
if( mb ) mb->LODModelHandle = modhandle;
|
||||
if( mb ) mb->modhandle = modhandle;
|
||||
}
|
||||
//=======================================================================
|
||||
|
||||
|
@ -1327,11 +1327,11 @@ R_CullEntities
|
|||
*/
|
||||
static void R_CullEntities( void )
|
||||
{
|
||||
unsigned int i;
|
||||
ref_entity_t *e;
|
||||
bool culled;
|
||||
uint i;
|
||||
ref_entity_t *e;
|
||||
bool culled;
|
||||
|
||||
memset( r_entVisBits, 0, sizeof( r_entVisBits ) );
|
||||
Mem_Set( r_entVisBits, 0, sizeof( r_entVisBits ));
|
||||
if( !r_drawentities->integer )
|
||||
return;
|
||||
|
||||
|
@ -1695,6 +1695,8 @@ void R_RenderView( const ref_params_t *fd )
|
|||
|
||||
R_RenderDebugSurface ();
|
||||
|
||||
R_StudioDrawDebug ();
|
||||
|
||||
R_DrawPhysDebug ();
|
||||
|
||||
R_DrawNullEntities();
|
||||
|
@ -1964,11 +1966,13 @@ void R_EndFrame( void )
|
|||
R_SpeedsMessage
|
||||
===============
|
||||
*/
|
||||
const char *R_SpeedsMessage( char *out, size_t size )
|
||||
static bool R_SpeedsMessage( char *out, size_t size )
|
||||
{
|
||||
if( out )
|
||||
com.strncpy( out, r_speeds_msg, size );
|
||||
return out;
|
||||
if( r_speeds->integer <= 0 ) return false;
|
||||
if( !out || !size ) return false;
|
||||
|
||||
com.strncpy( out, r_speeds_msg, size );
|
||||
return true;
|
||||
}
|
||||
|
||||
//==================================================================================
|
||||
|
@ -1978,22 +1982,23 @@ const char *R_SpeedsMessage( char *out, size_t size )
|
|||
R_TransformToScreen_Vec3
|
||||
=============
|
||||
*/
|
||||
void R_TransformToScreen_Vec3( vec3_t in, vec3_t out )
|
||||
bool R_TransformToScreen_Vec3( const vec3_t in, vec3_t out )
|
||||
{
|
||||
vec4_t temp, temp2;
|
||||
vec4_t temp, temp2;
|
||||
|
||||
temp[0] = in[0];
|
||||
temp[1] = in[1];
|
||||
temp[2] = in[2];
|
||||
temp[3] = 1.0f;
|
||||
Matrix4x4_ConcatVector( RI.worldviewProjectionMatrix, temp, temp2 );
|
||||
|
||||
if( !temp2[3] )
|
||||
return;
|
||||
Matrix4x4_ConcatVector( RI.worldviewProjectionMatrix, temp, temp2 );
|
||||
if( !temp2[3] ) return true; // Z-clipped
|
||||
|
||||
out[0] = (temp2[0] / temp2[3] + 1.0f) * 0.5f * RI.refdef.viewport[2];
|
||||
out[1] = (temp2[1] / temp2[3] + 1.0f) * 0.5f * RI.refdef.viewport[3];
|
||||
out[2] = (temp2[2] / temp2[3] + 1.0f) * 0.5f;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2020,13 +2025,21 @@ void R_TransformVectorToScreen( const ref_params_t *rd, const vec3_t in, vec2_t
|
|||
Matrix4x4_ConcatVector( m, temp, temp2 );
|
||||
Matrix4x4_ConcatVector( p, temp2, temp );
|
||||
|
||||
if( !temp[3] )
|
||||
return;
|
||||
if( !temp[3] ) return;
|
||||
|
||||
out[0] = rd->viewport[0] + ( temp[0] / temp[3] + 1.0f ) * rd->viewport[2] * 0.5f;
|
||||
out[1] = rd->viewport[1] + ( temp[1] / temp[3] + 1.0f ) * rd->viewport[3] * 0.5f;
|
||||
}
|
||||
|
||||
static void R_ScreenToWorld( const float *screen, float *world )
|
||||
{
|
||||
// FIXME: implement
|
||||
}
|
||||
|
||||
static bool R_WorldToScreen( const float *world, float *screen )
|
||||
{
|
||||
return R_TransformToScreen_Vec3( world, screen );
|
||||
}
|
||||
//==================================================================================
|
||||
|
||||
/*
|
||||
|
@ -2222,18 +2235,62 @@ bool R_AddGenericEntity( edict_t *pRefEntity, ref_entity_t *refent, int ed_type,
|
|||
VectorNegate( refent->axis[1], refent->axis[1] );
|
||||
}
|
||||
|
||||
// copy controllers
|
||||
for( i = 0; i < MAXSTUDIOCONTROLLERS; i++ )
|
||||
if( refent->model->type == mod_studio )
|
||||
{
|
||||
refent->prev.controller[i] = refent->controller[i];
|
||||
refent->controller[i] = pRefEntity->v.controller[i];
|
||||
}
|
||||
studiovars_t *studio;
|
||||
int numbones = ((mstudiomodel_t *)refent->model->extradata)->phdr->numbones;
|
||||
|
||||
if( !refent->extradata )
|
||||
refent->extradata = (void *)Mem_Alloc( studiopool, sizeof( studiovars_t ));
|
||||
studio = (studiovars_t *)refent->extradata;
|
||||
|
||||
// copy blends
|
||||
for( i = 0; i < MAXSTUDIOBLENDS; i++ )
|
||||
// copy controllers
|
||||
for( i = 0; i < MAXSTUDIOCONTROLLERS; i++ )
|
||||
{
|
||||
studio->prev.controller[i] = studio->controller[i];
|
||||
studio->controller[i] = pRefEntity->v.controller[i];
|
||||
}
|
||||
|
||||
// copy blends
|
||||
for( i = 0; i < MAXSTUDIOBLENDS; i++ )
|
||||
{
|
||||
studio->prev.blending[i] = studio->blending[i];
|
||||
studio->blending[i] = pRefEntity->v.blending[i];
|
||||
}
|
||||
|
||||
if( !studio->bonestransform || studio->numbones != numbones )
|
||||
{
|
||||
size_t cache_size = sizeof( matrix4x4 ) * numbones;
|
||||
size_t names_size = numbones * 32; // bonename length
|
||||
|
||||
// allocate or merge bones cache
|
||||
studio->bonestransform = (matrix4x4 *)Mem_Realloc( studiopool, studio->bonestransform, cache_size );
|
||||
studio->numbones = numbones;
|
||||
}
|
||||
|
||||
if( r_studio_bonelighting->integer )
|
||||
{
|
||||
if( !studio->light )
|
||||
studio->light = Mem_Alloc( studiopool, sizeof( studiolight_t ));
|
||||
}
|
||||
else
|
||||
{
|
||||
if( studio->light ) Mem_Free( studio->light );
|
||||
studio->light = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
refent->prev.blending[i] = refent->blending[i];
|
||||
refent->blending[i] = pRefEntity->v.blending[i];
|
||||
// entity has changed model, so no reason to keep this data
|
||||
if( refent->extradata )
|
||||
{
|
||||
studiovars_t *studio = (studiovars_t *)refent->extradata;
|
||||
|
||||
if( studio->bonestransform ) Mem_Free( studio->bonestransform );
|
||||
if( studio->light ) Mem_Free( studio->light );
|
||||
Mem_Free( refent->extradata );
|
||||
}
|
||||
refent->extradata = NULL;
|
||||
}
|
||||
|
||||
if( refent->ent_type == ED_CLIENT )
|
||||
|
@ -2423,6 +2480,9 @@ render_exp_t DLLEXPORT *CreateAPI(stdlib_api_t *input, render_imp_t *engfuncs )
|
|||
re.DrawStretchRaw = R_DrawStretchRaw;
|
||||
re.DrawStretchPic = R_DrawStretchPic;
|
||||
re.GetFragments = R_GetClippedFragments;
|
||||
re.ScreenToWorld = R_ScreenToWorld;
|
||||
re.WorldToScreen = R_WorldToScreen;
|
||||
re.RSpeedsMessage = R_SpeedsMessage;
|
||||
|
||||
return &re;
|
||||
}
|
|
@ -394,8 +394,7 @@ void R_AddModelMeshToList( unsigned int modhandle, mfog_t *fog, ref_shader_t *sh
|
|||
meshbuffer_t *mb;
|
||||
|
||||
mb = R_AddMeshToList( MB_MODEL, fog, shader, -( meshnum+1 ) );
|
||||
if( mb )
|
||||
mb->LODModelHandle = modhandle;
|
||||
if( mb ) mb->modhandle = modhandle;
|
||||
|
||||
if( !GL_Support( R_SHADER_GLSL100_EXT ) && RI.currententity->outlineHeight/* && !(RI.params & RP_SHADOWMAPVIEW)*/ )
|
||||
{
|
||||
|
|
|
@ -89,7 +89,7 @@ typedef struct
|
|||
{
|
||||
int lastPoly;
|
||||
uint dlightbits;
|
||||
uint LODModelHandle;
|
||||
uint modhandle;
|
||||
};
|
||||
uint shadowbits;
|
||||
} meshbuffer_t;
|
||||
|
|
|
@ -400,6 +400,9 @@ mleaf_t *Mod_PointInLeaf( float *p, ref_model_t *model );
|
|||
byte *Mod_ClusterPVS( int cluster, ref_model_t *model );
|
||||
uint Mod_Handle( ref_model_t *mod );
|
||||
ref_model_t *Mod_ForHandle( unsigned int elem );
|
||||
ref_model_t *R_RegisterModel( const char *name );
|
||||
void R_BeginRegistration( const char *model, const dvis_t *visData );
|
||||
void R_EndRegistration( const char *skyname );
|
||||
|
||||
#define Mod_Malloc( mod, size ) Mem_Alloc(( mod )->mempool, size )
|
||||
#define Mod_Realloc( mod, data, size ) Mem_Realloc(( mod )->mempool, data, size )
|
||||
|
|
|
@ -21,151 +21,5 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#define __R_PUBLIC_H__
|
||||
|
||||
// FIXME: move these to r_local.h?
|
||||
#define MAX_SKINFILES 256
|
||||
#define MAX_ENTITIES 2048
|
||||
#define MAX_POLY_VERTS 3000
|
||||
#define MAX_POLYS 2048
|
||||
|
||||
typedef struct
|
||||
{
|
||||
vec3_t axis[3];
|
||||
vec3_t origin;
|
||||
} orientation_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
float rgb[3]; // 0.0 - 2.0
|
||||
} lightstyle_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
RT_MODEL,
|
||||
RT_SPRITE,
|
||||
RT_PORTALSURFACE,
|
||||
|
||||
NUM_RTYPES
|
||||
} refEntityType_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
byte open; // 0 = mouth closed, 255 = mouth agape
|
||||
byte sndcount; // counter for running average
|
||||
int sndavg; // running average
|
||||
} mouth_t;
|
||||
|
||||
typedef struct latchedvars_s
|
||||
{
|
||||
float animtime; // ???
|
||||
float sequencetime;
|
||||
vec3_t origin; // edict->v.old_origin
|
||||
vec3_t angles;
|
||||
|
||||
vec3_t gaitorigin;
|
||||
int sequence; // ???
|
||||
float frame;
|
||||
|
||||
float blending[MAXSTUDIOBLENDS];
|
||||
float seqblending[MAXSTUDIOBLENDS];
|
||||
float controller[MAXSTUDIOCONTROLLERS];
|
||||
|
||||
} latchedvars_t;
|
||||
|
||||
typedef struct entity_s
|
||||
{
|
||||
edtype_t ent_type; // entity type
|
||||
uint renderframe; // keep current render frame
|
||||
int index; // viewmodel has entindex -1
|
||||
refEntityType_t rtype;
|
||||
|
||||
struct ref_model_s *model; // opaque type outside refresh
|
||||
struct ref_model_s *weaponmodel; // opaque type outside refresh
|
||||
struct skinfile_s *skinfile; // registered .skin file
|
||||
|
||||
latchedvars_t prev; // previous frame values for lerping
|
||||
|
||||
float framerate; // custom framerate
|
||||
float animtime; // lerping animtime
|
||||
float frame; // also used as RF_BEAM's diameter
|
||||
|
||||
int body;
|
||||
int skin;
|
||||
|
||||
float blending[MAXSTUDIOBLENDS];
|
||||
vec3_t attachment[MAXSTUDIOATTACHMENTS];
|
||||
float controller[MAXSTUDIOCONTROLLERS];
|
||||
mouth_t mouth; // for synchronizing mouth movements.
|
||||
|
||||
int gaitsequence; // client->sequence + yaw
|
||||
float gaitframe; // client->frame + yaw
|
||||
float gaityaw; // local value
|
||||
|
||||
int movetype; // entity moving type
|
||||
int sequence;
|
||||
float scale;
|
||||
|
||||
// misc
|
||||
float backlerp; // 0.0 = current, 1.0 = old
|
||||
rgb_t rendercolor; // hl1 rendercolor
|
||||
byte 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 flags; // q1 effect flags, EF_ROTATE, EF_DIMLIGHT etc
|
||||
|
||||
int m_fSequenceLoops;
|
||||
int m_fSequenceFinished;
|
||||
|
||||
/*
|
||||
** most recent data
|
||||
*/
|
||||
vec3_t axis[3];
|
||||
vec3_t angles;
|
||||
vec3_t movedir; // forward vector that computed on a server
|
||||
vec3_t origin, origin2;
|
||||
vec3_t lightingOrigin;
|
||||
|
||||
// RT_SPRITE stuff
|
||||
struct ref_shader_s *spriteshader; // client drawing stuff
|
||||
float radius; // used as RT_SPRITE's radius
|
||||
|
||||
// outilne stuff
|
||||
float outlineHeight;
|
||||
rgba_t outlineColor;
|
||||
|
||||
} ref_entity_t;
|
||||
|
||||
void R_ModelBounds( const struct ref_model_s *model, vec3_t mins, vec3_t maxs );
|
||||
|
||||
struct ref_model_s *R_RegisterModel( const char *name );
|
||||
struct skinfile_s *R_RegisterSkinFile( const char *name );
|
||||
|
||||
void R_ClearScene( void );
|
||||
void R_AddLightToScene( const vec3_t org, float intensity, float r, float g, float b, const struct ref_shader_s *shader );
|
||||
bool R_AddPolyToScene( const poly_t *poly );
|
||||
void R_AddLightStyleToScene( int style, float r, float g, float b );
|
||||
void R_DrawStretchPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, shader_t shader );
|
||||
void R_DrawStretchRaw( int x, int y, int w, int h, int cols, int rows, const byte *data, bool redraw );
|
||||
void R_SetCustomColor( int num, int r, int g, int b );
|
||||
void R_LightForOrigin( const vec3_t origin, vec3_t dir, vec4_t ambient, vec4_t diffuse, float radius );
|
||||
int R_GetClippedFragments( const vec3_t origin, float radius, vec3_t axis[3], int maxfverts, vec3_t *fverts,
|
||||
int maxfragments, fragment_t *fragments );
|
||||
|
||||
void R_TransformVectorToScreen( const ref_params_t *rd, const vec3_t in, vec2_t out );
|
||||
const char *R_SpeedsMessage( char *out, size_t size );
|
||||
|
||||
// Xash renderer exports
|
||||
bool R_Init( bool full );
|
||||
void R_Shutdown( bool full );
|
||||
void R_BeginRegistration( const char *model, const dvis_t *visData );
|
||||
shader_t Mod_RegisterShader( const char *name, int shaderType );
|
||||
void R_EndRegistration( const char *skyname );
|
||||
void R_BeginFrame( void );
|
||||
void R_RenderScene( const ref_params_t *fd );
|
||||
void R_EndFrame( void );
|
||||
|
||||
bool R_AddEntityToScene( edict_t *pRefEntity, int ed_type, float lerp );
|
||||
bool VID_ScreenShot( const char *filename, bool levelshot );
|
||||
bool VID_CubemapShot( const char *base, uint size, bool skyshot );
|
||||
|
||||
|
||||
#endif /*__R_PUBLIC_H__*/
|
||||
#endif // __R_PUBLIC_H__
|
|
@ -511,7 +511,7 @@ void GL_InitCommands( void )
|
|||
r_novis = Cvar_Get( "r_novis", "0", 0, "ignore vis information (perfomance test)" );
|
||||
r_nocull = Cvar_Get( "r_nocull", "0", 0, "ignore frustrum culling (perfomance test)" );
|
||||
r_lerpmodels = Cvar_Get( "r_lerpmodels", "1", 0, "use lerping for alias and studio models" );
|
||||
r_speeds = Cvar_Get( "r_speeds", "0", 0, "shows r_speeds" );
|
||||
r_speeds = Cvar_Get( "r_speeds", "0", CVAR_ARCHIVE, "shows r_speeds" );
|
||||
r_drawelements = Cvar_Get( "r_drawelements", "1", 0, "use gldrawElements or glDrawRangeElements" );
|
||||
r_showtris = Cvar_Get( "r_showtris", "0", CVAR_CHEAT, "show mesh triangles" );
|
||||
r_lockpvs = Cvar_Get( "r_lockpvs", "0", CVAR_CHEAT, "lockpvs area at current point (pvs test)" );
|
||||
|
@ -1015,6 +1015,9 @@ void GL_InitExtensions( void )
|
|||
|
||||
Cvar_Set( "r_anisotropy", va( "%f", bound( 0, gl_texture_anisotropy->value, glConfig.max_texture_anisotropy )));
|
||||
|
||||
// software mipmap generator does wrong result with NPOT textures ...
|
||||
if( !GL_Support( R_SGIS_MIPMAPS_EXT )) GL_SetExtension( R_ARB_TEXTURE_NPOT_EXT, false );
|
||||
|
||||
if( GL_Support( R_TEXTURE_COMPRESSION_EXT )) flags |= IL_DDS_HARDWARE;
|
||||
flags |= IL_USE_LERPING|IL_ALLOW_OVERWRITE;
|
||||
|
||||
|
@ -1040,7 +1043,6 @@ static void R_InitMedia( void )
|
|||
R_InitCinematics ();
|
||||
R_InitShaders();
|
||||
R_InitModels();
|
||||
R_InitSkinFiles();
|
||||
R_InitCoronas();
|
||||
R_InitShadows();
|
||||
R_InitOcclusionQueries();
|
||||
|
@ -1066,7 +1068,6 @@ static void R_FreeMedia( void )
|
|||
|
||||
R_ShutdownOcclusionQueries();
|
||||
R_ShutdownShadows();
|
||||
R_ShutdownSkinFiles();
|
||||
R_ShutdownModels();
|
||||
R_ShutdownShaders();
|
||||
R_ShutdownCinematics ();
|
||||
|
@ -1143,6 +1144,7 @@ void R_NewMap( void )
|
|||
R_InitLightStyles(); // clear lightstyles
|
||||
R_InitCustomColors(); // clear custom colors
|
||||
R_InitCoronas(); // update corona shader (because we can't make it static)
|
||||
R_StudioNewMap (); // free boneposes
|
||||
|
||||
GL_SetDefaultTexState ();
|
||||
Mem_Set( &RI, 0, sizeof( refinst_t ));
|
||||
|
|
|
@ -43,14 +43,14 @@ extern int r_entShadowBits[MAX_ENTITIES];
|
|||
void R_InitShadows( void );
|
||||
void R_ShutdownShadows( void );
|
||||
|
||||
bool R_CullPlanarShadow( ref_entity_t *e, vec3_t mins, vec3_t maxs, bool occclusionQuery );
|
||||
bool R_CullPlanarShadow( struct ref_entity_s *e, vec3_t mins, vec3_t maxs, bool occclusionQuery );
|
||||
void R_DeformVPlanarShadow( int numV, float *v );
|
||||
void R_PlanarShadowPass( int state );
|
||||
ref_shader_t *R_PlanarShadowShader( void );
|
||||
|
||||
void R_ClearShadowmaps( void );
|
||||
void R_GroupShadowCasters( void );
|
||||
bool R_AddShadowCaster( ref_entity_t *ent );
|
||||
bool R_AddShadowCaster( struct ref_entity_s *ent );
|
||||
void R_CullShadowmapGroups( void );
|
||||
void R_DrawShadowmaps( void );
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -190,10 +190,6 @@ SOURCE=.\r_shadow.c
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\r_skin.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\r_sky.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
|
|
@ -3,56 +3,55 @@
|
|||
<pre>
|
||||
<h1>Build Log</h1>
|
||||
<h3>
|
||||
--------------------Configuration: render - Win32 Debug--------------------
|
||||
--------------------Configuration: render - Win32 Release--------------------
|
||||
</h3>
|
||||
<h3>Command Lines</h3>
|
||||
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP213C.tmp" with contents
|
||||
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP2CB1.tmp" with contents
|
||||
[
|
||||
/nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "../public" /I "../common" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR"..\temp\render\!debug/" /Fo"..\temp\render\!debug/" /Fd"..\temp\render\!debug/" /FD /c
|
||||
/nologo /MD /W3 /GX /O2 /I "../public" /I "../common" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /Fo"..\temp\render\!release/" /Fd"..\temp\render\!release/" /FD /c
|
||||
"D:\Xash3D\src_main\render\r_studio.c"
|
||||
]
|
||||
Creating command line "cl.exe @C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP213C.tmp"
|
||||
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP213D.tmp" with contents
|
||||
Creating command line "cl.exe @C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP2CB1.tmp"
|
||||
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP2CB2.tmp" with contents
|
||||
[
|
||||
msvcrtd.lib user32.lib gdi32.lib /nologo /subsystem:windows /dll /incremental:yes /pdb:"..\temp\render\!debug/render.pdb" /debug /machine:I386 /nodefaultlib:"msvcrt.lib" /out:"..\temp\render\!debug/render.dll" /implib:"..\temp\render\!debug/render.lib" /pdbtype:sept
|
||||
"\Xash3D\src_main\temp\render\!debug\cin.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_aliasq.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_backend.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_bloom.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_cin.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_cull.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_draw.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_image.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_light.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_main.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_math.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_mesh.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_model.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_opengl.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_poly.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_program.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_register.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_shader.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_shadow.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_skin.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_sky.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_sprite.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_studio.obj"
|
||||
"\Xash3D\src_main\temp\render\!debug\r_surf.obj"
|
||||
msvcrt.lib user32.lib gdi32.lib /nologo /subsystem:windows /dll /pdb:none /machine:I386 /nodefaultlib:"libc.lib" /out:"..\temp\render\!release/render.dll" /implib:"..\temp\render\!release/render.lib" /libpath:"../public/libs/"
|
||||
"\Xash3D\src_main\temp\render\!release\cin.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_aliasq.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_backend.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_bloom.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_cin.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_cull.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_draw.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_image.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_light.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_main.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_math.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_mesh.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_model.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_opengl.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_poly.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_program.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_register.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_shader.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_shadow.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_sky.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_sprite.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_studio.obj"
|
||||
"\Xash3D\src_main\temp\render\!release\r_surf.obj"
|
||||
]
|
||||
Creating command line "link.exe @C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP213D.tmp"
|
||||
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP213E.bat" with contents
|
||||
Creating command line "link.exe @C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP2CB2.tmp"
|
||||
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP2CB3.bat" with contents
|
||||
[
|
||||
@echo off
|
||||
copy \Xash3D\src_main\temp\render\!debug\render.dll "D:\Xash3D\bin\render.dll"
|
||||
copy \Xash3D\src_main\temp\render\!release\render.dll "D:\Xash3D\bin\render.dll"
|
||||
]
|
||||
Creating command line "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP213E.bat"
|
||||
Creating command line "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP2CB3.bat"
|
||||
Compiling...
|
||||
r_studio.c
|
||||
Linking...
|
||||
Creating library ..\temp\render\!debug/render.lib and object ..\temp\render\!debug/render.exp
|
||||
Creating library ..\temp\render\!release/render.lib and object ..\temp\render\!release/render.exp
|
||||
<h3>Output Window</h3>
|
||||
Performing Custom Build Step on \Xash3D\src_main\temp\render\!debug\render.dll
|
||||
Performing Custom Build Step on \Xash3D\src_main\temp\render\!release\render.dll
|
||||
‘ª®¯¨à®¢ ® ä ©«®¢: 1.
|
||||
|
||||
|
||||
|
|
7
todo.log
7
todo.log
|
@ -132,7 +132,6 @@ Beta 13.12.09
|
|||
108. prepare QuArK to Xash-ready OK
|
||||
109. implement q1 models instead of q3 models OK
|
||||
110. loading textures for q1 models OK
|
||||
111. implement SSE_Transform if possible
|
||||
112. finalize alias models
|
||||
113. clean up renderer sources
|
||||
114. reorganize MathLib.
|
||||
111. finalize alias models
|
||||
112. clean up renderer sources
|
||||
113. fixup debug tools OK
|
||||
|
|
Reference in New Issue