Rewrote the entire thing using my new OpenCL template. Makes small one offs like these reallly simple
This commit is contained in:
133
src/main.cpp
Normal file
133
src/main.cpp
Normal file
@@ -0,0 +1,133 @@
|
||||
|
||||
#include <iostream>
|
||||
#include <SFML/Graphics.hpp>
|
||||
#include <random>
|
||||
#include <chrono>
|
||||
#include "util.hpp"
|
||||
#include <thread>
|
||||
#include "OpenCL.h"
|
||||
|
||||
float elap_time() {
|
||||
static std::chrono::time_point<std::chrono::system_clock> start;
|
||||
static bool started = false;
|
||||
|
||||
if (!started) {
|
||||
start = std::chrono::system_clock::now();
|
||||
started = true;
|
||||
}
|
||||
|
||||
std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now();
|
||||
std::chrono::duration<double> elapsed_time = now - start;
|
||||
return static_cast<float>(elapsed_time.count());
|
||||
}
|
||||
|
||||
const int WINDOW_X = 1080;
|
||||
const int WINDOW_Y = 1080;
|
||||
|
||||
void generate_nodes(sf::Uint8* nodes) {
|
||||
|
||||
for (int i = 0; i < WINDOW_X * WINDOW_Y; i += 1) {
|
||||
if (rand() % 10 > 8)
|
||||
nodes[i] = 1;
|
||||
else
|
||||
nodes[i] = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int main() {
|
||||
|
||||
sf::RenderWindow window(sf::VideoMode(WINDOW_X, WINDOW_Y), "conways-game-of-life-opencl");
|
||||
window.setFramerateLimit(60);
|
||||
|
||||
float physic_step = 0.166f;
|
||||
float physic_time = 0.0f;
|
||||
double frame_time = 0.0, elapsed_time = 0.0, delta_time = 0.0, accumulator_time = 0.0, current_time = 0.0;
|
||||
|
||||
OpenCL cl;
|
||||
|
||||
|
||||
if (!cl.init())
|
||||
return -1;
|
||||
|
||||
while (!cl.compile_kernel("../kernels/conways.cl", "conways")) {
|
||||
std::cin.get();
|
||||
}
|
||||
|
||||
sf::Vector2i image_resolution(WINDOW_X, WINDOW_Y);
|
||||
cl.create_image_buffer("viewport_image", image_resolution, sf::Vector2f(0, 0), CL_MEM_WRITE_ONLY);
|
||||
cl.create_buffer("image_res", sizeof(sf::Vector2i), &image_resolution);
|
||||
|
||||
sf::Uint8* nodes = new sf::Uint8[WINDOW_X * WINDOW_Y];
|
||||
generate_nodes(nodes);
|
||||
nodes[0] = 1;
|
||||
cl.create_buffer("first_node_buffer", WINDOW_X * WINDOW_Y, (void*)nodes, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR);
|
||||
cl.create_buffer("second_node_buffer", WINDOW_X * WINDOW_Y, (void*)nodes, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR);
|
||||
|
||||
char buffer_flip = 0;
|
||||
cl.create_buffer("buffer_flip", sizeof(char), (void*)&buffer_flip, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR);
|
||||
|
||||
cl.set_kernel_arg("conways", 0, "image_res");
|
||||
cl.set_kernel_arg("conways", 1, "viewport_image");
|
||||
cl.set_kernel_arg("conways", 2, "first_node_buffer");
|
||||
cl.set_kernel_arg("conways", 3, "second_node_buffer");
|
||||
cl.set_kernel_arg("conways", 4, "buffer_flip");
|
||||
|
||||
while (window.isOpen())
|
||||
{
|
||||
sf::Event event; // Handle input
|
||||
while (window.pollEvent(event)) {
|
||||
if (event.type == sf::Event::Closed) {
|
||||
window.close();
|
||||
}
|
||||
if (event.type == sf::Event::KeyPressed) {
|
||||
if (event.key.code == sf::Keyboard::Down) {
|
||||
|
||||
}
|
||||
if (event.key.code == sf::Keyboard::Up) {
|
||||
|
||||
}
|
||||
if (event.key.code == sf::Keyboard::Right) {
|
||||
|
||||
}
|
||||
if (event.key.code == sf::Keyboard::Left) {
|
||||
|
||||
}
|
||||
if (event.key.code == sf::Keyboard::Equal) {
|
||||
|
||||
}
|
||||
if (event.key.code == sf::Keyboard::Dash) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
elapsed_time = elap_time(); // Handle time
|
||||
delta_time = elapsed_time - current_time;
|
||||
current_time = elapsed_time;
|
||||
if (delta_time > 0.02f)
|
||||
delta_time = 0.02f;
|
||||
accumulator_time += delta_time;
|
||||
|
||||
while (accumulator_time >= physic_step) { // While the frame has sim time, update
|
||||
accumulator_time -= physic_step;
|
||||
physic_time += physic_step;
|
||||
}
|
||||
|
||||
window.clear(sf::Color::White);
|
||||
|
||||
cl.run_kernel("conways", image_resolution);
|
||||
//cl.run_kernel("conways", sf::Vector2i(5, 5));
|
||||
cl.draw(&window);
|
||||
|
||||
if (buffer_flip == 1)
|
||||
buffer_flip = 0;
|
||||
else
|
||||
buffer_flip = 1;
|
||||
|
||||
window.display();
|
||||
|
||||
}
|
||||
return 0;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user