quake3 源码分析(四)
--Render
void CL_InitRef( void )
{
refimport _t ri;
refexport_t *ret;
ri.Cmd_AddCommand = Cmd_AddCommand;
…
ret = GetRefAPI( REF_API_VERSION, &ri );
re = *ret;
}
refexport_t *GetRefAPI ( int apiVersion, refimport_t *rimp )
{
static refexport_t re;
ri = *rimp;
re.Shutdown = RE_Shutdown;
re.BeginRegistration = RE_BeginRegistration;
re.RegisterModel = RE_RegisterModel;
……
return &re;
}
qhandle_t RE_RegisterModel( const char *name )
{
//查找当前的model name,找到,如果mod->type == MOD_BAD返回0,否则返回第几个model
//调用R_AllocModel分配新的空间,并加入全局变量tr(trGlobals_t tr;)中;
mod = R_AllocModel
Q_strncpyz( mod->name, name, sizeof( mod->name ) );//model name
// make sure the render thread is stopped
R_SyncRenderThread();
//加载文件
sprintf( namebuf, "_%d.md3", lod );
strcat( filename, namebuf );
ri.FS_ReadFile( filename, (void **)&buf );
//根据文件头决定加载MD4 or MD3
ident = LittleLong(*(unsigned *)buf);
if ( ident == MD4_IDENT ) {
loaded = R_LoadMD4( mod, buf, name );
} else {
if ( ident != MD3_IDENT ) {
ri.Printf (PRINT_WARNING,"RE_RegisterModel: unknown fileid for %s/n", name);
goto fail;
}
loaded = R_LoadMD3( mod, lod, buf, name );
}
ri.FS_FreeFile (buf);
……
}
static qboolean R_LoadMD3 (model_t *mod, int lod, void *buffer, const char *mod_name )
{
//判断MD3的版本号
pinmodel = (md3Header_t *)buffer;
version = LittleLong (pinmodel->version);
size = LittleLong(pinmodel->ofsEnd);
mod->dataSize += size;
mod->md3[lod] = ri.Hunk_Alloc( size, h_low );
//将文件中的数据COPY到md3中
Com_Memcpy (mod->md3 [lod], buffer, LittleLong(pinmodel->ofsEnd) );
…
//对所有的数据进行大小字节的转换,如果有需要的话
//调用R_FindShader函数register the shaders
R_FindShader( shader->name, LIGHTMAP_NONE, qtrue );
}