?? r_main.c
字號:
for (i=0 ; i<256 ; i++, in+=4, out+=4)
{
for (j=0 ; j<3 ; j++)
{
v = premult[j] + one_minus_alpha * in[j];
if (v > 255)
v = 255;
out[j] = v;
}
out[3] = 255;
}
R_GammaCorrectAndSetPalette( ( const unsigned char * ) palette[0] );
// SWimp_SetPalette( palette[0] );
}
//=======================================================================
void R_SetLightLevel (void)
{
vec3_t light;
if ((r_newrefdef.rdflags & RDF_NOWORLDMODEL) || (!r_drawentities->value) || (!currententity))
{
r_lightlevel->value = 150.0;
return;
}
// save off light value for server to look at (BIG HACK!)
R_LightPoint (r_newrefdef.vieworg, light);
r_lightlevel->value = 150.0 * light[0];
}
/*
@@@@@@@@@@@@@@@@
R_RenderFrame
@@@@@@@@@@@@@@@@
*/
void R_RenderFrame (refdef_t *fd)
{
r_newrefdef = *fd;
if (!r_worldmodel && !( r_newrefdef.rdflags & RDF_NOWORLDMODEL ) )
ri.Sys_Error (ERR_FATAL,"R_RenderView: NULL worldmodel");
VectorCopy (fd->vieworg, r_refdef.vieworg);
VectorCopy (fd->viewangles, r_refdef.viewangles);
if (r_speeds->value || r_dspeeds->value)
r_time1 = Sys_Milliseconds ();
R_SetupFrame ();
R_MarkLeaves (); // done here so we know if we're in water
R_PushDlights (r_worldmodel);
R_EdgeDrawing ();
if (r_dspeeds->value)
{
se_time2 = Sys_Milliseconds ();
de_time1 = se_time2;
}
R_DrawEntitiesOnList ();
if (r_dspeeds->value)
{
de_time2 = Sys_Milliseconds ();
dp_time1 = Sys_Milliseconds ();
}
R_DrawParticles ();
if (r_dspeeds->value)
dp_time2 = Sys_Milliseconds ();
R_DrawAlphaSurfaces();
R_SetLightLevel ();
if (r_dowarp)
D_WarpScreen ();
if (r_dspeeds->value)
da_time1 = Sys_Milliseconds ();
if (r_dspeeds->value)
da_time2 = Sys_Milliseconds ();
R_CalcPalette ();
if (sw_aliasstats->value)
R_PrintAliasStats ();
if (r_speeds->value)
R_PrintTimes ();
if (r_dspeeds->value)
R_PrintDSpeeds ();
if (sw_reportsurfout->value && r_outofsurfaces)
ri.Con_Printf (PRINT_ALL,"Short %d surfaces\n", r_outofsurfaces);
if (sw_reportedgeout->value && r_outofedges)
ri.Con_Printf (PRINT_ALL,"Short roughly %d edges\n", r_outofedges * 2 / 3);
}
/*
** R_InitGraphics
*/
void R_InitGraphics( int width, int height )
{
vid.width = width;
vid.height = height;
// free z buffer
if ( d_pzbuffer )
{
free( d_pzbuffer );
d_pzbuffer = NULL;
}
// free surface cache
if ( sc_base )
{
D_FlushCaches ();
free( sc_base );
sc_base = NULL;
}
d_pzbuffer = malloc(vid.width*vid.height*2);
R_InitCaches ();
R_GammaCorrectAndSetPalette( ( const unsigned char *) d_8to24table );
}
/*
** R_BeginFrame
*/
void R_BeginFrame( float camera_separation )
{
extern void Draw_BuildGammaTable( void );
/*
** rebuild the gamma correction palette if necessary
*/
if ( vid_gamma->modified )
{
Draw_BuildGammaTable();
R_GammaCorrectAndSetPalette( ( const unsigned char * ) d_8to24table );
vid_gamma->modified = false;
}
while ( sw_mode->modified || vid_fullscreen->modified )
{
rserr_t err;
/*
** if this returns rserr_invalid_fullscreen then it set the mode but not as a
** fullscreen mode, e.g. 320x200 on a system that doesn't support that res
*/
if ( ( err = SWimp_SetMode( &vid.width, &vid.height, sw_mode->value, vid_fullscreen->value ) ) == rserr_ok )
{
R_InitGraphics( vid.width, vid.height );
sw_state.prev_mode = sw_mode->value;
vid_fullscreen->modified = false;
sw_mode->modified = false;
}
else
{
if ( err == rserr_invalid_mode )
{
ri.Cvar_SetValue( "sw_mode", sw_state.prev_mode );
ri.Con_Printf( PRINT_ALL, "ref_soft::R_BeginFrame() - could not set mode\n" );
}
else if ( err == rserr_invalid_fullscreen )
{
R_InitGraphics( vid.width, vid.height );
ri.Cvar_SetValue( "vid_fullscreen", 0);
ri.Con_Printf( PRINT_ALL, "ref_soft::R_BeginFrame() - fullscreen unavailable in this mode\n" );
sw_state.prev_mode = sw_mode->value;
// vid_fullscreen->modified = false;
// sw_mode->modified = false;
}
else
{
ri.Sys_Error( ERR_FATAL, "ref_soft::R_BeginFrame() - catastrophic mode change failure\n" );
}
}
}
}
/*
** R_GammaCorrectAndSetPalette
*/
void R_GammaCorrectAndSetPalette( const unsigned char *palette )
{
int i;
for ( i = 0; i < 256; i++ )
{
sw_state.currentpalette[i*4+0] = sw_state.gammatable[palette[i*4+0]];
sw_state.currentpalette[i*4+1] = sw_state.gammatable[palette[i*4+1]];
sw_state.currentpalette[i*4+2] = sw_state.gammatable[palette[i*4+2]];
}
SWimp_SetPalette( sw_state.currentpalette );
}
/*
** R_CinematicSetPalette
*/
void R_CinematicSetPalette( const unsigned char *palette )
{
byte palette32[1024];
int i, j, w;
int *d;
// clear screen to black to avoid any palette flash
w = abs(vid.rowbytes)>>2; // stupid negative pitch win32 stuff...
for (i=0 ; i<vid.height ; i++, d+=w)
{
d = (int *)(vid.buffer + i*vid.rowbytes);
for (j=0 ; j<w ; j++)
d[j] = 0;
}
// flush it to the screen
SWimp_EndFrame ();
if ( palette )
{
for ( i = 0; i < 256; i++ )
{
palette32[i*4+0] = palette[i*3+0];
palette32[i*4+1] = palette[i*3+1];
palette32[i*4+2] = palette[i*3+2];
palette32[i*4+3] = 0xFF;
}
R_GammaCorrectAndSetPalette( palette32 );
}
else
{
R_GammaCorrectAndSetPalette( ( const unsigned char * ) d_8to24table );
}
}
/*
================
Draw_BuildGammaTable
================
*/
void Draw_BuildGammaTable (void)
{
int i, inf;
float g;
g = vid_gamma->value;
if (g == 1.0)
{
for (i=0 ; i<256 ; i++)
sw_state.gammatable[i] = i;
return;
}
for (i=0 ; i<256 ; i++)
{
inf = 255 * pow ( (i+0.5)/255.5 , g ) + 0.5;
if (inf < 0)
inf = 0;
if (inf > 255)
inf = 255;
sw_state.gammatable[i] = inf;
}
}
/*
** R_DrawBeam
*/
void R_DrawBeam( entity_t *e )
{
#define NUM_BEAM_SEGS 6
int i;
vec3_t perpvec;
vec3_t direction, normalized_direction;
vec3_t start_points[NUM_BEAM_SEGS], end_points[NUM_BEAM_SEGS];
vec3_t oldorigin, origin;
oldorigin[0] = e->oldorigin[0];
oldorigin[1] = e->oldorigin[1];
oldorigin[2] = e->oldorigin[2];
origin[0] = e->origin[0];
origin[1] = e->origin[1];
origin[2] = e->origin[2];
normalized_direction[0] = direction[0] = oldorigin[0] - origin[0];
normalized_direction[1] = direction[1] = oldorigin[1] - origin[1];
normalized_direction[2] = direction[2] = oldorigin[2] - origin[2];
if ( VectorNormalize( normalized_direction ) == 0 )
return;
PerpendicularVector( perpvec, normalized_direction );
VectorScale( perpvec, e->frame / 2, perpvec );
for ( i = 0; i < NUM_BEAM_SEGS; i++ )
{
RotatePointAroundVector( start_points[i], normalized_direction, perpvec, (360.0/NUM_BEAM_SEGS)*i );
VectorAdd( start_points[i], origin, start_points[i] );
VectorAdd( start_points[i], direction, end_points[i] );
}
for ( i = 0; i < NUM_BEAM_SEGS; i++ )
{
R_IMFlatShadedQuad( start_points[i],
end_points[i],
end_points[(i+1)%NUM_BEAM_SEGS],
start_points[(i+1)%NUM_BEAM_SEGS],
e->skinnum & 0xFF,
e->alpha );
}
}
//===================================================================
/*
============
R_SetSky
============
*/
// 3dstudio environment map names
char *suf[6] = {"rt", "bk", "lf", "ft", "up", "dn"};
int r_skysideimage[6] = {5, 2, 4, 1, 0, 3};
extern mtexinfo_t r_skytexinfo[6];
void R_SetSky (char *name, float rotate, vec3_t axis)
{
int i;
char pathname[MAX_QPATH];
strncpy (skyname, name, sizeof(skyname)-1);
skyrotate = rotate;
VectorCopy (axis, skyaxis);
for (i=0 ; i<6 ; i++)
{
Com_sprintf (pathname, sizeof(pathname), "env/%s%s.pcx", skyname, suf[r_skysideimage[i]]);
r_skytexinfo[i].image = R_FindImage (pathname, it_sky);
}
}
/*
===============
Draw_GetPalette
===============
*/
void Draw_GetPalette (void)
{
byte *pal, *out;
int i;
int r, g, b;
// get the palette and colormap
LoadPCX ("pics/colormap.pcx", &vid.colormap, &pal, NULL, NULL);
if (!vid.colormap)
ri.Sys_Error (ERR_FATAL, "Couldn't load pics/colormap.pcx");
vid.alphamap = vid.colormap + 64*256;
out = (byte *)d_8to24table;
for (i=0 ; i<256 ; i++, out+=4)
{
r = pal[i*3+0];
g = pal[i*3+1];
b = pal[i*3+2];
out[0] = r;
out[1] = g;
out[2] = b;
}
free (pal);
}
struct image_s *R_RegisterSkin (char *name);
/*
@@@@@@@@@@@@@@@@@@@@@
GetRefAPI
@@@@@@@@@@@@@@@@@@@@@
*/
refexport_t GetRefAPI (refimport_t rimp)
{
refexport_t re;
ri = rimp;
re.api_version = API_VERSION;
re.BeginRegistration = R_BeginRegistration;
re.RegisterModel = R_RegisterModel;
re.RegisterSkin = R_RegisterSkin;
re.RegisterPic = Draw_FindPic;
re.SetSky = R_SetSky;
re.EndRegistration = R_EndRegistration;
re.RenderFrame = R_RenderFrame;
re.DrawGetPicSize = Draw_GetPicSize;
re.DrawPic = Draw_Pic;
re.DrawStretchPic = Draw_StretchPic;
re.DrawChar = Draw_Char;
re.DrawTileClear = Draw_TileClear;
re.DrawFill = Draw_Fill;
re.DrawFadeScreen= Draw_FadeScreen;
re.DrawStretchRaw = Draw_StretchRaw;
re.Init = R_Init;
re.Shutdown = R_Shutdown;
re.CinematicSetPalette = R_CinematicSetPalette;
re.BeginFrame = R_BeginFrame;
re.EndFrame = SWimp_EndFrame;
re.AppActivate = SWimp_AppActivate;
Swap_Init ();
return re;
}
#ifndef REF_HARD_LINKED
// this is only here so the functions in q_shared.c and q_shwin.c can link
void Sys_Error (char *error, ...)
{
va_list argptr;
char text[1024];
va_start (argptr, error);
vsprintf (text, error, argptr);
va_end (argptr);
ri.Sys_Error (ERR_FATAL, "%s", text);
}
void Com_Printf (char *fmt, ...)
{
va_list argptr;
char text[1024];
va_start (argptr, fmt);
vsprintf (text, fmt, argptr);
va_end (argptr);
ri.Con_Printf (PRINT_ALL, "%s", text);
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -