added texture mapping
[dosdemo] / src / 3dgfx.c
index 30721c8..47b3830 100644 (file)
@@ -6,6 +6,7 @@
 #include "3dgfx.h"
 #include "polyfill.h"
 #include "inttypes.h"
+#include "util.h"
 
 #define STACK_SIZE     8
 typedef float g3d_matrix[16];
@@ -90,9 +91,9 @@ void g3d_framebuffer(int width, int height, void *pixels)
        st->height = height;
        st->pixels = pixels;
 
-       pimg_fb.pixels = pixels;
-       pimg_fb.width = width;
-       pimg_fb.height = height;
+       pfill_fb.pixels = pixels;
+       pfill_fb.width = width;
+       pfill_fb.height = height;
 }
 
 void g3d_enable(unsigned int opt)
@@ -339,6 +340,33 @@ void g3d_mtl_shininess(float shin)
        st->mtl.shin = shin;
 }
 
+static INLINE int calc_shift(unsigned int x)
+{
+       int res = -1;
+       while(x) {
+               x >>= 1;
+               ++res;
+       }
+       return res;
+}
+
+static INLINE int calc_mask(unsigned int x)
+{
+       return x - 1;
+}
+
+void g3d_set_texture(int xsz, int ysz, void *pixels)
+{
+       pfill_tex.pixels = pixels;
+       pfill_tex.width = xsz;
+       pfill_tex.height = ysz;
+
+       pfill_tex.xshift = calc_shift(xsz);
+       pfill_tex.yshift = calc_shift(ysz);
+       pfill_tex.xmask = calc_mask(xsz);
+       pfill_tex.ymask = calc_mask(ysz);
+}
+
 void g3d_draw(int prim, const struct g3d_vertex *varr, int varr_size)
 {
        g3d_draw_indexed(prim, varr, varr_size, 0, 0);
@@ -388,11 +416,11 @@ void g3d_draw_indexed(int prim, const struct g3d_vertex *varr, int varr_size,
                        v[i].y = (0.5f - v[i].y * 0.5f) * (float)st->height;
 
                        /* convert pos to 24.8 fixed point */
-                       pv[i].x = (int32_t)(v[i].x * 256.0f);
-                       pv[i].y = (int32_t)(v[i].y * 256.0f);
+                       pv[i].x = cround64(v[i].x * 256.0f);
+                       pv[i].y = cround64(v[i].y * 256.0f);
                        /* convert tex coords to 16.16 fixed point */
-                       pv[i].u = (int32_t)(v[i].u * 65536.0f);
-                       pv[i].v = (int32_t)(v[i].v * 65536.0f);
+                       pv[i].u = cround64(v[i].u * 65536.0f);
+                       pv[i].v = cround64(v[i].v * 65536.0f);
                        /* pass the color through as is */
                        pv[i].r = v[i].r;
                        pv[i].g = v[i].g;
@@ -483,9 +511,9 @@ static void shade(struct g3d_vertex *v)
                color[2] += st->mtl.kd[2] * st->lt[i].b * ndotl;
        }
 
-       r = color[0] * 255.0;
-       g = color[1] * 255.0;
-       b = color[2] * 255.0;
+       r = cround64(color[0] * 255.0);
+       g = cround64(color[1] * 255.0);
+       b = cround64(color[2] * 255.0);
 
        v->r = r > 255 ? 255 : r;
        v->g = g > 255 ? 255 : g;