📄 gl_rmain.pas
字号:
{$endif}
(*Y GL_SetDefaultState();
{ /*
** draw our stereo patterns
*/
#if 0 // commented out until H3D pays us the money they owe us
GL_DrawStereoPattern();
#endif}*)
GL_InitImages ();
Mod_Init ();
(* R_InitParticleTexture ();
Draw_InitLocal ();*)
err := qglGetError();
if (err <> GL_NO_ERROR) then
ri.Con_Printf (PRINT_ALL, 'glGetError() = 0x%x\n', [err]);
end;//function
{*
===============
R_Shutdown
===============
*}
procedure R_Shutdown; cdecl;
begin
ri.Cmd_RemoveCommand ('modellist');
ri.Cmd_RemoveCommand ('screenshot');
ri.Cmd_RemoveCommand ('imagelist');
ri.Cmd_RemoveCommand ('gl_strings');
Mod_FreeAll ();
GL_ShutdownImages ();
{*
** shut down OS specific OpenGL stuff like contexts, etc.
*}
GLimp_Shutdown();
{*
** shutdown our QGL subsystem
*}
QGL_Shutdown();
end;//procedure
{*
@@@@@@@@@@@@@@@@@@@@@
R_BeginFrame
@@@@@@@@@@@@@@@@@@@@@
*}
procedure R_BeginFrame (camera_separation : float); cdecl;
var
ref : cvar_p;
// char envbuffer[1024];
g : float;
begin
gl_state.camera_separation := camera_separation;
{*
** change modes if necessary
*}
if (gl_mode.modified OR vid_fullscreen.modified) then
begin
// FIXME: only restart if CDS is required
ref := ri.Cvar_Get ('vid_ref', 'gl', 0);
ref.modified := true;
end;
if (gl_log.modified) then
begin
GLimp_EnableLogging ( (gl_log.value <> 0) ); //Y???
gl_log.modified := false;
end;
if (gl_log.value <>0) then
GLimp_LogNewFrame();
{*
** update 3Dfx gamma -- it is expected that a user will do a vid_restart
** after tweaking this value
*}
if (vid_gamma.modified) then
begin
vid_gamma.modified := false;
//{Y} if ( gl_config.renderer & ( GL_RENDERER_VOODOO ) )
if ((gl_config.renderer AND GL_RENDERER_VOODOO) <> 0) then
begin
g := 2.00 * (0.8 - (vid_gamma.value - 0.5)) + 1.0;
(*Y Com_sprintf (envbuffer, sizeof(envbuffer), 'SSTV2_GAMMA=%f', g);
putenv (envbuffer);
Com_sprintf (envbuffer, sizeof(envbuffer), 'SST_GAMMA=%f', g);
putenv (envbuffer);*)
end;
end;
GLimp_BeginFrame (camera_separation);
{*
** go into 2D mode
*}
qglViewport (0,0, vid.width, vid.height);
qglMatrixMode(GL_PROJECTION);
qglLoadIdentity ();
qglOrtho (0, vid.width, vid.height, 0, -99999, 99999);
qglMatrixMode(GL_MODELVIEW);
qglLoadIdentity ();
qglDisable (GL_DEPTH_TEST);
qglDisable (GL_CULL_FACE);
qglDisable (GL_BLEND);
qglEnable (GL_ALPHA_TEST);
qglColor4f (1,1,1,1);
{*
** draw buffer stuff
*}
if (gl_drawbuffer.modified) then
begin
gl_drawbuffer.modified := false;
if (gl_state.camera_separation = 0) OR (NOT gl_state.stereo_enabled) then
if (Q_stricmp(gl_drawbuffer.string_, 'GL_FRONT') = 0)
then qglDrawBuffer (GL_FRONT)
else qglDrawBuffer (GL_BACK);
end;
{*
** texturemode stuff
*}
if (_gl_texturemode.modified) then
begin
GL_TextureMode (_gl_texturemode.string_);
_gl_texturemode.modified := false;
end;
if (_gl_texturealphamode.modified) then
begin
GL_TextureAlphaMode (_gl_texturealphamode.string_);
_gl_texturealphamode.modified := false;
end;
if (_gl_texturesolidmode.modified) then
begin
GL_TextureSolidMode (_gl_texturesolidmode.string_);
_gl_texturesolidmode.modified := false;
end;
{*
** swapinterval stuff
*}
//Y GL_UpdateSwapInterval();
//
// clear screen if desired
//
R_Clear ();
end;//procedure
{*
=============
R_SetPalette
=============
*}
//Y: ??? unsigned r_rawpalette[256];
//procedure R_SetPalette ( const unsigned char *palette);
procedure R_SetPalette (palette : {array of byte}PByte); cdecl;
var
i : integer;
begin
(*Y byte *rp = ( byte * ) r_rawpalette;
if ( palette )
then
for i:=0 to 255 do
begin
rp[i*4+0] := palette[i*3+0];
rp[i*4+1] := palette[i*3+1];
rp[i*4+2] := palette[i*3+2];
rp[i*4+3] := $FF;
end
else
for i:=0 to 255 do
begin
rp[i*4+0] := d_8to24table[i] AND $FF;
rp[i*4+1] := (d_8to24table[i] SHR 8) AND $FF;
rp[i*4+2] := (d_8to24table[i] SHR 16) AND $FF;
rp[i*4+3] := $FF;
end;
GL_SetTexturePalette (r_rawpalette);*)
qglClearColor (0,0,0,0);
qglClear (GL_COLOR_BUFFER_BIT);
qglClearColor (1,0, 0.5, 0.5);
end;//procedure
{*
** R_DrawBeam
*}
procedure R_DrawBeam (e : entity_p);
const
NUM_BEAM_SEGS = 6;
var
i : integer;
r, g, b : float;
perpvec,
direction,
normalized_direction,
oldorigin, origin : vec3_t;
start_points,
end_points : array [0..NUM_BEAM_SEGS-1] of vec3_t;
begin
oldorigin[0] := e.oldorigin[0];
oldorigin[1] := e.oldorigin[1];
oldorigin[2] := e.oldorigin[2];
//oldorigin := e.oldorigin; if EQUAL type: vec3_t & array[0..2] of float
origin[0] := e.origin[0];
origin[1] := e.origin[1];
origin[2] := e.origin[2];
//origin := e.origin; //up!
{ 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];}
direction[0] := oldorigin[0] - origin[0];
direction[1] := oldorigin[1] - origin[1];
direction[2] := oldorigin[2] - origin[2];
normalized_direction := direction;
if (VectorNormalize (normalized_direction) = 0) then
Exit;
PerpendicularVector (perpvec, normalized_direction);
VectorScale (perpvec, e.frame / 2, perpvec);
for i:=0 to 5 do
begin
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]);
end;
qglDisable (GL_TEXTURE_2D);
qglEnable (GL_BLEND);
qglDepthMask (GL_FALSE);
(*Y r := (d_8to24table[e.skinnum AND $FF]) AND $FF;
g := (d_8to24table[e.skinnum AND $FF] SHR 8) AND $FF;
b := (d_8to24table[e.skinnum AND $FF] SHR 16) AND $FF;*)
{ r *= 1/255.0F;
g *= 1/255.0F;
b *= 1/255.0F;}
r := r *1/255.0; //{Y}optimize code: r := r * invert255;
g := g *1/255.0;
b := b *1/255.0;
qglColor4f (r, g, b, e.alpha);
qglBegin (GL_TRIANGLE_STRIP);
for i:=0 to NUM_BEAM_SEGS-1 do
begin
qglVertex3fv (@start_points[i]);
qglVertex3fv (@end_points[i]);
qglVertex3fv (@start_points[(i+1) MOD NUM_BEAM_SEGS]);
qglVertex3fv (@end_points[(i+1) MOD NUM_BEAM_SEGS]);
end;
qglEnd();
qglEnable (GL_TEXTURE_2D);
qglDisable (GL_BLEND);
qglDepthMask (GL_TRUE);
end;//procedure
//===================================================================
(*Y
void R_BeginRegistration (char *map);
struct model_s *R_RegisterModel (char *name);
struct image_s *R_RegisterSkin (char *name);
void R_SetSky (char *name, float rotate, vec3_t axis);
void R_EndRegistration (void);
void R_RenderFrame (refdef_t *fd);
struct image_s *Draw_FindPic (char *name);
void Draw_Pic (int x, int y, char *name);
void Draw_Char (int x, int y, int c);
void Draw_TileClear (int x, int y, int w, int h, char *name);
void Draw_Fill (int x, int y, int w, int h, int c);
void Draw_FadeScreen (void);
*)
{*
@@@@@@@@@@@@@@@@@@@@@
GetRefAPI
@@@@@@@@@@@@@@@@@@@@@
*}
//refexport_t GetRefAPI (refimport_t rimp )
function GetRefAPI (rimp : refimport_t) : refexport_t;
var
re : refexport_t;
begin
ri := rimp;
re.api_version := API_VERSION;
re.BeginRegistration := R_BeginRegistration; //gl_model.c
//Y re.RegisterModel := R_RegisterModel; //gl_model.c
//Y re.RegisterSkin := R_RegisterSkin; //gl_image.c
//Y re.RegisterPic := Draw_FindPic; //gl_draw.c
re.SetSky := R_SetSky; //gl_warp.c
re.EndRegistration := R_EndRegistration; //gl_model.c
re.RenderFrame := R_RenderFrame; //gl_rmain.R_RenderFrame ();
(*Y re.DrawGetPicSize := Draw_GetPicSize; //gl_draw.c
re.DrawPic := Draw_Pic; //gl_draw.c
re.DrawStretchPic := Draw_StretchPic; //gl_draw.c
re.DrawChar := Draw_Char; //gl_draw.c
re.DrawTileClear := Draw_TileClear; //gl_draw.c
re.DrawFill := Draw_Fill; //gl_draw.c
re.DrawFadeScreen := Draw_FadeScreen; //gl_draw.c
re.DrawStretchRaw := Draw_StretchRaw; //gl_draw.c*)
//Y re.Init := R_Init; //gl_rmain.R_Init ();
re.Shutdown := R_Shutdown; //gl_rmain.R_Shutdown ();
re.CinematicSetPalette := R_SetPalette; //gl_rmain.R_SetPalette ()
re.BeginFrame := R_BeginFrame; //gl_rmain.R_BeginFrame ()
re.EndFrame := GLimp_EndFrame; //glw_imp.GLimp_EndFrame
re.AppActivate := GLimp_AppActivate; //glw_imp.GLimp_AppActivate
Swap_Init ();
Result := re;
end;//function
(*Y
#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
*)
// End of file
end.
My current problems:
--------------------
1) VectorCopy (r_origin, temp);
OR
temp := r_origin;
OR
"OVERLOAD" proc
2) C-code: if ( strstr( renderer_buffer, "voodoo" ) )
PAS: if Pos('vodoo', renderer_buffer) > 0
-strstr
-
3) sample cycle kind of:
C-code: for ( p = particles, i=0 ; i < num_particles ; i++,p++)
PAS-code:
var
p : particle_p;
p := particles;
for i:=0 to num_particles-1 do
begin
...
Inc(p); //This is EQUAL, but larger-code: p := p + sizeof(particle_t);
end;
4) #ifndef REF_HARD_LINKED
5)
磬忮痦铄 屠奈 狍溴
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -