📄 gl_rmain.pas
字号:
{$IFDEF WIN32}
if (CPas.strstr(gl_config.extensions_string, 'WGL_EXT_swap_control') <> nil) then
begin
qwglSwapIntervalEXT := qwglGetProcAddress('wglSwapIntervalEXT');
ri.Con_Printf(PRINT_ALL, '...enabling WGL_EXT_swap_control'#10, []);
end
else
ri.Con_Printf(PRINT_ALL, '...WGL_EXT_swap_control not found'#10, []);
{$ENDIF}
if (CPas.strstr(gl_config.extensions_string, 'GL_EXT_point_parameters') <> nil) then
begin
if (gl_ext_pointparameters.value <> 0) then
begin
qglPointParameterfEXT := qwglGetProcAddress('glPointParameterfEXT');
qglPointParameterfvEXT := qwglGetProcAddress('glPointParameterfvEXT');
ri.Con_Printf(PRINT_ALL, '...using GL_EXT_point_parameters'#10, []);
end
else
ri.Con_Printf(PRINT_ALL, '...ignoring GL_EXT_point_parameters'#10, []);
end
else
ri.Con_Printf(PRINT_ALL, '...GL_EXT_point_parameters not found'#10, []);
if (not assigned(qglColorTableEXT)) and
(CPas.strstr(gl_config.extensions_string, 'GL_EXT_paletted_texture') <> nil) and
(CPas.strstr(gl_config.extensions_string, 'GL_EXT_shared_texture_palette') <> nil) then
begin
if (gl_ext_palettedtexture.value <> 0) then
begin
ri.Con_Printf(PRINT_ALL, '...using GL_EXT_shared_texture_palette'#10, []);
qglColorTableEXT := qwglGetProcAddress('glColorTableEXT');
end
else
ri.Con_Printf(PRINT_ALL, '...ignoring GL_EXT_shared_texture_palette'#10, []);
end
else
ri.Con_Printf(PRINT_ALL, '...GL_EXT_shared_texture_palette not found'#10, []);
if (strstr(gl_config.extensions_string, 'GL_ARB_multitexture') <> nil) then
begin
if (gl_ext_multitexture.value <> 0) then
begin
ri.Con_Printf(PRINT_ALL, '...using GL_ARB_multitexture'#10);
qglMTexCoord2fSGIS := qwglGetProcAddress('glMultiTexCoord2fARB');
qglActiveTextureARB := qwglGetProcAddress('glActiveTextureARB');
qglClientActiveTextureARB := qwglGetProcAddress('glClientActiveTextureARB');
GL_TEXTURE0 := GL_TEXTURE0_ARB;
GL_TEXTURE1 := GL_TEXTURE1_ARB;
end
else
begin
ri.Con_Printf(PRINT_ALL, '...ignoring GL_ARB_multitexture'#10);
end
end
else
begin
ri.Con_Printf(PRINT_ALL, '...GL_ARB_multitexture not found'#10);
end;
if (CPas.strstr(gl_config.extensions_string, 'GL_SGIS_multitexture') <> nil) then
begin
if assigned(qglActiveTextureARB) then
begin
ri.Con_Printf(PRINT_ALL, '...GL_SGIS_multitexture deprecated in favor of ARB_multitexture'#10);
end
else
if (gl_ext_multitexture.value <> 0) then
begin
ri.Con_Printf(PRINT_ALL, '...using GL_SGIS_multitexture'#10, []);
qglMTexCoord2fSGIS := qwglGetProcAddress('glMTexCoord2fSGIS');
qglSelectTextureSGIS := qwglGetProcAddress('glSelectTextureSGIS');
GL_TEXTURE0 := GL_TEXTURE0_SGIS;
GL_TEXTURE1 := GL_TEXTURE1_SGIS;
end
else
ri.Con_Printf(PRINT_ALL, '...ignoring GL_SGIS_multitexture'#10, []);
end
else
ri.Con_Printf(PRINT_ALL, '...GL_SGIS_multitexture not found'#10, []);
GL_SetDefaultState();
{
** draw our stereo patterns
}
(*
// commented out until H3D pays us the money they owe us
GL_DrawStereoPattern();
*)
GL_InitImages();
Mod_Init();
R_InitParticleTexture();
Draw_InitLocal();
err := qglGetError();
if (err <> GL_NO_ERROR) then
ri.Con_Printf(PRINT_ALL, 'glGetError() = 0x%x'#10, [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: Single); cdecl;
var
ref: cvar_p;
envbuffer: array[0..1024 - 1] of char;
g: Single;
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));
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;
if ((gl_config.renderer and GL_RENDERER_VOODOO) <> 0) then
begin
g := 2.00 * (0.8 - (vid_gamma.value - 0.5)) + 1.0;
(* Juha: TODO
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
*}
GL_UpdateSwapInterval();
//
// clear screen if desired
//
R_Clear();
end; //procedure
{*
=============
R_SetPalette
=============
*}
procedure R_SetPalette(palette: PByte); cdecl;
var
i: integer;
rp: PByteArray;
begin
rp := @r_rawpalette;
if (palette <> nil) then
for i := 0 to 255 do
begin
rp[i * 4 + 0] := PByteArray(palette)[i * 3 + 0];
rp[i * 4 + 1] := PByteArray(palette)[i * 3 + 1];
rp[i * 4 + 2] := PByteArray(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: Single;
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(False);
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 := r * (1 / 255.0);
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(True);
end;
//===================================================================
{*
@@@@@@@@@@@@@@@@@@@@@
GetRefAPI
@@@@@@@@@@@@@@@@@@@@@
*}
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
re.RegisterModel := R_RegisterModel; //gl_model.c
re.RegisterSkin := R_RegisterSkin; //gl_image.c
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 ();
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
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;
// this is only here so the functions in q_shared.c and q_shwin.c can link
procedure Sys_Error(fmt: PChar; args: array of const);
var
text: array[0..1024 - 1] of char;
begin
DelphiStrFmt(text, fmt, args);
ri.Sys_Error(ERR_FATAL, text);
end;
procedure Com_Printf(fmt: PChar; args: array of const);
var
text: array[0..1024 - 1] of char;
begin
DelphiStrFmt(text, fmt, args);
ri.Con_Printf(PRINT_ALL, text);
end;
procedure Com_Printf(fmt: PChar); overload;
begin
Com_Printf(fmt, []);
end;
// End of file
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -