Browse Source

Merge pull request #24 from zmeyc/pr_subpixel

Optionally disable subpixel rendering
Denis Muratshin 10 years ago
parent
commit
5755d24be4
2 changed files with 36 additions and 24 deletions
  1. 30 24
      oxygine/src/core/Renderer.h
  2. 6 0
      oxygine/src/oxygine_include.h

+ 30 - 24
oxygine/src/core/Renderer.h

@@ -8,6 +8,12 @@
 #include "NativeTexture.h"
 #include "VideoDriver.h"
 
+#if OXYGINE_NO_SUBPIXEL_RENDERING
+#define ROUND_TO_PIXELS_IF_ENABLED(arg) floor(arg)
+#else
+#define ROUND_TO_PIXELS_IF_ENABLED(arg) (arg)
+#endif
+
 namespace oxygine
 {
     typedef AffineTransform Transform;
@@ -50,29 +56,29 @@ namespace oxygine
 
         vt.z = 0;
 
-        vt.x = p1.x;
-        vt.y = p1.y;
+        vt.x = ROUND_TO_PIXELS_IF_ENABLED(p1.x);
+        vt.y = ROUND_TO_PIXELS_IF_ENABLED(p1.y);
         vt.u = u;
         vt.v = v;
         *pv = vt;
         ++pv;
 
-        vt.x = p2.x;
-        vt.y = p2.y;
+        vt.x = ROUND_TO_PIXELS_IF_ENABLED(p2.x);
+        vt.y = ROUND_TO_PIXELS_IF_ENABLED(p2.y);
         vt.u = u;
         vt.v = v + dv;
         *pv = vt;
         ++pv;
 
-        vt.x = p3.x;
-        vt.y = p3.y;
+        vt.x = ROUND_TO_PIXELS_IF_ENABLED(p3.x);
+        vt.y = ROUND_TO_PIXELS_IF_ENABLED(p3.y);
         vt.u = u + du;
         vt.v = v;
         *pv = vt;
         ++pv;
 
-        vt.x = p4.x;
-        vt.y = p4.y;
+        vt.x = ROUND_TO_PIXELS_IF_ENABLED(p4.x);
+        vt.y = ROUND_TO_PIXELS_IF_ENABLED(p4.y);
         vt.u = u + du;
         vt.v = v + dv;
         *pv = vt;
@@ -102,29 +108,29 @@ namespace oxygine
 
         vt.z = Z;
 
-        vt.x = p1.x;
-        vt.y = p1.y;
+        vt.x = ROUND_TO_PIXELS_IF_ENABLED(p1.x);
+        vt.y = ROUND_TO_PIXELS_IF_ENABLED(p1.y);
         vt.u = u;
         vt.v = v;
         *pv = vt;
         ++pv;
 
-        vt.x = p2.x;
-        vt.y = p2.y;
+        vt.x = ROUND_TO_PIXELS_IF_ENABLED(p2.x);
+        vt.y = ROUND_TO_PIXELS_IF_ENABLED(p2.y);
         vt.u = u;
         vt.v = v + dv;
         *pv = vt;
         ++pv;
 
-        vt.x = p3.x;
-        vt.y = p3.y;
+        vt.x = ROUND_TO_PIXELS_IF_ENABLED(p3.x);
+        vt.y = ROUND_TO_PIXELS_IF_ENABLED(p3.y);
         vt.u = u + du;
         vt.v = v;
         *pv = vt;
         ++pv;
 
-        vt.x = p4.x;
-        vt.y = p4.y;
+        vt.x = ROUND_TO_PIXELS_IF_ENABLED(p4.x);
+        vt.y = ROUND_TO_PIXELS_IF_ENABLED(p4.y);
         vt.u = u + du;
         vt.v = v + dv;
         *pv = vt;
@@ -166,8 +172,8 @@ namespace oxygine
 
         vt.z = 0;
 
-        vt.x = p1.x;
-        vt.y = p1.y;
+        vt.x = ROUND_TO_PIXELS_IF_ENABLED(p1.x);
+        vt.y = ROUND_TO_PIXELS_IF_ENABLED(p1.y);
         vt.u = u;
         vt.v = v;
         vt.u2 = u2;
@@ -175,8 +181,8 @@ namespace oxygine
         *pv = vt;
         ++pv;
 
-        vt.x = p2.x;
-        vt.y = p2.y;
+        vt.x = ROUND_TO_PIXELS_IF_ENABLED(p2.x);
+        vt.y = ROUND_TO_PIXELS_IF_ENABLED(p2.y);
         vt.u = u;
         vt.v = v + dv;
         vt.u2 = u2;
@@ -184,8 +190,8 @@ namespace oxygine
         *pv = vt;
         ++pv;
 
-        vt.x = p3.x;
-        vt.y = p3.y;
+        vt.x = ROUND_TO_PIXELS_IF_ENABLED(p3.x);
+        vt.y = ROUND_TO_PIXELS_IF_ENABLED(p3.y);
         vt.u = u + du;
         vt.v = v;
         vt.u2 = u2 + du2;
@@ -193,8 +199,8 @@ namespace oxygine
         *pv = vt;
         ++pv;
 
-        vt.x = p4.x;
-        vt.y = p4.y;
+        vt.x = ROUND_TO_PIXELS_IF_ENABLED(p4.x);
+        vt.y = ROUND_TO_PIXELS_IF_ENABLED(p4.y);
         vt.u = u + du;
         vt.v = v + dv;
         vt.u2 = u2 + du2;

+ 6 - 0
oxygine/src/oxygine_include.h

@@ -6,6 +6,12 @@
 #include <stdio.h>
 #include <stdarg.h>
 
+// Round everything to whole pixels during rendering.
+// Helps to avoid artifacts in pixel art games
+// when using textures with linearFilter="false"
+// and fractional sprite coordinates or sprite scaling.
+// Introduces some CPU overhead.
+//#define OXYGINE_NO_SUBPIXEL_RENDERING 1
 
 //#define OXYGINE_NO_YEILD 1