03 Sep 2009

This commit is contained in:
g-cont 2009-09-03 00:00:00 +04:00 committed by Alibek Omarov
parent d71ae7d5a6
commit b2a84e1e9e
10 changed files with 2463 additions and 272 deletions

16
launch/launch.plg Normal file
View File

@ -0,0 +1,16 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: launch - Win32 Release--------------------
</h3>
<h3>Command Lines</h3>
<h3>Results</h3>
launch.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@ -789,7 +789,7 @@ bool R_GetPixelFormat( const char *name, rgbdata_t *pic, uint tex_flags )
int w, h, d, i, s, BlockSize;
size_t mipsize, totalsize = 0;
if( !pic || !pic->buffer ) return false;
if( !pic ) return false; // pass images with NULL buffer (e.g. shadowmaps, portalmaps )
Mem_EmptyPool( r_imagepool ); // flush buffers
Mem_Set( &image_desc, 0, sizeof( image_desc ));
@ -3544,17 +3544,17 @@ static void R_InitScreenTexture( texture_t **ptr, const char *name, int id, int
if( !*ptr )
{
string name;
string uploadName;
com.snprintf( name, sizeof( name ), "***%s%i***", name, id );
com.snprintf( uploadName, sizeof( uploadName ), "***%s%i***", name, id );
r_screen.width = width;
r_screen.height = height;
r_screen.type = PF_RGB_24;
r_screen.type = PF_LUMINANCE;
r_screen.buffer = data;
r_screen.depth = r_screen.numMips = 1;
r_screen.size = width * height * samples;
*ptr = R_LoadTexture( name, &r_screen, samples, flags );
*ptr = R_LoadTexture( uploadName, &r_screen, samples, flags );
return;
}

View File

@ -253,6 +253,15 @@ typedef struct studiolight_s
int numdynlights;
} studiolight_t;
typedef struct studioverts_s
{
vec3_t *verts;
vec3_t *norms;
int numverts;
int numnorms;
int m_nCachedFrame; // to avoid transform it twice
} studioverts_t;
typedef struct studiovars_s
{
studiolatched_t prev;
@ -266,8 +275,10 @@ typedef struct studiovars_s
matrix4x4 *bonestransform;
int numbones;
// StudioBoneLighting (fast but ugly)
// StudioBoneLighting (slow and ugly)
studiolight_t *light; // FIXME: alloc match size not maximum
studioverts_t *mesh[MAXSTUDIOMODELS];
int num_models;
} studiovars_t;
typedef struct ref_entity_s

View File

@ -2152,8 +2152,8 @@ bool R_AddGenericEntity( edict_t *pRefEntity, ref_entity_t *refent, int ed_type,
// setup light origin
if( refent->model ) VectorAverage( refent->model->mins, refent->model->maxs, center );
else VectorClear( center );
VectorAdd( pRefEntity->v.origin, center, refent->lightingOrigin );
if( refent->flags & EF_INVLIGHT ) refent->lightingOrigin[2] += center[2];
VectorCopy( pRefEntity->v.origin, refent->lightingOrigin );
if( refent->ent_type == ED_CLIENT ) refent->lightingOrigin[2] -= 32;
// do animate
if( refent->flags & EF_ANIMATE )
@ -2288,6 +2288,15 @@ bool R_AddGenericEntity( edict_t *pRefEntity, ref_entity_t *refent, int ed_type,
if( studio->bonestransform ) Mem_Free( studio->bonestransform );
if( studio->light ) Mem_Free( studio->light );
for( i = 0; i < studio->num_models; i++ )
{
if( studio->mesh[i] )
{
if( studio->mesh[i]->verts ) Mem_Free( studio->mesh[i]->verts );
if( studio->mesh[i]->norms ) Mem_Free( studio->mesh[i]->norms );
Mem_Free( studio->mesh[i] );
}
}
Mem_Free( refent->extradata );
}
refent->extradata = NULL;

View File

@ -321,7 +321,7 @@ add:
VectorSubtract( group->mins, origin, mins );
VectorSubtract( group->maxs, origin, maxs );
radius = RadiusFromBounds( mins, maxs );
group->projDist = max( group->projDist, radius * ent->scale * 2 + min( r_shadows_projection_distance->value, 64 ) );
group->projDist = max( group->projDist, radius * ent->scale * 2 + min( r_shadows_projection_distance->value, 64 ));
return true;
}

View File

