⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gl_rmain.pas

📁 雷神之锤2(Quake2)Delphi源码
💻 PAS
📖 第 1 页 / 共 4 页
字号:
{$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 + -