diff --git a/data/assets/scene/solarsystem/missions/juice/CMR-illuminance2.txt b/data/assets/scene/solarsystem/missions/juice/CMR-illuminance2.txt new file mode 100644 index 0000000000..2ed4bff17e --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/CMR-illuminance2.txt @@ -0,0 +1,14 @@ +width 10 +lower 0.0 +upper 1.0 + +mappingkey 0.0 60 38 164 255 +mappingkey 0.083 106 43 167 255 +mappingkey 0.166 173 54 110 255 +mappingkey 0.332 253 64 40 255 +mappingkey 0.415 234 117 6 255 +mappingkey 0.498 230 169 16 255 +mappingkey 0.664 236 236 159 255 +mappingkey 0.830 251 251 235 255 +mappingkey 0.915 255 255 255 255 +mappingkey 1.0 255 255 255 255 \ No newline at end of file diff --git a/data/assets/scene/solarsystem/missions/juice/fieldlines.asset b/data/assets/scene/solarsystem/missions/juice/fieldlines.asset new file mode 100644 index 0000000000..bc7b7c8c96 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/fieldlines.asset @@ -0,0 +1,52 @@ +local transforms = asset.require('./transforms') + +local data = asset.syncedResource({ + Type = "HttpSynchronization", + Name = "Ganymede Plane Simulations", + Identifier = "juice_ganymede_fieldlines", + Version = 1 +}) + + +local magnetosphere = { + Identifier = "GanymedeMagnetosphere", + Parent = transforms.GPHIO.Identifier, + Renderable = { + Type = "RenderableFieldlinesSequence", + SourceFolder = data, + LineWidth = 1.0, + InputFileType = "Json", + ColorMethod = "By Quantity", + ColorQuantity = 0, + ColorTableRanges = { { 62.556353386366766, 1665.5534182835445 } }, + ColorTablePaths = { asset.localResource("CMR-illuminance2.txt") }, + Color = { 1.0, 0.725, 0.75, 0.8 } + }, + GUI = { + Name = "Ganymede Magnetosphere", + Path = "/Solar System/Missions/Juice/Fieldlines", + Description = "Fieldlines showing a simulation of the magnetic fields around Ganymede" + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(magnetosphere) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(magnetosphere) +end) + + +asset.meta = { + Name = "Static fieldline representation of Ganymede's magnetic field", + Version = "1.0", + Description = [[ + Showing a single timestep of the magnetic fieldlines around Ganymede in the GPHIO + coordinate system + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/juice/fov.asset b/data/assets/scene/solarsystem/missions/juice/fov.asset new file mode 100644 index 0000000000..20768ffcb0 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/fov.asset @@ -0,0 +1,9 @@ +asset.require('./fov/gala') +asset.require('./fov/janus') +asset.require('./fov/jmc') +asset.require('./fov/majis') +asset.require('./fov/navcam') +asset.require('./fov/rime') +asset.require('./fov/startracker') +asset.require('./fov/swi') +asset.require('./fov/uvs') diff --git a/data/assets/scene/solarsystem/missions/juice/fov/gala.asset b/data/assets/scene/solarsystem/missions/juice/fov/gala.asset new file mode 100644 index 0000000000..564e5ed61a --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/fov/gala.asset @@ -0,0 +1,59 @@ +local transforms = asset.require('../transforms') +local kernels = asset.require('../kernels') + + +local Gala = { + Identifier = "JuiceGala", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_GALA_RXT", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "JUICE_GALA_RXT", + Method = "CIRCLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "Gala FOV", + Path = "/Solar System/Missions/Juice/Instruments", + Description = "The field-of-view for the Ganymede Laster Altimeter (GALA) instrument." + } +} + + +asset.onInitialize(function() + -- Circle shapes are currently not supported + openspace.addSceneGraphNode(Gala) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(Gala) +end) + +asset.export(Gala) + + +asset.meta = { + Name = "GALA", + Version = "1.0", + Description = [[ + Shows the field-view for the Ganymede Laser Altimeter (GALA) instrument onboard Juice, + measuring a 2.5D heightfield of Ganymede and Europa. See + https://elib.dlr.de/94264/1/JUICE%20GALA%20-%20Design%20Overview%20v04.pdf for more + information. + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/juice/fov/janus.asset b/data/assets/scene/solarsystem/missions/juice/fov/janus.asset new file mode 100644 index 0000000000..6221361d74 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/fov/janus.asset @@ -0,0 +1,63 @@ +local transforms = asset.require('../transforms') +local kernels = asset.require('../kernels') + + +local Janus = { + Identifier = "JuiceJanus", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Transform = { + Translation = { + Type = "StaticTranslation", + Position = { 0.44, 0.33, 0.9 } + } + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_JANUS", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "JUICE_JANUS", + Method = "RECTANGLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "Janus FOV", + Path = "/Solar System/Missions/Juice/Instruments", + Description = "The field-of-view for the JANUS instrument onboard Juice" + + } +} + +asset.onInitialize(function() + openspace.addSceneGraphNode(Janus) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(Janus) +end) + +asset.export(Janus) + + +asset.meta = { + Name = "Janus", + Version = "1.0", + Description = [[ + Shows the field-view for the Jovis Amorum ac Natorum Undique Scrutator (JANUS) + instrument onboard Juice, which is the camera operating in visible wavelengths. See + https://elib.dlr.de/90175/1/2094.pdf for more information. + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/juice/fov/jmc.asset b/data/assets/scene/solarsystem/missions/juice/fov/jmc.asset new file mode 100644 index 0000000000..181006a43b --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/fov/jmc.asset @@ -0,0 +1,90 @@ +local transforms = asset.require('../transforms') +local kernels = asset.require('../kernels') + + +local JMC1 = { + Identifier = "JuiceJMC1", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_JMC-1", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "JUICE_JMC-1", + Method = "RECTANGLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "JUICE_JMC-1 FOV", + Path = "/Solar System/Missions/Juice/Instruments", + Description = "The field-of-views for the Juice Monitoring cameras" + } +} + +local JMC2 = { + Identifier = "JuiceJMC2", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_JMC-2", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "JUICE_JMC-2", + Method = "RECTANGLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "JUICE_JMC-2 FOV", + Path = "/Solar System/Missions/Juice/Instruments", + Description = "The field-of-views for the Juice Monitoring cameras" + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(JMC1) + openspace.addSceneGraphNode(JMC2) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(JMC2) + openspace.removeSceneGraphNode(JMC1) +end) + +asset.export(JMC1) +asset.export(JMC2) + + +asset.meta = { + Name = "JMC", + Version = "1.0", + Description = [[ + Shows the field-view for the Juice Monitoring Cameras (JMC) onboard Juice, which + provide status information about the deployment of various Juice systems, like the + solar array, antenna, etc. See https://microcameras.space/project/juice/ for more + information. + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/juice/fov/majis.asset b/data/assets/scene/solarsystem/missions/juice/fov/majis.asset new file mode 100644 index 0000000000..26750603af --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/fov/majis.asset @@ -0,0 +1,256 @@ +local transforms = asset.require('../transforms') +local kernels = asset.require('../kernels') + + +local MajisVisnir = { + Identifier = "JuiceMajisVisnir", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_MAJIS_VISNIR", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "JUICE_MAJIS_VISNIR", + Method = "RECTANGLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "Majis Visnir FOV", + Path = "/Solar System/Missions/Juice/Instruments", + Description = [[ + The field-of-view for the Moon and Jupiter Imaging Spectrometer measuring in the + visible and near-infrared spectra (0.4-1.9 um and 1.5-5.7 um). + ]] + } +} + +local MajisVisnirB2 = { + Identifier = "JuiceMajisVisnirB2", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_MAJIS_VISNIR_B2", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "JUICE_MAJIS_VISNIR_B2", + Method = "RECTANGLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "Majis Visnir B2 FOV", + Path = "/Solar System/Missions/Juice/Instruments" + } +} + +local MajisVisnirB4 = { + Identifier = "JuiceMajisVisnirB4", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_MAJIS_VISNIR_B4", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "JUICE_MAJIS_VISNIR_B4", + Method = "RECTANGLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "Majis Visnir B4 FOV", + Path = "/Solar System/Missions/Juice/Instruments" + } +} + +local MajisIr = { + Identifier = "JuiceMajisIr", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_MAJIS_IR", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "JUICE_MAJIS_IR", + Method = "RECTANGLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "Majis IR FOV", + Path = "/Solar System/Missions/Juice/Instruments" + } +} + +local MajisIrB2 = { + Identifier = "JuiceMajisIrB2", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_MAJIS_IR_B2", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "JUICE_MAJIS_IR_B2", + Method = "RECTANGLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "Majis IR B2 FOV", + Path = "/Solar System/Missions/Juice/Instruments" + } +} + +local MajisIrB4 = { + Identifier = "JuiceMajisIrB4", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_MAJIS_IR_B4", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "JUICE_MAJIS_IR_B4", + Method = "RECTANGLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "Majis IR B4 FOV", + Path = "/Solar System/Missions/Juice/Instruments" + } +} + +local Majis = { + Identifier = "JuiceMajis", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_MAJIS", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "JUICE_MAJIS", + Method = "RECTANGLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "Majis FOV", + Path = "/Solar System/Missions/Juice/Instruments", + Description = [[ + The field-of-view for the Moon and Jupiter Imaging Spectrometer measuring in the + visible and near-infrared spectra (0.4-1.9 um and 1.5-5.7 um). + ]] + } +} + + +asset.onInitialize(function() + -- We are only adding the main version of this instrument as a scene graph node. Other + -- versions are defined in the available SPICE kernels, but not a lot of information is + -- accessible about them. We don't want to remove them entirely as they might prove + -- useful to some users though + + -- openspace.addSceneGraphNode(MajisVisnir) + -- openspace.addSceneGraphNode(MajisVisnirB2) + -- openspace.addSceneGraphNode(MajisVisnirB4) + -- openspace.addSceneGraphNode(MajisIr) + -- openspace.addSceneGraphNode(MajisIrB2) + -- openspace.addSceneGraphNode(MajisIrB4) + openspace.addSceneGraphNode(Majis) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(Majis) + -- openspace.removeSceneGraphNode(MajisIrB4) + -- openspace.removeSceneGraphNode(MajisIrB2) + -- openspace.removeSceneGraphNode(MajisIr) + -- openspace.removeSceneGraphNode(MajisVisnirB4) + -- openspace.removeSceneGraphNode(MajisVisnirB2) + -- openspace.removeSceneGraphNode(MajisVisnir) +end) + +-- asset.export(MajisVisnir) +-- asset.export(MajisVisnirB2) +-- asset.export(MajisVisnirB4) +-- asset.export(MajisIr) +-- asset.export(MajisIrB2) +-- asset.export(MajisIrB4) +asset.export(Majis) + + +asset.meta = { + Name = "Majis", + Version = "1.0", + Description = [[ + Shows the field-view for the Moon and Jupiter Imaging Spectrometer (MAJIS) onboard + Juice, which is going to take spectroscopic measurements of the Jovian moons and + Jupiter. See https://www.hou.usra.edu/meetings/lpsc2014/pdf/2493.pdf for more + information. + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/juice/fov/navcam.asset b/data/assets/scene/solarsystem/missions/juice/fov/navcam.asset new file mode 100644 index 0000000000..88ded2eafe --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/fov/navcam.asset @@ -0,0 +1,58 @@ +local transforms = asset.require('../transforms') +local kernels = asset.require('../kernels') + + +local NavCam = { + Identifier = "JuiceNavCam", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_NAVCAM-1", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "JUICE_NAVCAM-1", + Method = "RECTANGLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "NavCam FOV", + Path = "/Solar System/Missions/Juice/Instruments", + Description = "The camera onboard Juice used to navigate by the stars" + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(NavCam) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(NavCam) +end) + +asset.export(NavCam) + + +asset.meta = { + Name = "NavCam", + Version = "1.0", + Description = [[ + Shows the field-view for the navigational camera (NavCam) onboard Juice, which is used + to measure the location of Juice. See + https://www.spiedigitallibrary.org/proceedings/Download?urlId=10.1117%2F12.2536086 + for more information. + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/juice/fov/rime.asset b/data/assets/scene/solarsystem/missions/juice/fov/rime.asset new file mode 100644 index 0000000000..58fa281f24 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/fov/rime.asset @@ -0,0 +1,93 @@ +local transforms = asset.require('../transforms') +local kernels = asset.require('../kernels') + + +-- Circle shapes are not support +local RimeBase = { + Identifier = "JuiceRimeBase", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_RIME_BASE", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "JUICE_RIME_BASE", + Method = "CIRCLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "Rime Base FOV", + Path = "/Solar System/Missions/Juice/Instruments", + Description = "The location of the base for the RIME instrument onboard Juice." + } +} + +-- Circle shapes are not supported +local Rime = { + Identifier = "JuiceRime", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_RIME", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "JUICE_RIME", + Method = "CIRCLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "Rime FOV", + Path = "/Solar System/Missions/Juice/Instruments", + Description = "The location of the RIME instrument onboard Juice." + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(Rime) + openspace.addSceneGraphNode(RimeBase) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(RimeBase) + openspace.removeSceneGraphNode(Rime) +end) + +asset.export(Rime) +asset.export(RimeBase) + + +asset.meta = { + Name = "RIME", + Version = "1.0", + Description = [[ + Shows the field-view for the Radar for Icy Moons Exploration (RIME) onboard Juice, + which is a ground-penetrating radar meant to measure the subsurface structure of the + ice surrounding the icy Galilean moons of up to 9 km. See + https://www.spacetech-i.com/products/mechanisms/juice-rime-antenna for more + information. + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/juice/fov/startracker.asset b/data/assets/scene/solarsystem/missions/juice/fov/startracker.asset new file mode 100644 index 0000000000..356b23be0d --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/fov/startracker.asset @@ -0,0 +1,121 @@ +local transforms = asset.require('../transforms') +local kernels = asset.require('../kernels') + + +local StarOh1 = { + Identifier = "JuiceStarOH1", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_STR-OH1", + RGB = { 0.0, 0.0, 0.0 }, + Instrument = { + Name = "JUICE_STR-OH1", + Method = "RECTANGLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "Star Tracker OH1 FOV", + Path = "/Solar System/Missions/Juice/Instruments", + Description = "The first head of the Hydra star tracking system" + } +} + +local StarOh2 = { + Identifier = "JuiceStarOH2", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_STR-OH2", + RGB = { 0.0, 0.0, 0.0 }, + Instrument = { + Name = "JUICE_STR-OH2", + Method = "RECTANGLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "Star Tracker OH2 FOV", + Path = "/Solar System/Missions/Juice/Instruments", + Description = "The second head of the Hydra star tracking system" + } +} + +local StarOh3 = { + Identifier = "JuiceStarOH3", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_STR-OH3", + RGB = { 0.0, 0.0, 0.0 }, + Instrument = { + Name = "JUICE_STR-OH3", + Method = "RECTANGLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "Star Tracker OH3 FOV", + Path = "/Solar System/Missions/Juice/Instruments", + Description = "The third head of the Hydra star tracking system" + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(StarOh1) + openspace.addSceneGraphNode(StarOh2) + openspace.addSceneGraphNode(StarOh3) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(StarOh3) + openspace.removeSceneGraphNode(StarOh2) + openspace.removeSceneGraphNode(StarOh1) +end) + +asset.export(StarOh1) +asset.export(StarOh2) +asset.export(StarOh3) + + +asset.meta = { + Name = "Star Tracker", + Version = "1.0", + Description = [[ + Shows the field-view for the three headed "Hydra" star trackers onboard Juice, which + is measuring the location of stars and comparing them to their known locations in + order to determine the position of Juice relative to the celestial sphere. + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/juice/fov/swi.asset b/data/assets/scene/solarsystem/missions/juice/fov/swi.asset new file mode 100644 index 0000000000..c940a950cc --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/fov/swi.asset @@ -0,0 +1,142 @@ +local transforms = asset.require('../transforms') +local kernels = asset.require('../kernels') + + +-- Circle shapes are not support +local SwiCh2 = { + Identifier = "JuiceSwiCH2", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_SWI_CH2", + RGB = { 0.0, 0.0, 0.0 }, + Instrument = { + Name = "JUICE_SWI_CH2", + Method = "CIRCLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "SWI CH2 FOV", + Path = "/Solar System/Missions/Juice/Instruments" + } +} + +local SwiFull = { + Identifier = "JuiceSwiFull", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Transform = { + Translation = { + Type = "StaticTranslation", + -- These translations are eyeballed based on the existing model + Position = { 0.465, -0.1, 0.95 } + } + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_SWI_FULL", + RGB = { 0.0, 0.0, 0.0 }, + Instrument = { + Name = "JUICE_SWI_FULL", + Method = "RECTANGLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "SWI Full FOV", + Path = "/Solar System/Missions/Juice/Instruments", + Description = "The field-of-view for the full SWI instrument onboard Juice." + } +} + +-- This frame throws an error as the JUICE_SWI_FULL_GCO500 is not a recognized frame in +-- the kernel set version 5 +local SwiFullGCO500 = { + Identifier = "JuiceSwiFullGCO500", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Transform = { + Translation = { + Type = "StaticTranslation", + -- These translations are eyeballed based on the existing model + Position = { 0.465, -0.1, 0.95 } + } + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_SWI_FULL_GCO500", + RGB = { 0.0, 0.0, 0.0 }, + Instrument = { + Name = "JUICE_SWI_FULL_GCO500", + Method = "RECTANGLE", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "SWI Full GCO500 FOV", + Path = "/Solar System/Missions/Juice/Instruments" + } +} + + +asset.onInitialize(function() + -- We are only adding the main version of this instrument as a scene graph node. Other + -- versions are defined in the available SPICE kernels, but not a lot of information is + -- accessible about them. We don't want to remove them entirely as they might prove + -- useful to some users though + + -- openspace.addSceneGraphNode(SwiCh2) + -- openspace.addSceneGraphNode(SwiFullGCO500) + openspace.addSceneGraphNode(SwiFull) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(SwiFull) + -- openspace.removeSceneGraphNode(SwiFullGCO500) + -- openspace.removeSceneGraphNode(SwiCh2) +end) + +-- asset.export(SwiCh2) +asset.export(SwiFull) +-- asset.export(SwiFullGCO500) + + +asset.meta = { + Name = "SWI", + Version = "1.0", + Description = [[ + Shows the field-view for the Submillimetre Wave Instrument (SWI), which is measuring + the chemistry, meteorology, and structure of Jupiters middle atmosphere as well as the + habitability of the Galilean moons. See + https://www.mps.mpg.de/planetary-science/juice-swi for more information. + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/juice/fov/uvs.asset b/data/assets/scene/solarsystem/missions/juice/fov/uvs.asset new file mode 100644 index 0000000000..d630f6ddcc --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/fov/uvs.asset @@ -0,0 +1,58 @@ +local transforms = asset.require('../transforms') +local kernels = asset.require('../kernels') + + +local UVS = { + Identifier = "JuiceUVS", + Parent = transforms.Juice.Identifier, + TimeFrame = { + Type = "TimeFrameInterval", + Start = "2031 JUL 02 00:00:00.000", + End = "2035 OCT 05 00:00:00.000" + }, + Renderable = { + Type = "RenderableFov", + Body = "JUICE", + Frame = "JUICE_UVS", + RGB = { 0.8, 0.7, 0.7 }, + Instrument = { + Name = "JUICE_UVS", + Method = "POLYGON", + Aberration = "NONE" + }, + AlwaysDrawFov = true, + PotentialTargets = { "JUPITER", "CALLISTO", "EUROPA", "GANYMEDE", "IO" }, + FrameConversions = {} + }, + GUI = { + Name = "UVS FOV", + Path = "/Solar System/Missions/Juice/Instruments", + Description = "The field-of-view for the UVS instrument onboard Juice" + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(UVS) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(UVS) +end) + +asset.export(UVS) + + +asset.meta = { + Name = "UVS", + Version = "1.0", + Description = [[ + Shows the field-view for the Ultraviolet Spectograph (UVS), which is measuring the + composition, chemistry, structure, and variability of Europa's atmopshere. See + https://www.lpi.usra.edu/opag/meetings/aug2015/presentations/day-1/8_b_retherford.pdf + for more information. + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/juice/kernels.asset b/data/assets/scene/solarsystem/missions/juice/kernels.asset new file mode 100644 index 0000000000..7a12b5f7fe --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/kernels.asset @@ -0,0 +1,84 @@ +local kernels = asset.syncedResource({ + Name = "JUICE Kernels", + Type = "HttpSynchronization", + Identifier = "juice_kernels", + Version = 1 +}) + +-- From the crema 5.0b23_1 meta kernel +-- + GPHIO from Ronan +local Kernels = { + kernels .. "juice_sc_sat_crema_5_0b23_1_default_f20160326_v01.bc", + kernels .. "juice_sc_sat_crema_5_0b23_1_comms_f20160326_v01.bc", + kernels .. "juice_sc_sat_crema_5_0b23_1_conjctn_f20160326_v01.bc", + kernels .. "juice_sc_sat_crema_5_0b23_1_flybys_f20160326_v01.bc", + kernels .. "juice_lpbooms_f20160326_v01.bc", + kernels .. "juice_magboom_f20160326_v03.bc", + kernels .. "juice_mga_zero_f20160326_v02.bc", + kernels .. "juice_majis_scan_zero_f20160326_v02.bc", + kernels .. "juice_swi_scan_zero_f20160326_v02.bc", + kernels .. "juice_sa_crema_5_0b23_1_default_f20160326_v01.bc", + + kernels .. "juice_v26.tf", + kernels .. "juice_sci_v10.tf", + kernels .. "juice_ops_v07.tf", + kernels .. "juice_dsk_surfaces_v05.tf", + kernels .. "juice_roi_v02.tf", + kernels .. "gphio.tf", + kernels .. "rssd0002.tf", + kernels .. "earth_topo_050714.tf", + kernels .. "earthfixediau.tf", + kernels .. "estrack_v04.tf", + + kernels .. "juice_gala_v03.ti", + kernels .. "juice_janus_v06.ti", + kernels .. "juice_jmc_v02.ti", + kernels .. "juice_majis_v05.ti", + kernels .. "juice_navcam_v01.ti", + kernels .. "juice_pep_v10.ti", + kernels .. "juice_radem_v00.ti", + kernels .. "juice_rime_v04.ti", + kernels .. "juice_rpwi_v02.ti", + kernels .. "juice_str_v01.ti", + kernels .. "juice_swi_v07.ti", + kernels .. "juice_uvs_v03.ti", + kernels .. "juice_aux_v01.ti", + + kernels .. "de-403-masses.tpc", + kernels .. "gm_de431.tpc", + kernels .. "juice_jup006.tpc", + kernels .. "juice_roi_v01.tpc", + + kernels .. "juice_fict_20160326_v03.tsc", + kernels .. "juice_step_20160326_v03.tsc", + + kernels .. "juice_struct_v13.bsp", + kernels .. "juice_cog_v00.bsp", + kernels .. "juice_roi_v02.bsp", + kernels .. "mar085_20200101_20400101.bsp", + kernels .. "earthstns_fx_050714.bsp", + kernels .. "estrack_v04.bsp", + kernels .. "jup310_20200101_20500101.bsp", + kernels .. "jup343_20200101_20500101.bsp", + kernels .. "de432s.bsp", + kernels .. "noe-5-2017-gal-a-reduced_20200101_20380902.bsp", + + kernels .. "juice_mat_crema_5_0b23_1_20230405_20351005_v01.bsp", +} + +asset.export("Kernels", Kernels) + + + + +asset.meta = { + Name = "Spice Kernels for the Juice Mission", + Version = "1.0", + Description = [[ + Kernels were acquired from the official Juice mailing list and extended with the + GPHIO kernel provided by Ronan Modolo for the fieldline and plane data visualization + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/juice/model.asset b/data/assets/scene/solarsystem/missions/juice/model.asset new file mode 100644 index 0000000000..7e7bdd62bc --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/model.asset @@ -0,0 +1,75 @@ +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') +local transforms = asset.require('./transforms') + + +local model = asset.syncedResource({ + Name = "JUICE Model", + Type = "HttpSynchronization", + Identifier = "juice_models", + Version = 1 +}) + +local JuiceModel = { + Identifier = "JuiceModel", + Parent = transforms.Juice.Identifier, + Transform = { + Translation = { + Type = "StaticTranslation", + -- Offset numbers found by eyeballing + Position = { 4.5, 0.0, -1.0 } + }, + Rotation = { + Type = "StaticRotation", + Rotation = { math.pi / 2.0, 0.0, 0.0 } + } + }, + Renderable = { + Type = "RenderableModel", + Body = "JUICE", + GeometryFile = model .. "juice.fbx", + ModelScale = "Centimeter", + LightSources = { + { + Type = "SceneGraphLightSource", + Identifier = "Sun", + Node = sunTransforms.SolarSystemBarycenter.Identifier, + Intensity = 0.6 + }, + { + Identifier = "Camera", + Type = "CameraLightSource", + Intensity = 0.4, + Enabled = false + } + } + }, + GUI = { + Name = "Juice Model", + Path = "/Solar System/Missions/Juice", + Description = "The model of the JUICE spacecraft" + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(JuiceModel) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(JuiceModel) +end) + +asset.export(JuiceModel) + + +asset.meta = { + Name = "Juice Model", + Version = "1.0", + Description = [[ + The model of the JUICE spacecraft. The model file was taken from + https://www.cosmos.esa.int/web/esac-cmso/scifleet. + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/juice/plane.asset b/data/assets/scene/solarsystem/missions/juice/plane.asset new file mode 100644 index 0000000000..ddbeddd612 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/plane.asset @@ -0,0 +1,355 @@ +local transforms = asset.require('./transforms') + +-- Datasets created using the script found at: +-- https://github.com/OpenSpace/scripts/tree/master/juice-gphio-image-conversion +local data = asset.syncedResource({ + Type = "HttpSynchronization", + Name = "Ganymede Plane Simulations", + Identifier = "juice_ganymede_plane_cuts", + Version = 1 +}) + + +local GanymedeRadius = 2634 * 1000 +-- Size value from the original dataset provided by Ronan +local Size = 4.114 * GanymedeRadius + +local xy_n = { + Identifier = "Ganymede_Plane_XY_N", + Parent = transforms.GPHIO.Identifier, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = Size, + Texture = data .. "XY-n.png", + Enabled = false + }, + GUI = { + Name = "Ganymede XY Plane N", + Path = "/Solar System/Missions/Juice/Plane", + Description = "A cut plane in Ganymede's XY plane showing the number of particles" + } +} + +local xy_t = { + Identifier = "Ganymede_Plane_XY_T", + Parent = transforms.GPHIO.Identifier, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = Size, + Texture = data .. "XY-T.png", + Enabled = false + }, + GUI = { + Name = "Ganymede XY Plane T", + Path = "/Solar System/Missions/Juice/Plane", + Description = "A cut plane in Ganymede's XY plane showing the temperature" + } +} + +local xy_u = { + Identifier = "Ganymede_Plane_XY_U", + Parent = transforms.GPHIO.Identifier, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = Size, + Texture = data .. "XY-U.png", + Enabled = false + }, + GUI = { + Name = "Ganymede XY Plane U", + Path = "/Solar System/Missions/Juice/Plane", + Description = [[A cut plane in Ganymede's XY plane showing the strength of the + magnetic field]] + } +} + +local xy_utot = { + Identifier = "Ganymede_Plane_XY_Utot", + Parent = transforms.GPHIO.Identifier, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = Size, + Texture = data .. "XY-Utot.png", + Enabled = false + }, + GUI = { + Name = "Ganymede XY Plane U_tot", + Path = "/Solar System/Missions/Juice/Plane", + Description = [[A cut plane in Ganymede's XY plane showing the X, Y, and Z components + of the magnetic field mapped to the RGB components.]] + } +} + +local xy_ux = { + Identifier = "Ganymede_Plane_XY_Ux", + Parent = transforms.GPHIO.Identifier, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = Size, + Texture = data .. "XY-Ux.png", + Enabled = false + }, + GUI = { + Name = "Ganymede XY Plane Ux", + Path = "/Solar System/Missions/Juice/Plane", + Description = [[A cut plane in Ganymede's XY plane showing the X component of + Ganymede's magnetic field]] + } +} + +local xy_uy = { + Identifier = "Ganymede_Plane_XY_Uy", + Parent = transforms.GPHIO.Identifier, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = Size, + Texture = data .. "XY-Uy.png", + Enabled = false + }, + GUI = { + Name = "Ganymede XY Plane Uy", + Path = "/Solar System/Missions/Juice/Plane", + Description = [[A cut plane in Ganymede's XY plane showing the Y component of + Ganymede's magnetic field]] + } +} + +local xy_uz = { + Identifier = "Ganymede_Plane_XY_Uz", + Parent = transforms.GPHIO.Identifier, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = Size, + Texture = data .. "XY-Uz.png", + Enabled = false + }, + GUI = { + Name = "Ganymede XY Plane Uz", + Path = "/Solar System/Missions/Juice/Plane", + Description = [[A cut plane in Ganymede's XY plane showing the Z component of + Ganymede's magnetic field]] + } +} + +local xz_n = { + Identifier = "Ganymede_Plane_XZ_N", + Parent = transforms.GPHIO.Identifier, + Transform = { + Rotation = { + Type = "StaticRotation", + Rotation = { -math.pi/2, 0.0, 0.0 } + } + }, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = Size, + Texture = data .. "XZ-n.png", + Enabled = false + }, + GUI = { + Name = "Ganymede XZ Plane N", + Path = "/Solar System/Missions/Juice/Plane", + Description = "A cut plane in Ganymede's XZ plane showing the number of particles" + } +} + +local xz_t = { + Identifier = "Ganymede_Plane_XZ_T", + Parent = transforms.GPHIO.Identifier, + Transform = { + Rotation = { + Type = "StaticRotation", + Rotation = { -math.pi/2, 0.0, 0.0 } + } + }, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = Size, + Texture = data .. "XZ-T.png", + Enabled = false + }, + GUI = { + Name = "Ganymede XZ Plane T", + Path = "/Solar System/Missions/Juice/Plane", + Description = "A cut plane in Ganymede's XZ plane showing the temperature" + } +} + +local xz_u = { + Identifier = "Ganymede_Plane_XZ_U", + Parent = transforms.GPHIO.Identifier, + Transform = { + Rotation = { + Type = "StaticRotation", + Rotation = { -math.pi/2, 0.0, 0.0 } + } + }, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = Size, + Texture = data .. "XZ-U.png", + Enabled = false + }, + GUI = { + Name = "Ganymede XZ Plane U", + Path = "/Solar System/Missions/Juice/Plane", + Description = [[A cut plane in Ganymede's XZ plane showing the strength of the + magnetic field]] + } +} + +local xz_utot = { + Identifier = "Ganymede_Plane_XZ_Utot", + Parent = transforms.GPHIO.Identifier, + Transform = { + Rotation = { + Type = "StaticRotation", + Rotation = { -math.pi/2, 0.0, 0.0 } + } + }, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = Size, + Texture = data .. "XZ-Utot.png", + Enabled = false + }, + GUI = { + Name = "Ganymede XZ Plane U_tot", + Path = "/Solar System/Missions/Juice/Plane", + Description = [[A cut plane in Ganymede's XZ plane showing the X, Y, and Z components + of the magnetic field mapped to the RGB components.]] + } +} + +local xz_ux = { + Identifier = "Ganymede_Plane_XZ_Ux", + Parent = transforms.GPHIO.Identifier, + Transform = { + Rotation = { + Type = "StaticRotation", + Rotation = { -math.pi/2, 0.0, 0.0 } + } + }, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = Size, + Texture = data .. "XZ-Ux.png", + Enabled = false + }, + GUI = { + Name = "Ganymede XZ Plane Ux", + Path = "/Solar System/Missions/Juice/Plane", + Description = [[A cut plane in Ganymede's XZ plane showing the X component of + Ganymede's magnetic field]] + } +} + +local xz_uy = { + Identifier = "Ganymede_Plane_XZ_Uy", + Parent = transforms.GPHIO.Identifier, + Transform = { + Rotation = { + Type = "StaticRotation", + Rotation = { -math.pi/2, 0.0, 0.0 } + } + }, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = Size, + Texture = data .. "XZ-Uy.png", + Enabled = false + }, + GUI = { + Name = "Ganymede XZ Plane Uy", + Path = "/Solar System/Missions/Juice/Plane", + Description = [[A cut plane in Ganymede's XZ plane showing the Y component of + Ganymede's magnetic field]] + } +} + +local xz_uz = { + Identifier = "Ganymede_Plane_XZ_Uz", + Parent = transforms.GPHIO.Identifier, + Transform = { + Rotation = { + Type = "StaticRotation", + Rotation = { -math.pi/2, 0.0, 0.0 } + } + }, + Renderable = { + Type = "RenderablePlaneImageLocal", + Size = Size, + Texture = data .. "XZ-Uz.png", + Enabled = false + }, + GUI = { + Name = "Ganymede XZ Plane Uz", + Path = "/Solar System/Missions/Juice/Plane", + Description = [[A cut plane in Ganymede's XZ plane showing the Z component of + Ganymede's magnetic field]] + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(xy_n) + openspace.addSceneGraphNode(xy_t) + openspace.addSceneGraphNode(xy_u) + openspace.addSceneGraphNode(xy_utot) + openspace.addSceneGraphNode(xy_ux) + openspace.addSceneGraphNode(xy_uy) + openspace.addSceneGraphNode(xy_uz) + + openspace.addSceneGraphNode(xz_n) + openspace.addSceneGraphNode(xz_t) + openspace.addSceneGraphNode(xz_u) + openspace.addSceneGraphNode(xz_utot) + openspace.addSceneGraphNode(xz_ux) + openspace.addSceneGraphNode(xz_uy) + openspace.addSceneGraphNode(xz_uz) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(xz_uz) + openspace.removeSceneGraphNode(xz_uy) + openspace.removeSceneGraphNode(xz_ux) + openspace.removeSceneGraphNode(xz_utot) + openspace.removeSceneGraphNode(xz_u) + openspace.removeSceneGraphNode(xz_t) + openspace.removeSceneGraphNode(xz_n) + + openspace.removeSceneGraphNode(xy_uz) + openspace.removeSceneGraphNode(xy_uy) + openspace.removeSceneGraphNode(xy_ux) + openspace.removeSceneGraphNode(xy_utot) + openspace.removeSceneGraphNode(xy_u) + openspace.removeSceneGraphNode(xy_t) + openspace.removeSceneGraphNode(xy_n) +end) + +asset.export(xy_n) +asset.export(xy_t) +asset.export(xy_u) +asset.export(xy_utot) +asset.export(xy_ux) +asset.export(xy_uy) +asset.export(xy_uz) +asset.export(xz_n) +asset.export(xz_t) +asset.export(xz_u) +asset.export(xz_utot) +asset.export(xz_ux) +asset.export(xz_uy) +asset.export(xz_uz) + + +asset.meta = { + Name = "Ganymede Cut Planes", + Version = "1.0", + Description = [[ + Cutplane visualizations of Ganymede's magnetic field as prepared by Ronan Modolo. + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/juice/trail.asset b/data/assets/scene/solarsystem/missions/juice/trail.asset new file mode 100644 index 0000000000..9ce8b24660 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/trail.asset @@ -0,0 +1,4 @@ +asset.require('./trails/earth') +asset.require('./trails/ganymede') +asset.require('./trails/jupiter') +asset.require('./trails/ssb') diff --git a/data/assets/scene/solarsystem/missions/juice/trails/earth.asset b/data/assets/scene/solarsystem/missions/juice/trails/earth.asset new file mode 100644 index 0000000000..9022ee2c4a --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/trails/earth.asset @@ -0,0 +1,49 @@ +local earthTransforms = asset.require('scene/solarsystem/planets/earth/transforms') +local kernels = asset.require('../kernels') + + +local JuiceTrailEarth = { + Identifier = "JuiceTrailEarth", + Parent = earthTransforms.EarthBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "JUICE", + Observer = "EARTH BARYCENTER", + Kernels = kernels.Kernels + }, + Color = { 0.30, 0.70, 0.20 }, + StartTime = "2023 APR 05 12:00:00.000", + EndTime = "2033 JUN 04 02:51:00.546", + SampleInterval = 3600 + }, + GUI = { + Name = "Juice Trail (Earth)", + Path = "/Solar System/Missions/Juice", + Description = "Juice's trajectory relative to the Earth barycenter" + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(JuiceTrailEarth) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(JuiceTrailEarth) +end) + +asset.export(JuiceTrailEarth) + + +asset.meta = { + Name = "Juice trajectory relative to the Earth barycenter", + Version = "1.0", + Description = [[ + The trajectory of the Juice spacecraft relative to the Earth barycenter + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/juice/trails/ganymede.asset b/data/assets/scene/solarsystem/missions/juice/trails/ganymede.asset new file mode 100644 index 0000000000..7bac990af9 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/trails/ganymede.asset @@ -0,0 +1,49 @@ +local transforms = asset.require('../transforms') +local kernels = asset.require('../kernels') + + +local JuiceTrailGanymede = { + Identifier = "JuiceTrailGanymede", + Parent = transforms.GanymedePosition.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "JUICE", + Observer = "GANYMEDE", + Kernels = kernels.Kernels + }, + Color = { 0.70, 0.770, 0.35 }, + StartTime = "2034 DEC 01 00:00:00.000", + EndTime = "2035 OCT 05 00:00:00.000", + SampleInterval = 600 + }, + GUI = { + Name = "Juice Trail (Ganymede)", + Path = "/Solar System/Missions/Juice", + Description = "Juice's trajectory relative to Ganymede" + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(JuiceTrailGanymede) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(JuiceTrailGanymede) +end) + +asset.export(JuiceTrailGanymede) + + +asset.meta = { + Name = "Juice trajectory relative to Ganymede", + Version = "1.0", + Description = [[ + The trajectory of the Juice spacecraft relative to Ganymede + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/juice/trails/jupiter.asset b/data/assets/scene/solarsystem/missions/juice/trails/jupiter.asset new file mode 100644 index 0000000000..49b4d85720 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/trails/jupiter.asset @@ -0,0 +1,49 @@ +local jupiterTransforms = asset.require('scene/solarsystem/planets/jupiter/transforms') +local kernels = asset.require('../kernels') + + +local JuiceTrailJupiter = { + Identifier = "JuiceTrailJupiter", + Parent = jupiterTransforms.JupiterBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "JUICE", + Observer = "JUPITER BARYCENTER", + Kernels = kernels.Kernels + }, + Color = { 0.70, 0.370, 0.45 }, + StartTime = "2031 JUL 02 00:00:00.000", + EndTime = "2035 OCT 05 00:00:00.000", + SampleInterval = 3600 + }, + GUI = { + Name = "Juice Trail (Jupiter)", + Path = "/Solar System/Missions/Juice", + Description = "Juice's trajectory relative to Jupiter" + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(JuiceTrailJupiter) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(JuiceTrailJupiter) +end) + +asset.export(JuiceTrailJupiter) + + +asset.meta = { + Name = "Juice trajectory relative to Jupiter", + Version = "1.0", + Description = [[ + The trajectory of the Juice spacecraft relative to Jupiter + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/juice/trails/ssb.asset b/data/assets/scene/solarsystem/missions/juice/trails/ssb.asset new file mode 100644 index 0000000000..5aeec137e2 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/trails/ssb.asset @@ -0,0 +1,49 @@ +local sunTransforms = asset.require('scene/solarsystem/sun/transforms') +local kernels = asset.require('../kernels') + + +local JuiceTrail = { + Identifier = "JuiceTrail", + Parent = sunTransforms.SolarSystemBarycenter.Identifier, + Renderable = { + Type = "RenderableTrailTrajectory", + Translation = { + Type = "SpiceTranslation", + Target = "JUICE", + Observer = "SSB", + Kernels = kernels.Kernels + }, + Color = { 0.85, 0.85, 0.85 }, + StartTime = "2023 APR 05 12:00:00.000", + EndTime = "2035 OCT 05 00:00:00.000", + SampleInterval = 3600 + }, + GUI = { + Name = "Juice Trail", + Path = "/Solar System/Missions/Juice", + Description = "Juice's trajectory relative to the solar system's barycenter" + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(JuiceTrail) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(JuiceTrail) +end) + +asset.export(JuiceTrail) + + +asset.meta = { + Name = "Juice trajectory relative to the solar system's barycenter", + Version = "1.0", + Description = [[ + The trajectory of the Juice spacecraft relative to the solar system's barycenter + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/missions/juice/transforms.asset b/data/assets/scene/solarsystem/missions/juice/transforms.asset new file mode 100644 index 0000000000..f0e2688c83 --- /dev/null +++ b/data/assets/scene/solarsystem/missions/juice/transforms.asset @@ -0,0 +1,96 @@ +local jupiterTransforms = asset.require('scene/solarsystem/planets/jupiter/transforms') +local kernels = asset.require('./kernels') + + +local Juice = { + Identifier = "Juice", + Parent = jupiterTransforms.JupiterBarycenter.Identifier, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "JUICE", + Observer = "JUPITER BARYCENTER", + Kernels = kernels.Kernels + }, + Rotation = { + Type = "SpiceRotation", + SourceFrame = "JUICE_SPACECRAFT", + DestinationFrame = "GALACTIC", + Kernels = kernels.Kernels + }, + }, + GUI = { + Name = "Juice", + Path = "/Solar System/Missions/Juice", + Description = "The position of Juice in the reference frame of Jupiter" + } +} + +local GanymedePosition = { + Identifier = "GanymedePosition", + Parent = jupiterTransforms.JupiterBarycenter.Identifier, + Transform = { + Translation = { + Type = "SpiceTranslation", + Target = "GANYMEDE", + Observer = "JUPITER BARYCENTER", + Kernels = kernels.Kernels + } + }, + GUI = { + Path = "/Solar System/Planets/Jupiter/Moons", + Description = "Ganymede's position relative to Jupiter as an inertial reference frame" + } +} + +local GPHIO = { + Identifier = "GPHIO", + Parent = GanymedePosition.Identifier, + Transform = { + Rotation = { + Type = "SpiceRotation", + SourceFrame = "GPHIO", + DestinationFrame = "GALACTIC", + Kernels = kernels.Kernels + } + }, + GUI = { + Name = "GPHIO", + Path = "/Solar System/Missions/Juice", + Description = [[A rotating coordinate system called Ganymede Phi-Omega (G_PHI_O). The + X axis is pointing in the direction of corotational flow (System III flow), Z is + parallel to the Jovian spin axis (Omega), and Y completes the right handed set. The + basis vectors are fixed at the time of Ganymede closest approach (2000-12-28 + 08:25:28)]] + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(Juice) + openspace.addSceneGraphNode(GanymedePosition) + openspace.addSceneGraphNode(GPHIO) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(GPHIO) + openspace.removeSceneGraphNode(GanymedePosition) + openspace.removeSceneGraphNode(Juice) +end) + +asset.export(Juice) +asset.export(GanymedePosition) +asset.export(GPHIO) + + +asset.meta = { + Name = "Transformations for the JUICE mission profile", + Version = "1.0", + Description = [[ + Contains all of the base transformations necessary for the JUICE mission in the Jovian + system + ]], + Author = "OpenSpace Team", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/profiles/juice.profile b/data/profiles/juice.profile new file mode 100644 index 0000000000..1f51606e81 --- /dev/null +++ b/data/profiles/juice.profile @@ -0,0 +1,123 @@ +{ + "additional_scripts": [ + "" + ], + "assets": [ + "base", + "scene/solarsystem/missions/juice/fieldlines", + "scene/solarsystem/missions/juice/fov/janus", + "scene/solarsystem/missions/juice/fov/navcam", + "scene/solarsystem/missions/juice/model", + "scene/solarsystem/missions/juice/plane", + "scene/solarsystem/missions/juice/trail", + "scene/solarsystem/planets/earth/earth" + ], + "camera": { + "altitude": 9220000000.0, + "anchor": "Jupiter", + "latitude": -7.1689, + "longitude": -173.3037, + "type": "goToGeo" + }, + "delta_times": [ + 1.0, + 5.0, + 30.0, + 60.0, + 300.0, + 1800.0, + 3600.0, + 43200.0, + 86400.0, + 604800.0, + 1209600.0, + 2592000.0, + 5184000.0, + 7776000.0, + 15552000.0, + 31536000.0, + 63072000.0, + 157680000.0, + 315360000.0, + 630720000.0 + ], + "mark_nodes": [ + "Earth", + "Juice", + "Jupiter", + "Ganymede" + ], + "meta": { + "author": "OpenSpace Team", + "description": "Juice profile that visualizes the currently best known trajectory for the JUICE mission the Jupiter and its moons. See https://sci.esa.int/documents/33960/35865/1567260128466-JUICE_Red_Book_i1.0.pdf for more information about the JUICE mission. Currently, only the Janus and NavCam instruments are included in this profile, but the other instruments are available for a custom profile. Some of these are not behaving correctly, which will be addressed later.", + "license": "MIT License", + "name": "Juice", + "url": "https://www.openspaceproject.com", + "version": "1.0" + }, + "properties": [ + { + "name": "NavigationHandler.OrbitalNavigator.MinimumAllowedDistance", + "type": "setPropertyValueSingle", + "value": "0.0" + }, + { + "name": "Scene.JuiceTrailEarth.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "false" + }, + { + "name": "Scene.JuiceTrailJupiter.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "true" + }, + { + "name": "Scene.JuiceTrailGanymede.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "false" + }, + { + "name": "Scene.GanymedeMagnetosphere.Renderable.DomainEnabled", + "type": "setPropertyValueSingle", + "value": "false" + }, + { + "name": "Scene.JuiceTrail.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "false" + }, + { + "name": "Scene.GanymedeMagnetosphere.Renderable.LineWidth", + "type": "setPropertyValueSingle", + "value": "2.0" + }, + { + "name": "Scene.GanymedeMagnetosphere.Renderable.Flow.ParticleSize", + "type": "setPropertyValueSingle", + "value": "25.000000" + }, + { + "name": "Scene.GanymedeMagnetosphere.Renderable.Flow.ParticleSpacing", + "type": "setPropertyValueSingle", + "value": "40" + }, + { + "name": "Scene.GanymedeMagnetosphere.Renderable.Flow.Speed", + "type": "setPropertyValueSingle", + "value": "150.000000" + }, + { + "name": "Scene.GanymedeMagnetosphere.Renderable.FlowEnabled", + "type": "setPropertyValueSingle", + "value": "true" + } + ], + "time": { + "type": "absolute", + "value": "2031-08-01T03:01:30" + }, + "version": { + "major": 1, + "minor": 1 + } +} diff --git a/modules/base/rendering/renderableplane.cpp b/modules/base/rendering/renderableplane.cpp index 2749f74a08..a5a5fa198d 100644 --- a/modules/base/rendering/renderableplane.cpp +++ b/modules/base/rendering/renderableplane.cpp @@ -270,6 +270,7 @@ void RenderablePlane::render(const RenderData& data, RendererTasks&) { glDepthMask(false); glBlendFunc(GL_SRC_ALPHA, GL_ONE); } + glDisable(GL_CULL_FACE); glBindVertexArray(_quad); glDrawArrays(GL_TRIANGLES, 0, 6); diff --git a/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp b/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp index 87be9ca108..55888dd992 100644 --- a/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp +++ b/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp @@ -550,9 +550,6 @@ fls::Model stringToModel(std::string str) { bool RenderableFieldlinesSequence::loadJsonStatesIntoRAM() { fls::Model model = stringToModel(_modelStr); - if (model == fls::Model::Invalid) { - return false; - } for (const std::string& filePath : _sourceFiles) { FieldlinesState newState; const bool loadedSuccessfully = newState.loadStateFromJson( @@ -1079,6 +1076,12 @@ void RenderableFieldlinesSequence::update(const UpdateData& data) { if (!_hasBeenUpdated) { updateVertexPositionBuffer(); } + + if (_states[_activeStateIndex].nExtraQuantities() > 0) { + _shouldUpdateColorBuffer = true; + _shouldUpdateMaskingBuffer = true; + } + _hasBeenUpdated = true; } else {