void vis_render() { const PlaneData *ro_visData; double aspect_ratio = 0; simulation->vis_get_vis_data_array(&ro_visData, &aspect_ratio); PlaneData &visData = (PlaneData&)*ro_visData; if (glTexture == nullptr) { glTexture = new GlTexture(GL_TEXTURE_2D, GL_RED, GL_RED, GL_UNSIGNED_BYTE); glTexture->bind(); glTexture->resize(visData.planeDataConfig->physical_data_size[0], visData.planeDataConfig->physical_data_size[1]); glTexture->unbind(); texture_data = new unsigned char[visData.planeDataConfig->physical_array_data_number_of_elements]; } visData.request_data_physical(); vis_min = visData.reduce_min(); vis_max = visData.reduce_max(); vis_max = std::max(vis_max, vis_min+1e-20); //< avoid numerical issues if min == max double real_delta = vis_max-vis_min; // vis_min -= real_delta*0.03; // vis_max += real_delta*0.03; double inv_delta = 1.0/real_delta; #pragma omp parallel for OPENMP_PAR_SIMD for (std::size_t i = 0; i < visData.planeDataConfig->physical_array_data_number_of_elements; i++) { double value = (visData.physical_space_data[i]-vis_min)*inv_delta; value *= 255.0; texture_data[i] = (unsigned char)std::min(255.0, std::max(0.0, value)); } glTexture->bind(); glTexture->setData(texture_data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); double scale_x = 1.0; double scale_y = aspect_ratio; if (aspect_ratio > 1.0) { scale_x /= aspect_ratio; scale_y = 1.0; } visualizationEngine->engineState->commonShaderPrograms.shaderTexturizeRainbowmap.use(); visualizationEngine->engineState->commonShaderPrograms.shaderTexturizeRainbowmap.pvm_matrix_uniform.set( visualizationEngine->engineState->matrices.pvm*GLSL::scale((float)scale_x, (float)scale_y, (float)1.0) ); glDrawQuad->render(); visualizationEngine->engineState->commonShaderPrograms.shaderTexturizeRainbowmap.disable(); glTexture->unbind(); if (hud_visible) { glFreeType->viewportChanged(visualizationEngine->renderWindow->window_width, visualizationEngine->renderWindow->window_height); std::string status_string = simulation->vis_get_status_string(); std::replace(status_string.begin(), status_string.end(), ',', '\n'); glFreeType->setPosition(10, visualizationEngine->renderWindow->window_height-16); glFreeType->renderString(status_string.c_str()); visSweetHUD->render(); } // execute simulation time step simulation->vis_post_frame_processing(sim_runs_per_frame); }