#include #include #include #include #include #include #include #include #include #include #include #include #include "hash.h" #include "structure.h" #include "base.h" imgs digits ; imgs letters ; int ln_baseN(int n, int b) { int r = 0; while(n != 0) { n = n / b; r++; } return r; } int pw(int x, int n) { if (n<0) return 0; if (n==0) return 1; if (n%2==0) return pw(x*x, n/2); return x*pw(x*x, n/2); } double pwf(double x, int n) { if (n<0) return 0.0; if (n==0) return 1.0; if (n%2==0) return pwf(x*x, n/2); return x*pwf(x*x, n/2); } int abs(int n) { if(n > 0) { return n; } else { return (-n); } } int min(int a, int b) { if(a > b) { return b; }; return a; } int max(int a, int b) { if(a < b) { return b; }; return a; } double mind(double a, double b) { if(a > b) { return b; }; return a; } double maxd(double a, double b) { if(a < b) { return b; }; return a; } double absf(double n) { if(n > 0.0f) { return n; } else { return (-n); } } int convex_seg(int x1, int x2, double theta) { return (int)(((1.0f - theta) * x1 + theta * x2)); } bool is_an_integer(char c) { return ((int)c >= 48 && (int)c <= 57); } double to_double(int n) { return (double)n ; } int to_int(double n) { return (int)n ; } int line_count(char* filename) { FILE* ptr = fopen(filename, "r"); char c = 'd'; int n = 0 ; while(c != EOF) { if(c == '\n') { n += 1; }; c = fgetc(ptr); }; fclose(ptr); return (n+1); } int str_to_int(char* s) { int res = 0 ; int i = 0 ; while(s[i] != '\0' && is_an_integer(s[i])) { res *= 10 ; res += (int)s[i] - 48 ; i++; }; return res; } bool str_equal(char* s1, char* s2) { if(s1[0] == '\0' || s2[0] == '\0') { return (s1[0] == '\0' && s2[0] == '\0'); } return (s1[0] == s2[0] && str_equal(&s1[1], &s2[1])); } // ------------------------------------------------------------------------------------------------ // cube_0 create_cube_0(double x, double y, double z, double w, double h, double d, double hz_a, double vt_a, int r, int g, int b) { cube_0* cb = malloc(sizeof(cube_0)) ; cb->red = r ; cb->green = g ; cb->blue = b ; cb->x = x ; cb->y = y ; cb->z = z ; cb->w = w ; cb->h = h ; cb->d = d ; cb->hz_angle = hz_a ; cb->vt_angle = vt_a ; return *cb ; } cube create_cube(double x, double y, double z, double w, double h, double d, double hz_a, double vt_a, int r, int g, int b) { cube cb = malloc(sizeof(cube_0)); *cb = create_cube_0(x, y, z, w, h, d, hz_a, vt_a, r, g, b) ; return cb; } void free_cube(cube c) { free(c) ; } teleporter create_teleporter( double x, double y, double z, double w, double h, double d, double hz_a, double vt_a, int r, int g, int b, int chx_dest, int chy_dest, double x_dest, double y_dest, double z_dest ) { teleporter* tp = malloc(sizeof(teleporter)) ; tp->dest_chx = chx_dest ; tp->dest_chy = chy_dest ; tp->dest_x = x_dest ; tp->dest_y = y_dest ; tp->dest_z = z_dest ; tp->hitbox = create_cube_0(x, y, z, w, h, d, hz_a, vt_a, r, g, b); return *tp ; } // ------------------------------------------------------------------------------------------------ // double convex_pt(double a, double b, double theta) { return (a+(b-a)*theta) ; } double distance_pt_pt_3d(double x0, double y0, double z0, double x1, double y1, double z1) { return sqrt((x1 - x0)*(x1 - x0)+(y1 - y0)*(y1 - y0)+(z1 - z0)*(z1 - z0)) ; } double distance_pt_seg_3d(double x, double y, double z, double sx, double sy, double sz, double ex, double ey, double ez) { double theta = -( ((ex - sx) * (sx - x) + (ey - sy) * (sy - y) + (ez - sz) * (sz - z)) / ((ex - sx) * (ex - sx) + (ey - sy) * (ey - sy) + (ez - sz) * (ez - sz)) ); if(theta >= 0.0 && theta <= 1.0) { return (distance_pt_pt_3d(x, y, z, convex_pt(sx, ex, theta), convex_pt(sy, ey, theta), convex_pt(sz, ez, theta))) ; } else if (theta < 0.0) { return (distance_pt_pt_3d(x, y, z, sx, sy, sz)) ; } else { return (distance_pt_pt_3d(x, y, z, ex, ey, ez)) ; } } double distance_pt_cube_axis(double coord, double begin, double end) { if(coord < begin) { return (begin-coord) ; } else if(coord > end) { return (coord-end) ; } else { return 0.0 ; } } double distance_pt_cube_axis_max(double coord, double begin, double end) { if(coord < (begin+end)/2) { return absf(end-coord) ; } else { return absf(begin-coord) ; } } double distance_pt_cube_aligned_3d(double x0, double y0, double z0, double cx, double cy, double cz, double cw, double ch, double cd) { return (distance_pt_cube_axis(x0, cx, cx+cw)+distance_pt_cube_axis(y0, cy, cy+ch)+distance_pt_cube_axis(z0, cz, cz+cd)) ; } double distance_pt_cube_aligned_3d_max(double x0, double y0, double z0, double cx, double cy, double cz, double cw, double ch, double cd) { return (distance_pt_cube_axis_max(x0, cx, cx+cw)+distance_pt_cube_axis_max(y0, cy, cy+ch)+distance_pt_cube_axis_max(z0, cz, cz+cd)) ; } double distance_pt_cube_0_3d(double x0, double y0, double z0, cube_0 c) { // places the origin at the center of the cube double x = x0 - (c.x + c.w/2.0) ; double y = y0 - (c.y + c.h/2.0) ; double z = z0 - (c.z + c.d/2.0) ; // rotate the point : y then x double xry = x*cos(c.hz_angle) + z*sin(c.hz_angle) ; double yry = y ; double zry = z*cos(c.hz_angle) - x*sin(c.hz_angle) ; double xrx = xry ; double yrx = yry*cos(c.vt_angle) - zry*sin(c.vt_angle) ; double zrx = zry*cos(c.vt_angle) + yry*sin(c.vt_angle) ; // now the cube and pt are aligned, and (0, 0, 0) is at the cube's (bary)center return distance_pt_cube_aligned_3d(xrx, yrx, zrx, -c.w/2.0, -c.h/2.0, -c.d/2.0, c.w, c.h, c.d) ; } double distance_pt_cube_0_3d_max(double x0, double y0, double z0, cube_0 c) { // places the origin at the center of the cube double x = x0 - (c.x + c.w/2.0) ; double y = y0 - (c.y + c.h/2.0) ; double z = z0 - (c.z + c.d/2.0) ; // rotate the point : y then x double xry = x*cos(c.hz_angle) + z*sin(c.hz_angle) ; double yry = y ; double zry = z*cos(c.hz_angle) - x*sin(c.hz_angle) ; double xrx = xry ; double yrx = yry*cos(c.vt_angle) - zry*sin(c.vt_angle) ; double zrx = zry*cos(c.vt_angle) + yry*sin(c.vt_angle) ; // now the cube and pt are aligned, and (0, 0, 0) is at the cube's (bary)center return distance_pt_cube_aligned_3d_max(xrx, yrx, zrx, -c.w/2.0, -c.h/2.0, -c.d/2.0, c.w, c.h, c.d) ; } double distance_pt_cube_aligned_3d_weighted(double x0, double y0, double z0, double cx, double cy, double cz, double cw, double ch, double cd, double mx, double my, double mz) { return (mx*distance_pt_cube_axis(x0, cx, cx+cw)+my*distance_pt_cube_axis(y0, cy, cy+ch)+mz*distance_pt_cube_axis(z0, cz, cz+cd)) ; } double distance_pt_cube_0_3d_weighted(double x0, double y0, double z0, double mx, double my, double mz, cube_0 c) { // places the origin at the center of the cube double x = x0 - (c.x + c.w/2.0) ; double y = y0 - (c.y + c.h/2.0) ; double z = z0 - (c.z + c.d/2.0) ; // rotate the point : y then x double xry = x*cos(c.hz_angle) + z*sin(c.hz_angle) ; double yry = y ; double zry = z*cos(c.hz_angle) - x*sin(c.hz_angle) ; double xrx = xry ; double yrx = yry*cos(c.vt_angle) - zry*sin(c.vt_angle) ; double zrx = zry*cos(c.vt_angle) + yry*sin(c.vt_angle) ; // now the cube and pt are aligned, and (0, 0, 0) is at the cube's (bary)center return distance_pt_cube_aligned_3d_weighted(xrx, yrx, zrx, -c.w/2.0, -c.h/2.0, -c.d/2.0, c.w, c.h, c.d, mx, my, mz) ; } double distance_pt_cube_3d(double x0, double y0, double z0, cube cb) { return distance_pt_cube_0_3d(x0, y0, z0, *cb) ; } // ------------------------------------------------------------------------------------------------ // void remove_entity(entity** arr, int* memlen, int* len, int index) { if(*len > 0) { (*arr)[index] = (*arr)[*len -1]; *len -= 1; } } void add_entity(entity** arr, int* memlen, int* len, entity ent) { if(*memlen == *len) { entity* newarr = malloc(sizeof(entity)*2*(*memlen)); for(int k = 0; k < *len; k++) { newarr[k] = (*arr)[k] ; } free(*arr); *arr = newarr ; *memlen *= 2; } (*arr)[*len] = ent ; *len += 1; } // ------------------------------------------------------------------------------------------------ // void import_digits(SDL_Renderer* renderer) { imgs res; res.arr = malloc(sizeof(SDL_Texture*)*11); SDL_Texture* texture; SDL_Surface* img; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/digits/digit-0.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[0] = texture; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/digits/digit-1.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[1] = texture; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/digits/digit-2.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[2] = texture; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/digits/digit-3.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[3] = texture; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/digits/digit-4.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[4] = texture; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/digits/digit-5.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[5] = texture; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/digits/digit-6.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[6] = texture; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/digits/digit-7.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[7] = texture; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/digits/digit-8.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[8] = texture; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/digits/digit-9.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[9] = texture; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/digits/sign-minus.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[10] = texture; res.len = 11 ; digits = res; } void import_letters(SDL_Renderer* renderer) { imgs res; res.arr = malloc(sizeof(SDL_Texture*)*26); SDL_Texture* texture; SDL_Surface* img; int cc = 0 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-a.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-b.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-c.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-d.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-e.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-f.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-g.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-h.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-i.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-j.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-k.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-l.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-m.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-n.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-o.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-p.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-q.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-r.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-s.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-t.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-u.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-v.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-w.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-x.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-y.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; cc += 1 ; // -------------------------------------------------------- // img = SDL_LoadBMP("./res/letters/letter-z.bmp"); texture = SDL_CreateTextureFromSurface(renderer, img); SDL_FreeSurface(img); res.arr[cc] = texture; res.len = 26 ; letters = res; } void free_digits(imgs dgts) { for(int i = 0; i < dgts.len; i++) { SDL_DestroyTexture(dgts.arr[i]); } free(dgts.arr); }