#include #include #include #include #include #include #include #include #include #include #include #include #include "consts.h" #include "base.h" #include "display.h" void updateRenderer(SDL_Renderer* renderer) { //printf("E"); SDL_RenderPresent(renderer); } void resetRenderer(SDL_Renderer* renderer) { SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL_RenderClear(renderer); } void drawRectToRenderer(SDL_Renderer* renderer, SDL_Rect* rect, int R, int G, int B, int A) { SDL_SetRenderDrawColor(renderer, R, G, B, A); SDL_RenderFillRect(renderer, rect); } void placeRectToRenderer(SDL_Renderer* renderer, int X, int Y, int W, int H, int R, int G, int B, int A) { SDL_Rect rect; rect.x = X; rect.y = Y; rect.w = W; rect.h = H; SDL_SetRenderDrawColor(renderer, R, G, B, A); SDL_RenderFillRect(renderer, &rect); } void drawLineWithThicc(SDL_Renderer* renderer, int width, int x1, int x2, int y1, int y2, int R, int G, int B, int A) { // draws line with width (native SDL cannot do that) double theta = 0.0; double seglen = distance_pt(x1, x2, y1, y2); while(theta < 1.0) { placeRectToRenderer(renderer, convex_seg(x1, x2, theta)-width/2, convex_seg(y1, y2, theta)-width/2, width, width, R, G, B, A); theta += 1 / seglen; } } void drawLineWithThiccGradient(SDL_Renderer* renderer, int start_width, int end_width, int x1, int x2, int y1, int y2, int R, int G, int B, int A) { // draws line with width ; // width goes from start_width to end_with in a linear way double theta = 0.0; double seglen = distance_pt(x1, x2, y1, y2); while(theta < 1.0) { int width = convex_seg(start_width, end_width, theta) ; placeRectToRenderer(renderer, convex_seg(x1, x2, theta)-width/2, convex_seg(y1, y2, theta)-width/2, width, width, R, G, B, A); theta += 1 / seglen; } } void drawDigitToRenderer(SDL_Renderer* renderer, imgs data, int digit, int X, int Y, int W, int H) { if (!(0 <= digit && digit <= 9)) { fprintf(stderr, "Illegal digit : '%d'.\n", digit); exit(1); } SDL_Rect rect; rect.x = X; rect.y = Y; rect.w = W; rect.h = H; SDL_Texture* texture = data.arr[digit]; SDL_RenderCopy(renderer, texture, NULL, &rect); } void drawCharToRenderer(SDL_Renderer* renderer, imgs data, char c, int X, int Y, int W, int H) { if ((int)c >= 97 && (int)c <= 122) { SDL_Rect rect; rect.x = X; rect.y = Y; rect.w = W; rect.h = H; SDL_Texture* texture = data.arr[(int)c - 97]; SDL_RenderCopy(renderer, texture, NULL, &rect); } } void drawNumberToRenderer(SDL_Renderer* renderer, imgs data, int n, int X, int Y, int W, int H, int Woffset) { if(n == 0) { drawDigitToRenderer(renderer, data, 0, X + W, Y, W, H); } else { int toDraw = 0, remaining = n, nIter = ln_baseN(n, 10); while(nIter != 0) { toDraw = remaining%10; remaining = remaining / 10; drawDigitToRenderer(renderer, data, toDraw, X + (W-Woffset)*nIter, Y, W, H); nIter--; } } } void drawStringToRenderer(SDL_Renderer* renderer, imgs data, char* s, int X, int Y, int W, int H) { int k = 0 ; while(s[k] != '\0') { drawCharToRenderer(renderer, data, s[k], X + W*k, Y, W, H); k += 1; } } long cell_colors(cell* cl) { switch (cl->type) { case START: return (long)(32) + (long)(256)*(long)(255) + (long)(256*256)*(long)(32); case BLUE: return (long)(32) + (long)(256)*(long)(32) + (long)(256*256)*(long)(255); case RED: return (long)(255) + (long)(256)*(long)(32) + (long)(256*256)*(long)(32); case EVENT: return (long)(32) + (long)(256)*(long)(128) + (long)(256*256)*(long)(32); case VS: return (long)(255) + (long)(256)*(long)(128) + (long)(256*256)*(long)(32); case BOWSER: return (long)(32) + (long)(256)*(long)(32) + (long)(256*256)*(long)(32); case CHANCE_TIME: return (long)(32) + (long)(256)*(long)(128) + (long)(256*256)*(long)(255); case BOO: return (long)(128) + (long)(256)*(long)(128) + (long)(256*256)*(long)(128); case STAR: return (long)(255) + (long)(256)*(long)(255) + (long)(256*256)*(long)(32); case BANK: return (long)(255) + (long)(256)*(long)(255) + (long)(256*256)*(long)(32); case ITEM_SHOP: return (long)(220) + (long)(256)*(long)(220) + (long)(256*256)*(long)(220); } } void draw_cell(SDL_Renderer* renderer, int xmin, int xmax, int ymin, int ymax, cell* cl, int draw_id) { if(cl != NULL && cl->id != draw_id && (cl->coord_x - tile_size > xmin || cl->coord_x - tile_size < xmax || cl->coord_y > ymin || cl->coord_y < ymax)) { // draw lines cl->id = draw_id; int nxmin = to_int((to_double(cl->coord_x) - to_double(xmin)) * to_double(__width__)) / (to_double(xmax) - to_double(xmin)) ; int nymin = to_int((to_double(cl->coord_y) - to_double(ymin)) * to_double(__height__)) / (to_double(ymax) - to_double(ymin)) ; if(cl->next_1 != NULL) { drawLineWithThiccGradient(renderer, tile_size*220/zoom_factor, 3, nxmin, to_int((to_double(cl->next_1->coord_x) - to_double(xmin)) * to_double(__width__)) / (to_double(xmax) - to_double(xmin)), nymin, to_int((to_double(cl->next_1->coord_y) - to_double(ymin)) * to_double(__height__)) / (to_double(ymax) - to_double(ymin)), 255, 255, 0, SDL_ALPHA_OPAQUE); drawDigitToRenderer(renderer, digits, 1, to_int((to_double((cl->coord_x + cl->next_1->coord_x)/2) - to_double(xmin)) * to_double(__width__)) / (to_double(xmax) - to_double(xmin)) - 75/6, to_int((to_double((cl->coord_y + cl->next_1->coord_y)/2) - to_double(ymin)) * to_double(__height__)) / (to_double(ymax) - to_double(ymin)) - 105/6, 75/3, 105/3); }; if(cl->next_2 != NULL) { drawLineWithThiccGradient(renderer, tile_size*220/zoom_factor, 3, nxmin, to_int((to_double(cl->next_2->coord_x) - to_double(xmin)) * to_double(__width__)) / (to_double(xmax) - to_double(xmin)), nymin, to_int((to_double(cl->next_2->coord_y) - to_double(ymin)) * to_double(__height__)) / (to_double(ymax) - to_double(ymin)), 255, 255, 0, SDL_ALPHA_OPAQUE); drawDigitToRenderer(renderer, digits, 2, to_int((to_double((cl->coord_x + cl->next_2->coord_x)/2) - to_double(xmin)) * to_double(__width__)) / (to_double(xmax) - to_double(xmin)) - 75/6, to_int((to_double((cl->coord_y + cl->next_2->coord_y)/2) - to_double(ymin)) * to_double(__height__)) / (to_double(ymax) - to_double(ymin)) - 105/6, 75/3, 105/3); }; if(cl->next_3 != NULL) { drawLineWithThiccGradient(renderer, tile_size*220/zoom_factor, 3, nxmin, to_int((to_double(cl->next_3->coord_x) - to_double(xmin)) * to_double(__width__)) / (to_double(xmax) - to_double(xmin)), nymin, to_int((to_double(cl->next_3->coord_y) - to_double(ymin)) * to_double(__height__)) / (to_double(ymax) - to_double(ymin)), 255, 255, 0, SDL_ALPHA_OPAQUE); drawDigitToRenderer(renderer, digits, 3, to_int((to_double((cl->coord_x + cl->next_3->coord_x)/2) - to_double(xmin)) * to_double(__width__)) / (to_double(xmax) - to_double(xmin)) - 75/6, to_int((to_double((cl->coord_y + cl->next_3->coord_y)/2) - to_double(ymin)) * to_double(__height__)) / (to_double(ymax) - to_double(ymin)) - 105/6, 75/3, 105/3); }; if(cl->next_4 != NULL) { drawLineWithThiccGradient(renderer, tile_size*220/zoom_factor, 3, nxmin, to_int((to_double(cl->next_4->coord_x) - to_double(xmin)) * to_double(__width__)) / (to_double(xmax) - to_double(xmin)), nymin, to_int((to_double(cl->next_4->coord_y) - to_double(ymin)) * to_double(__height__)) / (to_double(ymax) - to_double(ymin)), 255, 255, 0, SDL_ALPHA_OPAQUE); drawDigitToRenderer(renderer, digits, 4, to_int((to_double((cl->coord_x + cl->next_4->coord_x)/2) - to_double(xmin)) * to_double(__width__)) / (to_double(xmax) - to_double(xmin)) - 75/6, to_int((to_double((cl->coord_y + cl->next_4->coord_y)/2) - to_double(ymin)) * to_double(__height__)) / (to_double(ymax) - to_double(ymin)) - 105/6, 75/3, 105/3); }; // recursive calls draw_cell(renderer, xmin, xmax, ymin, ymax, cl->prev_1, draw_id); draw_cell(renderer, xmin, xmax, ymin, ymax, cl->prev_2, draw_id); draw_cell(renderer, xmin, xmax, ymin, ymax, cl->prev_3, draw_id); draw_cell(renderer, xmin, xmax, ymin, ymax, cl->prev_4, draw_id); draw_cell(renderer, xmin, xmax, ymin, ymax, cl->next_1, draw_id); draw_cell(renderer, xmin, xmax, ymin, ymax, cl->next_2, draw_id); draw_cell(renderer, xmin, xmax, ymin, ymax, cl->next_3, draw_id); draw_cell(renderer, xmin, xmax, ymin, ymax, cl->next_4, draw_id); // draw current cell long packed_colors = cell_colors(cl); if(cl == current) { placeRectToRenderer(renderer, nxmin-tile_size*250/zoom_factor/2-10, nymin-tile_size*250/zoom_factor/2-10, tile_size*250/zoom_factor+20, tile_size*250/zoom_factor+20, 255, 255, 255, SDL_ALPHA_OPAQUE); }; placeRectToRenderer(renderer, nxmin-tile_size*250/zoom_factor/2, nymin-tile_size*250/zoom_factor/2, tile_size*250/zoom_factor, tile_size*250/zoom_factor, (int)(packed_colors%256), (int)((packed_colors/256)%256), (int)((packed_colors/256/256)%256), SDL_ALPHA_OPAQUE); } else if(cl != NULL && cl->id != draw_id) { cl->id = draw_id; draw_cell(renderer, xmin, xmax, ymin, ymax, cl->prev_1, draw_id); draw_cell(renderer, xmin, xmax, ymin, ymax, cl->prev_2, draw_id); draw_cell(renderer, xmin, xmax, ymin, ymax, cl->prev_3, draw_id); draw_cell(renderer, xmin, xmax, ymin, ymax, cl->prev_4, draw_id); draw_cell(renderer, xmin, xmax, ymin, ymax, cl->next_1, draw_id); draw_cell(renderer, xmin, xmax, ymin, ymax, cl->next_2, draw_id); draw_cell(renderer, xmin, xmax, ymin, ymax, cl->next_3, draw_id); draw_cell(renderer, xmin, xmax, ymin, ymax, cl->next_4, draw_id); } } void draw_board(SDL_Renderer* renderer, int xmin, int xmax, int ymin, int ymax, cell* one_cell) { if(one_cell == NULL) { fprintf(stderr, "ERROR : cannot draw NULL cell\n"); exit(1); } else { draw_cell(renderer, xmin, xmax, ymin, ymax, one_cell, (one_cell->id +1)%727); } }