+
+/* XXX all the sptr calculations assume mountimg.width == 512 */
+static void draw_mountains(void)
+{
+ int i, j, horizon_y, y;
+ int32_t x, xstart, xend, dx;
+ uint16_t *dptr, *sptr;
+
+ /* 24.8 fixed point, 512 width, 90deg arc */
+ xstart = cround64(cam_theta * (256.0 * MOUNTIMG_WIDTH / 90.0));
+ xend = cround64((cam_theta + HFOV) * (256.0 * MOUNTIMG_WIDTH / 90.0));
+ dx = (xend - xstart) / FB_WIDTH;
+ x = xstart;
+
+ horizon_y = cround64(-cam_phi * (FB_HEIGHT / 45.0)) + FB_HEIGHT / 2;
+ y = horizon_y - MOUNTIMG_HEIGHT;
+
+ if(y >= FB_HEIGHT) {
+ /* TODO draw gradient for the sky */
+ return;
+ }
+ if(horizon_y < 0) {
+ memset(fb_pixels, 0, FB_WIDTH * FB_HEIGHT * 2);
+ return;
+ }
+
+ for(i=0; i<FB_WIDTH; i++) {
+ int skip = mountimg_skip[(x >> 8) & 0x1ff];
+ int vspan = MOUNTIMG_HEIGHT - skip;
+
+ dptr = fb_pixels + (y + skip) * FB_WIDTH + i;
+
+ for(j=0; j<vspan; j++) {
+ *dptr = 0; /* black mountains */
+ dptr += FB_WIDTH;
+ }
+
+ x += dx;
+ }
+
+ if(horizon_y < FB_HEIGHT) {
+ memset(fb_pixels + horizon_y * FB_WIDTH, 0, (FB_HEIGHT - horizon_y) * FB_WIDTH * 2);
+ }
+}