From 4ec94c97879aafef15f7663135745e4ba61e62cf Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Mon, 17 May 2021 00:15:33 +0200 Subject: Extract first public LiterateLB version --- tangle/sampler/q_criterion.h | 90 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 tangle/sampler/q_criterion.h (limited to 'tangle/sampler/q_criterion.h') diff --git a/tangle/sampler/q_criterion.h b/tangle/sampler/q_criterion.h new file mode 100644 index 0000000..31eeb61 --- /dev/null +++ b/tangle/sampler/q_criterion.h @@ -0,0 +1,90 @@ +#pragma once + +#include "sampler.h" + +#include +#include +#include + +#include +#include +#include + +#include + +template +class QCriterionS : public Sampler { +private: +Lattice& _lattice; +DeviceBuffer& _mask; +SDF _geometry; + +DeviceTexture _curl_buffer; +cudaTextureObject_t _curl_texture; +cudaSurfaceObject_t _curl_surface; + +DeviceBuffer _moments_rho; +DeviceBuffer _moments_u; +DeviceBuffer _curl_norm; +DeviceBuffer _q; + +float _scale = 1; +float _lower = 0.01; +float _upper = 1; + +public: +QCriterionS(Lattice& lattice, DeviceBuffer& mask, SDF geometry): + Sampler("Q criterion", lattice.cuboid()), + _lattice(lattice), + _mask(mask), + _geometry(geometry), + _curl_buffer(lattice.cuboid()), + _curl_texture(_curl_buffer.getTexture()), + _curl_surface(_curl_buffer.getSurface()), + _moments_rho(lattice.cuboid().volume), + _moments_u(DESCRIPTOR::d * lattice.cuboid().volume), + _curl_norm(lattice.cuboid().volume), + _q(lattice.cuboid().volume) +{ } + +void sample() { + _lattice.template inspect(_mask, _moments_rho.device(), _moments_u.device()); + _lattice.template inspect(_mask, _moments_u.device(), _curl_surface, _curl_norm.device()); + _lattice.template inspect(_mask, _moments_rho.device(), _moments_u.device(), _curl_norm.device(), _sample_surface, _q.device()); +} + +void render(VolumetricRenderConfig& config) { + raymarch<<< + dim3(config.canvas_size.x / 32 + 1, config.canvas_size.y / 32 + 1), + dim3(32, 32) + >>>(config, + _geometry, + [samples=_sample_texture, scale=_scale, lower=_lower, upper=_upper] + __device__ (float3 p) -> float { + float sample = scale * tex3D(samples, p.x, p.y, p.z); + return (sample >= lower) * (sample <= upper) * sample; + }, + [] __device__ (float x) -> float { + return (x > 0) * 1; + }); +} + +void scale() { + auto max = thrust::max_element(thrust::device_pointer_cast(_q.device()), + thrust::device_pointer_cast(_q.device() + _lattice.cuboid().volume)); + _scale = 1 / max[0]; +} + +void interact() { + ImGui::SliderFloat("Scale", &_scale, 0.01f, 10000.f); + ImGui::SameLine(); + if (ImGui::Button("Auto")) { + scale(); + } + ImGui::DragFloatRange2("Bounds", &_lower, &_upper, 0.01f, 0.01f, 1.f, "%.2f", "%.2f"); +} + +}; + +template +QCriterionS(Lattice&, DeviceBuffer&, SDF) -> QCriterionS; -- cgit v1.2.3