22#include " stb_image.h"
33#include " resource.h"
44#include " debug.h"
5+ #include " ..\include\openglrenderer.h"
56
67#ifdef _USRDLL
78extern HINSTANCE g_hInstDll;
@@ -51,7 +52,7 @@ OpenGLRenderer::OpenGLRenderer()
5152 char * fss = getRcdata (m_ctx.hInstance , IDR_SHADER_DEFAULT_FS, fsl);
5253 char * atl = getRcdata (m_ctx.hInstance , IDR_TEXTURE_ATLAS, texl);
5354
54- initShapeMap ();
55+ initShapeAttrs ();
5556
5657 int atl_w, atl_h;
5758 int atl_cmp;
@@ -85,6 +86,8 @@ OpenGLRenderer::OpenGLRenderer()
8586
8687 shader.setUniform (" m_TexSelector" , texSelector);
8788 shader.setUniform (" m_TexMixer" , texMixer);
89+ shader.setUniform (" m_SdfOffset" , 0 .3f );
90+ shader.setUniform (" m_SdfEnable" , false );
8891
8992 atlas.image2d (atl_w, atl_h, GL_RGBA, GL_UNSIGNED_BYTE, atl_data);
9093 }
@@ -97,14 +100,12 @@ OpenGLRenderer::~OpenGLRenderer()
97100
98101}
99102
100- void OpenGLRenderer::Render (SarFile& sar, int texW, int texH, void * bgraData)
101- {
102- // Prepare Data
103+ void OpenGLRenderer::Render (SarFile& sar, gl::framebuffer& fbo) {
103104
104105 std::vector<glm::vec3> vertices;
105106 std::vector<glm::vec4> colors;
106107 std::vector<glm::vec2> uvs;
107- std::vector<GLint> drawMode;
108+ std::vector<glm::ivec2> drawMode;
108109 std::vector<GLuint> indices;
109110
110111 glm::vec2 uv[] = { {0 ,0 },{0 ,1 },{1 ,0 }, {1 ,1 } };
@@ -117,13 +118,13 @@ void OpenGLRenderer::Render(SarFile& sar, int texW, int texH, void* bgraData)
117118 if (l.hidden ())
118119 continue ;
119120
120- auto map_it = m_ShapeMaps .find (l.shape ());
121- if (map_it == m_ShapeMaps .end ()) {
121+ auto map_it = m_ShapeAttrs .find (l.shape ());
122+ if (map_it == m_ShapeAttrs .end ()) {
122123 DEBUG_PRINT (" Invalid Shape ID: " << l.shape ());
123124 continue ;
124125 }
125126
126- shape_map map = map_it->second ;
127+ shape_attr map = map_it->second ;
127128 glm::vec2 uv_offset = glm::vec2 (map.x_pos (), map.y_pos ());
128129 // 0 2
129130 // 1 3
@@ -147,7 +148,7 @@ void OpenGLRenderer::Render(SarFile& sar, int texW, int texH, void* bgraData)
147148 uvs.push_back (baseUv);
148149
149150 // Shape Mod
150- drawMode.push_back (map.sheet ());
151+ drawMode.push_back (glm::ivec2 ( map.sheet (), map. sdf () ? 1 : 0 ));
151152
152153 DEBUG_PRINT (" UVs: " << baseUv.x << " , " << baseUv.y );
153154 }
@@ -165,12 +166,9 @@ void OpenGLRenderer::Render(SarFile& sar, int texW, int texH, void* bgraData)
165166 float halfH = sar.height () / 2 .f ;
166167 glm::mat4 proj = glm::ortho (-halfW - 0 .5f , halfW - 0 .5f , -halfH - 0 .5f , halfH - 0 .5f );
167168
168-
169- // OpenGL Drawing
170169 {
171170 std::lock_guard<std::mutex> lock{ m_ctx.mutex };
172171
173- gl::framebuffer fbo (texW, texH);
174172 shader.setUniform (" m_View" , view);
175173 shader.setUniform (" m_Proj" , proj);
176174
@@ -211,15 +209,15 @@ void OpenGLRenderer::Render(SarFile& sar, int texW, int texH, void* bgraData)
211209 glEnableVertexAttribArray (2 );
212210
213211 attr_mod.bind ();
214- glVertexAttribIPointer (3 , 1 , GL_INT, 1 * sizeof (GLint), (void *)0 );
212+ glVertexAttribIPointer (3 , 2 , GL_INT, 2 * sizeof (GLint), (void *)0 );
215213 glEnableVertexAttribArray (3 );
216214
217215 vao.unbind ();
218216
219217 // Draw
220218 fbo.bind ();
221219
222- glViewport (0 , 0 , texW, texH );
220+ glViewport (0 , 0 , fbo. width , fbo. height );
223221
224222 glClearColor (1 , 1 , 1 , 0 );
225223 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
@@ -229,42 +227,75 @@ void OpenGLRenderer::Render(SarFile& sar, int texW, int texH, void* bgraData)
229227
230228 glDrawElements (GL_TRIANGLES, indices.size (), GL_UNSIGNED_INT, 0 );
231229
232- glReadPixels (0 , 0 , texW, texH, GL_BGRA, GL_UNSIGNED_BYTE, bgraData);
233-
234230 fbo.unbind ();
235231 }
236232}
237233
238- void OpenGLRenderer::initShapeMap ()
234+ void OpenGLRenderer::SetFlag (int flag, bool value)
235+ {
236+ switch (flag) {
237+ case FLAG_HD:
238+ {
239+ std::lock_guard<std::mutex> lock{ m_ctx.mutex };
240+ shader.use ();
241+ shader.setUniform (" m_SdfEnable" , value);
242+ }
243+ break ;
244+ }
245+ }
246+
247+ void OpenGLRenderer::Render (SarFile& sar, int texW, int texH, void * bgraData)
239248{
240- struct map_offset {
249+ gl::framebuffer fbo (texW, texH);
250+
251+ Render (sar, fbo);
252+
253+ fbo.bind ();
254+ glReadPixels (0 , 0 , texW, texH, GL_BGRA, GL_UNSIGNED_BYTE, bgraData);
255+ fbo.unbind ();
256+ }
257+
258+ void OpenGLRenderer::initShapeAttrs ()
259+ {
260+ struct shape_attr_info {
241261 uint16_t start;
242262 uint16_t end;
243263 int16_t offset;
264+ bool sdfEnabled;
265+ };
266+
267+ shape_attr_info attrs[] = {
268+ /* Start End Offset SDF Shape Set */
269+ { 0 , 79 , 0 , true }, // Characters
270+ { 240 , 291 , 16 , true }, // Basic Diagram
271+ { 320 , 358 , 0 , true }, // Lines
272+ { 400 , 438 , -16 , true }, // Ink
273+ { 480 , 516 , 32 , false }, // Gradients
274+ { 560 , 584 , 16 , true }, // Fractals
275+ { 608 , 612 , 16 , true }, // Marks
276+ { 640 , 703 , 0 , true },
277+ { 720 , 753 , 240 , false } // Pictures
244278 };
245279
246- map_offset fixups[] = {
247- /* Start End Offset Shape Set */
248- { 0 , 79 , 0 }, // Characters
249- { 240 , 291 , 16 }, // Basic Diagram
250- { 320 , 358 , 0 }, // Lines
251- { 400 , 438 , -16 }, // Ink
252- { 480 , 516 , 32 }, // Gradients
253- { 560 , 584 , 16 }, // Fractals
254- { 608 , 612 , 16 }, // Marks
255- { 640 , 703 , 0 },
256- { 720 , 753 , 240 } // Pictures
280+ uint16_t blacklist[] = {
281+ 560 + 8 , 560 + 20 , 560 + 21 , 560 + 22 , 560 + 23 , 560 + 24 // Some Fractals
257282 };
258283
259- constexpr int num_fixups = sizeof (fixups ) / sizeof (map_offset );
260- for (int i = 0 ; i < num_fixups ; i++) {
261- map_offset& fixup = fixups [i];
262- for (uint16_t shape_id = fixup .start ; shape_id <= fixup .end ; shape_id++) {
263- uint16_t new_id = uint16_t (shape_id + fixup .offset );
264- m_ShapeMaps [shape_id] = { new_id };
284+ constexpr int num_attrs = sizeof (attrs ) / sizeof (shape_attr_info );
285+ for (int i = 0 ; i < num_attrs ; i++) {
286+ shape_attr_info& attr = attrs [i];
287+ for (uint16_t shape_id = attr .start ; shape_id <= attr .end ; shape_id++) {
288+ uint16_t new_id = uint16_t (shape_id + attr .offset );
289+ m_ShapeAttrs [shape_id] = { new_id, attr. sdfEnabled };
265290 DEBUG_PRINT (" Shape Mapping: " << shape_id << " => " << new_id);
266291 }
267292 }
293+
294+ constexpr int num_blacklisted = sizeof (blacklist) / sizeof (uint16_t );
295+ for (int i = 0 ; i < num_blacklisted; i++) {
296+ uint16_t shape = blacklist[i];
297+ m_ShapeAttrs[shape].m_EnableSdf = false ;
298+ }
268299}
269300
270301OpenGLContext::OpenGLContext ()
0 commit comments