ColorWheel::ColorWheel(unsigned n) : rgbs_(n) { for(unsigned i=0; i<n; ++i) heatmap(((float)i)/n, 0, 1, &rgbs_[i].r, &rgbs_[i].g, &rgbs_[i].b); std::random_shuffle(rgbs_.begin(), rgbs_.end()); }
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= // Class WaterfallPlot // // @class WaterfallPlot // @author David Witten // @date $(Date) // @file $(CurrentFileName).$(CurrentFileExt) // @brief // //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= PlotWaterfall::PlotWaterfall(wxFrame* parent, bool graticule, int colour): PlotPanel(parent) { for(int i = 0; i < 255; i++) { m_heatmap_lut[i] = heatmap((float)i, 0.0, 255.0); } m_graticule = graticule; m_colour = colour; m_Bufsz = GetMaxClientSize(); m_newdata = false; m_firstPass = true; m_line_color = 0; SetLabelSize(10.0); m_pBmp = NULL; m_max_mag = MAX_MAG_DB; m_min_mag = MIN_MAG_DB; }
int HostRender::run(RaytracingContext& context, PixelFunc const& render_pixel, int kill_timeout_seconds, std::function<void()> const& render_overlay) { auto render_pixel_wrapper = [&](int x, int y, RaytracingContext const &ctx, ThreadLocalData *tld) -> glm::vec3 { RenderData data(context, tld); switch(context.params.render_mode) { case RaytracingParameters::RECURSIVE: if (context.params.stereo) { data.camera_mode = Camera::StereoLeft; auto const left = render_pixel(x, y, ctx, data); data.camera_mode = Camera::StereoRight; auto const right = render_pixel(x, y, ctx, data); return combine_stereo(left, right); } else { return render_pixel(x, y, ctx, data); } case RaytracingParameters::DESATURATE: if (context.params.stereo) { data.camera_mode = Camera::StereoLeft; auto const left = render_pixel(x, y, ctx, data); data.camera_mode = Camera::StereoRight; auto const right = render_pixel(x, y, ctx, data); return combine_stereo(desaturate(left), desaturate(right)); } else { return desaturate(render_pixel(x, y, ctx, data)); } case RaytracingParameters::NUM_RAYS: render_pixel(x, y, ctx, data); return heatmap(float(data.num_cast_rays - 1) / 64.0f); case RaytracingParameters::NORMAL: render_pixel(x, y, ctx, data); return glm::normalize(data.isect.normal) * 0.5f + glm::vec3(0.5f); case RaytracingParameters::TIME: { Timer timer; timer.start(); if(context.params.render_mode == RaytracingParameters::TIME) { auto const color = render_pixel(x, y, ctx, data); (void) color; } timer.stop(); return heatmap(static_cast<float>(timer.getElapsedTimeInMilliSec()) * context.params.scale_render_time); } default: /* should never happen */ return glm::vec3(1, 0, 1); } }; if (context.params.interactive) { return run_interactive(context, render_pixel_wrapper, render_overlay); } else { return run_noninteractive(context, render_pixel_wrapper, kill_timeout_seconds); } }
int HostRender::run(RaytracingContext& context, PixelFunc const& render_pixel, int kill_timeout_seconds, std::function<void()> const& render_overlay) { auto render_pixel_wrapper = [&](int x, int y, RaytracingContext const &ctx, ThreadLocalData *tld) -> glm::vec3 { RenderData data(context, tld); switch(context.params.render_mode) { case RaytracingParameters::RECURSIVE: if (context.params.stereo) { data.camera_mode = Camera::StereoLeft; auto const left = render_pixel(x, y, ctx, data); data.camera_mode = Camera::StereoRight; auto const right = render_pixel(x, y, ctx, data); return combine_stereo(left, right); } else { return render_pixel(x, y, ctx, data); } case RaytracingParameters::DESATURATE: if (context.params.stereo) { data.camera_mode = Camera::StereoLeft; auto const left = render_pixel(x, y, ctx, data); data.camera_mode = Camera::StereoRight; auto const right = render_pixel(x, y, ctx, data); return combine_stereo(desaturate(left), desaturate(right)); } else { return desaturate(render_pixel(x, y, ctx, data)); } case RaytracingParameters::NUM_RAYS: render_pixel(x, y, ctx, data); return heatmap(float(data.num_cast_rays - 1) / 64.0f); case RaytracingParameters::NORMAL: render_pixel(x, y, ctx, data); if (context.params.normal_mapping) return glm::normalize(data.isect.shading_normal) * 0.5f + glm::vec3(0.5f); else return glm::normalize(data.isect.normal) * 0.5f + glm::vec3(0.5f); case RaytracingParameters::BVH_TIME: case RaytracingParameters::TIME: { Timer timer; timer.start(); if(context.params.render_mode == RaytracingParameters::TIME) { auto const color = render_pixel(x, y, ctx, data); (void) color; } else { Ray ray = createPrimaryRay(data, float(x) + 0.5f, float(y) + 0.5f); for(auto& o: context.scene->objects) { BVH *bvh = dynamic_cast<BVH *>(o.get()); if(bvh) { bvh->intersect(ray, nullptr); } } } timer.stop(); return heatmap(static_cast<float>(timer.getElapsedTimeInMilliSec()) * context.params.scale_render_time); } case RaytracingParameters::DUDV: { auto const color = render_pixel(x, y, ctx, data); (void) color; if(!data.isect.isValid()) return glm::vec3(0.0); return heatmap(std::log(1.0f + 5.0f * glm::length(data.isect.dudv))); } case RaytracingParameters::AABB_INTERSECT_COUNT: { Ray ray = createPrimaryRay(data, float(x) + 0.5f, float(y) + 0.5f); glm::vec3 accum(0.0f); for(auto& o: context.scene->objects) { auto *bvh = dynamic_cast<BVH *>(o.get()); if(bvh) { accum += bvh->intersect_count(ray, 0, 0) * 0.02f; } } return accum; } default: /* should never happen */ return glm::vec3(1, 0, 1); } }; if (context.params.interactive) { return run_interactive(context, render_pixel_wrapper, render_overlay); } else { return run_noninteractive(context, render_pixel_wrapper, kill_timeout_seconds); } }