small tweaks, addind mouse control and preview of chosen pattern

master
MitchellHansen 8 years ago
parent fb32b9a0be
commit 2e2fb9ffd2

@ -73,8 +73,30 @@ void clear_nodes(sf::Uint8 *nodes, sf::Vector2i dimensions) {
}
}
// Set up the copy pattern to load at a position, mouse click?
//
std::unique_ptr<sf::Texture> generate_pattern_texture(pattern_info pattern) {
sf::Vector2i dimensions = pattern.dimensions;
std::vector<sf::Uint8> pixels(dimensions.x * dimensions.y * 4, 0);
for (int i = 0; i < dimensions.x * dimensions.y; i += 4) {
if (pattern.nodes[i] != 0) {
pixels.at(i + 0) = 125;
pixels.at(i + 1) = 125;
pixels.at(i + 2) = 125;
pixels.at(i + 3) = 125;
}
}
std::unique_ptr<sf::Texture> texture(new sf::Texture);
texture->create(dimensions.x, dimensions.y);
texture->update(pixels.data());
return std::move(texture);
}
int main() {
@ -119,6 +141,10 @@ int main() {
Decoder d;
std::vector<const char*> pattern_list = d.getPatternList();
pattern_info pattern_info;
sf::Sprite pattern_sprite;
sf::Texture pattern_texture;
sf::Clock sf_delta_clock;
fps_counter render_fps;
@ -141,26 +167,33 @@ int main() {
if (event.type == sf::Event::Closed) {
window.close();
}
if (event.type == sf::Event::MouseButtonPressed) {
else if (event.type == sf::Event::MouseButtonPressed) {
if (event.mouseButton.button == sf::Mouse::Right) {
mouse_state = PRESSED;
mouse_position = sf::Mouse::getPosition();
}
else if (event.mouseButton.button == sf::Mouse::Middle) {
mouse_position = sf::Mouse::getPosition();
copy_pattern(nodes, sf::Vector2i(WINDOW_X, WINDOW_Y), static_cast<sf::Vector2u>(mouse_position), pattern_info);
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);
cl.set_kernel_arg("conways", 2, "first_node_buffer");
cl.set_kernel_arg("conways", 3, "second_node_buffer");
}
if (event.type == sf::Event::MouseButtonReleased) {
}
else if (event.type == sf::Event::MouseButtonReleased) {
if (event.mouseButton.button == sf::Mouse::Right) {
mouse_state = DEPRESSED;
}
if (event.type == sf::Event::MouseWheelScrolled) {
}
else if (event.type == sf::Event::MouseWheelScrolled) {
zoom_level -= event.mouseWheelScroll.delta / 10;
sf::View v = window.getView();
v.setSize(static_cast<sf::Vector2f>(window.getSize()) * zoom_level);
window.setView(v);
}
}
else if (event.type == sf::Event::MouseMoved) {
if (mouse_state == PRESSED) {
sf::Vector2i mouse_delta = mouse_position - sf::Mouse::getPosition();
@ -173,6 +206,16 @@ int main() {
}
pattern_sprite.setPosition(mouse_position.x, mouse_position.y);
}
}
elapsed_time = elap_time(); // Handle time
delta_time = elapsed_time - current_time;
current_time = elapsed_time;
@ -196,13 +239,7 @@ int main() {
if (ImGui::SliderInt("Simulation Speed", &simulation_speed, 30, 500)) {
window.setFramerateLimit(simulation_speed);
}
if (ImGui::Button("One shot")) {
std::cout << "sim" << std::endl;
/*std::cout << buffer_flip << std::endl;
cl.map_buffer("buffer_flip", sizeof(char), &buffer_flip);*/
}
cl.run_kernel("conways", image_resolution);
cl.draw(&window);
if (buffer_flip == 1)
@ -220,13 +257,27 @@ int main() {
}
if (ImGui::Button("Load Pattern")) {
clear_nodes(nodes, sf::Vector2i(WINDOW_X, WINDOW_Y));
pattern_info p = d.decodePattern(pattern_list.at(pattern_number));
copy_pattern(nodes, sf::Vector2i(WINDOW_X, WINDOW_Y), sf::Vector2u(100, 300), p);
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);
cl.set_kernel_arg("conways", 2, "first_node_buffer");
cl.set_kernel_arg("conways", 3, "second_node_buffer");
pattern_info = d.decodePattern(pattern_list.at(pattern_number));
sf::Vector2i dimensions = pattern_info.dimensions;
sf::Uint8* pixels = new sf::Uint8[dimensions.x * dimensions.y * 4]{ 0 };
for (int i = 0; i < dimensions.x * dimensions.y; i += 4) {
if (pattern_info.nodes[i] != 0) {
pixels[i + 0] = 0;
pixels[i + 1] = 0;
pixels[i + 2] = 255;
pixels[i + 3] = 255;
}
}
if (pattern_texture.create(dimensions.x, dimensions.y)) {
pattern_texture.update(pixels);
pattern_sprite.setTexture(pattern_texture, true);
}
}
if (ImGui::Button("Rerun")) {
@ -249,14 +300,10 @@ int main() {
ImGui::Render();
// ImGui screws stuff up after the render, rendering a drawable resets it
window.draw(sf::CircleShape(0));
window.draw(sf::CircleShape(100));
window.draw(pattern_sprite);
window.display();
}

Loading…
Cancel
Save