DEADSOFTWARE

render: use only r_render to access render
[d2df-sdl.git] / src / game / opengl / r_render.pas
index 668fb901f4e850dcd843a09ce3342daaecdccda2..1a35098c0216ed5f3575dc7cc90bf15b4f3bc29f 100644 (file)
@@ -17,32 +17,144 @@ unit r_render;
 
 interface
 
+  uses g_base; // TRectWH
+
   procedure r_Render_Initialize;
   procedure r_Render_Finalize;
+
+  procedure r_Render_Load;
+  procedure r_Render_Free;
+
+  procedure r_Render_LoadTextures;
+  procedure r_Render_FreeTextures;
+
+  procedure r_Render_Update;
+
   procedure r_Render_Resize (w, h: Integer);
+  procedure r_Render_Apply;
+
+  function r_Render_WriteScreenShot (filename: String): Boolean;
+
+  function r_Render_GetGibRect (m, id: Integer): TRectWH;
+  procedure r_Render_QueueEffect (AnimType, X, Y: Integer);
+
+  procedure r_Render_DrawLoading (force: Boolean); // !!! remove it
 
 implementation
 
-  uses SysUtils, Classes, e_log, g_system, g_game, g_options, r_window, r_graphics, r_console, r_playermodel;
+  uses
+    {$INCLUDE ../../nogl/noGLuses.inc}
+    SysUtils, Classes, Math,
+    e_log, g_system, utils,
+    g_game, g_options, g_console,
+    r_window, r_graphics, r_console, r_playermodel, r_textures, r_animations,
+    r_weapons, r_items, r_gfx, r_monsters, r_map, r_player, r_game
+  ;
+
+  var
+    LoadedGL: Boolean = false;
+
+  procedure LoadGL;
+  begin
+    if LoadedGL = false then
+    begin
+      {$IFDEF NOGL_INIT}
+        nogl_Init;
+        if glRenderToFBO and (not nogl_ExtensionSupported('GL_OES_framebuffer_object')) then
+        begin
+          e_LogWriteln('GL: framebuffer objects not supported; disabling FBO rendering');
+          glRenderToFBO := false
+        end;
+      {$ELSE}
+        if glRenderToFBO and (not Load_GL_ARB_framebuffer_object) then
+        begin
+          e_LogWriteln('GL: framebuffer objects not supported; disabling FBO rendering');
+          glRenderToFBO := false
+        end;
+      {$ENDIF}
+      LoadedGL := true
+    end
+  end;
+
+  procedure FreeGL;
+  begin
+    if LoadedGL = true then
+    begin
+      {$IFDEF NOGL_INIT}
+        nogl_Quit;
+      {$ENDIF}
+      LoadedGL := false
+    end
+  end;
+
+  procedure r_Render_LoadTextures;
+  begin
+    r_Game_LoadTextures;
+    r_Map_LoadTextures;
+  end;
+
+  procedure r_Render_FreeTextures;
+  begin
+    r_Map_FreeTextures;
+    r_Game_FreeTextures;
+  end;
+
+  procedure r_Render_Load;
+  begin
+    r_Game_Load; // load first!
+    r_Player_Load;
+    r_Map_Load;
+    r_PlayerModel_Load;
+    r_Monsters_Load;
+    r_Weapon_Load;
+    r_Items_Load;
+    r_GFX_Load;
+  end;
+
+  procedure r_Render_Free;
+  begin
+    r_GFX_Free;
+    r_Items_Free;
+    r_Weapon_Free;
+    r_Monsters_Free;
+    r_PlayerModel_Free;
+    r_Map_Free;
+    r_Player_Free;
+    r_Game_Free;
+    g_Texture_DeleteAll;
+    g_Frames_DeleteAll;
+  end;
 
   procedure r_Render_Initialize;
   begin
     if sys_SetDisplayMode(gRC_Width, gRC_Height, gBPP, gRC_FullScreen, gRC_Maximized) = False then
       raise Exception.Create('Failed to set videomode on startup.');
-    
+    LoadGL;
     r_Window_Initialize;
     r_Console_Init;
     r_PlayerModel_Initialize;
+    r_Map_Initialize;
   end;
 
   procedure r_Render_Finalize;
   begin
+    r_Map_Finalize;
     r_PlayerModel_Finalize;
+    FreeGL;
     e_ReleaseEngine
   end;
 
+  procedure r_Render_Update;
+  begin
+    r_GFX_Update;
+    r_Map_Update;
+    r_PlayerModel_Update;
+    r_Console_Update;
+  end;
+
   procedure r_Render_Resize (w, h: Integer);
   begin
+    LoadGL;
     gWinSizeX := w;
     gWinSizeY := h;
     gRC_Width := w;
@@ -63,7 +175,49 @@ implementation
     gScreenWidth := w;
     gScreenHeight := h;
     e_ResizeWindow(w, h);
-    e_InitGL
+    e_InitGL;
+    r_Game_SetupScreenSize;
+  end;
+
+  procedure r_Render_Apply;
+  begin
+    if sys_SetDisplayMode(Max(1, gRC_Width), Max(1, gRC_Height), Max(1, gBPP), gRC_FullScreen, gRC_Maximized) then
+      e_LogWriteln('resolution changed')
+    else
+      e_LogWriteln('resolution not changed');
+    sys_EnableVSync(gVSync)
+  end;
+
+  function r_Render_WriteScreenShot (filename: String): Boolean;
+    var s: TStream;
+  begin
+    Result := False;
+    try
+      s := CreateDiskFile(filename);
+      try
+        e_MakeScreenshot(s, gScreenWidth, gScreenHeight);
+        Result := True;
+      except
+        DeleteFile(filename)
+      end;
+      s.Free;
+    finally
+    end
+  end;
+
+  function r_Render_GetGibRect (m, id: Integer): TRectWH;
+  begin
+    Result := r_PlayerModel_GetGibRect(m, id)
+  end;
+
+  procedure r_Render_QueueEffect (AnimType, X, Y: Integer);
+  begin
+    r_GFX_OnceAnim(AnimType, X, Y)
+  end;
+
+  procedure r_Render_DrawLoading (force: Boolean);
+  begin
+    r_Window_DrawLoading(force)
   end;
 
 end.