@@ -42,10 +42,71 @@ IC void MouseRayFromPoint(Fvector& direction, int x, int y, Fmatrix& m_CamMat)
42
42
#define SM_FOR_SEND_HEIGHT 480
43
43
44
44
#if defined(USE_OGL)
45
+ // XXX: remove
46
+ // Temporary solution based on:
47
+ // http://masandilov.ru/opengl/ScreenShots
48
+ void WriteTGA (IWriter* file)
49
+ {
50
+ const u32 width = psCurrentVidMode[0 ];
51
+ const u32 height = psCurrentVidMode[1 ];
52
+
53
+ constexpr u32 colorMode = 3 ;
54
+ const u32 size = width * height * colorMode;
55
+
56
+ auto output = new u8 [size];
57
+
58
+ glReadPixels (0 , 0 , width, height, GL_RGB, GL_UNSIGNED_BYTE, output);
59
+
60
+ const u8 tgaHeader[12 ] = { 0 , 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };
61
+
62
+ constexpr u8 bits = 24 ;
63
+ constexpr u8 flipped = 32 ;
64
+
65
+ u8 header[6 ];
66
+ header[0 ] = width % 256 ;
67
+ header[1 ] = width / 256 ;
68
+ header[2 ] = height % 256 ;
69
+ header[3 ] = height / 256 ;
70
+ header[4 ] = bits;
71
+ header[5 ] = flipped;
72
+
73
+ file->w (tgaHeader, sizeof (tgaHeader));
74
+ file->w (header, sizeof (header));
75
+
76
+ // TGA format used BGR instead of RGB
77
+ for (u32 i = 0 ; i < size; i += colorMode)
78
+ std::swap (output[i], output[i + 2 ]);
79
+
80
+ file->w (output, size);
81
+ xr_delete (output);
82
+ }
83
+
84
+ // XXX: Provide full implementation
45
85
void CRender::ScreenshotImpl (ScreenshotMode mode, LPCSTR name, CMemoryWriter* memory_writer)
46
86
{
47
- // TODO: OGL: Implement screenshot feature.
48
- VERIFY (!" CRender::ScreenshotImpl not implemented." );
87
+ switch (mode)
88
+ {
89
+ case SM_NORMAL:
90
+ {
91
+ string64 time;
92
+ string_path buf;
93
+ xr_sprintf (buf, sizeof (buf), " ss_%s_%s_(%s).tga" , Core.UserName , timestamp (time),
94
+ g_pGameLevel ? g_pGameLevel->name ().c_str () : " mainmenu" );
95
+
96
+ IWriter* fs = FS.w_open (" $screenshots$" , buf);
97
+ R_ASSERT (fs);
98
+ WriteTGA (fs);
99
+ FS.w_close (fs);
100
+
101
+ return ;
102
+ }
103
+
104
+ case SM_FOR_CUBEMAP:
105
+ case SM_FOR_GAMESAVE:
106
+ case SM_FOR_LEVELMAP:
107
+ case SM_FOR_MPSENDING:
108
+ VERIFY (!" CRender::Screenshot. This screenshot type is not supported for OGL." );
109
+ }
49
110
}
50
111
#elif defined(USE_DX10) || defined(USE_DX11)
51
112
void CRender::ScreenshotImpl (ScreenshotMode mode, LPCSTR name, CMemoryWriter* memory_writer)
0 commit comments