diff --git a/src/debugsprite.cpp b/src/debugsprite.cpp
index a48fba09..177fdf44 100644
--- a/src/debugsprite.cpp
+++ b/src/debugsprite.cpp
@@ -53,7 +53,7 @@ void DebugSprite::TickRender(float delta_time)
     Asset::TickRender(delta_time);
 
     data->game->GetScene()->AddTile((data->tiler << 16) | 15, 300, 200, 32, 1);
-    data->game->GetScene()->AddTile((data->tiler << 16) | 31, 300, 232, 0, 1);
+    data->game->GetScene()->AddTile((data->tiler << 16) | 31, 300, 200, 0, 1);
 }
 
 DebugSprite::~DebugSprite()
diff --git a/src/scene.cpp b/src/scene.cpp
index 48d940fb..c25783a3 100644
--- a/src/scene.cpp
+++ b/src/scene.cpp
@@ -7,7 +7,19 @@
 #   include "config.h"
 #endif
 
-#include <stdlib.h>
+#include <cstdlib>
+#include <cmath>
+
+#ifdef WIN32
+#   define WIN32_LEAN_AND_MEAN
+#   include <windows.h>
+#endif
+#if defined __APPLE__ && defined __MACH__
+#   include <OpenGL/gl.h>
+#else
+#   define GL_GLEXT_PROTOTYPES
+#   include <GL/gl.h>
+#endif
 
 #include "scene.h"
 #include "tiler.h"
@@ -15,7 +27,7 @@
 struct Tile
 {
     uint32_t prio, code;
-    int x, y;
+    int x, y, z, o;
 };
 
 /*
@@ -64,6 +76,8 @@ void Scene::AddTile(uint32_t code, int x, int y, int z, int o)
     data->tiles[data->ntiles].code = code;
     data->tiles[data->ntiles].x = x;
     data->tiles[data->ntiles].y = y;
+    data->tiles[data->ntiles].z = z;
+    data->tiles[data->ntiles].o = o;
     data->ntiles++;
 }
 
@@ -71,8 +85,22 @@ void Scene::Render() // XXX: rename to Blit()
 {
     qsort(data->tiles, data->ntiles, sizeof(Tile), SceneData::Compare);
 
+    // XXX: debug stuff
+    glPushMatrix();
+    static float f = 0.0f;
+    f += 0.05f;
+    glTranslatef(320.0f, 240.0f, 0.0f);
+    glRotatef(45.0f, 1.0f, 0.0f, 0.0f);
+    glRotatef(30.0f * sinf(f), 0.0f, 0.0f, 1.0f);
+    //glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
+    glTranslatef(-320.0f, -240.0f, 0.0f);
+
     for (int i = 0; i < data->ntiles; i++)
-        Tiler::Render(data->tiles[i].code, data->tiles[i].x, data->tiles[i].y);
+        Tiler::BlitTile(data->tiles[i].code, data->tiles[i].x,
+                        data->tiles[i].y, data->tiles[i].z, data->tiles[i].o);
+
+    glPopMatrix();
+    // XXX: end of debug stuff
 
     free(data->tiles);
     data->tiles = 0;
diff --git a/src/sdlinput.cpp b/src/sdlinput.cpp
index 00c82d36..ee89be1a 100644
--- a/src/sdlinput.cpp
+++ b/src/sdlinput.cpp
@@ -50,7 +50,7 @@ void SdlInput::TickGame(float delta_time)
     /* Handle mouse input */
     int mx, my;
     SDL_GetMouseState(&mx, &my);
-    data->game->SetMouse(mx * (640 - 32) / 640, my * (480 - 32) / 480);
+    data->game->SetMouse(mx * (640 - 32) / 320 - 320, my * (480 - 32) / 240 - 240);
 
     /* Handle keyboard and WM input */
     SDL_Event event;
diff --git a/src/tiler.cpp b/src/tiler.cpp
index 3ee1e709..cfdd2644 100644
--- a/src/tiler.cpp
+++ b/src/tiler.cpp
@@ -94,10 +94,10 @@ void Tiler::Deregister(int id)
         data->tilesets[id] = NULL;
 }
 
-void Tiler::Render(uint32_t code, int x, int y)
+void Tiler::BlitTile(uint32_t code, int x, int y, int z, int o)
 {
     int id = (code >> 16) - 1; /* ID 0 is for the empty tileset */
 
-    data->tilesets[id]->BlitTile(code & 0xffff, x, y);
+    data->tilesets[id]->BlitTile(code & 0xffff, x, y, z, o);
 }
 
diff --git a/src/tiler.h b/src/tiler.h
index cad90df0..cee15769 100644
--- a/src/tiler.h
+++ b/src/tiler.h
@@ -20,7 +20,7 @@ public:
     static int Register(char const *path);
     static void Deregister(int id);
 
-    static void Render(uint32_t code, int x, int y);
+    static void BlitTile(uint32_t code, int x, int y, int z, int o);
 };
 
 #endif // __DH_TILER_H__
diff --git a/src/tileset.cpp b/src/tileset.cpp
index dc174063..e09d8539 100644
--- a/src/tileset.cpp
+++ b/src/tileset.cpp
@@ -8,6 +8,7 @@
 #endif
 
 #include <cstdlib>
+#include <cmath>
 
 #ifdef WIN32
 #   define WIN32_LEAN_AND_MEAN
@@ -108,23 +109,26 @@ char const *TileSet::GetName()
     return data->name;
 }
 
-void TileSet::BlitTile(uint32_t id, int x, int y)
+void TileSet::BlitTile(uint32_t id, int x, int y, int z, int o)
 {
     float tx = .0625f * (id & 0xf);
     float ty = .0625f * ((id >> 4) & 0xf);
 
+    float sqrt2 = sqrtf(2.0f);
+    int off = o ? 32 : 0;
+
     if (!data->img)
     {
         glBindTexture(GL_TEXTURE_2D, data->texture);
         glBegin(GL_QUADS);
             glTexCoord2f(tx, ty);
-            glVertex2f(x, y);
+            glVertex3f(x, sqrt2 * (y + off), sqrt2 * (z + off));
             glTexCoord2f(tx + .0625f, ty);
-            glVertex2f(x + 32, y);
+            glVertex3f(x + 32, sqrt2 * (y + off), sqrt2 * (z + off));
             glTexCoord2f(tx + .0625f, ty + .0625f);
-            glVertex2f(x + 32, y + 32);
+            glVertex3f(x + 32, sqrt2 * (y + 32), sqrt2 * z);
             glTexCoord2f(tx, ty + .0625f);
-            glVertex2f(x, y + 32);
+            glVertex3f(x, sqrt2 * (y + 32), sqrt2 * z);
         glEnd();
     }
 }
diff --git a/src/tileset.h b/src/tileset.h
index 8da0bf1e..7ad37101 100644
--- a/src/tileset.h
+++ b/src/tileset.h
@@ -35,7 +35,7 @@ public:
     /* New methods */
     char const *GetName();
 
-    void BlitTile(uint32_t id, int x, int y);
+    void BlitTile(uint32_t id, int x, int y, int z, int o);
 
 private:
     TileSetData *data;