@ -1,215 +0,0 @@
/*
Copyright (C) 2002-2007 Victor Luchits
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "r_local.h"
#define SkinFile_CopyString( str ) com.stralloc( r_skinsPool, str, __FILE__, __LINE__ )
typedef struct
{
char *meshname;
ref_shader_t *shader;
} mesh_shader_pair_t;
typedef struct skinfile_s
{
char *name;
mesh_shader_pair_t *pairs;
int numpairs;
} skinfile_t;
static skinfile_t r_skinfiles[MAX_SKINFILES];
static byte *r_skinsPool;
/*
================
R_InitSkinFiles
================
*/
void R_InitSkinFiles( void )
{
r_skinsPool = Mem_AllocPool( "Skins" );
Mem_Set( r_skinfiles, 0, sizeof( r_skinfiles ));
}
/*
================
SkinFile_FreeSkinFile
================
*/
static void SkinFile_FreeSkinFile( skinfile_t *skinfile )
{
int i;
for( i = 0; i < skinfile->numpairs; i++ )
Mem_Free( skinfile->pairs[i].meshname );
Mem_Free( skinfile->pairs );
Mem_Free( skinfile->name );
Mem_Set( skinfile, 0, sizeof( skinfile_t ));
}
/*
================
R_FindShaderForSkinFile
================
*/
ref_shader_t *R_FindShaderForSkinFile( const skinfile_t *skinfile, const char *meshname )
{
int i;
mesh_shader_pair_t *pair;
if( !skinfile || !skinfile->numpairs )
return NULL;
for( i = 0, pair = skinfile->pairs; i < skinfile->numpairs; i++, pair++ )
{
if( !com.stricmp( pair->meshname, meshname ) )
return pair->shader;
}
return NULL;
}
/*
================
SkinFile_ParseBuffer
================
*/
static int SkinFile_ParseBuffer( char *buffer, mesh_shader_pair_t *pairs )
{
int numpairs;
string skinname;
string meshname;
script_t *script;
token_t tok;
script = Com_OpenScript( "skinfile", buffer, com.strlen( buffer ));
numpairs = 0;
while( 1 )
{
if( !Com_ReadToken( script, SC_ALLOW_NEWLINES, &tok )) // skip tag
break;
if( !com.strcmp( tok.string, "," ))
{
if( !Com_ReadToken( script, SC_ALLOW_PATHNAMES, &tok ))
continue; // tag without shadername
com.strncpy( skinname, tok.string, sizeof( skinname ));
FS_StripExtension( skinname );
}
else
{
com.strncpy( meshname, tok.string, sizeof( meshname ));
continue; // waiting for ','
}
if( pairs )
{
pairs[numpairs].meshname = SkinFile_CopyString( meshname );
pairs[numpairs].shader = R_LoadShader( skinname, SHADER_ALIAS_MD3, false, 0, SHADER_INVALID );
}
numpairs++;
}
Com_CloseScript( script );
return numpairs;
}
/*
================
R_RegisterSkinFile
================
*/
skinfile_t *R_RegisterSkinFile( const char *name )
{
string filename;
int i;
char *buffer;
skinfile_t *skinfile;
com.strncpy( filename, name, sizeof( filename ) );
FS_DefaultExtension( filename, ".skin" );
for( i = 0, skinfile = r_skinfiles; i < MAX_SKINFILES; i++, skinfile++ )
{
if( !skinfile->name )
break;
if( !com.stricmp( skinfile->name, filename ) )
return skinfile;
}
if( i == MAX_SKINFILES )
{
MsgDev( D_ERROR, "R_SkinFile_Load: Skin files limit exceeded\n" );
return NULL;
}
if((buffer = FS_LoadFile( filename, NULL )) == NULL )
{
MsgDev( D_WARN, "R_SkinFile_Load: Failed to load %s\n", name );
return NULL;
}
skinfile = &r_skinfiles[i];
skinfile->name = SkinFile_CopyString( filename );
skinfile->numpairs = SkinFile_ParseBuffer( buffer, NULL );
if( skinfile->numpairs )
{
skinfile->pairs = Mem_Alloc( r_skinsPool, skinfile->numpairs * sizeof( mesh_shader_pair_t ) );
SkinFile_ParseBuffer( buffer, skinfile->pairs );
}
else
{
MsgDev( D_WARN, "R_SkinFile_Load: no mesh/shader pairs in %s\n", name );
}
Mem_Free( buffer );
return skinfile;
}
/*
================
R_ShutdownSkinFiles
================
*/
void R_ShutdownSkinFiles( void )
{
int i;
skinfile_t *skinfile;
if( !r_skinsPool )
return;
for( i = 0, skinfile = r_skinfiles; i < MAX_SKINFILES; i++, skinfile++ )
{
if( !skinfile->name )
break;
if( skinfile->numpairs )
SkinFile_FreeSkinFile( skinfile );
Mem_Free( skinfile->name );
}
Mem_FreePool( &r_skinsPool );
}

View File

