@ -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 ( ) ;
}