+ update();
+
+ memset(fb_pixels, 0, fb_width * fb_height * 2);
+
+ g3d_matrix_mode(G3D_MODELVIEW);
+ g3d_load_identity();
+ g3d_translate(0, 0, -cam_dist);
+ if(opt.sball) {
+ g3d_mult_matrix(sball_matrix);
+ } else {
+ g3d_rotate(cam_phi, 1, 0, 0);
+ g3d_rotate(cam_theta, 0, 1, 0);
+ }
+
+ g3d_light_pos(0, -10, 10, 20);
+
+ zsort_mesh(&torus);
+
+ g3d_mtl_diffuse(0.4, 0.7, 1.0);
+ g3d_set_texture(tex.width, tex.height, tex.pixels);
+
+ draw_mesh(&torus);
+
+ /*draw_mesh(&cube);*/
+ swap_buffers(fb_pixels);
+}
+
+static void draw_debug(void)
+{
+ update();
+
+ memset(lowres_pixels, 0, lowres_width * lowres_height * 2);
+
+ g3d_matrix_mode(G3D_MODELVIEW);
+ g3d_load_identity();
+ g3d_translate(0, 0, -cam_dist);
+ g3d_rotate(cam_phi, 1, 0, 0);
+ g3d_rotate(cam_theta, 0, 1, 0);
+
+ g3d_framebuffer(lowres_width, lowres_height, lowres_pixels);
+ /*zsort(&torus);*/
+ draw_mesh(&cube);
+
+ draw_lowres_raster();
+
+
+ g3d_framebuffer(fb_width, fb_height, fb_pixels);
+
+ g3d_polygon_mode(G3D_WIRE);
+ draw_mesh(&cube);
+ g3d_polygon_mode(G3D_FLAT);
+
+ swap_buffers(fb_pixels);
+}
+
+
+static void draw_huge_pixel(uint16_t *dest, int dest_width, uint16_t color)
+{
+ int i, j;
+ uint16_t grid_color = PACK_RGB16(127, 127, 127);
+
+ for(i=0; i<LOWRES_SCALE; i++) {
+ for(j=0; j<LOWRES_SCALE; j++) {
+ dest[j] = i == 0 || j == 0 ? grid_color : color;
+ }
+ dest += dest_width;
+ }
+}
+
+static void draw_lowres_raster(void)
+{
+ int i, j;
+ uint16_t *sptr = lowres_pixels;
+ uint16_t *dptr = fb_pixels;
+
+ for(i=0; i<lowres_height; i++) {
+ for(j=0; j<lowres_width; j++) {
+ draw_huge_pixel(dptr, fb_width, *sptr++);
+ dptr += LOWRES_SCALE;
+ }
+ dptr += fb_width * LOWRES_SCALE - fb_width;
+ }
+}
+
+static int gen_texture(struct pimage *img, int xsz, int ysz)
+{
+ int i, j;
+ uint16_t *pix;
+
+ if(!(img->pixels = malloc(xsz * ysz * sizeof *pix))) {
+ return -1;
+ }
+ pix = img->pixels;
+
+ for(i=0; i<ysz; i++) {
+ for(j=0; j<xsz; j++) {
+ int val = i ^ j;
+
+ *pix++ = PACK_RGB16(val, val, val);
+ }
+ }
+
+ img->width = xsz;
+ img->height = ysz;
+ return 0;