From b0459451a3063542bd795b3c5df0d0b4624e2345 Mon Sep 17 00:00:00 2001 From: Daniel Weber Date: Sat, 23 Nov 2024 21:59:28 -0500 Subject: [PATCH] Initial commit --- .gitignore | 8 + Cpp_Stuff/CMakeLists.txt | 7 + Cpp_Stuff/include/custom_kernels.cuh | 2 + Cpp_Stuff/include/hal.hpp | 3 + Cpp_Stuff/include/sim_renderer.h | 5 + Cpp_Stuff/include/textures.hpp | 5 + Cpp_Stuff/include/ui_particles.hpp | 18 ++ Cpp_Stuff/include/universe.hpp | 39 ++++ Cpp_Stuff/include/util.hpp | 18 ++ Cpp_Stuff/sdl_sprites/blue.bmp | Bin 0 -> 27694 bytes Cpp_Stuff/sdl_sprites/blue.png | Bin 0 -> 5069 bytes Cpp_Stuff/sdl_sprites/green.bmp | Bin 0 -> 27694 bytes Cpp_Stuff/sdl_sprites/green.png | Bin 0 -> 4969 bytes Cpp_Stuff/sdl_sprites/red.bmp | Bin 0 -> 27694 bytes Cpp_Stuff/sdl_sprites/red.png | Bin 0 -> 4657 bytes Cpp_Stuff/sdl_sprites/yellow.bmp | Bin 0 -> 27694 bytes Cpp_Stuff/sdl_sprites/yellow.png | Bin 0 -> 4121 bytes Cpp_Stuff/src/CMakeLists.txt | 31 +++ Cpp_Stuff/src/main.cpp | 47 +++++ Cpp_Stuff/src/renderer/sim_renderer.cpp | 132 +++++++++++++ Cpp_Stuff/src/renderer/textures.cpp | 25 +++ Cpp_Stuff/src/renderer/ui_particles.cpp | 44 +++++ Cpp_Stuff/src/simulator/universe.cpp | 218 ++++++++++++++++++++++ Cpp_Stuff/src/utility/custom_kernels.cu | 39 ++++ Cpp_Stuff/src/utility/hal.cpp | 25 +++ Python_Stuff/python_particle_simulator.py | 62 ++++++ Python_Stuff/renderer.py | 37 ++++ Python_Stuff/requirements.txt | 2 + Python_Stuff/sdl.py | 50 +++++ Python_Stuff/sdl_sprites/blue.bmp | Bin 0 -> 27694 bytes Python_Stuff/sdl_sprites/blue.png | Bin 0 -> 5069 bytes Python_Stuff/sdl_sprites/green.bmp | Bin 0 -> 27694 bytes Python_Stuff/sdl_sprites/green.png | Bin 0 -> 4969 bytes Python_Stuff/sdl_sprites/red.bmp | Bin 0 -> 27694 bytes Python_Stuff/sdl_sprites/red.png | Bin 0 -> 4657 bytes Python_Stuff/sdl_sprites/yellow.bmp | Bin 0 -> 27694 bytes Python_Stuff/sdl_sprites/yellow.png | Bin 0 -> 4121 bytes Python_Stuff/universe.py | 153 +++++++++++++++ Python_Stuff/world_objects.py | 20 ++ 39 files changed, 990 insertions(+) create mode 100644 .gitignore create mode 100644 Cpp_Stuff/CMakeLists.txt create mode 100644 Cpp_Stuff/include/custom_kernels.cuh create mode 100644 Cpp_Stuff/include/hal.hpp create mode 100644 Cpp_Stuff/include/sim_renderer.h create mode 100644 Cpp_Stuff/include/textures.hpp create mode 100644 Cpp_Stuff/include/ui_particles.hpp create mode 100644 Cpp_Stuff/include/universe.hpp create mode 100644 Cpp_Stuff/include/util.hpp create mode 100644 Cpp_Stuff/sdl_sprites/blue.bmp create mode 100644 Cpp_Stuff/sdl_sprites/blue.png create mode 100644 Cpp_Stuff/sdl_sprites/green.bmp create mode 100644 Cpp_Stuff/sdl_sprites/green.png create mode 100644 Cpp_Stuff/sdl_sprites/red.bmp create mode 100644 Cpp_Stuff/sdl_sprites/red.png create mode 100644 Cpp_Stuff/sdl_sprites/yellow.bmp create mode 100644 Cpp_Stuff/sdl_sprites/yellow.png create mode 100644 Cpp_Stuff/src/CMakeLists.txt create mode 100644 Cpp_Stuff/src/main.cpp create mode 100644 Cpp_Stuff/src/renderer/sim_renderer.cpp create mode 100644 Cpp_Stuff/src/renderer/textures.cpp create mode 100644 Cpp_Stuff/src/renderer/ui_particles.cpp create mode 100644 Cpp_Stuff/src/simulator/universe.cpp create mode 100644 Cpp_Stuff/src/utility/custom_kernels.cu create mode 100644 Cpp_Stuff/src/utility/hal.cpp create mode 100644 Python_Stuff/python_particle_simulator.py create mode 100644 Python_Stuff/renderer.py create mode 100644 Python_Stuff/requirements.txt create mode 100644 Python_Stuff/sdl.py create mode 100644 Python_Stuff/sdl_sprites/blue.bmp create mode 100644 Python_Stuff/sdl_sprites/blue.png create mode 100644 Python_Stuff/sdl_sprites/green.bmp create mode 100644 Python_Stuff/sdl_sprites/green.png create mode 100644 Python_Stuff/sdl_sprites/red.bmp create mode 100644 Python_Stuff/sdl_sprites/red.png create mode 100644 Python_Stuff/sdl_sprites/yellow.bmp create mode 100644 Python_Stuff/sdl_sprites/yellow.png create mode 100644 Python_Stuff/universe.py create mode 100644 Python_Stuff/world_objects.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..367449a --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +Cpp_Stuff/.cache/clangd/index +Cpp_Stuff/build +Cpp_Stuff/compile_commands.json +Cpp_Stuff/tags +Python_Stuff/.vscode +Python_Stuff/__pycache__ +Python_Stuff/new_venv +Python_Stuff/venv diff --git a/Cpp_Stuff/CMakeLists.txt b/Cpp_Stuff/CMakeLists.txt new file mode 100644 index 0000000..9d9a436 --- /dev/null +++ b/Cpp_Stuff/CMakeLists.txt @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 3.22) +project(particle_sim) +# set (CMAKE_EXPORT_COMPILE_COMMANDS ON) +# set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "") +add_subdirectory(./src) +#add_subdirectory(./test) + diff --git a/Cpp_Stuff/include/custom_kernels.cuh b/Cpp_Stuff/include/custom_kernels.cuh new file mode 100644 index 0000000..1937bb4 --- /dev/null +++ b/Cpp_Stuff/include/custom_kernels.cuh @@ -0,0 +1,2 @@ + +void custom_kernel_process_ray_collision(int size, float * norms, float * direction, float * vel, float * pos, int array_stride, float * line_vec); diff --git a/Cpp_Stuff/include/hal.hpp b/Cpp_Stuff/include/hal.hpp new file mode 100644 index 0000000..fd31b9f --- /dev/null +++ b/Cpp_Stuff/include/hal.hpp @@ -0,0 +1,3 @@ +#include "vector" + +std::vector hal_vector_f32_cross_multiply(std::vector & a, std::vector & b); \ No newline at end of file diff --git a/Cpp_Stuff/include/sim_renderer.h b/Cpp_Stuff/include/sim_renderer.h new file mode 100644 index 0000000..8a55fee --- /dev/null +++ b/Cpp_Stuff/include/sim_renderer.h @@ -0,0 +1,5 @@ +#include +#include + + +int begin_sim(SDL_Renderer *renderer, SDL_Window *win); diff --git a/Cpp_Stuff/include/textures.hpp b/Cpp_Stuff/include/textures.hpp new file mode 100644 index 0000000..f7543f6 --- /dev/null +++ b/Cpp_Stuff/include/textures.hpp @@ -0,0 +1,5 @@ +#include + + +void init_textures(SDL_Renderer *in_renderer); +SDL_Texture * get_texture(int color); \ No newline at end of file diff --git a/Cpp_Stuff/include/ui_particles.hpp b/Cpp_Stuff/include/ui_particles.hpp new file mode 100644 index 0000000..2fcce35 --- /dev/null +++ b/Cpp_Stuff/include/ui_particles.hpp @@ -0,0 +1,18 @@ +#include + +enum Color {blue, green, red, yellow}; + +class ui_particles +{ + private: + SDL_Surface *bitmapSurface = NULL; + SDL_Texture * bitmapTexture = NULL; + SDL_Rect Rectangle; + SDL_Renderer *renderer; + + public: + ui_particles(Color color, SDL_Renderer *in_renderer); + ~ui_particles(); + void set_location(float x, float y); + void draw(void); +}; \ No newline at end of file diff --git a/Cpp_Stuff/include/universe.hpp b/Cpp_Stuff/include/universe.hpp new file mode 100644 index 0000000..0abe543 --- /dev/null +++ b/Cpp_Stuff/include/universe.hpp @@ -0,0 +1,39 @@ +#include +#include "ui_particles.hpp" +#include +#include + +struct data3d{ + float *data; +}; + +class universe +{ + private: + std::vector my_particles; + int num_of_particles; + int array_size; + cublasHandle_t cublas_handle; + float * device_ray_position; + float * device_ray_direction; + float * device_position; + float * device_velocity; + float * device_acceleration; + float * device_scratch_padA; + float * device_scratch_padB; + float * host_position; + float * host_velocity; + float * host_acceleration; + curandGenerator_t gen; + void process_collisions_with_other_particles(void); + void process_collisions_with_rays(void); + void process_particles(void); + /* data3d */ + public: + universe(int size); + ~universe(); + void get_positions(float ** in_out_buffer, int * size, int * stride); + void process(void); +}; + + diff --git a/Cpp_Stuff/include/util.hpp b/Cpp_Stuff/include/util.hpp new file mode 100644 index 0000000..46cc4c7 --- /dev/null +++ b/Cpp_Stuff/include/util.hpp @@ -0,0 +1,18 @@ + +#include +#include +#include + +#define CHECK_CUDA_ERROR(val) check((val), #val, __FILE__, __LINE__) +template +void check(T err, const char* const func, const char* const file, + const int line) +{ + if (int(err) != int(cudaSuccess)) + { + std::cerr << "CUDA Runtime Error at: " << file << ":" << line << ":" << err + << std::endl; + // We don't exit when we encounter CUDA errors in this example. + // std::exit(EXIT_FAILURE); + } +} \ No newline at end of file diff --git a/Cpp_Stuff/sdl_sprites/blue.bmp b/Cpp_Stuff/sdl_sprites/blue.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d53eb3bfd85bbf628170ba04c7a77c953c6ebf7e GIT binary patch literal 27694 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 literal 0 HcmV?d00001 diff --git a/Cpp_Stuff/sdl_sprites/green.bmp b/Cpp_Stuff/sdl_sprites/green.bmp new file mode 100644 index 0000000000000000000000000000000000000000..71037d91bd9d15e582589a4ea22878bd25f1a03d GIT binary patch literal 27694 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 literal 0 HcmV?d00001 diff --git a/Cpp_Stuff/sdl_sprites/red.bmp b/Cpp_Stuff/sdl_sprites/red.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7d4382f98d5162902c3a47fff0b6065ea248064e GIT binary patch literal 27694 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 literal 0 HcmV?d00001 diff --git a/Cpp_Stuff/sdl_sprites/red.png b/Cpp_Stuff/sdl_sprites/red.png new file mode 100644 index 0000000000000000000000000000000000000000..04036af42608215cf78375cc464a5e2aba2301ad GIT binary patch literal 4657 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 Z`0&{1zuRN&M((~w|LvYaE)Tb3{|7`Zo_qiR literal 0 HcmV?d00001 diff --git a/Cpp_Stuff/sdl_sprites/yellow.png b/Cpp_Stuff/sdl_sprites/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..a438d37be7f15a577ba039a2d8f526c5d8622156 GIT binary patch literal 4121 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 +#include +#include +#include +#include +#include +#include +#include "sim_renderer.h" + +int main( int argc, const char* argv[] ) +{ + SDL_Renderer *renderer = NULL; + SDL_Texture *texture = NULL; + SDL_Window *win; + SDL_Rect srcR, destR; + const char name[] = "Game"; + if (SDL_Init(SDL_INIT_EVERYTHING) != 0) + { + SDL_Log("Unable to initialize SDL: %s", SDL_GetError()); + return 1; + } + + win = SDL_CreateWindow(name, 0, 0, 800, 800, SDL_WINDOW_RESIZABLE); + if (win == NULL) + { + // In the case that the window could not be made... + printf("Could not create window: %s\n", SDL_GetError()); + return 1; + } + renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED); + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); + SDL_Rect rectangle; + + rectangle.x = 0; + rectangle.y = 0; + rectangle.w = 50; + rectangle.h = 50; + SDL_RenderFillRect(renderer, &rectangle); + texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 800, 800); + + (void)begin_sim(renderer, win); + + SDL_DestroyTexture(texture); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(win); + return 0; +} diff --git a/Cpp_Stuff/src/renderer/sim_renderer.cpp b/Cpp_Stuff/src/renderer/sim_renderer.cpp new file mode 100644 index 0000000..31fdb23 --- /dev/null +++ b/Cpp_Stuff/src/renderer/sim_renderer.cpp @@ -0,0 +1,132 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "universe.hpp" +#include "util.hpp" +#include "textures.hpp" + +static clock_t start_time, end_time; +std::vector test; + +static void draw_particles(universe * my_universe, std::vector *my_particles) +{ + float * positions; + int stride; + int size; + my_universe->get_positions(&positions, &size, &stride); + for(int i = 0; i < size; i++) + { + // printf("Test\n"); + (*my_particles)[i].set_location(positions[i], positions[stride+i]); + (*my_particles)[i].draw(); + } +} + +int begin_sim(SDL_Renderer *renderer, SDL_Window *win) +{ + SDL_Rect srcR, destR; + int num_of_particles = 10000; + bool run = true; + SDL_Surface *screen; + universe my_universe = universe(num_of_particles); + init_textures(renderer); + std::vector my_particles; + for(int i = 0; i < num_of_particles; i++) + { + ui_particles temp_particle = ui_particles(Color(i%4), renderer); + my_particles.push_back(temp_particle); + } + // screen = SDL_SetVideoMode(800, 800, 0, 0); + while (run) + { + clock_t start_t, end_t; + SDL_Event event; + bool redraw = true; + while (SDL_PollEvent(&event)) + { + /* handle your event here */ + if (event.type == SDL_MOUSEBUTTONDOWN) + { + if (event.button.button == SDL_BUTTON_MIDDLE) // scroll up + { + run = false; + } + else if ((event.button.button == SDL_BUTTON_LEFT) + || (event.button.button == SDL_BUTTON_RIGHT)) // scroll up + { + // bitmapSurface = SDL_LoadBMP("./sdl_sprites/red.bpm"); + SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00); + SDL_RenderClear(renderer); + my_universe.process(); + start_time = clock(); + draw_particles(&my_universe, &my_particles); + end_time = clock(); + + SDL_RenderPresent(renderer); + clock_t t = end_time - start_time; + SDL_Log("No. of clicks %ld clicks (%f seconds) to process the incoming click.\n", t, ((float)t) / CLOCKS_PER_SEC); + } + else + { + /* Do nothing. */ + } + + } + else if (event.type == SDL_QUIT) + { + run = false; + } + else if (event.type == SDL_WINDOWEVENT) + { + switch (event.window.event) + { + case SDL_WINDOWEVENT_ENTER: + case SDL_WINDOWEVENT_SHOWN: + case SDL_WINDOWEVENT_MOVED: + case SDL_WINDOWEVENT_EXPOSED: + case SDL_WINDOWEVENT_RESTORED: + redraw = true; + break; + case SDL_WINDOWEVENT_RESIZED: + case SDL_WINDOWEVENT_SIZE_CHANGED: + case SDL_WINDOWEVENT_MAXIMIZED: + redraw = true; + SDL_GetWindowSize(win, &destR.w, &destR.h); + // ui_resize(renderer, destR.w, destR.h); + break; + } + } + else + { + /* Do nothing. */ + } + } + if (redraw) + { + SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00); + SDL_RenderClear(renderer); + start_time = clock(); + for(int i = 0; i < 100; i++) + { + my_universe.process(); + } + end_time = clock(); + draw_particles(&my_universe, &my_particles); + + // ui_redraw_board(renderer); + SDL_RenderPresent(renderer); + + clock_t t = end_time - start_time; + SDL_Log("No. of clicks %ld clicks (%f seconds).\n", + t, ((float)t) / CLOCKS_PER_SEC); + } + /* do some other stuff here -- draw your app, etc. */ + } + return 0; +} diff --git a/Cpp_Stuff/src/renderer/textures.cpp b/Cpp_Stuff/src/renderer/textures.cpp new file mode 100644 index 0000000..4981abc --- /dev/null +++ b/Cpp_Stuff/src/renderer/textures.cpp @@ -0,0 +1,25 @@ +#include "textures.hpp" +#include +#include +#include +#include + +SDL_Surface *bitmapSurface[4]= {}; +SDL_Texture * bitmapTexture[4] = {}; +static std::string color_paths[] = {"blue", "green", "red", "yellow"}; +static std::string sprite_path = "../sdl_sprites/"; + +void init_textures(SDL_Renderer *in_renderer) +{ + for (size_t color = 0; color < 4; color++) + { + bitmapSurface[color] = SDL_LoadBMP((sprite_path+color_paths[color]+".bmp").c_str()); + bitmapTexture[color] = SDL_CreateTextureFromSurface(in_renderer, bitmapSurface[color]); + } + +} + +SDL_Texture * get_texture(int color) +{ + return bitmapTexture[color]; +} diff --git a/Cpp_Stuff/src/renderer/ui_particles.cpp b/Cpp_Stuff/src/renderer/ui_particles.cpp new file mode 100644 index 0000000..95421ff --- /dev/null +++ b/Cpp_Stuff/src/renderer/ui_particles.cpp @@ -0,0 +1,44 @@ +#include +#include +#include +#include +#include +#include +#include +#include "ui_particles.hpp" +#include "textures.hpp" + + +static std::string color_paths[] = {"blue", "green", "red", "yellow"}; +static std::string sprite_path = "../sdl_sprites/"; + +ui_particles::ui_particles(Color color, SDL_Renderer *in_renderer) +{ + renderer = in_renderer; + bitmapTexture = get_texture(color); + Rectangle.x = 0; + Rectangle.y = 0; + Rectangle.w = 5; + Rectangle.h = 5; + // std::cout< +#include +#include +#include +#include +#include +#include +#include +#include +#include "universe.hpp" +#include "npp.h" +#include "custom_kernels.cuh" +#include "util.hpp" + +#define DELTA_TIME 0.5 + + +void universe::process_collisions_with_rays(void) +{ + float temp_directions[][3] = + { + {1.0,0.0,0.0}, + {0.0,1.0,0.0}, + {1.0,0.0,0.0}, + {0.0,1.0,0.0} + }; + + float temp_positions[][3] = + { + {0.0,0.0,0.0}, + {0.0,0.0,0.0}, + {800.0,800.0,800.0}, + {800.0,800.0,800.0} + }; + + float alpha = 1.0; + float beta = 0.0; + + float * dev_dot_product_result; + float * dev_direction_vec; + + CHECK_CUDA_ERROR(cudaMallocManaged(&(dev_dot_product_result), + long(num_of_particles*sizeof(float)))); + + CHECK_CUDA_ERROR(cudaMallocManaged(&(dev_direction_vec), + long(num_of_particles*3*sizeof(float)))); + + for(int i = 0; i < 4; i++) + { + //Fill scratchpad A with vec1 = line_position - particle_position + for (int j = 0; j < 3; j++) + { + CHECK_CUDA_ERROR(nppsSubCRev_32f(&device_position[array_size * j], + temp_positions[i][j], &device_scratch_padA[num_of_particles * j], + num_of_particles)); + } + alpha = 1.0; + beta = 0.0; + CHECK_CUDA_ERROR(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N, + num_of_particles, 1, 3, &alpha, device_scratch_padA, + num_of_particles, &device_ray_direction[i * 3], 3, &beta, + dev_dot_product_result, num_of_particles)); + + //Use dot product to find projections onto the line directions + CHECK_CUDA_ERROR(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, + num_of_particles, 3, 1, &alpha, dev_dot_product_result, + num_of_particles, &device_ray_direction[i * 3], 3, &beta, + device_scratch_padA, num_of_particles)); + + //calc norm + CHECK_CUDA_ERROR(nppsSqr_32f(device_scratch_padA, dev_direction_vec, + num_of_particles * 3)); + + CHECK_CUDA_ERROR(cublasSaxpy(cublas_handle, num_of_particles, &alpha, + &dev_direction_vec[num_of_particles * 1], 1, + dev_direction_vec, 1)); + + CHECK_CUDA_ERROR(cublasSaxpy(cublas_handle, num_of_particles, &alpha, + &dev_direction_vec[num_of_particles * 2], 1, + dev_direction_vec, 1)); + + CHECK_CUDA_ERROR(nppsSqrt_32f_I(dev_direction_vec, num_of_particles)); + + //Normalize vector + CHECK_CUDA_ERROR(nppsDiv_32f_I(dev_direction_vec, device_scratch_padA, + num_of_particles)); + + CHECK_CUDA_ERROR(nppsDiv_32f_I(dev_direction_vec, + &device_scratch_padA[1 * num_of_particles], num_of_particles)); + + CHECK_CUDA_ERROR(nppsDiv_32f_I(dev_direction_vec, + &device_scratch_padA[2 * num_of_particles], num_of_particles)); + + custom_kernel_process_ray_collision(num_of_particles, dev_direction_vec, + device_scratch_padA, device_velocity, device_position, + array_size, &device_ray_direction[i*3]); + + } + + CHECK_CUDA_ERROR(cudaFree(dev_dot_product_result)); + CHECK_CUDA_ERROR(cudaFree(dev_direction_vec)); + +} + + +void universe::process_collisions_with_other_particles(void) +{ + +} + +void universe::process_particles(void) +{ + const float delta = DELTA_TIME; + + // // Update the positions of the particles: + // // self.positions[counti] = self.velocities[counti] * DELTA_TIME + self.positions[counti] + CHECK_CUDA_ERROR(cublasSaxpy(cublas_handle, array_size*3, &delta, + device_velocity, 1, device_position, 1)); + + // Update the velocities of the particles: + // self.velocities[counti] = self.accelerations[counti] * DELTA_TIME + self.velocities[counti] + CHECK_CUDA_ERROR(cublasSaxpy(cublas_handle, array_size*3, &delta, + device_acceleration, 1, device_velocity, 1)); + + process_collisions_with_rays(); + + process_collisions_with_other_particles(); +} + +void universe::get_positions(float ** in_out_buffer, int * size, int * stride) +{ + CHECK_CUDA_ERROR(cudaMemcpy(host_position, device_position, + long(array_size * 3 * sizeof(float)), cudaMemcpyDeviceToHost)); + + *in_out_buffer = host_position; + *size = num_of_particles; + *stride = array_size; +} + +universe::universe(int size) +{ +curandCreateGenerator(&gen, + CURAND_RNG_PSEUDO_DEFAULT); + + CHECK_CUDA_ERROR(cublasCreate(&cublas_handle)); + + num_of_particles = size; + array_size = size; + + CHECK_CUDA_ERROR(cudaMallocManaged(&(device_position), + long(array_size*3*sizeof(float)))); + + CHECK_CUDA_ERROR(cudaMallocManaged(&(device_velocity), + long(array_size*3*sizeof(float)))); + + CHECK_CUDA_ERROR(cudaMallocManaged(&(device_acceleration), + long(array_size*3*sizeof(float)))); + + CHECK_CUDA_ERROR(cudaMallocManaged(&(device_scratch_padA), + long(array_size*3*sizeof(float)))); + + host_position = (float *)malloc(long(array_size*3*sizeof(float))); + host_velocity = (float *)malloc(long(array_size*3*sizeof(float))); + host_acceleration = (float *)malloc(long(array_size*3*sizeof(float))); + + CHECK_CUDA_ERROR(curandGenerateUniform(gen, device_position, array_size*2)); + CHECK_CUDA_ERROR(nppsAddC_32f_I(20.0, device_position, array_size*3)); + CHECK_CUDA_ERROR(curandGenerateUniform(gen, device_velocity, array_size*2)); + // CHECK_CUDA_ERROR(curandGenerateUniform(gen, device_acceleration, num_of_particles*3)); + + //Add rays that can collied with particles to the universe + CHECK_CUDA_ERROR(cudaMallocManaged(&(device_ray_position), + long(4*3*sizeof(float)))); + + CHECK_CUDA_ERROR(cudaMallocManaged(&(device_ray_direction), + long(4*3*sizeof(float)))); + + float temp_positions[] = {0.0,0.0,0.0,0.0,0.0,0.0,800.0,800.0,800.0,800.0,800.0,800.0}; + float temp_directions[] = {1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0}; + + CHECK_CUDA_ERROR(cudaMemcpy(device_ray_position, temp_positions, + long(sizeof(temp_positions)), cudaMemcpyHostToDevice)); + + CHECK_CUDA_ERROR(cudaMemcpy(device_ray_direction, temp_directions, + long(sizeof(temp_directions)), cudaMemcpyHostToDevice)); + + +} + +universe::~universe() +{ + + + CHECK_CUDA_ERROR(cudaFree(device_position)); + CHECK_CUDA_ERROR(cudaFree(device_velocity)); + CHECK_CUDA_ERROR(cudaFree(device_acceleration)); + CHECK_CUDA_ERROR(cudaFree(device_scratch_padA)); + + free(host_position); + free(host_velocity); + free(host_acceleration); + CHECK_CUDA_ERROR(cublasDestroy(cublas_handle)); + + + +} + +void universe::process(void) +{ + + //First we need to process gravity + + + + //Then we want to process collisions + process_particles(); + +} diff --git a/Cpp_Stuff/src/utility/custom_kernels.cu b/Cpp_Stuff/src/utility/custom_kernels.cu new file mode 100644 index 0000000..7890c69 --- /dev/null +++ b/Cpp_Stuff/src/utility/custom_kernels.cu @@ -0,0 +1,39 @@ +#include "custom_kernels.cuh" +#include "stdio.h" +#define BLOCK_SIZE 32 + +__global__ static void process_ray_collision(int size, float * norms, float * direction, float * vel, float * pos, int array_stride, float * line_vec) +{ + int index = blockIdx.x * blockDim.x + threadIdx.x; + int stride = blockDim.x * gridDim.x; + for (int i = index; i < size; i+= stride) + { + if(norms[i] < 5.0) + { + float speed_norm = 0.0; + float dot_product = 0.0; + for(int k = 0; k<3; k++) + { + dot_product += vel[k*array_stride+i]*line_vec[k]; + } + for(int k = 0; k<3; k++) + { + float temp = (dot_product*(line_vec[k])); + speed_norm += pow(temp, 2); + } + speed_norm = sqrt(speed_norm)*2.0; + for(int k = 0; k<3; k++) + { + vel[k*array_stride+i] = vel[k*array_stride+i] - speed_norm*direction[k*size+i]; + pos[k*array_stride+i] = pos[k*array_stride+i] - direction[k*size+i]*(5.0-norms[i]); + } + } + } +} + + +void custom_kernel_process_ray_collision(int size, float * norms, float * direction, float * vel, float * pos, int array_stride, float * line_vec) +{ + int numBlocks = (size + BLOCK_SIZE - 1) / BLOCK_SIZE; + process_ray_collision<<>>(size, norms, direction, vel, pos, array_stride, line_vec); +} diff --git a/Cpp_Stuff/src/utility/hal.cpp b/Cpp_Stuff/src/utility/hal.cpp new file mode 100644 index 0000000..eb9738c --- /dev/null +++ b/Cpp_Stuff/src/utility/hal.cpp @@ -0,0 +1,25 @@ +#include "hal.hpp" +#include "npp.h" +#include +#include + +std::vector hal_vector_f32_cross_multiply(std::vector& a, std::vector& b) +{ + Npp32f * pSrca; + Npp32f * pSrcb; + cudaMallocManaged((void **)(&pSrca), long(sizeof(Npp32f) * a.size())); + cudaMallocManaged((void **)(&pSrcb), long(sizeof(Npp32f) * b.size())); + cudaMemcpy(pSrca, &a[0], sizeof(Npp32f) * a.size(), cudaMemcpyHostToDevice); + cudaMemcpy(pSrcb, &b[0], sizeof(Npp32f) * b.size(), cudaMemcpyHostToDevice); + std::vector ret_vec; + ret_vec = b; + Npp32f * pSrcc; + cudaMallocManaged((void **)(&pSrcc), long(sizeof(Npp32f) * ret_vec.size())); + NppStatus status = nppsMul_32f(pSrca, pSrcb, pSrcc, a.size()); + cudaDeviceSynchronize(); + cudaMemcpy(&ret_vec[0], pSrcc, sizeof(Npp32f) * ret_vec.size(), cudaMemcpyDeviceToHost); + cudaFree(pSrca); + cudaFree(pSrcb); + cudaFree(pSrcc); + return ret_vec; +} diff --git a/Python_Stuff/python_particle_simulator.py b/Python_Stuff/python_particle_simulator.py new file mode 100644 index 0000000..f0787fd --- /dev/null +++ b/Python_Stuff/python_particle_simulator.py @@ -0,0 +1,62 @@ +import numpy as np +import time +import sys +import sdl2 +import sdl2.ext + +import world_objects +import universe +import renderer + +sprites = ["./sdl_sprites/green.bmp", +"./sdl_sprites/red.bmp", +"./sdl_sprites/yellow.bmp", +"./sdl_sprites/blue.bmp"] + +def generate_particle(my_renderer): + location = np.random.randint(10,750,2) + accel = np.random.randint(0,5,2) + vel = np.random.randint(-10,10,2) + print(len(sprites)) + sprite = sprites[np.random.randint(0,(len(sprites)))] + return world_objects.particle(location, vel, accel, 10, (255,0,0), 10.0, "blah", my_renderer, sprite) + + +def run(): + my_renderer = renderer.SdlRender() + running = True + my_universe = universe.universe() + black_hole = world_objects.particle([400,400], [10,0], [0,0], 20, (0,0,255), 2000.0, "red", my_renderer, sprites[1]) + my_universe.add_particle(black_hole) + + for i in range(100): + my_universe.add_particle(generate_particle(my_renderer)) + + left = world_objects.line([0,0], [1,0]) + top = world_objects.line([0,0], [0,1]) + right = world_objects.line([800, 800], [1,0]) + bottom = world_objects.line([800, 800], [0,1]) + my_universe.add_line(left) + my_universe.add_line(top) + my_universe.add_line(right) + my_universe.add_line(bottom) + + print(my_universe) + start_time=0 + while running: + start_time = time.time() + events = sdl2.ext.get_events() + for event in events: + if event.type == sdl2.SDL_QUIT: + running = False + break + my_universe.process() + stop_time = time.time() + + my_renderer.sdl_world.process() + temp = stop_time - start_time + start_time = time.time() + print(f"Process physics: {(temp)*1000} ms Draw world: {(start_time - stop_time)*1000} ms") + +if __name__ == '__main__': + sys.exit(run()) diff --git a/Python_Stuff/renderer.py b/Python_Stuff/renderer.py new file mode 100644 index 0000000..14a51a6 --- /dev/null +++ b/Python_Stuff/renderer.py @@ -0,0 +1,37 @@ +import sdl2 +import sdl2.ext +from sdl2.ext.image import load_image +import numpy as np + + +WHITE = sdl2.ext.Color(255, 255, 255) + +class Player(sdl2.ext.Entity): + def __init__(self, world, renderer, radius, path_to_image, posx=0, posy=0): + image = load_image(str(path_to_image)) + new_surf = sdl2.surface.SDL_CreateRGBSurface(0,radius*2,radius*2,32,0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000) + sdl2.surface.SDL_BlitScaled(image, sdl2.rect.SDL_Rect(0,0,image.h,image.w), new_surf, sdl2.rect.SDL_Rect(0,0,radius*2,radius*2)) + self.sprite = renderer.factory.from_surface(new_surf, False) + self.sprite.position = int(posx), int(posy) + + def update_pos(self, pos): + self.sprite.position = int(pos[0]), int(pos[1]) + +class SoftwareRenderer(sdl2.ext.SoftwareSpriteRenderSystem): + def __init__(self, window): + super(SoftwareRenderer, self).__init__(window) + + def render(self, components): + sdl2.ext.fill(self.surface, sdl2.ext.Color(0, 0, 0)) + super(SoftwareRenderer, self).render(components) + +class SdlRender(): + def __init__(self): + sdl2.ext.init() + self.window = sdl2.ext.Window("Gravity Sim", size=(800, 800)) + self.window.show() + self.sdl_world = sdl2.ext.World() + + self.spriterenderer = SoftwareRenderer(self.window) + self.sdl_world.add_system(self.spriterenderer) + self.factory = sdl2.ext.SpriteFactory(sdl2.ext.SOFTWARE) diff --git a/Python_Stuff/requirements.txt b/Python_Stuff/requirements.txt new file mode 100644 index 0000000..9ad69b0 --- /dev/null +++ b/Python_Stuff/requirements.txt @@ -0,0 +1,2 @@ +numpy==1.24.1 +PySDL2==0.9.14 diff --git a/Python_Stuff/sdl.py b/Python_Stuff/sdl.py new file mode 100644 index 0000000..b60009c --- /dev/null +++ b/Python_Stuff/sdl.py @@ -0,0 +1,50 @@ +import sys +import sdl2 +import sdl2.ext + +WHITE = sdl2.ext.Color(255, 255, 255) + +class SoftwareRenderer(sdl2.ext.SoftwareSpriteRenderSystem): + def __init__(self, window): + super(SoftwareRenderer, self).__init__(window) + + def render(self, components): + sdl2.ext.fill(self.surface, sdl2.ext.Color(0, 0, 0)) + super(SoftwareRenderer, self).render(components) + + +class Player(sdl2.ext.Entity): + def __init__(self, world, sprite, posx=0, posy=0): + self.sprite = sprite + self.sprite.position = posx, posy + +def run(): + sdl2.ext.init() + window = sdl2.ext.Window("The Pong Game", size=(800, 600)) + window.show() + world = sdl2.ext.World() + + spriterenderer = SoftwareRenderer(window) + world.add_system(spriterenderer) + factory = sdl2.ext.SpriteFactory(sdl2.ext.SOFTWARE) + + sp_paddle1 = factory.from_color(WHITE, size=(20, 100)) + sp_paddle2 = factory.from_color(WHITE, size=(20, 100)) + + player1 = Player(world, sp_paddle1, 0, 250) + player2 = Player(world, sp_paddle2, 780, 250) + + running = True + while running: + events = sdl2.ext.get_events() + for event in events: + if event.type == sdl2.SDL_QUIT: + running = False + break + + world.process() + #window.refresh() + return 0 + +if __name__ == "__main__": + sys.exit(run()) \ No newline at end of file diff --git a/Python_Stuff/sdl_sprites/blue.bmp b/Python_Stuff/sdl_sprites/blue.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d53eb3bfd85bbf628170ba04c7a77c953c6ebf7e GIT binary patch literal 27694 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 literal 0 HcmV?d00001 diff --git a/Python_Stuff/sdl_sprites/green.bmp b/Python_Stuff/sdl_sprites/green.bmp new file mode 100644 index 0000000000000000000000000000000000000000..71037d91bd9d15e582589a4ea22878bd25f1a03d GIT binary patch literal 27694 zcmeI*3A9~xb;t47)yi5ORs~&Zm%w5Y2PktGk}?PgA?+fo7L?8Kj*#u^3TbAdG`$oFHrQ)efQjR z?mOqZfBU!h|9|d%?04Aq3woM=E-(K+uZ*ev<2QOX@A=L0^R1`!^t|$S`$l=%|4;Pv z^!?xS*l+UDXXGp0KK@p>JO2NE>kWa&dggDsxM$v}a|D4soU%y2T$BB-Z14&vEj5WhCLkT zc<z8_g?DvjpB62<)MpvPCTYu-x4}H_jQw-Yaa=>ZjZs%@9Ed=62E_3f*Hn1 z_2t~WrSf+Agh{JuZljr7#VclS9j~1K#%8=~!8T#M`d!D`^FZZ-aody>wtLO zqJv`Vdk-FTc-^qCV;qk;#`t0@Ms&L-u9!MM=Q&>eRIKlR+3e+Wci5-77S~ksbKTfs zf!XUHJ}lnwjU(bsi;s?No|qQfJ~<=)@abclvHdg0MULF&(LVNdjAOkIzR9-cO0R43 z0_W*`$D2k=-drbtc6rNojV>^x71vhtbNyK0g4GVs9UnVAe?sgM^Sd7Q-|<&-nq!kM zwqlc9#f|<`tAjChzWsTB-3x7weK|dEshXKO#L%_SifgO+jf7n{oUs)fy2X`V>7NfI zQ#u_i_nm)#kNSf2P&nSd!R%#+?6rI2Q@oH4Ylg1PH4ayM-S8W1A6)5`{%N(%bTB{F zN4cJL?V-tW!r?nLc_j97IdzC34Gwm_>tcH{O`VFdd=Yass*^_L{JP}X)R+>#-Dm9D zoR{+xdm5mH7n)%^PBl}p7IU%Z>79Hud9Ll6)5&b+5lexx>a%K42C-#T39+Tz)8+~}7+0|tbM;UzWzKi1OKXc~ z`s0?Tt*kF{nlH+s!OnfWZdVWGlAMxTdXK?)jU+CiQj5&rN21L#$6kEY z%>A2wOr2TZ{c)(+p5N-3JL$&Fj%_@dH>=m~CT>to;3Ex-1D@=qSB?VY?+UB{;zme%nv+i7YO zn-^oPX|roTuWJ$S?3C-5Y<6g=Lqp&1D1NYH=Zp7k)~)1r`**z*p7YMk^-g`fd!IP1 zNt=yNZaK5@-2Wyvybmo*N5^=HR_mC`tBciulDd(C1{>Ta#>w$Vu^{%0cf?+0>>a1Z zKJm^~hHYNA-=sJt_9(~TI}#qFJ*KVAc8@ezzv=T7ADA?wsbOQKN&N7@2D3NEX|Z3N z9{b0;;($0K4vaIKF*(i(!*ko;Qigr@E&DqTcWk|%xQv!jx5uY8vqx%cQw_qc?VIv@ z`k99{x*n}2U9)SaG5m1B39p0W-El~q6NkpRaab9L$Dgb+Z1cKtP@LTygRL0g>V0W- zT`^5 zJuVy=p4;yAqvQNIvh0hsLHN|z&OzIFr4CoFQe2$MxV|Khh z=Eh}lLR=ob@qw6E4bN>i=9K+r#rqoG*yEZ^`GZ)Anb@V5jzk099Aj>ob0PgvU4z^Y zu07M*+_4w--LvWDy>lOWa2;~ab;(28p~GZIcbMRV+lle#B{Q!mYWh$!7Q|KM9aaw8 zPmU{#TU=2-f$+fruHqmb$yBW9o<{kJoLE~qU)LacUaukX%zACp{PM_ahIbD!Ino7R zlzXW~c`R3H5JUX%!R(!Jbvfe0MZq5_M_p4$Tsts4H%>3F+wUD^e{69T2U^9HPUSxD zrBS&c=hgeQ!Bej46ZMPjUeo83>iIeU9L_vPUejZ8qz``P`dp{$O@>&U8h_F7!RhSy zXxaPYrJ`I{l=X>boEO&*{A~NV<@I;R#~Q|%ioZA{Q@PJ``A6n_%~PDmy1!qOXX2N&{En?=cijuA*Xj&^l-Kl_9O=b%(va(R z{q%()emGqmw-nm9l|64S+5eY?`lnVImzC{azcg-bIOB>xre~Fyhz+mc8?>K1=`-^^ z>(N-wLwTn44!x1JxY{#6_3~o}Sl+zjtgi0kh_xJ2uhkj;D6i?U=Ex6Sw|u2946(rp zyDQ=|h4vjK^FLdN-#IWmzp8A%G8Pt6pKe&=O21+uCSoJ+X`YYPJo%?QkuUN_+=t4s zZeQn_e9#=I-Dm2HQkPhE(^u-{#GE(DDLo2*l-H?89OYzckq&9_gM|%#*j*E!E2KYP zsN7xDc6T9uPxI*KkH#08*FGF~HC%D0U$GDq8s!%>k0*V~cePG_h_5({x44g0uD9z? z-LtR4a_8AYvQ!^4x5Zvg@hWwOKg#QxBR_QgbVz3y;)mDu@x`LDzbbotsVMHR2gXh1 zXWMTmuj7j=reYu#sZm;Q^UQi=PGGJi-r_F)-D+>B{jz6o*YcX>ExXJaa$Sg@>*Msu zncK7=$J81AD6i?U=7_^b3J(l1!t2(!w_?hkh(`ou})Q#!8!Nd8hf$a9FlADYwmKoVy&8YjTc1^0m|>@52EP z8cc=@P3pmEgGS^Yf0Wnsh~p<>QKLm%FvRZ*h2Nt1Mp510 z7Q){wN`15$o`11yzdOEO9QBd%4i7gvy(PZfXgYbSOY&Wf7r*pQp54}F`sP^7*}G*q z*gV`hWbIC$tTm|**FVZ_T9JeNQC`!doR+t^&>)7`-51{~nf-X7`|W|@`TeoDkbAV@ zj4A!{f#fMZ^e$fFCVt|`t7~oYP4&?nQ%xU>`B1kk2V1jr4$j3nIXCAhkK|LW$;@pv zLN4-0en*cu(jwj68;>;%zZ%~uq@IYsiSHG<-*1MWABpdlz5lLZO0&t6m*Pq1`T+3~ zH{L9cw5jjpo9dyuD2MnvpC5}F)D6prf3J7Y+SAVOtliGpxx0qcr2f%0(hiT~kMf!x zaim3@F#KlxpgeoBC~-+q=8v1l#pU^<@xz8M)^tk4cz(9%lfL<`UP`>$+T@#hPBmTb z=r!b$JXbqM+q+}gsrJKkF__kch8YG9z zh4k+FxzX11?1|K#`hEp|*{fUUIP}3;tJOMjti3XObGvzp9)yS;pW8s-tw%3Z*kEuV4xNn!Z2_<5oCTp{_d<=JzE;=eRZ@%(O~j643~z$4Ulbx41&uGM+2 zKhodo&$6DUXJ+3%nmJ|8d)jlz_B|i#!snf~I?L=Uv+n5I^g=n$slAdu=!BQ?G_^v0 zW00EUk2FV*IAZu*{Cg~oUzeYLRY)!^ul%CXD&D-5HhF{E&Nu5kHz(2`UD99Av)9z~ z@*ym(y=46vO`n6LUtKRiw? z#*$BBgOR+ZM;w10%gXFv+Gl{{ZI>Dg7ko7iT_f3VCNo_%E}mga?6@=84< zeI-l&h}pjtE#mmUu_FFEmKU=B*=UnyX;+@tEO{oD=9pOOjj-g^gRxXEu~a`t(-&nw zRNvd}zYn=A>rOuM%-J{3UPYU2mZ{5bSk}74veqS*{83)h2{h{fr=6Sb%NtgW6`Xj&85AjR2BK;Cey^g*|y;f&% zK%LSXWi4;}C6@eBj_3R*b3Esgb&ikJFVidAb*JyMgPs5W#6!Q| zyS$#`x9fO4=TXPi9(7z#qEA=H^(yMP-bEcZzcw#4pP?}x_`_0p@WNBBWBP2#cpl0t z<+mDzy%_LYzRNRshkh&TxOtY|R*$QWo72{{C+9xa6GqB%u=^8(eV&Lu-J3l5+LhYO zxwy3}^M~w-^p`n*)L&X-;92H8JdBs|G~Px_YH;@H`0zn}kG=>y{wS~U#qs-PD^2R5 z)E%)96MaEF_mKzkL0;%D`FA~!%(Y=X(P;Y1I=}P2*-+n8DJ(a=b&r)SY1F*O9L&7O zoXp%zjWk!2Pq{v%FUh$$&15alz6cLoa{)p8jn(C^9@^B%ohy}n`I!?WtV>*nXd@>~7JD?PH)W2r$)W_)>NJy-kcHDEm(FVYX| zi|bmRJ*MlF=c!F|A3171h^Lya4_DXaJe_*P5NCSCQO(i|>G#Ei2lL`Ozw3S|*NWUn zcke_V$tQVb{x*_zw@&%(o;XgO_|@C=O1Dm2$ueuXJjot2*DiDJV=i3JBlXa(H|OMh zQ?4gZwZwb|Q`~6KpjrNiH;=42rcd$@vEt1iV7QZFPQ+ z`pNe9Q9kzSsVmxR7~SZx-lx=|>)yYhcR-uYFMX50JO9je`k)iFfIj&dp4O1C;Gvkx zd-sEAmF{xjY#ZjuP#qHwI;VGftU2cWvb@Jr-y0uEPbs(C-;?V5yz0E`YAz%FSueHV z#`#UJTYq*Vb6t-_7xE0x)Tg<#&4WySnB#-Sm>fVe38y@6@|zuID}8+B@--@9KfISsKE? z+B>FniVv<>@l<>bKikd|v6s)OMRDODbT6;zF*)kd%yIO;az^e9_p?MiGQX3b-yxqc zWrtNhr#c*7YuZ;I@W4j%mL2tY-{)A>NBukR%+D67MX67HylZyt7+@;z7ZCTqB#57z&rN9Ok>c0GERwfc9TlIN7CPHN&V z{&>o(vpRW+$(q9<3YKJmtGS zo`2GaYjmxySsr3ar!=KrV1p61?LmLEY#+HS78uex51~cemfvwHImo*qyJo)F;Z})v)Pu+CymquKpYjw@;Utvn8c;KRDV1#XZ*p9pX^jcz} zPr#7o#Yw!xjlb|2{y3cZwmQQfGp~J~a*yM7Z}NIHf9qv1R^4pppQT?|cHspp>pP9O zM%OC;Fy(17poke+iuv;{xs-#u}OyA)))EA7tIN2QBF@jalcsf@>z`*oo}A|czx7Q zl$bBMbKBmSyRf&>kbJ}f6KrS}UjwiF*>valnsy8z%A-A3Y4lIXpMKZVc!CjM{8nB6W!2ZdXr^ zGY>f`7Hv4IVfaGT=&@u<2PK~#$?=UJ`n~I;4!hw`8~t4MAo1}7=fwGE%!!k(oE6hQKRYJ=tnd3Vbe03N>G$fe;1^1j)ASLB+Og*YZPlg!Mox?e2Y? z(?9M#_nvd_+10MJvW>~rtnXUdy?gKHet(biJC6nauvKj%XY<21p|h2P-a^1`;o$QC zG7I1{2*`xz#lbm1MgaZ^0XfD&w-d1KTX6Z&&kfAGu=7?9b~gvVl7Q4YH|_+!bQEmf zCm@%c23dX-Xv`_^@oWwNU^a(mGccQjeNqd)dmd=tEReogF!#?#ediV6;5h>F0Req- zGgiEC-oe~}uGJ>^!yJ4KTXxjsH}3-ebU)0m^-lVjUV*{M`e2=`2PezmjC!Cumcr^< zin{k#A$@G2OF-UnK_1+Sl{-GuFz>?7TN%6`@_DBhv-R(S{`LDXFC761eh}_M(+&2_ zS0Y&We4@=64S;4n=}O9(Z%@3 zmtd{?2oy$uj)H=QFcBaXAbq6bhXwz7U|?YI%KH5LX%|k`Lt)TE{P=h*DqsqwmJ_gikRHbS9gLrJ;Py13^|^a- z!SS~39k~1(XBDPz)_foN`F>*p`~qmU z&&GJa1MF$VA3y(aE^Rm6Ia#weCJWMQJNPqe_rF-?!cmw=!9)rcQZQk~9?9SNkgbH0 zSoN;g&O7O#q(2W690Hkz{*mnS?ilT^Zfri<`_;j{LY$n@K3&dg?I0^ zE^PU<97bljFgdV?y!mLY`Q-t{-^D@7%G7~Uqq^Fplv5%e=+J-(4=yO&(0BT26-fjz zA0t=x<(RyYrl^~3!LxbT)*rpJ54*ndgW4-z`OiH7nyRMEjri~YdHR{T#@hV}_36}U zYW|*7tEI^R3<-Xu$Viz~@sCh))cC%9m;xv&<9?RnQSVdN?kCrVu45mBLUG5O#V+iost!-Gi^xiCK;gGzUO5ZOU$|; zBVZid1Kb?PNZkRDk-FwT8~pcqJJIp0NyFTLuGP4<=SRl#TZs-}1V@HuY0{+P>J)Av z9?7W$lt?}kN)uGTRnZ}V(kna2S`7xg9D`^3>U47qCo>;l#;MDeUp@9v$p~N4XVT`8 zm+7M~5)vjTQ8Q8Zh=Vi&fV$Vx&}@;2=1hv-RPnF+1fNNMHl78Dn^JBI2>|M5TVXk` zZjS$af7=$a^6f=0!!GVWjgsx{`(9g4)^`Qws77Qr4t_QK1Cj6~Q#p{%3hPzxeFs7{>W&kX*XvhJh#AcVf%W%7(cKovrLk zhc_E9JWT*d;LH-iB$Y6E*w&_-f8hfL<1zCu%|K`Puw z4-086bT#eLH$Rj4si8DSD{301DQcQcSQ&p`(`4N$md!bzboHdss$+juF@^tY#=?;gqfj8&oq&4 zHZj!FjiHu3%Qv8F^@K1DuxIelucQ~K=2j_KwY8(V0vTiyvOY7=H3IaFf;iNq-z`_2 zzCsOH8UOu{cOM?~rWZ+Uw-I5d;PqT_CQKv|v zw2`P(>Z3|Qx{}SxP*@ElvC}G{q+D=-(&x<*ec^Kdx9DOJ475C&e0jYKEJ30M=r+2r!_Fu6HS)Am|~Lg3l{*50HT~^i@^q7 z=qnMvM|7CQM{OjJpS*EUN^x9MU7Dma(==41P^SwZSAWXq7s2E+=*nY>B2uz06ZyGf z0Ocx;2RH1)A+froIF8(A=8^;O!odYHOiuwTpNssXE5l6{W@PRZG#v%JY~w)yd`1Y9 zXU2<$Lmj{fqL;WB8K5Z2Ql(N3<^AIKTpc}_K=N6#q`RPe>H zaT5T%C4D7gVfg^%i}Z6uC(+#?AIA%a%E*6H`^V)+1l5zq9I0Tvm}+HrPz`0uK*cuL z(hUqq-4?nR31wCSkZKAdQ68wKL{##ZP&#Mh0}h;`VB;X;5M{8_y@fED&0(bV%9MkM z9-tBQYpWwRXw0;^)H@R&@)EfeUUc+^3p){*WVKEN_Kd+Sovbs-G=)#}Ko$R}j&PG( zL25stcuxczn!au|m5QsA@Q>Ha_b@-rN z!k45wOJ*<02GVfGJ3zvde?s)e~l|-=D>JE3UAp9Ia?xre>0)!T46MKdQ|AiIhLOdR&jfdw%}r<2 zgVkV^VeXE0{14ZTvhZVgDHB(HCXcC_#nK!dP&vxmRX1FCOj?&JRTX3~>D9@4a7LLD$(sh+0g!Cu zGlAXg_qEqKSr0Wc%NtD0!9t+wNL?07gv=1A&cutWyR@kno4QhMkaFM=!ADl6Y1e}Q zyF-`^{5`94>2=P!Zg>S2jshzWXhA6?$f^`gPc=V{X8@(=PL?wDxXDikNZ~K#S;Mlw zY#L|>1Ak9~Nnf&h7v7%_=53b?Q(V3aTdD`CC9;W4oD>Z~#b#aTU`}UqF`UmH?B%Ut zWHA`%OCijySh-{4#~->w{WYdDyL?lRM|m}Vmp1X@^UZn1raqlp{&X-aIGDrkWIe^i zn+Dq4j$pdAOl>cHcgga?g1x9|E-$L<@=)=JOq@#fO_FGn7fY?g@#2$F&vfxZ1Ra0= zx(hcO4?ftNXaRBH)w&(4mXH6%ZsZ5uNx_s`N)wxSav%XuOgmwTZjee=N0>6mQGWpd zohkv~!V}kk1Ft3qAv}du57h5k>E;LB(BV!wrGOjsKB_&CQIBLk@m%+R@jDOh83PFb z`9U{WRe=Sjt}>Z*;wtwkta?COf-`ard#zuuTwZAI4#(G2V-tp|4y7qQ=pR+;W|*of zovepKu%d#zwH#j!%ei2$(xss)iQd!r%GbiXPz`k!%K&tNBw8|pomG&sDhq?b0xGd6 zKEL;y@Idb=3Uez~?x;WX#a{QL#&DAR=W)wR%TJ8=`+GUJtQorqO#^Mc@kLWK38nFP z^NY8I3x$mLf4+ctr*#a-4LE5b!V&Uc{lLMQ@gE*3Ldj;}`3K-;cj3rrPl zgm+-oiuphPuA4uU3J-q11|;2zGVyCQ?RqThywB~xsujhKQ?jCwvK!ZbVcU1ZWf#N; zo{s@XzP|C3PNGljvd-@#?KG_~b*z#wH)F*M%?Gc3tMxuq1VC{O#Xy>N zJyyQ`&$*P{*jCPQ%W8agVaumidVjk=v#)L4$vJNkM(l946|vBgSd!sf-n;_C*m2u` z9J4VV?8lDVT97N=euQVnT5sQimG4yzrVn&;&o%i6dol;w*PUwpEpeF-lm|dPo58H5 zpe8wI%{tp>BiHX>?0E1v=I@;mrUltJy!5t8mNKiTEYyX~J!|q0_Ox{0c=JGWr&Tad zgEJ21iAnDKoKvZY*13}|#*X=^kAOIK+<}+l2_Jdo8&BpkW39JWx+dJDWV8vLt#)c; zU-#M{)UstqQPXUqZjOa?vx)Rf12xV5-0aD8e^e8qsD6n>Nk!ozKj zTH&N^QULwmEB~!_wEcIe2`0MN&9-1=j1a1oF_3OH&REnJ5S=UwnuI=3@m!bsh}O-r zuKOkpa!N1-P!8@gO6%OLu<< z^LxKJOn|ntvVNw#ZN!HiLoIv$W?%c0$j>_*LbV$Fl?2S#d~GX3{V5XEWpFX_G;O#^LDbzs%TsdA|5n!^Qa=%0HSD-b8N5e_TK3F2v}~K0N*scvDH@o%KMzr;)K{hclsub25r+;5GCwd|hqJN^=qY z|5Gi{=({ZIL2|3OzF|4hJ)DfNf0HMaP~g4ZzA(v5*HOy5^c z_(j}y%sp}wOs9U@zlPzA!jyd~1OE;Iz6D_Rz}y{VwDBNDXY^vU@gVZ`rz$>X&Dcd~ z7+!>ik;P~jUWAqtt2uy^9QZK>`HwUCl{ROsA+3HF5WWoX8Ll-(MjH>7eT;_TMKGOu n4v-N7>^>L16X*|HmA3x}i8lo{KE}^~00000NkvXXu0mjf1axY7 literal 0 HcmV?d00001 diff --git a/Python_Stuff/sdl_sprites/red.bmp b/Python_Stuff/sdl_sprites/red.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7d4382f98d5162902c3a47fff0b6065ea248064e GIT binary patch literal 27694 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 literal 0 HcmV?d00001 diff --git a/Python_Stuff/sdl_sprites/red.png b/Python_Stuff/sdl_sprites/red.png new file mode 100644 index 0000000000000000000000000000000000000000..04036af42608215cf78375cc464a5e2aba2301ad GIT binary patch literal 4657 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 Z`0&{1zuRN&M((~w|LvYaE)Tb3{|7`Zo_qiR literal 0 HcmV?d00001 diff --git a/Python_Stuff/sdl_sprites/yellow.png b/Python_Stuff/sdl_sprites/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..a438d37be7f15a577ba039a2d8f526c5d8622156 GIT binary patch literal 4121 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