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

📄 gl_rmain.pas

📁 delphi编的不错的贪吃蛇
💻 PAS
📖 第 1 页 / 共 4 页
字号:

{$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 + -