@ -97,6 +97,34 @@ void R_StudioShutdown( void )
MISC STUDIO UTILS
====================
*/
/*
====================
StudioSetupRender
====================
*/
static void R_StudioSetupRender( ref_entity_t *e, ref_model_t *mod )
{
mstudiomodel_t *m_pRefModel = (mstudiomodel_t *)mod->extradata;
// set global pointers
m_pStudioHeader = m_pRefModel->phdr;
m_pTextureHeader = m_pRefModel->thdr;
// set intermediate vertex buffers
m_pvlightvalues = &g_lightvalues[0];
Com_Assert( e->extradata == NULL );
// set cached bones
m_pbonestransform = ((studiovars_t *)e->extradata)->bonestransform;
// misc info
if( r_studio_lerping->integer )
m_fDoInterp = (e->flags & EF_NOINTERP) ? false : true;
else m_fDoInterp = false;
}
// extract texture filename from modelname
char *R_ExtName( ref_model_t *mod )
{
@ -125,8 +153,8 @@ void R_StudioModelBBox( ref_entity_t *e, vec3_t mins, vec3_t maxs )
{
dstudiohdr_t *hdr;
if( !e || !e->model || !e->model->extradata )
return;
if( !e->model ) return;
R_StudioSetupRender( e, e->model );
hdr = ((mstudiomodel_t *)e->model->extradata)->phdr;
if( !hdr ) return;
@ -1223,34 +1251,6 @@ bool R_StudioComputeBBox( vec3_t bbox[8] )
return true;
}
/*
====================
StudioSetupRender
====================
*/
static void R_StudioSetupRender( ref_entity_t *e, ref_model_t *mod )
{
mstudiomodel_t *m_pRefModel = (mstudiomodel_t *)mod->extradata;
// set global pointers
m_pStudioHeader = m_pRefModel->phdr;
m_pTextureHeader = m_pRefModel->thdr;
// set intermediate vertex buffers
m_pvlightvalues = &g_lightvalues[0];
Com_Assert( e->extradata == NULL );
// set cached bones
m_pbonestransform = ((studiovars_t *)e->extradata)->bonestransform;
// misc info
if( r_studio_lerping->integer )
m_fDoInterp = (e->flags & EF_NOINTERP) ? false : true;
else m_fDoInterp = false;
}
/*
====================
StudioSetupSubModel
@ -1490,6 +1490,7 @@ void R_StudioDrawMesh( const meshbuffer_t *mb, short *ptricmds, float s, float t
av = m_pxformverts[ptricmds[0]]; // verts
Vector4Set( inVertsArray[r_backacc.numVerts], av[0], av[1], av[2], 1.0f );
r_backacc.c_totalVerts++; // r_speeds issues
r_backacc.numVerts++;
}
}
@ -1995,6 +1996,7 @@ void R_StudioDrawPoints( const meshbuffer_t *mb, ref_entity_t *e )
static int studio_framecount = 0;
bool doTransform = false;
bool doBonesSetup = false;
bool doForceTransform = false;
modelnum = (infokey & 0xFF);
meshnum = ((infokey & 0xFF00)>>8);
@ -2014,11 +2016,7 @@ void R_StudioDrawPoints( const meshbuffer_t *mb, ref_entity_t *e )
return; // nothing to draw
if( mb->modhandle != old_model || old_entity != RI.currententity )
{
if( mb->modhandle != old_model )
Mem_Set( g_cachestate, 0, sizeof( g_cachestate )); // model has changed - clear the cache
doBonesSetup = doTransform = true;
}
if( modelnum != old_submodel )
{
@ -2034,6 +2032,7 @@ void R_StudioDrawPoints( const meshbuffer_t *mb, ref_entity_t *e )
{
R_StudioSetupRender( e, Mod_ForHandle( mb->modhandle ));
R_StudioMergeBones( e, Mod_ForHandle( mb->modhandle ));
doForceTransform = true;
}
else
{
@ -2056,12 +2055,12 @@ void R_StudioDrawPoints( const meshbuffer_t *mb, ref_entity_t *e )
s = 1.0f / (float)ptexture[pskinref[pmesh->skinref]].width;
t = 1.0f / (float)ptexture[pskinref[pmesh->skinref]].height;
flags = ptexture[pskinref[pmesh->skinref]].flags;
/*
#if 0
Msg( "StudioDrawPoints( entity %i, model %s, doBonesSetup %s, doTransform %s, skin %s, submodel %i, mesh %i\n",
e - r_entities, m_pStudioHeader->name, doBonesSetup ? "true" : "false", doTransform ? "true" : "false",
ptexture[pskinref[((dstudiomesh_t *)((byte *)m_pStudioHeader + m_pSubModel->meshindex) + meshnum)->skinref]].name,
modelnum, meshnum );
*/
#endif
// detect mesh features
features = MF_NONBATCHED | shader->features;
if( RI.params & RP_SHADOWMAPVIEW )
@ -2080,16 +2079,41 @@ void R_StudioDrawPoints( const meshbuffer_t *mb, ref_entity_t *e )
if( doTransform )
{
studiovars_t *studio = (studiovars_t *)e->extradata;
Com_Assert( studio == NULL );
pvertbone = ((byte *)m_pStudioHeader + m_pSubModel->vertinfoindex);
pnormbone = ((byte *)m_pStudioHeader + m_pSubModel->norminfoindex);
pstudioverts = (vec3_t *)((byte *)m_pStudioHeader + m_pSubModel->vertindex);
pstudionorms = (vec3_t *)((byte *)m_pStudioHeader + m_pSubModel->normindex);
m_pxformverts = g_xformverts[modelnum];
m_pxformnorms = g_xformnorms[modelnum];
// initialize vertex cache
studio->num_models = m_pStudioHeader->numbodyparts;
if( !g_cachestate[modelnum] )
if( !studio->mesh[modelnum] || studio->mesh[modelnum]->numverts != m_pSubModel->numverts || studio->mesh[modelnum]->numnorms != m_pSubModel->numnorms )
{
if( !studio->mesh[modelnum] )
studio->mesh[modelnum] = Mem_Alloc( studiopool, sizeof( studioverts_t ));
if( studio->mesh[modelnum]->numverts != m_pSubModel->numverts )
{
studio->mesh[modelnum]->verts = Mem_Realloc( studiopool, studio->mesh[modelnum]->verts, sizeof( vec3_t ) * m_pSubModel->numverts );
studio->mesh[modelnum]->numverts = m_pSubModel->numverts;
Msg( "realloc verts()\n" );
}
if( studio->mesh[modelnum]->numnorms != m_pSubModel->numnorms )
{
studio->mesh[modelnum]->norms = Mem_Realloc( studiopool, studio->mesh[modelnum]->norms, sizeof( vec3_t ) * m_pSubModel->numnorms );
studio->mesh[modelnum]->numnorms = m_pSubModel->numnorms;
Msg( "realloc norms()\n" );
}
}
m_pxformverts = studio->mesh[modelnum]->verts;
m_pxformnorms = studio->mesh[modelnum]->norms;
if( studio->mesh[modelnum]->m_nCachedFrame != r_framecount || doForceTransform )
{
dstudiomesh_t *pmesh = (dstudiomesh_t *)((byte *)m_pStudioHeader + m_pSubModel->meshindex);
float *lv = (float *)g_lightvalues;
@ -2097,8 +2121,10 @@ void R_StudioDrawPoints( const meshbuffer_t *mb, ref_entity_t *e )
for( i = 0; i < m_pSubModel->numverts; i++ )
{
Matrix4x4_VectorTransform( m_pbonestransform[pvertbone[i]], pstudioverts[i], m_pxformverts[i] );
if(!( features & MF_NORMALS )) continue;
Matrix4x4_VectorIRotate( m_pbonestransform[pvertbone[i]], pstudionorms[i], m_pxformnorms[i] );
}
for( i = 0; ( i < m_pSubModel->numnorms ) && ( features & MF_NORMALS ); i++ )
{
Matrix4x4_VectorRotate( m_pbonestransform[pnormbone[i]], pstudionorms[i], m_pxformnorms[i] );
}
for( i = 0; i < m_pSubModel->nummesh; i++ )
{
@ -2113,7 +2139,7 @@ void R_StudioDrawPoints( const meshbuffer_t *mb, ref_entity_t *e )
R_StudioSetupChrome( g_chrome[(float (*)[3])lv - g_lightvalues], *pnormbone, (float *)pstudionorms );
}
}
g_cachestate[modelnum] = true;
studio->mesh[modelnum]->m_nCachedFrame = r_framecount;
}
}
R_StudioDrawMesh( mb, ptricmds, s, t, features, flags );

2343
render/r_studio.old Normal file

File diff suppressed because it is too large Load Diff

View File

@ -6,13 +6,13 @@
--------------------Configuration: render - Win32 Release--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP2CB1.tmp" with contents
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP2E75.tmp" with contents
[
/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\RSP2CB1.tmp"
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP2CB2.tmp" with contents
Creating command line "cl.exe @C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP2E75.tmp"
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP2E76.tmp" with contents
[
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"
@ -39,13 +39,13 @@ msvcrt.lib user32.lib gdi32.lib /nologo /subsystem:windows /dll /pdb:none /machi
"\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\RSP2CB2.tmp"
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP2CB3.bat" with contents
Creating command line "link.exe @C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP2E76.tmp"
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP2E77.bat" with contents
[
@echo off
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\RSP2CB3.bat"
Creating command line "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP2E77.bat"
Compiling...
r_studio.c
Linking...

View File

@ -135,3 +135,4 @@ Beta 13.12.09
111. finalize alias models
112. clean up renderer sources
113. fixup debug tools OK
114. fixup shadowmaps OK