cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

testintersections.c (10016B)


      1/*
      2  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
      3
      4  This software is provided 'as-is', without any express or implied
      5  warranty.  In no event will the authors be held liable for any damages
      6  arising from the use of this software.
      7
      8  Permission is granted to anyone to use this software for any purpose,
      9  including commercial applications, and to alter it and redistribute it
     10  freely.
     11*/
     12
     13/* Simple program:  draw as many random objects on the screen as possible */
     14
     15#include <stdlib.h>
     16#include <stdio.h>
     17#include <time.h>
     18
     19#include "SDL_test_common.h"
     20
     21#define SWAP(typ,a,b) do{typ t=a;a=b;b=t;}while(0)
     22#define NUM_OBJECTS 100
     23
     24static SDLTest_CommonState *state;
     25static int num_objects;
     26static SDL_bool cycle_color;
     27static SDL_bool cycle_alpha;
     28static int cycle_direction = 1;
     29static int current_alpha = 255;
     30static int current_color = 255;
     31static SDL_BlendMode blendMode = SDL_BLENDMODE_NONE;
     32
     33void
     34DrawPoints(SDL_Renderer * renderer)
     35{
     36    int i;
     37    int x, y;
     38    SDL_Rect viewport;
     39
     40    /* Query the sizes */
     41    SDL_RenderGetViewport(renderer, &viewport);
     42
     43    for (i = 0; i < num_objects * 4; ++i) {
     44        /* Cycle the color and alpha, if desired */
     45        if (cycle_color) {
     46            current_color += cycle_direction;
     47            if (current_color < 0) {
     48                current_color = 0;
     49                cycle_direction = -cycle_direction;
     50            }
     51            if (current_color > 255) {
     52                current_color = 255;
     53                cycle_direction = -cycle_direction;
     54            }
     55        }
     56        if (cycle_alpha) {
     57            current_alpha += cycle_direction;
     58            if (current_alpha < 0) {
     59                current_alpha = 0;
     60                cycle_direction = -cycle_direction;
     61            }
     62            if (current_alpha > 255) {
     63                current_alpha = 255;
     64                cycle_direction = -cycle_direction;
     65            }
     66        }
     67        SDL_SetRenderDrawColor(renderer, 255, (Uint8) current_color,
     68                               (Uint8) current_color, (Uint8) current_alpha);
     69
     70        x = rand() % viewport.w;
     71        y = rand() % viewport.h;
     72        SDL_RenderDrawPoint(renderer, x, y);
     73    }
     74}
     75
     76#define MAX_LINES 16
     77int num_lines = 0;
     78SDL_Rect lines[MAX_LINES];
     79static int
     80add_line(int x1, int y1, int x2, int y2)
     81{
     82    if (num_lines >= MAX_LINES)
     83        return 0;
     84    if ((x1 == x2) && (y1 == y2))
     85        return 0;
     86
     87    SDL_Log("adding line (%d, %d), (%d, %d)\n", x1, y1, x2, y2);
     88    lines[num_lines].x = x1;
     89    lines[num_lines].y = y1;
     90    lines[num_lines].w = x2;
     91    lines[num_lines].h = y2;
     92
     93    return ++num_lines;
     94}
     95
     96
     97void
     98DrawLines(SDL_Renderer * renderer)
     99{
    100    int i;
    101    SDL_Rect viewport;
    102
    103    /* Query the sizes */
    104    SDL_RenderGetViewport(renderer, &viewport);
    105
    106    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
    107
    108    for (i = 0; i < num_lines; ++i) {
    109        if (i == -1) {
    110            SDL_RenderDrawLine(renderer, 0, 0, viewport.w - 1, viewport.h - 1);
    111            SDL_RenderDrawLine(renderer, 0, viewport.h - 1, viewport.w - 1, 0);
    112            SDL_RenderDrawLine(renderer, 0, viewport.h / 2, viewport.w - 1, viewport.h / 2);
    113            SDL_RenderDrawLine(renderer, viewport.w / 2, 0, viewport.w / 2, viewport.h - 1);
    114        } else {
    115            SDL_RenderDrawLine(renderer, lines[i].x, lines[i].y, lines[i].w, lines[i].h);
    116        }
    117    }
    118}
    119
    120#define MAX_RECTS 16
    121int num_rects = 0;
    122SDL_Rect rects[MAX_RECTS];
    123static int
    124add_rect(int x1, int y1, int x2, int y2)
    125{
    126    if (num_rects >= MAX_RECTS)
    127        return 0;
    128    if ((x1 == x2) || (y1 == y2))
    129        return 0;
    130
    131    if (x1 > x2)
    132        SWAP(int, x1, x2);
    133    if (y1 > y2)
    134        SWAP(int, y1, y2);
    135
    136    SDL_Log("adding rect (%d, %d), (%d, %d) [%dx%d]\n", x1, y1, x2, y2,
    137           x2 - x1, y2 - y1);
    138
    139    rects[num_rects].x = x1;
    140    rects[num_rects].y = y1;
    141    rects[num_rects].w = x2 - x1;
    142    rects[num_rects].h = y2 - y1;
    143
    144    return ++num_rects;
    145}
    146
    147static void
    148DrawRects(SDL_Renderer * renderer)
    149{
    150    SDL_SetRenderDrawColor(renderer, 255, 127, 0, 255);
    151    SDL_RenderFillRects(renderer, rects, num_rects);
    152}
    153
    154static void
    155DrawRectLineIntersections(SDL_Renderer * renderer)
    156{
    157    int i, j;
    158
    159    SDL_SetRenderDrawColor(renderer, 0, 255, 55, 255);
    160
    161    for (i = 0; i < num_rects; i++)
    162        for (j = 0; j < num_lines; j++) {
    163            int x1, y1, x2, y2;
    164            SDL_Rect r;
    165
    166            r = rects[i];
    167            x1 = lines[j].x;
    168            y1 = lines[j].y;
    169            x2 = lines[j].w;
    170            y2 = lines[j].h;
    171
    172            if (SDL_IntersectRectAndLine(&r, &x1, &y1, &x2, &y2)) {
    173                SDL_RenderDrawLine(renderer, x1, y1, x2, y2);
    174            }
    175        }
    176}
    177
    178static void
    179DrawRectRectIntersections(SDL_Renderer * renderer)
    180{
    181    int i, j;
    182
    183    SDL_SetRenderDrawColor(renderer, 255, 200, 0, 255);
    184
    185    for (i = 0; i < num_rects; i++)
    186        for (j = i + 1; j < num_rects; j++) {
    187            SDL_Rect r;
    188            if (SDL_IntersectRect(&rects[i], &rects[j], &r)) {
    189                SDL_RenderFillRect(renderer, &r);
    190            }
    191        }
    192}
    193
    194int
    195main(int argc, char *argv[])
    196{
    197    int mouse_begin_x = -1, mouse_begin_y = -1;
    198    int i, done;
    199    SDL_Event event;
    200    Uint32 then, now, frames;
    201
    202    /* Enable standard application logging */
    203    SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
    204
    205    /* Initialize parameters */
    206    num_objects = NUM_OBJECTS;
    207
    208    /* Initialize test framework */
    209    state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO);
    210    if (!state) {
    211        return 1;
    212    }
    213    for (i = 1; i < argc;) {
    214        int consumed;
    215
    216        consumed = SDLTest_CommonArg(state, i);
    217        if (consumed == 0) {
    218            consumed = -1;
    219            if (SDL_strcasecmp(argv[i], "--blend") == 0) {
    220                if (argv[i + 1]) {
    221                    if (SDL_strcasecmp(argv[i + 1], "none") == 0) {
    222                        blendMode = SDL_BLENDMODE_NONE;
    223                        consumed = 2;
    224                    } else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) {
    225                        blendMode = SDL_BLENDMODE_BLEND;
    226                        consumed = 2;
    227                    } else if (SDL_strcasecmp(argv[i + 1], "add") == 0) {
    228                        blendMode = SDL_BLENDMODE_ADD;
    229                        consumed = 2;
    230                    } else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) {
    231                        blendMode = SDL_BLENDMODE_MOD;
    232                        consumed = 2;
    233                    }
    234                }
    235            } else if (SDL_strcasecmp(argv[i], "--cyclecolor") == 0) {
    236                cycle_color = SDL_TRUE;
    237                consumed = 1;
    238            } else if (SDL_strcasecmp(argv[i], "--cyclealpha") == 0) {
    239                cycle_alpha = SDL_TRUE;
    240                consumed = 1;
    241            } else if (SDL_isdigit(*argv[i])) {
    242                num_objects = SDL_atoi(argv[i]);
    243                consumed = 1;
    244            }
    245        }
    246        if (consumed < 0) {
    247            SDL_Log("Usage: %s %s [--blend none|blend|add|mod] [--cyclecolor] [--cyclealpha]\n",
    248                    argv[0], SDLTest_CommonUsage(state));
    249            return 1;
    250        }
    251        i += consumed;
    252    }
    253    if (!SDLTest_CommonInit(state)) {
    254        return 2;
    255    }
    256
    257    /* Create the windows and initialize the renderers */
    258    for (i = 0; i < state->num_windows; ++i) {
    259        SDL_Renderer *renderer = state->renderers[i];
    260        SDL_SetRenderDrawBlendMode(renderer, blendMode);
    261        SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
    262        SDL_RenderClear(renderer);
    263    }
    264
    265    srand(time(NULL));
    266
    267    /* Main render loop */
    268    frames = 0;
    269    then = SDL_GetTicks();
    270    done = 0;
    271    while (!done) {
    272        /* Check for events */
    273        ++frames;
    274        while (SDL_PollEvent(&event)) {
    275            SDLTest_CommonEvent(state, &event, &done);
    276            switch (event.type) {
    277            case SDL_MOUSEBUTTONDOWN:
    278                mouse_begin_x = event.button.x;
    279                mouse_begin_y = event.button.y;
    280                break;
    281            case SDL_MOUSEBUTTONUP:
    282                if (event.button.button == 3)
    283                    add_line(mouse_begin_x, mouse_begin_y, event.button.x,
    284                             event.button.y);
    285                if (event.button.button == 1)
    286                    add_rect(mouse_begin_x, mouse_begin_y, event.button.x,
    287                             event.button.y);
    288                break;
    289            case SDL_KEYDOWN:
    290                switch (event.key.keysym.sym) {
    291                case 'l':
    292                    if (event.key.keysym.mod & KMOD_SHIFT)
    293                        num_lines = 0;
    294                    else
    295                        add_line(rand() % 640, rand() % 480, rand() % 640,
    296                                 rand() % 480);
    297                    break;
    298                case 'r':
    299                    if (event.key.keysym.mod & KMOD_SHIFT)
    300                        num_rects = 0;
    301                    else
    302                        add_rect(rand() % 640, rand() % 480, rand() % 640,
    303                                 rand() % 480);
    304                    break;
    305                }
    306                break;
    307            default:
    308                break;
    309            }
    310        }
    311        for (i = 0; i < state->num_windows; ++i) {
    312            SDL_Renderer *renderer = state->renderers[i];
    313            if (state->windows[i] == NULL)
    314                continue;
    315            SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
    316            SDL_RenderClear(renderer);
    317
    318            DrawRects(renderer);
    319            DrawPoints(renderer);
    320            DrawRectRectIntersections(renderer);
    321            DrawLines(renderer);
    322            DrawRectLineIntersections(renderer);
    323
    324            SDL_RenderPresent(renderer);
    325        }
    326    }
    327
    328    SDLTest_CommonQuit(state);
    329
    330    /* Print out some timing information */
    331    now = SDL_GetTicks();
    332    if (now > then) {
    333        double fps = ((double) frames * 1000) / (now - then);
    334        SDL_Log("%2.2f frames per second\n", fps);
    335    }
    336    return 0;
    337}
    338
    339/* vi: set ts=4 sw=4 expandtab: */