void RaytracerApplication::toggle_raytracing( int width, int height ) { assert( width > 0 && height > 0 ); // do setup if starting a new raytrace if ( !raytracing ) { // only re-allocate if the dimensions changed if ( buf_width != width || buf_height != height ) { free( buffer ); buffer = (unsigned char*) malloc( BUFFER_SIZE( width, height ) ); if ( !buffer ) { std::cout << "Unable to allocate buffer.\n"; return; // leave untoggled since we have no buffer. } buf_width = width; buf_height = height; } // initialize the raytracer (first make sure camera aspect is correct) scene.camera.aspect = real_t( width ) / real_t( height ); if (!raytracer.initialize(&scene, options.num_samples, width, height)) { std::cout << "Raytracer initialization failed.\n"; return; // leave untoggled since initialization failed. } // reset flag that says we are done raytrace_finished = false; } raytracing = !raytracing; }
void RaytracerApplication::toggle_raytracing( int width, int height ) { assert( width > 0 && height > 0 ); if ( !raytracing ) { if ( buf_width != width || buf_height != height ) { free( buffer ); buffer = (unsigned char*) malloc( BUFFER_SIZE( width, height ) ); if ( !buffer ) { std::cout << "Unable to allocate buffer.\n"; return; } buf_width = width; buf_height = height; } scene.camera.aspect = real_t( width ) / real_t( height ); if ( !raytracer.initialize( &scene, width, height ) ) { std::cout << "Raytracer initialization failed.\n"; return; } raytrace_finished = false; } raytracing = !raytracing; }
void RaytracerApplication::handle_event( const SDL_Event& event ) { int width, height; if ( !raytracing ) { camera_control.handle_event( this, event ); } switch ( event.type ) { case SDL_KEYDOWN: switch ( event.key.keysym.sym ) { case KEY_RAYTRACE: get_dimension( &width, &height ); toggle_raytracing( width, height ); break; case KEY_SEND_PHOTONS: raytracer.initialize(&scene, options.num_samples, 0, 0); queue_render_photon=true; case KEY_SCREENSHOT: output_image(); break; default: break; } default: break; } }