diff --git a/demos/optical_bench/src/lens.cpp b/demos/optical_bench/src/lens.cpp index 589485e7d69e12fdd052d6aa77c2720796c721ee..c2a909078cdd72844369eefed95eb643279e5101 100644 --- a/demos/optical_bench/src/lens.cpp +++ b/demos/optical_bench/src/lens.cpp @@ -48,12 +48,11 @@ Lens::Lens(phx::Engine* engine, phx::Scene* scene, OptixContextManager* manager, geometry_group_ = manager->getContext()->createGeometryGroup(); geometry_group_->addChild(geometry); - acceleration_structure_ = manager->getContext()->createAcceleration("Trbvh"); + acceleration_structure_ = manager->GetLensAcceleration(); geometry_group_->setAcceleration(acceleration_structure_); transform->setChild<optix::GeometryGroup>(geometry_group_); manager->getTopObject()->addChild(transform); - manager->getTopObject()->getAcceleration()->markDirty(); // Attach handles entity_ = scene->CreateEntity(); @@ -84,6 +83,7 @@ Lens::Lens(phx::Engine* engine, phx::Scene* scene, OptixContextManager* manager, transform->setMatrix(true, &(trans[0][0]), &(inverse(trans)[0][0])); support_rod_->Moved(); + manager_->ChangedLens(); }); selector_->SetExternalUpdate([this]() { glm::mat4 trans = @@ -91,6 +91,7 @@ Lens::Lens(phx::Engine* engine, phx::Scene* scene, OptixContextManager* manager, transform->setMatrix(true, &(trans[0][0]), &(inverse(trans)[0][0])); support_rod_->Moved(); + manager_->ChangedLens(); }); // Store if grabbed @@ -98,13 +99,13 @@ Lens::Lens(phx::Engine* engine, phx::Scene* scene, OptixContextManager* manager, selector_->SetRelease([this]() { grabbed_ = false; }); recalcBB(); + manager_->ChangedLens(); } Lens::~Lens() { manager_->getTopObject()->removeChild(transform); glass_material->destroy(); geometry->destroy(); - acceleration_structure_->destroy(); geometry_group_->destroy(); transform->destroy(); delete support_rod_; @@ -322,11 +323,6 @@ void Lens::recalcBB() { selector_->ExternalUpdate(); } -void Lens::markDirty() { - acceleration_structure_->markDirty(); - manager_->getTopObject()->getAcceleration()->markDirty(); -} - std::string Lens::getTypeString(LensSideType t) { switch (t) { case CONCAVE: @@ -340,16 +336,10 @@ std::string Lens::getTypeString(LensSideType t) { } void Lens::CreateGlassMaterialInstance() { - optix::Program closeHitP = manager_->getContext()->createProgramFromPTXString( - OptixContextManager::getPtxString("glass_perspective_camera.cu"), - "closest_hit_radiance"); - optix::Program closeHitI = manager_->getContext()->createProgramFromPTXString( - OptixContextManager::getPtxString("glass_iterative_camera.cu"), - "closest_hit_radiance"); - glass_material = manager_->getContext()->createMaterial(); - glass_material->setClosestHitProgram(0, closeHitP); - glass_material->setClosestHitProgram(1, closeHitI); + glass_material->setClosestHitProgram(0, + manager_->GetGlassProgramPerspective()); + glass_material->setClosestHitProgram(1, manager_->GetGlassProgramIterative()); glass_material["importance_cutoff"]->setFloat(1e-2f); glass_material["cutoff_color"]->setFloat(0.034f, 0.055f, 0.085f); diff --git a/demos/optical_bench/src/lens.hpp b/demos/optical_bench/src/lens.hpp index 46bb523d0cfd207445b94d699a11b9e97982ef77..3279d2073e88bf2de43949e0af37985f3f3a3784 100644 --- a/demos/optical_bench/src/lens.hpp +++ b/demos/optical_bench/src/lens.hpp @@ -39,7 +39,7 @@ class Lens { void SetThickness(float f) { geometry["halfCylinderLength"]->setFloat(getCylinderLength(f) / 2); - markDirty(); + manager_->ChangedLens(); recalcBB(); }; float GetThickness() { @@ -48,20 +48,20 @@ class Lens { void SetRadius(float f) { geometry["radius"]->setFloat(f); - markDirty(); + manager_->ChangedLens(); recalcBB(); } float GetRadius() { return geometry["radius"]->getFloat(); }; void SetRadius2(float f) { geometry["radius2"]->setFloat(f); - markDirty(); + manager_->ChangedLens(); recalcBB(); } float GetRadius2() { return geometry["radius2"]->getFloat(); }; void SetLensRadius(float f) { geometry["lensRadius"]->setFloat(f); - markDirty(); + manager_->ChangedLens(); recalcBB(); } float GetLensRadius() { return geometry["lensRadius"]->getFloat(); }; @@ -113,7 +113,6 @@ class Lens { GlassType glass_type_ = GlassType::BK7; float current_wavelength_nm_ = 0.0f; void recalcBB(); - void markDirty(); SupportRod* support_rod_; OptixContextManager* manager_; phx::Selector* selector_; diff --git a/demos/optical_bench/src/optical_bench.cpp b/demos/optical_bench/src/optical_bench.cpp index c90805387bda2b0f780942fd9d810006065bad8f..0cb7126ed513e03f50c0ebd8dc7f64da23204717 100644 --- a/demos/optical_bench/src/optical_bench.cpp +++ b/demos/optical_bench/src/optical_bench.cpp @@ -123,12 +123,16 @@ int main(int argc, char** args) { .at(0); input_system->AddKeyPressCallback( - [&engine, &viewer_system, &rayPass](char key) { + [&engine, &viewer_system, &rayPass, &contextManager](char key) { if (key == 'q') engine->Stop(); if (key == 'f') viewer_system->SetShowFramerate(!viewer_system->GetShowFramerate()); if (key == 'p') rayPass->NextLaserPattern(); if (key == 'o') rayPass->PreviousLaserPattern(); + + static bool usage = true; + if (key == 'l') contextManager->EnableUsageCallback(usage); + usage = !usage; }); std::vector<glm::vec3> light_dir{glm::vec3(0, -1, 0), glm::vec3(0, 1, 0), diff --git a/demos/optical_bench/src/optix_context_manager.cpp b/demos/optical_bench/src/optix_context_manager.cpp index ab03ef90d3d9410c3f904906eda7926893874cdd..7bb40fa56886780199d8bc1b393bead9fbaed96b 100644 --- a/demos/optical_bench/src/optix_context_manager.cpp +++ b/demos/optical_bench/src/optix_context_manager.cpp @@ -22,11 +22,11 @@ #include "phx/resources/types/shader_source.hpp" #include "phx/scripting/behavior_system.hpp" -/*static void callbackUsageReport(int level, const char* tag, const char* msg, +static void callbackUsageReport(int level, const char* tag, const char* msg, void*) { std::cout << "[" << level << "][" << std::left << std::setw(12) << tag << "] " << msg << std::endl; -}*/ +} OptixContextManager::OptixContextManager() { phx::ResourceManager::instance().RegisterResourceType( @@ -58,8 +58,16 @@ OptixContextManager::OptixContextManager() { context_->setRayGenerationProgram(0, rayProg); top_object = context_->createGroup(); - top_object->setAcceleration(context_->createAcceleration( - "NoAccel")); //("Bvh" , "Bvh") or "Trbvh" or "NoAccel" + mainAccel = context_->createAcceleration( + "Trbvh"); //("Bvh" , "Bvh") or "Trbvh" or "NoAccel" + mainAccel->setProperty("refit", "1"); + lensAccel = context_->createAcceleration("Trbvh"); + lensAccel->setProperty("refit", "1"); + targetAccel = context_->createAcceleration("Trbvh"); + targetAccel->setProperty("refit", "1"); + + top_object->setAcceleration(mainAccel); + context_["top_object"]->set(top_object); createTargetGeometry(); @@ -68,7 +76,12 @@ OptixContextManager::OptixContextManager() { createTargetMaterial(); createSkybox(); - // context_->setUsageReportCallback(callbackUsageReport, 3, NULL); + glassProgPers = context_->createProgramFromPTXString( + OptixContextManager::getPtxString("glass_perspective_camera.cu"), + "closest_hit_radiance"); + glassProgIter = context_->createProgramFromPTXString( + OptixContextManager::getPtxString("glass_iterative_camera.cu"), + "closest_hit_radiance"); } OptixContextManager::~OptixContextManager() { @@ -79,6 +92,13 @@ OptixContextManager::~OptixContextManager() { lensGeomerty->destroy(); targetGeomerty->destroy(); + mainAccel->destroy(); + lensAccel->destroy(); + targetAccel->destroy(); + + glassProgPers->destroy(); + glassProgIter->destroy(); + context_->destroy(); context_ = 0; } @@ -114,6 +134,19 @@ void OptixContextManager::launch(unsigned int entryPoint, RTsize width, } catch (optix::Exception e) { phx::error(e.getErrorString().c_str()); } + + static bool after_first_launch = true; + if (after_first_launch) { + mainAccel->markDirty(); + lensAccel->markDirty(); + targetAccel->markDirty(); + after_first_launch = false; + } +} + +void OptixContextManager::EnableUsageCallback(bool enabled) { + context_->setUsageReportCallback(callbackUsageReport, (enabled) ? 3 : 0, + NULL); } void OptixContextManager::createDebugMaterial() { diff --git a/demos/optical_bench/src/optix_context_manager.hpp b/demos/optical_bench/src/optix_context_manager.hpp index 2af04859d08a9343d6e69a8103c6990ed85cf5d8..b25a5b7000dafba7a895033e3b6ff8c82ead64f1 100644 --- a/demos/optical_bench/src/optix_context_manager.hpp +++ b/demos/optical_bench/src/optix_context_manager.hpp @@ -30,6 +30,23 @@ class OptixContextManager { optix::Geometry& GetLensGeometry() { return lensGeomerty; } optix::Geometry& GetTargetGeometry() { return targetGeomerty; } + optix::Acceleration& GetLensAcceleration() { return lensAccel; } + optix::Acceleration& GetTargetAcceleration() { return targetAccel; } + + optix::Program GetGlassProgramPerspective() { return glassProgPers; } + optix::Program GetGlassProgramIterative() { return glassProgIter; } + + void ChangedLens() { + lensAccel->markDirty(); + mainAccel->markDirty(); + } + void ChangedTarget() { + targetAccel->markDirty(); + mainAccel->markDirty(); + } + + void EnableUsageCallback(bool enabled); + private: optix::Context context_; optix::Group top_object; @@ -37,6 +54,11 @@ class OptixContextManager { optix::Material targetMaterial; optix::Geometry lensGeomerty; optix::Geometry targetGeomerty; + optix::Acceleration mainAccel; + optix::Acceleration lensAccel; + optix::Acceleration targetAccel; + optix::Program glassProgIter; + optix::Program glassProgPers; void createDebugMaterial(); void createTargetMaterial(); diff --git a/demos/optical_bench/src/test_pattern_frame.cpp b/demos/optical_bench/src/test_pattern_frame.cpp index 66903f4e0aef186ae267c7dcde53a2363f26149d..d7e464e571d750b351fa298a568397eab9190159 100644 --- a/demos/optical_bench/src/test_pattern_frame.cpp +++ b/demos/optical_bench/src/test_pattern_frame.cpp @@ -25,7 +25,7 @@ TestPatternFrame::TestPatternFrame(phx::Scene* scene, manager_->GetTargetGeometry(), &material, &material + 1); geometry_group = manager_->getContext()->createGeometryGroup(); geometry_group->addChild(geometry); - acceleration = manager_->getContext()->createAcceleration("Trbvh"); + acceleration = manager_->GetTargetAcceleration(); geometry_group->setAcceleration(acceleration); auto image_loaded = phx::ResourceUtils::LoadResourceFromFile<phx::Image>( @@ -62,6 +62,7 @@ TestPatternFrame::TestPatternFrame(phx::Scene* scene, glm::mat4 trans = entity_->GetFirstComponent<phx::Transform>()->GetGlobalMatrix(); transform->setMatrix(true, &(trans[0][0]), &(inverse(trans)[0][0])); + manager_->ChangedTarget(); }); selector->SetExternalUpdate([this, selector]() { @@ -84,7 +85,6 @@ TestPatternFrame::TestPatternFrame(phx::Scene* scene, TestPatternFrame::~TestPatternFrame() { manager_->getTopObject()->removeChild(transform); geometry->destroy(); - acceleration->destroy(); geometry_group->destroy(); transform->destroy(); delete support_rod_;