From 9a188cda980013fe72145c3c8e09b0e7cfddfd44 Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Wed, 16 May 2018 17:08:51 +0200 Subject: [PATCH] Enable spherical raycasting again --- .../examples/volume/generated/.gitignore | 3 ++ .../generated/cartesian.asset} | 4 +-- .../volume/generated/cartesiansequence.asset | 34 +++++++++++++++++++ .../examples/volume/generated/spherical.asset | 34 +++++++++++++++++++ .../examples/{ => volume}/toyvolume.asset | 0 .../{ => volume}/transferfunction.txt | 1 - .../generate_cartesian.task} | 4 +-- .../generate_cartesian_sequence.task} | 4 +-- data/tasks/volume/generate_spherical.task | 15 ++++++++ .../rendering/renderabletimevaryingvolume.cpp | 14 ++++++-- modules/volume/shaders/helper.glsl | 3 +- modules/volume/shaders/raycast.glsl | 4 ++- .../volume/tasks/generaterawvolumetask.cpp | 8 ++++- 13 files changed, 115 insertions(+), 13 deletions(-) create mode 100644 data/assets/examples/volume/generated/.gitignore rename data/assets/examples/{generatedvolume.asset => volume/generated/cartesian.asset} (86%) create mode 100644 data/assets/examples/volume/generated/cartesiansequence.asset create mode 100644 data/assets/examples/volume/generated/spherical.asset rename data/assets/examples/{ => volume}/toyvolume.asset (100%) rename data/assets/examples/{ => volume}/transferfunction.txt (75%) rename data/tasks/{generate_volume.task => volume/generate_cartesian.task} (66%) rename data/tasks/{generate_volume_sequence.task => volume/generate_cartesian_sequence.task} (76%) create mode 100644 data/tasks/volume/generate_spherical.task diff --git a/data/assets/examples/volume/generated/.gitignore b/data/assets/examples/volume/generated/.gitignore new file mode 100644 index 0000000000..5eabe86a70 --- /dev/null +++ b/data/assets/examples/volume/generated/.gitignore @@ -0,0 +1,3 @@ +cartesian/ +cartesiansequence/ +spherical/ \ No newline at end of file diff --git a/data/assets/examples/generatedvolume.asset b/data/assets/examples/volume/generated/cartesian.asset similarity index 86% rename from data/assets/examples/generatedvolume.asset rename to data/assets/examples/volume/generated/cartesian.asset index ccaeef3fe6..90a79ac6b2 100644 --- a/data/assets/examples/generatedvolume.asset +++ b/data/assets/examples/volume/generated/cartesian.asset @@ -10,8 +10,8 @@ local volume = { Parent = transforms.SolarSystemBarycenter.Identifier, Renderable = { Type = "RenderableTimeVaryingVolume", - SourceDirectory = asset.localResource("generatedvolume"), - TransferFunction = asset.localResource("transferfunction.txt"), + SourceDirectory = asset.localResource("cartesian"), + TransferFunction = asset.localResource("../transferfunction.txt"), StepSize = 0.01, MinValue = 0, MaxValue = 1, diff --git a/data/assets/examples/volume/generated/cartesiansequence.asset b/data/assets/examples/volume/generated/cartesiansequence.asset new file mode 100644 index 0000000000..e508d28e9d --- /dev/null +++ b/data/assets/examples/volume/generated/cartesiansequence.asset @@ -0,0 +1,34 @@ +-- This asset requires OpenSpace to be built with the OPENSPACE_MODULE_VOLUME enabled + +local assetHelper = asset.require('util/asset_helper') +local transforms = asset.require("scene/solarsystem/sun/transforms") + +local sunRadius = 695508000 + +local volume = { + Identifier = "GeneratedVolume", + Parent = transforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTimeVaryingVolume", + SourceDirectory = asset.localResource("cartesiansequence"), + TransferFunction = asset.localResource("../transferfunction.txt"), + StepSize = 0.01, + MinValue = 0, + MaxValue = 1, + GridType = "Cartesian", + SecondsBefore = 50*365*24*60*60, -- 50 years before + SecondsAfter = 50*365*24*60*60 -- 50 years after + }, + GUI = { + Path = "/Examples" + }, + Transform = { + Scale = { + Type = "StaticScale", + Scale = 1000 * sunRadius + } + } +} + +local objects = { volume } +assetHelper.registerSceneGraphNodes(asset, objects) \ No newline at end of file diff --git a/data/assets/examples/volume/generated/spherical.asset b/data/assets/examples/volume/generated/spherical.asset new file mode 100644 index 0000000000..0cdb91e48b --- /dev/null +++ b/data/assets/examples/volume/generated/spherical.asset @@ -0,0 +1,34 @@ +-- This asset requires OpenSpace to be built with the OPENSPACE_MODULE_VOLUME enabled + +local assetHelper = asset.require('util/asset_helper') +local transforms = asset.require("scene/solarsystem/sun/transforms") + +local astronomicalUnit = 149597870700 + +local volume = { + Identifier = "GeneratedVolume", + Parent = transforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTimeVaryingVolume", + SourceDirectory = asset.localResource("spherical"), + TransferFunction = asset.localResource("../transferfunction.txt"), + StepSize = 0.01, + MinValue = 0, + MaxValue = 1, + GridType = "Spherical", + SecondsBefore = 50*365*24*60*60, -- 50 years before + SecondsAfter = 50*365*24*60*60 -- 50 years after + }, + GUI = { + Path = "/Examples" + }, + Transform = { + Scale = { + Type = "StaticScale", + Scale = astronomicalUnit + } + } +} + +local objects = { volume } +assetHelper.registerSceneGraphNodes(asset, objects) \ No newline at end of file diff --git a/data/assets/examples/toyvolume.asset b/data/assets/examples/volume/toyvolume.asset similarity index 100% rename from data/assets/examples/toyvolume.asset rename to data/assets/examples/volume/toyvolume.asset diff --git a/data/assets/examples/transferfunction.txt b/data/assets/examples/volume/transferfunction.txt similarity index 75% rename from data/assets/examples/transferfunction.txt rename to data/assets/examples/volume/transferfunction.txt index 4a67232ceb..a93353df7a 100644 --- a/data/assets/examples/transferfunction.txt +++ b/data/assets/examples/volume/transferfunction.txt @@ -2,5 +2,4 @@ width 1024 lower 0.0 upper 1.0 mappingkey 0.0 250 250 250 0 -mappingkey 0.3 200 200 200 0 mappingkey 1.0 200 200 200 255 \ No newline at end of file diff --git a/data/tasks/generate_volume.task b/data/tasks/volume/generate_cartesian.task similarity index 66% rename from data/tasks/generate_volume.task rename to data/tasks/volume/generate_cartesian.task index 1dd93aac66..4b956ffb29 100644 --- a/data/tasks/generate_volume.task +++ b/data/tasks/volume/generate_cartesian.task @@ -13,6 +13,6 @@ return {{ UpperDomainBound = {0.5, 0.5, 0.5}, ValueFunction = fn, Time = "2018-05-04T00:00:00", - RawVolumeOutput = "${DATA}/assets/examples/generatedvolume/generatedvolume.rawvolume", - DictionaryOutput = "${DATA}/assets/examples/generatedvolume/generatedvolume.dictionary" + RawVolumeOutput = "${DATA}/assets/examples/volume/generated/cartesian/generatedvolume.rawvolume", + DictionaryOutput = "${DATA}/assets/examples/volume/generated/cartesian/generatedvolume.dictionary" }} \ No newline at end of file diff --git a/data/tasks/generate_volume_sequence.task b/data/tasks/volume/generate_cartesian_sequence.task similarity index 76% rename from data/tasks/generate_volume_sequence.task rename to data/tasks/volume/generate_cartesian_sequence.task index 2007efaa22..08aa2edd53 100644 --- a/data/tasks/generate_volume_sequence.task +++ b/data/tasks/volume/generate_cartesian_sequence.task @@ -19,8 +19,8 @@ for i=1,length do UpperDomainBound = {0.5, 0.5, 0.5}, ValueFunction = fn, Time = "2018-05-04T00:00:" .. step, - RawVolumeOutput = "${DATA}/assets/examples/generatedvolume/generatedvolume" .. step .. ".rawvolume", - DictionaryOutput = "${DATA}/assets/examples/generatedvolume/generatedvolume" .. step .. ".dictionary" + RawVolumeOutput = "${DATA}/assets/examples/volume/generated/cartesiansequence/" .. step .. ".rawvolume", + DictionaryOutput = "${DATA}/assets/examples/volume/generated/cartesiansequence/" .. step .. ".dictionary" } end diff --git a/data/tasks/volume/generate_spherical.task b/data/tasks/volume/generate_spherical.task new file mode 100644 index 0000000000..72c17dd3a2 --- /dev/null +++ b/data/tasks/volume/generate_spherical.task @@ -0,0 +1,15 @@ +local fn = + "return function (r, phi, theta) " .. + " return 1 - math.floor(r*10)/10 " .. + "end" + +return {{ + Type = "GenerateRawVolumeTask", + Dimensions = {32, 32, 32}, + LowerDomainBound = {0, 0, 0}, + UpperDomainBound = {1, math.pi, 2 * math.pi}, + ValueFunction = fn, + Time = "2018-05-04T00:00:00", + RawVolumeOutput = "${DATA}/assets/examples/volume/generated/spherical/spherical.rawvolume", + DictionaryOutput = "${DATA}/assets/examples/volume/generated/spherical/spherical.dictionary" +}} \ No newline at end of file diff --git a/modules/volume/rendering/renderabletimevaryingvolume.cpp b/modules/volume/rendering/renderabletimevaryingvolume.cpp index afec76e872..a7bc80cbaf 100644 --- a/modules/volume/rendering/renderabletimevaryingvolume.cpp +++ b/modules/volume/rendering/renderabletimevaryingvolume.cpp @@ -48,6 +48,7 @@ namespace { namespace { const char* KeyStepSize = "StepSize"; + const char* KeyGridType = "GridType"; const char* KeyTransferFunction = "TransferFunction"; const char* KeySourceDirectory = "SourceDirectory"; @@ -197,12 +198,12 @@ RenderableTimeVaryingVolume::RenderableTimeVaryingVolume( _clipPlanes->setIdentifier("clipPlanes"); _clipPlanes->setGuiName("Clip Planes"); - /*if (dictionary.hasValue(KeyGridType)) { + if (dictionary.hasValue(KeyGridType)) { VolumeGridType gridType = volume::parseGridType( dictionary.value(KeyGridType) ); _gridType = (gridType == VolumeGridType::Spherical) ? 1 : 0; - }*/ + } } RenderableTimeVaryingVolume::~RenderableTimeVaryingVolume() {} @@ -310,6 +311,7 @@ void RenderableTimeVaryingVolume::initializeGL() { addProperty(_opacity); addProperty(_rNormalization); addProperty(_rUpperBound); + addProperty(_gridType); _raycaster->setGridType( (_gridType.value() == 1) ? @@ -424,6 +426,10 @@ void RenderableTimeVaryingVolume::update(const UpdateData&) { if (_raycaster) { Timestep* t = currentTimestep(); _currentTimestep = timestepIndex(t); + + // Set scale and translation matrices: + // The original data cube is a unit cube centered in 0 + // ie with lower bound from (-0.5, -0.5, -0.5) and upper bound (0.5, 0.5, 0.5) if (t && t->texture) { if (_raycaster->gridType() == volume::VolumeGridType::Cartesian) { glm::dvec3 scale = t->metadata.upperDomainBound - @@ -436,10 +442,12 @@ void RenderableTimeVaryingVolume::update(const UpdateData&) { modelTransform = modelTransform * scaleMatrix; _raycaster->setModelTransform(glm::mat4(modelTransform)); } else { + // The diameter is two times the maximum radius. + // No translation: the sphere is always centered in (0, 0, 0) _raycaster->setModelTransform( glm::scale( glm::dmat4(1.0), - glm::dvec3(t->metadata.upperDomainBound[0]) + glm::dvec3(2.0 * t->metadata.upperDomainBound[0]) ) ); } diff --git a/modules/volume/shaders/helper.glsl b/modules/volume/shaders/helper.glsl index fe7ec2b022..e8e8f5404f 100644 --- a/modules/volume/shaders/helper.glsl +++ b/modules/volume/shaders/helper.glsl @@ -38,5 +38,6 @@ vec3 volume_cartesianToSpherical(vec3 zeroToOneCoords) { theta = acos(cartesian.z / r) / VOLUME_PI; phi = (VOLUME_PI + atan(cartesian.y, cartesian.x)) / (2.0 * VOLUME_PI ); } - return vec3(r * VOLUME_SQRT1_3, theta, phi); + + return vec3(r, theta, phi); } diff --git a/modules/volume/shaders/raycast.glsl b/modules/volume/shaders/raycast.glsl index 67888194be..e9416c52d0 100644 --- a/modules/volume/shaders/raycast.glsl +++ b/modules/volume/shaders/raycast.glsl @@ -49,12 +49,14 @@ void sample#{id}(vec3 samplePos, vec3 dir, inout vec3 accumulatedColor, vec3 transformedPos = samplePos; if (gridType_#{id} == 1) { transformedPos = volume_cartesianToSpherical(samplePos); + if (abs(transformedPos.r) > 1.0) { + return; + } } float clipAlpha = 1.0; vec3 centerToPos = transformedPos - vec3(0.5); - for (int i = 0; i < nClips_#{id} && i < 8; i++) { vec3 clipNormal = clipNormals_#{id}[i]; float clipBegin = clipOffsets_#{id}[i].x; diff --git a/modules/volume/tasks/generaterawvolumetask.cpp b/modules/volume/tasks/generaterawvolumetask.cpp index 93cb47421d..7941fb8ee9 100644 --- a/modules/volume/tasks/generaterawvolumetask.cpp +++ b/modules/volume/tasks/generaterawvolumetask.cpp @@ -33,6 +33,7 @@ #include #include +#include #include #include #include @@ -52,7 +53,6 @@ namespace { constexpr const char* KeyMinValue = "MinValue"; constexpr const char* KeyMaxValue = "MaxValue"; - // constexpr const char* KeyVisUnit = "VisUnit"; } // namespace namespace openspace { @@ -147,6 +147,12 @@ void GenerateRawVolumeTask::perform(const Task::ProgressCallback& progressCallba luaL_unref(state, LUA_REGISTRYINDEX, functionReference); + ghoul::filesystem::File file(_rawVolumeOutputPath); + const std::string directory = file.directoryName(); + if (!FileSys.directoryExists(directory)) { + FileSys.createDirectory(directory, ghoul::filesystem::FileSystem::Recursive::Yes); + } + volume::RawVolumeWriter writer(_rawVolumeOutputPath); writer.write(rawVolume);