dos3d
diff firstp/firstp.c @ 14:be61704c4cc8
added initial firstp
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Tue, 29 Nov 2011 07:22:49 +0200 |
parents | |
children | 1e9f0b3616fa |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/firstp/firstp.c Tue Nov 29 07:22:49 2011 +0200 1.3 @@ -0,0 +1,251 @@ 1.4 +#include <stdio.h> 1.5 +#include <stdlib.h> 1.6 +#include <math.h> 1.7 +#include <signal.h> 1.8 +#include <conio.h> 1.9 +#include "vga.h" 1.10 +#include "mingl.h" 1.11 +#include "timer.h" 1.12 +#include "mouse.h" 1.13 +#include "texture.h" 1.14 +#include "palman.h" 1.15 +#include "scene.h" 1.16 + 1.17 +#define DEG2RAD(x) (M_PI * (x) / 180.0) 1.18 + 1.19 +static int init(void); 1.20 +static void shutdown(void); 1.21 +static void redraw(void); 1.22 +static int proc_events(void); 1.23 +static int keyb(int key); 1.24 +static void mouse_button(int bn, int x, int y); 1.25 +static void mouse_motion(int x, int y); 1.26 +static void sighandler(int s); 1.27 + 1.28 + 1.29 +static float cam_x, cam_y, cam_z = 10; 1.30 +static float cam_theta, cam_phi; 1.31 + 1.32 +static float walk_speed = 0.1; 1.33 +static float look_speed = 1.0; 1.34 +static int mouse_look = 0; 1.35 + 1.36 +static void *fbuf; 1.37 +static struct scene scn; 1.38 + 1.39 + 1.40 +int main(void) 1.41 +{ 1.42 + if(init() == -1) { 1.43 + return 1; 1.44 + } 1.45 + 1.46 + while(proc_events()) { 1.47 + redraw(); 1.48 + } 1.49 + 1.50 + shutdown(); 1.51 + return 0; 1.52 +} 1.53 + 1.54 + 1.55 +static int init(void) 1.56 +{ 1.57 + init_timer(100); 1.58 + 1.59 + set_video_mode(0x13); 1.60 + 1.61 + signal(SIGINT, sighandler); 1.62 + signal(SIGSEGV, sighandler); 1.63 + signal(SIGFPE, sighandler); 1.64 + signal(SIGILL, sighandler); 1.65 + signal(SIGABRT, sighandler); 1.66 + 1.67 + if(mgl_init(320, 200) == -1) { 1.68 + fprintf(stderr, "mgl init failed\n"); 1.69 + return -1; 1.70 + } 1.71 + fbuf = mgl_framebuffer(); 1.72 + 1.73 + mgl_enable(MGL_CULL_FACE); 1.74 + mgl_enable(MGL_SMOOTH); 1.75 + mgl_enable(MGL_LIGHTING); 1.76 + mgl_enable(MGL_DEPTH_TEST); 1.77 + 1.78 + mgl_matrix_mode(MGL_PROJECTION); 1.79 + mgl_load_identity(); 1.80 + mgl_perspective(45.0, 320.0 / 200.0, 0.5, 200.0); 1.81 + 1.82 + /* setup palette */ 1.83 + palm_add_color(255, 255, 255); 1.84 + 1.85 + scn_init(&scn); 1.86 + if(scn_load(&scn, "data/hall.obj") == -1) { 1.87 + return -1; 1.88 + } 1.89 + 1.90 + palm_build(); 1.91 + { 1.92 + int i, palsz = palm_palette_size(); 1.93 + struct palm_color *pal = palm_palette(); 1.94 + 1.95 + for(i=0; i<palsz; i++) { 1.96 + set_palette(i, pal[i].r, pal[i].g, pal[i].b); 1.97 + } 1.98 + } 1.99 + 1.100 + mgl_color_range(palm_color_range() - 1); 1.101 + return 0; 1.102 +} 1.103 + 1.104 +static void shutdown(void) 1.105 +{ 1.106 + mgl_free(); 1.107 + set_video_mode(3); 1.108 +} 1.109 + 1.110 +static void redraw(void) 1.111 +{ 1.112 + mgl_clear(0); 1.113 + mgl_clear_depth(); 1.114 + 1.115 + mgl_matrix_mode(MGL_MODELVIEW); 1.116 + mgl_load_identity(); 1.117 + mgl_rotate(cam_theta, 0, 1, 0); 1.118 + mgl_rotate(cam_phi, 1, 0, 0); 1.119 + mgl_translate(-cam_x, -cam_y, -cam_z); 1.120 + 1.121 + mgl_light_intensity(0, 1.0); 1.122 + mgl_light_position(0, 0, 5, 0, 1); 1.123 + 1.124 + /*mgl_torus(0.75, 0.25, 16, 8);*/ 1.125 + scn_render(&scn); 1.126 + 1.127 + copy_frame(fbuf); 1.128 +} 1.129 + 1.130 +static int proc_events(void) 1.131 +{ 1.132 + static int prev_mx, prev_my, prev_bnmask; 1.133 + int mx, my, bnmask; 1.134 + 1.135 + if(kbhit()) { 1.136 + if(keyb(getch()) == 0) { 1.137 + return 0; 1.138 + } 1.139 + } 1.140 + 1.141 + bnmask = read_mouse(&mx, &my); 1.142 + if(bnmask != prev_bnmask) { 1.143 + mouse_button(bnmask, mx, my); 1.144 + prev_bnmask = bnmask; 1.145 + } 1.146 + if(mx != prev_mx || my != prev_my) { 1.147 + mouse_motion(mx, my); 1.148 + prev_mx = mx; 1.149 + prev_my = my; 1.150 + } 1.151 + return 1; 1.152 +} 1.153 + 1.154 +static int keyb(int key) 1.155 +{ 1.156 + float dir_x, dir_y, right_x, right_y; 1.157 + 1.158 + dir_x = sin(DEG2RAD(cam_theta)) * walk_speed; 1.159 + dir_y = cos(DEG2RAD(cam_theta)) * walk_speed; 1.160 + right_x = dir_y; 1.161 + right_y = -dir_x; 1.162 + 1.163 + switch(key) { 1.164 + case 27: 1.165 + return 0; 1.166 + 1.167 + case 'w': 1.168 + cam_x += dir_x; 1.169 + cam_z -= dir_y; 1.170 + break; 1.171 + 1.172 + case 's': 1.173 + cam_x -= dir_x; 1.174 + cam_z += dir_y; 1.175 + break; 1.176 + 1.177 + case 'a': 1.178 + cam_x -= right_x; 1.179 + cam_z += right_y; 1.180 + break; 1.181 + 1.182 + case 'd': 1.183 + cam_x += right_x; 1.184 + cam_z -= right_y; 1.185 + break; 1.186 + 1.187 + case '`': 1.188 + mouse_look = !mouse_look; 1.189 + break; 1.190 + 1.191 + default: 1.192 + break; 1.193 + } 1.194 + return 1; 1.195 +} 1.196 + 1.197 +static int bnstate; 1.198 +static void mouse_button(int bn, int x, int y) 1.199 +{ 1.200 + bnstate = bn; 1.201 +} 1.202 + 1.203 +static void mouse_motion(int x, int y) 1.204 +{ 1.205 + static int prev_x, prev_y; 1.206 + int dx = x - prev_x; 1.207 + int dy = y - prev_y; 1.208 + prev_x = x; 1.209 + prev_y = y; 1.210 + 1.211 + if(mouse_look || bnstate) { 1.212 + cam_theta += dx * look_speed; 1.213 + cam_phi += dy * look_speed; 1.214 + 1.215 + if(cam_phi < -90) { 1.216 + cam_phi = -90; 1.217 + } 1.218 + if(cam_phi > 90) { 1.219 + cam_phi = 90; 1.220 + } 1.221 + } 1.222 +} 1.223 + 1.224 +static void sighandler(int s) 1.225 +{ 1.226 + set_video_mode(3); 1.227 + 1.228 + switch(s) { 1.229 + case SIGABRT: 1.230 + fprintf(stderr, "abort\n"); 1.231 + break; 1.232 + 1.233 + case SIGILL: 1.234 + fprintf(stderr, "illegal operation\n"); 1.235 + break; 1.236 + 1.237 + case SIGSEGV: 1.238 + fprintf(stderr, "segmentation fault\n"); 1.239 + break; 1.240 + 1.241 + case SIGINT: 1.242 + fprintf(stderr, "interrupted\n"); 1.243 + break; 1.244 + 1.245 + case SIGFPE: 1.246 + fprintf(stderr, "floating point exception\n"); 1.247 + break; 1.248 + 1.249 + default: 1.250 + fprintf(stderr, "unexpected signal\n"); 1.251 + } 1.252 + 1.253 + exit(1); 1.254 +}