From ef64d2c4bad35a244d0d6a6d369c7d3e50956083 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Wed, 23 Aug 2017 21:16:17 -0400 Subject: [PATCH] tfv: starting to convert floating point to lookup tables --- gr-sim/lookup_tables.c | 26 +++ gr-sim/tfv_flying.c | 487 +++++++++++++++++++++++++++-------------- 2 files changed, 353 insertions(+), 160 deletions(-) create mode 100644 gr-sim/lookup_tables.c diff --git a/gr-sim/lookup_tables.c b/gr-sim/lookup_tables.c new file mode 100644 index 00000000..48e2731c --- /dev/null +++ b/gr-sim/lookup_tables.c @@ -0,0 +1,26 @@ +#include + +#include + +#define ANGLE_STEPS 16 + +int main(int argc, char **argv) { + + double angle; + int i; + + printf("Sin\n"); + for(i=0;i6.28) our_angle-=6.28; + angle+=1; + if (angle>=ANGLE_STEPS) angle-=ANGLE_STEPS; } } @@ -409,13 +298,13 @@ int flying(void) { } - dx = speed * cos (our_angle); - dy = speed * sin (our_angle); + dx = speed * our_cos (angle); + dy = speed * our_sin (angle); - flyx += dx; - flyy += dy; + cx += dx; + cy += dy; - draw_background_mode7(our_angle, flyx, flyy); + draw_background_mode7();//our_angle, flyx, flyy); if (turning==0) { if ((speed>0.0) && (over_water)&&(draw_splash)) { @@ -459,3 +348,281 @@ int flying(void) { return 0; } + + + + + + + + + + + + + + + + + + + + + + + + +#else + +#define ANGLE_STEPS 32 + +double our_sin(unsigned char angle) { + + double r; + + r=3.14159265358979*2.0*(double)angle/(double)ANGLE_STEPS; + + return sin(r); +} + +double our_cos(unsigned char angle) { + + double r; + + r=3.14159265358979*2.0*(double)angle/(double)ANGLE_STEPS; + + return cos(r); +} + +// +// Detailed version +// +// + +void draw_background_mode7(void) { + + + // the distance and horizontal scale of the line we are drawing + double distance, horizontal_scale; + + // step for points in space between two pixels on a horizontal line + double line_dx, line_dy; + + // current space position + double space_x, space_y; + int map_color; + + over_water=0; + + /* Draw Sky */ + /* Originally wanted to be fancy and have sun too, but no */ + color_equals(COLOR_MEDIUMBLUE); + for(screen_y=0;screen_y<6;screen_y+=2) { + hlin_double(ram[DRAW_PAGE], 0, 40, screen_y); + } + + /* Draw hazy horizon */ + color_equals(COLOR_GREY); + hlin_double(ram[DRAW_PAGE], 0, 40, 6); + + + for (screen_y = 8; screen_y < LOWRES_H; screen_y++) { + // first calculate the distance of the line we are drawing + distance = (space_z * scale_y) / (screen_y + horizon); + + // then calculate the horizontal scale, or the distance between + // space points on this horizontal line + horizontal_scale = (distance / scale_x); + + // calculate the dx and dy of points in space when we step + // through all points on this line + line_dx = -our_sin(angle) * horizontal_scale; + line_dy = our_cos(angle) * horizontal_scale; + + // calculate the starting position + space_x = cx + (distance * our_cos(angle)) - LOWRES_W/2 * line_dx; + space_y = cy + (distance * our_sin(angle)) - LOWRES_W/2 * line_dy; + + // Move camera back a bit + + double factor; + + factor=space_z*BETA; + + space_x+=factor*our_cos(angle); + space_y+=factor*our_sin(angle); + + + // go through all points in this screen line + for (screen_x = 0; screen_x < LOWRES_W-1; screen_x++) { + // get a pixel from the tile and put it on the screen + + map_color=lookup_map((int)space_x,(int)space_y); + + color_equals(map_color); + + if (screen_x==20) { + if (map_color==COLOR_DARKBLUE) over_water=1; + else over_water=0; + } + + plot(screen_x,screen_y); + + // advance to the next position in space + space_x += line_dx; + space_y += line_dy; + } + } +} + + + + +#define SHIPX 15 + +int flying(void) { + + unsigned char ch; + int shipy; + int turning=0; + double dy,dx,speed=0; + int draw_splash=0; + + /************************************************/ + /* Flying */ + /************************************************/ + + gr(); + shipy=20; + + while(1) { + if (draw_splash>0) draw_splash--; + + ch=grsim_input(); + + if ((ch=='q') || (ch==27)) break; + +#if 0 + if (ch=='g') { + BETA+=0.1; + printf("Horizon=%lf\n",BETA); + } + if (ch=='h') { + BETA-=0.1; + printf("Horizon=%lf\n",BETA); + } + + if (ch=='s') { + scale_x++; + scale_y++; + printf("Scale=%lf\n",scale_x); + } +#endif + + if ((ch=='w') || (ch==APPLE_UP)) { + if (shipy>16) { + shipy-=2; + space_z+=1; + } + + printf("Z=%lf\n",space_z); + } + if ((ch=='s') || (ch==APPLE_DOWN)) { + if (shipy<28) { + shipy+=2; + space_z-=1; + } + else { + draw_splash=10; + } + printf("Z=%lf\n",space_z); + } + if ((ch=='a') || (ch==APPLE_LEFT)) { + if (turning>0) { + turning=0; + } + else { + turning=-20; + + angle-=1; + if (angle<0) angle+=ANGLE_STEPS; + } + } + if ((ch=='d') || (ch==APPLE_RIGHT)) { + if (turning<0) { + turning=0; + } + else { + turning=20; + angle+=1; + if (angle>=ANGLE_STEPS) angle-=ANGLE_STEPS; + } + + } + + if (ch=='z') { + if (speed>0.5) speed=0.5; + speed+=0.05; + } + + if (ch=='x') { + if (speed<-0.5) speed=-0.5; + speed-=0.05; + } + + if (ch==' ') { + speed=0; + } + + + dx = speed * our_cos (angle); + dy = speed * our_sin (angle); + + cx += dx; + cy += dy; + + draw_background_mode7();//our_angle, flyx, flyy); + + if (turning==0) { + if ((speed>0.0) && (over_water)&&(draw_splash)) { + grsim_put_sprite(splash_forward, + SHIPX+1,shipy+9); + } + grsim_put_sprite(shadow_forward,SHIPX+3,31+space_z); + grsim_put_sprite(ship_forward,SHIPX,shipy); + } + if (turning<0) { + + if ((shipy>25) && (speed>0.0)) draw_splash=1; + + if (over_water&&draw_splash) { + grsim_put_sprite(splash_left, + SHIPX+1,36); + } + grsim_put_sprite(shadow_left,SHIPX+3,31+space_z); + grsim_put_sprite(ship_left,SHIPX,shipy); + turning++; + } + if (turning>0) { + + + if ((shipy>25) && (speed>0.0)) draw_splash=1; + + if (over_water&&draw_splash) { + grsim_put_sprite(splash_right, + SHIPX+1,36); + } + grsim_put_sprite(shadow_right,SHIPX+3,31+space_z); + grsim_put_sprite(ship_right,SHIPX,shipy); + turning--; + } + + page_flip(); + + usleep(20000); + + } + return 0; +} + +#endif