dos3d
changeset 14:be61704c4cc8
added initial firstp
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Tue, 29 Nov 2011 07:22:49 +0200 |
parents | 7b574ba5758e |
children | 4a0e9ab12ad0 |
files | Makefile firstp/Makefile firstp/Makefile.bcc firstp/firstp.c src/mglimpl.h |
diffstat | 5 files changed, 310 insertions(+), 11 deletions(-) [+] |
line diff
1.1 --- a/Makefile Mon Nov 28 05:12:33 2011 +0200 1.2 +++ b/Makefile Tue Nov 29 07:22:49 2011 +0200 1.3 @@ -1,6 +1,7 @@ 1.4 obj = src/test.o \ 1.5 src/mingl.o src/mglrast.o src/mglgen.o \ 1.6 src/texture.o src/palman.o \ 1.7 + src/scene.o src/cvec.o \ 1.8 dosemu/dosemu.o 1.9 dep = $(obj:.o=.d) 1.10 bin = test
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/firstp/Makefile Tue Nov 29 07:22:49 2011 +0200 2.3 @@ -0,0 +1,30 @@ 2.4 +mgldir = ../src 2.5 +demudir = ../dosemu 2.6 + 2.7 +obj = firstp.o \ 2.8 + $(mgldir)/mingl.o $(mgldir)/mglrast.o $(mgldir)/mglgen.o \ 2.9 + $(mgldir)/texture.o $(mgldir)/palman.o \ 2.10 + $(mgldir)/cvec.o $(mgldir)/scene.o \ 2.11 + $(demudir)/dosemu.o 2.12 +dep = $(obj:.o=.d) 2.13 +bin = firstp 2.14 + 2.15 +CC = gcc 2.16 +CFLAGS = -pedantic -Wall -g `pkg-config --cflags sdl` -I$(mgldir) -I$(demudir) 2.17 +LDFLAGS = `pkg-config --libs sdl` 2.18 + 2.19 +$(bin): $(obj) 2.20 + $(CC) -o $@ $(obj) $(LDFLAGS) 2.21 + 2.22 +-include $(dep) 2.23 + 2.24 +%.d: %.c 2.25 + @$(CPP) $(CFLAGS) $< -MM -MT $(@:.d=.o) >$@ 2.26 + 2.27 +.PHONY: clean 2.28 +clean: 2.29 + rm -f $(obj) $(bin) 2.30 + 2.31 +.PHONY: cleandep 2.32 +cleandep: 2.33 + rm -f $(dep)
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/firstp/Makefile.bcc Tue Nov 29 07:22:49 2011 +0200 3.3 @@ -0,0 +1,26 @@ 3.4 +.AUTODEPEND 3.5 + 3.6 +obj = src\test.obj src\vga.obj src\timer.obj src\mouse.obj \ 3.7 + src\mingl.obj src\mglrast.obj src\mglgen.obj \ 3.8 + src\texture.obj src\palman.obj 3.9 +bin = dos3d.exe 3.10 + 3.11 +CC = bcc 3.12 + 3.13 +# 286 instructions, large memory model 3.14 +CFLAGS = -1 -f287 -ml -O -G -Isrc 3.15 + 3.16 +$(bin): $(obj) 3.17 + $(CC) @&&| 3.18 +$(CFLAGS) -e$@ 3.19 +$(obj) 3.20 +| 3.21 + 3.22 +.SUFFIXES: .c .obj 3.23 + 3.24 +.c.obj: 3.25 + $(CC) $(CFLAGS) -o$@ -c $< 3.26 + 3.27 +clean: 3.28 + del src\*.obj 3.29 + del $(bin)
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 4.2 +++ b/firstp/firstp.c Tue Nov 29 07:22:49 2011 +0200 4.3 @@ -0,0 +1,251 @@ 4.4 +#include <stdio.h> 4.5 +#include <stdlib.h> 4.6 +#include <math.h> 4.7 +#include <signal.h> 4.8 +#include <conio.h> 4.9 +#include "vga.h" 4.10 +#include "mingl.h" 4.11 +#include "timer.h" 4.12 +#include "mouse.h" 4.13 +#include "texture.h" 4.14 +#include "palman.h" 4.15 +#include "scene.h" 4.16 + 4.17 +#define DEG2RAD(x) (M_PI * (x) / 180.0) 4.18 + 4.19 +static int init(void); 4.20 +static void shutdown(void); 4.21 +static void redraw(void); 4.22 +static int proc_events(void); 4.23 +static int keyb(int key); 4.24 +static void mouse_button(int bn, int x, int y); 4.25 +static void mouse_motion(int x, int y); 4.26 +static void sighandler(int s); 4.27 + 4.28 + 4.29 +static float cam_x, cam_y, cam_z = 10; 4.30 +static float cam_theta, cam_phi; 4.31 + 4.32 +static float walk_speed = 0.1; 4.33 +static float look_speed = 1.0; 4.34 +static int mouse_look = 0; 4.35 + 4.36 +static void *fbuf; 4.37 +static struct scene scn; 4.38 + 4.39 + 4.40 +int main(void) 4.41 +{ 4.42 + if(init() == -1) { 4.43 + return 1; 4.44 + } 4.45 + 4.46 + while(proc_events()) { 4.47 + redraw(); 4.48 + } 4.49 + 4.50 + shutdown(); 4.51 + return 0; 4.52 +} 4.53 + 4.54 + 4.55 +static int init(void) 4.56 +{ 4.57 + init_timer(100); 4.58 + 4.59 + set_video_mode(0x13); 4.60 + 4.61 + signal(SIGINT, sighandler); 4.62 + signal(SIGSEGV, sighandler); 4.63 + signal(SIGFPE, sighandler); 4.64 + signal(SIGILL, sighandler); 4.65 + signal(SIGABRT, sighandler); 4.66 + 4.67 + if(mgl_init(320, 200) == -1) { 4.68 + fprintf(stderr, "mgl init failed\n"); 4.69 + return -1; 4.70 + } 4.71 + fbuf = mgl_framebuffer(); 4.72 + 4.73 + mgl_enable(MGL_CULL_FACE); 4.74 + mgl_enable(MGL_SMOOTH); 4.75 + mgl_enable(MGL_LIGHTING); 4.76 + mgl_enable(MGL_DEPTH_TEST); 4.77 + 4.78 + mgl_matrix_mode(MGL_PROJECTION); 4.79 + mgl_load_identity(); 4.80 + mgl_perspective(45.0, 320.0 / 200.0, 0.5, 200.0); 4.81 + 4.82 + /* setup palette */ 4.83 + palm_add_color(255, 255, 255); 4.84 + 4.85 + scn_init(&scn); 4.86 + if(scn_load(&scn, "data/hall.obj") == -1) { 4.87 + return -1; 4.88 + } 4.89 + 4.90 + palm_build(); 4.91 + { 4.92 + int i, palsz = palm_palette_size(); 4.93 + struct palm_color *pal = palm_palette(); 4.94 + 4.95 + for(i=0; i<palsz; i++) { 4.96 + set_palette(i, pal[i].r, pal[i].g, pal[i].b); 4.97 + } 4.98 + } 4.99 + 4.100 + mgl_color_range(palm_color_range() - 1); 4.101 + return 0; 4.102 +} 4.103 + 4.104 +static void shutdown(void) 4.105 +{ 4.106 + mgl_free(); 4.107 + set_video_mode(3); 4.108 +} 4.109 + 4.110 +static void redraw(void) 4.111 +{ 4.112 + mgl_clear(0); 4.113 + mgl_clear_depth(); 4.114 + 4.115 + mgl_matrix_mode(MGL_MODELVIEW); 4.116 + mgl_load_identity(); 4.117 + mgl_rotate(cam_theta, 0, 1, 0); 4.118 + mgl_rotate(cam_phi, 1, 0, 0); 4.119 + mgl_translate(-cam_x, -cam_y, -cam_z); 4.120 + 4.121 + mgl_light_intensity(0, 1.0); 4.122 + mgl_light_position(0, 0, 5, 0, 1); 4.123 + 4.124 + /*mgl_torus(0.75, 0.25, 16, 8);*/ 4.125 + scn_render(&scn); 4.126 + 4.127 + copy_frame(fbuf); 4.128 +} 4.129 + 4.130 +static int proc_events(void) 4.131 +{ 4.132 + static int prev_mx, prev_my, prev_bnmask; 4.133 + int mx, my, bnmask; 4.134 + 4.135 + if(kbhit()) { 4.136 + if(keyb(getch()) == 0) { 4.137 + return 0; 4.138 + } 4.139 + } 4.140 + 4.141 + bnmask = read_mouse(&mx, &my); 4.142 + if(bnmask != prev_bnmask) { 4.143 + mouse_button(bnmask, mx, my); 4.144 + prev_bnmask = bnmask; 4.145 + } 4.146 + if(mx != prev_mx || my != prev_my) { 4.147 + mouse_motion(mx, my); 4.148 + prev_mx = mx; 4.149 + prev_my = my; 4.150 + } 4.151 + return 1; 4.152 +} 4.153 + 4.154 +static int keyb(int key) 4.155 +{ 4.156 + float dir_x, dir_y, right_x, right_y; 4.157 + 4.158 + dir_x = sin(DEG2RAD(cam_theta)) * walk_speed; 4.159 + dir_y = cos(DEG2RAD(cam_theta)) * walk_speed; 4.160 + right_x = dir_y; 4.161 + right_y = -dir_x; 4.162 + 4.163 + switch(key) { 4.164 + case 27: 4.165 + return 0; 4.166 + 4.167 + case 'w': 4.168 + cam_x += dir_x; 4.169 + cam_z -= dir_y; 4.170 + break; 4.171 + 4.172 + case 's': 4.173 + cam_x -= dir_x; 4.174 + cam_z += dir_y; 4.175 + break; 4.176 + 4.177 + case 'a': 4.178 + cam_x -= right_x; 4.179 + cam_z += right_y; 4.180 + break; 4.181 + 4.182 + case 'd': 4.183 + cam_x += right_x; 4.184 + cam_z -= right_y; 4.185 + break; 4.186 + 4.187 + case '`': 4.188 + mouse_look = !mouse_look; 4.189 + break; 4.190 + 4.191 + default: 4.192 + break; 4.193 + } 4.194 + return 1; 4.195 +} 4.196 + 4.197 +static int bnstate; 4.198 +static void mouse_button(int bn, int x, int y) 4.199 +{ 4.200 + bnstate = bn; 4.201 +} 4.202 + 4.203 +static void mouse_motion(int x, int y) 4.204 +{ 4.205 + static int prev_x, prev_y; 4.206 + int dx = x - prev_x; 4.207 + int dy = y - prev_y; 4.208 + prev_x = x; 4.209 + prev_y = y; 4.210 + 4.211 + if(mouse_look || bnstate) { 4.212 + cam_theta += dx * look_speed; 4.213 + cam_phi += dy * look_speed; 4.214 + 4.215 + if(cam_phi < -90) { 4.216 + cam_phi = -90; 4.217 + } 4.218 + if(cam_phi > 90) { 4.219 + cam_phi = 90; 4.220 + } 4.221 + } 4.222 +} 4.223 + 4.224 +static void sighandler(int s) 4.225 +{ 4.226 + set_video_mode(3); 4.227 + 4.228 + switch(s) { 4.229 + case SIGABRT: 4.230 + fprintf(stderr, "abort\n"); 4.231 + break; 4.232 + 4.233 + case SIGILL: 4.234 + fprintf(stderr, "illegal operation\n"); 4.235 + break; 4.236 + 4.237 + case SIGSEGV: 4.238 + fprintf(stderr, "segmentation fault\n"); 4.239 + break; 4.240 + 4.241 + case SIGINT: 4.242 + fprintf(stderr, "interrupted\n"); 4.243 + break; 4.244 + 4.245 + case SIGFPE: 4.246 + fprintf(stderr, "floating point exception\n"); 4.247 + break; 4.248 + 4.249 + default: 4.250 + fprintf(stderr, "unexpected signal\n"); 4.251 + } 4.252 + 4.253 + exit(1); 4.254 +}
5.1 --- a/src/mglimpl.h Mon Nov 28 05:12:33 2011 +0200 5.2 +++ b/src/mglimpl.h Tue Nov 29 07:22:49 2011 +0200 5.3 @@ -18,6 +18,8 @@ 5.4 #ifndef MGL_IMPL_H_ 5.5 #define MGL_IMPL_H_ 5.6 5.7 +#include "vmath.h" 5.8 + 5.9 #define MATRIX_STACK_SIZE 8 5.10 #define MAX_LIGHTS 4 5.11 5.12 @@ -30,17 +32,6 @@ 5.13 5.14 #define ROUND(x) ((x) >= 0.0 ? (x) + 0.5 : (x) - 0.5) 5.15 5.16 -typedef struct { 5.17 - float x, y, z, w; 5.18 -} vec4_t; 5.19 - 5.20 -typedef struct { 5.21 - float x, y, z; 5.22 -} vec3_t; 5.23 - 5.24 -typedef struct { 5.25 - float x, y; 5.26 -} vec2_t; 5.27 5.28 typedef float mat4_t[16]; 5.29