diff --git a/apps/OpenSpace/ext/launcher/include/settingsdialog.h b/apps/OpenSpace/ext/launcher/include/settingsdialog.h
index 54ba955ec0..dcd2aa89c0 100644
--- a/apps/OpenSpace/ext/launcher/include/settingsdialog.h
+++ b/apps/OpenSpace/ext/launcher/include/settingsdialog.h
@@ -50,7 +50,7 @@ private:
void updateSaveButton();
void save();
- void reject();
+ void reject() override;
QLineEdit* _configuration = nullptr;
QCheckBox* _rememberLastConfiguration = nullptr;
diff --git a/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp b/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp
index 75525bdf7f..98d222cdaa 100644
--- a/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp
+++ b/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp
@@ -401,8 +401,8 @@ QWidget* LauncherWindow::createCentralWidget() {
connect(
&dialog,
&SettingsDialog::saveSettings,
- [](Settings settings) {
- saveSettings(settings, findSettings());
+ [](Settings s) {
+ saveSettings(s, findSettings());
}
);
@@ -588,10 +588,17 @@ bool handleConfigurationFile(QComboBox& box, const std::filesystem::directory_en
// Add tooltip
if (isJson) {
- sgct::config::Meta meta = sgct::readMeta(p.path().string(), true);
- if (!meta.description.empty()) {
+ std::string tooltipDescription;
+ try {
+ sgct::config::Meta meta = sgct::readMeta(p.path().string());
+ tooltipDescription = meta.description;
+ }
+ catch (const sgct::Error&) {
+ tooltipDescription = "(no description available)";
+ }
+ if (!tooltipDescription.empty()) {
QString toolTip = QString::fromStdString(
- fmt::format("
{}
", meta.description)
+ fmt::format("{}
", tooltipDescription)
);
box.setItemData(box.count() - 1, toolTip, Qt::ToolTipRole);
}
diff --git a/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp b/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp
index 2a98f99b78..08d72eaa49 100644
--- a/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp
+++ b/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp
@@ -142,7 +142,7 @@ void SgctEdit::setupStateOfUiOnFirstWindow(size_t nWindows) {
bool firstWindowGuiIsEnabled = (nWindows > 1);
int graphicsSelectionForFirstWindow = 0;
int nGuiRenderTagsFound = 0;
- _settingsWidget->nWindowsDisplayedChanged(nWindows);
+ _settingsWidget->nWindowsDisplayedChanged(static_cast(nWindows));
for (size_t i = 0; i < nWindows; ++i) {
sgct::config::Window& w = _cluster.nodes.front().windows[i];
@@ -185,7 +185,7 @@ void SgctEdit::setupStateOfUiOnFirstWindow(size_t nWindows) {
// Call these again in order to ensure that GUI is configured correctly based on
// the values read from the config file
_settingsWidget->setEnableShowUiOnFirstWindowCheckbox(true);
- _settingsWidget->nWindowsDisplayedChanged(nWindows);
+ _settingsWidget->nWindowsDisplayedChanged(static_cast(nWindows));
}
_settingsWidget->setGraphicsSelectionForShowUiOnFirstWindow(
graphicsSelectionForFirstWindow
diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct
index e2e1b99a2d..cd588a8090 160000
--- a/apps/OpenSpace/ext/sgct
+++ b/apps/OpenSpace/ext/sgct
@@ -1 +1 @@
-Subproject commit e2e1b99a2de784d1774d8b72262fc4def2f0b5ce
+Subproject commit cd588a809006263554950a51aeb0cb9cf4848417
diff --git a/apps/OpenSpace/main.cpp b/apps/OpenSpace/main.cpp
index 5618fc3522..96ea13d8a2 100644
--- a/apps/OpenSpace/main.cpp
+++ b/apps/OpenSpace/main.cpp
@@ -1415,9 +1415,12 @@ int main(int argc, char* argv[]) {
LDEBUG("Creating SGCT Engine");
std::vector arg(argv + 1, argv + argc);
+ LDEBUG("Parsing commandline arguments");
sgct::Configuration config = parseArguments(arg);
+ LDEBUG("Loading cluster information");
config::Cluster cluster = loadCluster(absPath(windowConfiguration).string());
+ LDEBUG("Setting callbacks");
Engine::Callbacks callbacks;
callbacks.initOpenGL = mainInitFunc;
callbacks.preSync = mainPreSyncFunc;
diff --git a/data/assets/examples/pointclouds/data/dummydata.csv b/data/assets/examples/pointclouds/data/dummydata.csv
new file mode 100644
index 0000000000..e8b698833f
--- /dev/null
+++ b/data/assets/examples/pointclouds/data/dummydata.csv
@@ -0,0 +1,101 @@
+x,y,z,a,b,normaldist_withMissing,number_withNan
+13428000,26239000,45870000,-3.226548224,33.95773276,-0.357778948,29
+14727000,45282000,10832000,45.05941924,-106.0395917,,29
+24999000,28370000,19911000,-70.58906931,154.1851656,-0.167961782,Nan
+26539000,36165000,39582000,-13.3663358,71.79484733,0.113536778,9
+49056000,24775000,14626000,21.42870979,-115.6088304,0.125551095,37
+43965000,21472000,18760000,65.07055022,-56.36880466,0.172981386,18
+15661000,28429000,16965000,76.15826514,125.3163407,,40
+25046000,36006000,49453000,-22.31710915,137.4486786,0.447921314,28
+13797000,34811000,18825000,-79.40300933,74.05580595,-0.02379786,12
+13879000,14824000,41472000,-30.93548431,-8.755047834,-0.041777813,50
+11481000,20480000,25925000,75.51244012,178.1377926,-0.044396255,0
+45032000,16606000,23537000,37.38766828,175.5064508,-0.449674816,13
+14395000,34940000,21968000,-31.6863061,-116.6587323,-0.09741961,30
+15945000,21478000,29536000,-53.01226701,59.18196347,0.304142338,30
+13458000,19017000,18542000,8.72692265,80.65872957,,45
+45302000,15732000,34369000,-85.57061714,124.6890481,-0.364449145,20
+15559000,36269000,18160000,-4.975784243,-156.8789425,-0.012893853,22
+16552000,14570000,39763000,-39.2579671,75.22960824,-0.281792015,Nan
+11353000,13410000,38311000,8.610608538,-36.43103437,-0.196021206,9
+12383000,49302000,33539000,69.26506588,-109.0830926,-0.147483079,34
+44302000,21387000,23434000,16.14574541,78.81171702,0.115624185,5
+43107000,14206000,24728000,37.57233254,142.6103028,,Nan
+49320000,43878000,24240000,-39.10527498,149.2751575,-0.086246397,29
+37519000,40514000,16409000,-24.14434437,157.2871976,-0.071946303,12
+37202000,40122000,42551000,-79.88824934,-124.089513,0.375414362,31
+12783000,11757000,25348000,-11.83866388,118.2423568,-0.243289139,Nan
+39621000,30560000,15929000,75.8365484,-95.18288548,-0.399996182,37
+10937000,15183000,21413000,-32.40573,-157.8337361,-0.202310776,39
+39411000,12532000,44006000,34.67409469,-83.29512212,,Nan
+47905000,25552000,28902000,36.19437814,52.25734185,,32
+28426000,45268000,27886000,-70.843469,-63.7321218,0.112287307,45
+15026000,45897000,23911000,-89.01161062,10.16376248,-0.00400866,Nan
+24625000,14844000,12837000,88.91663258,169.8003753,-0.151728888,5
+46304000,21144000,24421000,-41.58069299,59.63971512,-0.371030712,48
+29558000,10724000,27312000,9.663492403,-71.18121738,0.344402457,Nan
+49636000,27202000,24626000,59.46440387,-92.91431055,0.26256468,31
+38603000,23794000,41040000,70.45128929,-67.84861911,-0.184920666,48
+37336000,21742000,40982000,-15.69131418,134.6754731,0.078786176,15
+35128000,38725000,25244000,2.279345664,34.91612867,0.091098807,44
+30419000,33591000,39512000,-56.16030331,133.9105282,-0.590693487,8
+18665000,11189000,45438000,-45.68302316,-85.35524485,0.046936859,26
+15442000,36392000,16074000,81.4389588,-56.70945587,0.038804669,5
+43378000,27900000,38748000,-74.35249265,-133.1884413,0.429053963,17
+44424000,19982000,13528000,-81.19709235,49.49364675,0.115926289,47
+42733000,15383000,28933000,75.17020088,-11.11330632,0.127627239,32
+40144000,46822000,29588000,-81.25577073,-135.8002245,0.346061193,33
+16927000,38232000,43931000,-80.97022269,157.7565432,-0.096039391,39
+38910000,36030000,38003000,-37.79005665,-1.5474944,0.107402594,11
+48340000,38510000,39290000,21.94846638,-112.6129615,0.230803493,3
+17258000,45665000,27152000,80.73726495,-31.33714033,-0.079079307,10
+48363000,39701000,11905000,11.83766221,-69.99777106,-0.002514692,3
+27660000,29370000,26029000,8.179457229,147.7719143,-0.006520509,31
+47106000,30527000,17038000,73.00898959,9.988869939,0.797492967,5
+10471000,37521000,35398000,57.46145065,-29.5045034,-0.261313809,39
+27774000,44082000,40036000,78.47974779,-4.998179635,0.437739286,24
+46887000,20413000,36649000,51.11098102,-136.3276432,0.237434245,41
+10093000,46706000,19187000,-58.41750426,-157.9933447,0.275586609,45
+49093000,36514000,38499000,-55.41355694,150.177605,0.576467955,21
+48945000,49826000,23225000,-63.91174083,-177.7191007,0.475443991,Nan
+26852000,28926000,32243000,-77.854481,116.9006581,,1
+34219000,34787000,30801000,-62.32990484,23.24232366,0.089523916,40
+31075000,30369000,36898000,-77.78314619,38.69526825,-0.046423443,7
+28135000,21412000,25552000,-7.411565773,-88.65122734,0.258690016,Nan
+13347000,15980000,43094000,74.71054756,-37.32614369,,7
+26928000,31159000,16653000,-32.74503199,146.7695347,0.576290488,34
+12364000,14374000,43646000,28.70641859,-92.35199713,-0.059531367,16
+38991000,49388000,48534000,56.70658222,8.014973542,-0.173400177,30
+17180000,14935000,11680000,-45.39957586,102.5726701,0.16285705,1
+27666000,29337000,44778000,89.4063742,-79.68068618,0.044140443,41
+13660000,11108000,37986000,57.03349279,7.98684928,0.066242706,24
+36910000,10252000,41657000,-9.906961203,21.79114496,-0.378241692,6
+21785000,20095000,14903000,77.49612237,-84.68789002,-0.071118836,16
+33363000,42124000,39814000,-64.47776113,-30.79591997,0.371115832,35
+42758000,48892000,44762000,42.39782697,-32.55868099,-0.146011285,1
+16590000,22098000,28515000,-36.90992927,-55.27481385,-0.203981239,27
+26448000,45475000,33361000,64.22197115,146.6687002,-0.026210913,1
+41182000,23927000,25075000,-81.55929754,137.9213773,0.042229126,10
+49801000,15636000,39883000,-89.22857667,159.9681504,0.035529624,15
+32725000,13037000,49874000,-55.17873101,61.01413612,0.519438664,43
+31130000,16471000,41939000,-45.36963748,-156.5100924,0.245045969,22
+19599000,37119000,26468000,-26.58523044,174.7731562,-0.210527713,22
+30024000,23097000,14711000,44.31464407,150.7894846,-0.041347399,45
+39567000,48586000,49391000,1.721781555,156.1687027,,31
+46249000,28249000,32393000,-13.3221674,-176.0644697,-0.108879159,30
+12180000,20488000,46288000,36.02858732,30.43526779,-0.099205446,47
+29659000,40098000,45152000,72.15373455,62.01511311,,46
+41026000,19309000,15845000,-38.63636224,145.9569745,-0.083266866,32
+47146000,39852000,26666000,35.2426196,-33.97130609,-0.650089141,7
+39958000,46945000,11789000,-68.31344333,172.4154216,0.001713968,37
+25921000,13147000,22257000,-15.89505915,-150.39693,0.165178387,37
+28892000,28329000,49094000,-58.72206735,-157.3776844,-0.228068143,48
+29563000,48312000,45703000,86.78718085,179.1386066,-0.146072441,49
+46127000,46582000,13462000,39.98033674,-164.152123,-0.081830298,17
+23268000,24051000,48652000,-43.61767649,83.51428751,-0.106824408,45
+22163000,26901000,28702000,51.04347167,169.7632117,0.052782471,31
+46968000,17027000,25787000,-73.8664022,2.915300454,-0.028069047,22
+24148000,44640000,15422000,8.379412685,101.9542853,-0.049339904,14
+11566000,26486000,11735000,-36.78748293,-129.8960512,,Nan
+11063000,38883000,16772000,-65.43894139,105.6607872,,7
+43081000,16718000,45813000,-2.464830259,87.07999887,-0.24057898,40
diff --git a/data/assets/examples/pointclouds/data/dummydata.label b/data/assets/examples/pointclouds/data/dummydata.label
new file mode 100644
index 0000000000..fb38a1f3e0
--- /dev/null
+++ b/data/assets/examples/pointclouds/data/dummydata.label
@@ -0,0 +1,100 @@
+13428000 26239000 45870000 id P0 text Point 0
+14727000 45282000 10832000 id P1 text Point 1
+24999000 28370000 19911000 id P2 text Point 2
+26539000 36165000 39582000 id P3 text Point 3
+49056000 24775000 14626000 id P4 text Point 4
+43965000 21472000 18760000 id P5 text Point 5
+15661000 28429000 16965000 id P6 text Point 6
+25046000 36006000 49453000 id P7 text Point 7
+13797000 34811000 18825000 id P8 text Point 8
+13879000 14824000 41472000 id P9 text Point 9
+11481000 20480000 25925000 id P10 text Point 10
+45032000 16606000 23537000 id P11 text Point 11
+14395000 34940000 21968000 id P12 text Point 12
+15945000 21478000 29536000 id P13 text Point 13
+13458000 19017000 18542000 id P14 text Point 14
+45302000 15732000 34369000 id P15 text Point 15
+15559000 36269000 18160000 id P16 text Point 16
+16552000 14570000 39763000 id P17 text Point 17
+11353000 13410000 38311000 id P18 text Point 18
+12383000 49302000 33539000 id P19 text Point 19
+44302000 21387000 23434000 id P20 text Point 20
+43107000 14206000 24728000 id P21 text Point 21
+49320000 43878000 24240000 id P22 text Point 22
+37519000 40514000 16409000 id P23 text Point 23
+37202000 40122000 42551000 id P24 text Point 24
+12783000 11757000 25348000 id P25 text Point 25
+39621000 30560000 15929000 id P26 text Point 26
+10937000 15183000 21413000 id P27 text Point 27
+39411000 12532000 44006000 id P28 text Point 28
+47905000 25552000 28902000 id P29 text Point 29
+28426000 45268000 27886000 id P30 text Point 30
+15026000 45897000 23911000 id P31 text Point 31
+24625000 14844000 12837000 id P32 text Point 32
+46304000 21144000 24421000 id P33 text Point 33
+29558000 10724000 27312000 id P34 text Point 34
+49636000 27202000 24626000 id P35 text Point 35
+38603000 23794000 41040000 id P36 text Point 36
+37336000 21742000 40982000 id P37 text Point 37
+35128000 38725000 25244000 id P38 text Point 38
+30419000 33591000 39512000 id P39 text Point 39
+18665000 11189000 45438000 id P40 text Point 40
+15442000 36392000 16074000 id P41 text Point 41
+43378000 27900000 38748000 id P42 text Point 42
+44424000 19982000 13528000 id P43 text Point 43
+42733000 15383000 28933000 id P44 text Point 44
+40144000 46822000 29588000 id P45 text Point 45
+16927000 38232000 43931000 id P46 text Point 46
+38910000 36030000 38003000 id P47 text Point 47
+48340000 38510000 39290000 id P48 text Point 48
+17258000 45665000 27152000 id P49 text Point 49
+48363000 39701000 11905000 id P50 text Point 50
+27660000 29370000 26029000 id P51 text Point 51
+47106000 30527000 17038000 id P52 text Point 52
+10471000 37521000 35398000 id P53 text Point 53
+27774000 44082000 40036000 id P54 text Point 54
+46887000 20413000 36649000 id P55 text Point 55
+10093000 46706000 19187000 id P56 text Point 56
+49093000 36514000 38499000 id P57 text Point 57
+48945000 49826000 23225000 id P58 text Point 58
+26852000 28926000 32243000 id P59 text Point 59
+34219000 34787000 30801000 id P60 text Point 60
+31075000 30369000 36898000 id P61 text Point 61
+28135000 21412000 25552000 id P62 text Point 62
+13347000 15980000 43094000 id P63 text Point 63
+26928000 31159000 16653000 id P64 text Point 64
+12364000 14374000 43646000 id P65 text Point 65
+38991000 49388000 48534000 id P66 text Point 66
+17180000 14935000 11680000 id P67 text Point 67
+27666000 29337000 44778000 id P68 text Point 68
+13660000 11108000 37986000 id P69 text Point 69
+36910000 10252000 41657000 id P70 text Point 70
+21785000 20095000 14903000 id P71 text Point 71
+33363000 42124000 39814000 id P72 text Point 72
+42758000 48892000 44762000 id P73 text Point 73
+16590000 22098000 28515000 id P74 text Point 74
+26448000 45475000 33361000 id P75 text Point 75
+41182000 23927000 25075000 id P76 text Point 76
+49801000 15636000 39883000 id P77 text Point 77
+32725000 13037000 49874000 id P78 text Point 78
+31130000 16471000 41939000 id P79 text Point 79
+19599000 37119000 26468000 id P80 text Point 80
+30024000 23097000 14711000 id P81 text Point 81
+39567000 48586000 49391000 id P82 text Point 82
+46249000 28249000 32393000 id P83 text Point 83
+12180000 20488000 46288000 id P84 text Point 84
+29659000 40098000 45152000 id P85 text Point 85
+41026000 19309000 15845000 id P86 text Point 86
+47146000 39852000 26666000 id P87 text Point 87
+39958000 46945000 11789000 id P88 text Point 88
+25921000 13147000 22257000 id P89 text Point 89
+28892000 28329000 49094000 id P90 text Point 90
+29563000 48312000 45703000 id P91 text Point 91
+46127000 46582000 13462000 id P92 text Point 92
+23268000 24051000 48652000 id P93 text Point 93
+22163000 26901000 28702000 id P94 text Point 94
+46968000 17027000 25787000 id P95 text Point 95
+24148000 44640000 15422000 id P96 text Point 96
+11566000 26486000 11735000 id P97 text Point 97
+11063000 38883000 16772000 id P98 text Point 98
+43081000 16718000 45813000 id P99 text Point 99
diff --git a/data/assets/examples/pointclouds/points.asset b/data/assets/examples/pointclouds/points.asset
new file mode 100644
index 0000000000..8007829406
--- /dev/null
+++ b/data/assets/examples/pointclouds/points.asset
@@ -0,0 +1,236 @@
+local earthAsset = asset.require("scene/solarsystem/planets/earth/earth")
+
+
+
+-- Color mapped points close to Earth, with some different settings for color and
+-- sizing, and a StaticRotation that makes them not overlap
+
+-- Point cloud with fixed color and default size (fixed)
+local FixedColor_FixedSize = {
+ Identifier = "ExamplePoints_FixedSize",
+ Parent = earthAsset.Earth.Identifier,
+ Renderable = {
+ Type = "RenderablePointCloud",
+ File = asset.resource("data/dummydata.csv"),
+ Coloring = {
+ FixedColor = { 0.0, 0.5, 0.0 }
+ }
+ },
+ GUI = {
+ Name = "Fixed Color / Fixed Size",
+ Path = "/Example/Point Clouds",
+ Description = "Point cloud with a fixed color and fixed sizing"
+ }
+}
+
+-- Point cloud with fixed color and size scaling that is limited by a certain size
+local FixedColor_MaxSize = {
+ Identifier = "ExamplePoints_MaxSize",
+ Parent = earthAsset.Earth.Identifier,
+ Transform = {
+ Rotation = {
+ Type = "StaticRotation",
+ Rotation = { 0, 0, 0.5 * math.pi }
+ }
+ },
+ Renderable = {
+ Type = "RenderablePointCloud",
+ File = asset.resource("data/dummydata.csv"),
+ Coloring = {
+ FixedColor = { 0.0, 1.0, 1.0 }
+ },
+ SizeSettings = {
+ MaxSize = 0.7,
+ EnableMaxSizeControl = true
+ }
+ },
+ GUI = {
+ Name = "Fixed Color / Max Size",
+ Path = "/Example/Point Clouds",
+ Description = "Point cloud with a fixed color and sizing with a given max size"
+ }
+}
+
+-- Point cloud with color mapping and fixed point sizing
+local ColorMapped_FixedSize = {
+ Identifier = "ExamplePoints_ColorMapped",
+ Parent = earthAsset.Earth.Identifier,
+ Transform = {
+ Rotation = {
+ Type = "StaticRotation",
+ Rotation = { 0, 0, -0.5 * math.pi }
+ }
+ },
+ Renderable = {
+ Type = "RenderablePointCloud",
+ File = asset.resource("data/dummydata.csv"),
+ Coloring = {
+ ColorMapping = {
+ File = asset.resource("viridis.cmap")
+ }
+ },
+ SizeSettings = {
+ -- Here we set the exponent for the scale explicitly, to a value that
+ -- gives the points a suitable size based on their world-space coordinates
+ ScaleExponent = 6.5
+ }
+ },
+ GUI = {
+ Name = "Color Mapped",
+ Path = "/Example/Point Clouds",
+ Description = "Color mapped point cloud with fixed sizing"
+ }
+}
+
+-- Point cloud with fixed color and size scaling from a selected data column
+local FixedColor_ScaleBasedOnData = {
+ Identifier = "ExamplePoints_ScaleFromData",
+ Parent = earthAsset.Earth.Identifier,
+ Transform = {
+ Rotation = {
+ Type = "StaticRotation",
+ Rotation = { 0, 0.5 * math.pi, 0 }
+ }
+ },
+ Renderable = {
+ Type = "RenderablePointCloud",
+ File = asset.resource("data/dummydata.csv"),
+ Coloring = {
+ FixedColor = { 0.5, 0.5, 0.0 }
+ },
+ SizeSettings = {
+ -- The options for the columns that the points can be scaled by. The first
+ -- alternative is chosen per default
+ SizeMapping = { "number_withNan", "a" },
+ -- Use a slightly smaller scale than above for the base size of the points
+ -- (will decide the size of the smallest point). That way, the points don't
+ -- become too big when scaled by the data parameter
+ ScaleExponent = 5
+ }
+ },
+ GUI = {
+ Name = "Fixed Color / Size From Data",
+ Path = "/Example/Point Clouds",
+ Description = [[Point cloud with a fixed color and sizing that can be set based on a
+ column in the dataset]]
+ }
+}
+
+-- Point cloud with textures. Textured points can also be color mapped, but here it
+-- is disabled per default
+local Textured = {
+ Identifier = "ExamplePoints_Textured",
+ Parent = earthAsset.Earth.Identifier,
+ Transform = {
+ Rotation = {
+ Type = "StaticRotation",
+ Rotation = { 0, math.pi, 0 }
+ }
+ },
+ Renderable = {
+ Type = "RenderablePointCloud",
+ File = asset.resource("data/dummydata.csv"),
+ -- The path to the texture file. Here we use openspace.absPath so that we can use
+ -- the ${DATA} token to get the path to a texture in the "OpenSpace/data" folder,
+ -- but for a file at a relative location it would also work to use asset.resource,
+ -- like for the data file above
+ Texture = openspace.absPath("${DATA}/test3.jpg"),
+ -- Disable additive blending, so that points will be rendered with their actual color
+ -- and overlapping points will be sorted by depth. This works best when the points
+ -- have an opacity of 1
+ UseAdditiveBlending = false,
+ Coloring = {
+ ColorMapping = {
+ -- Disable color map per default. When enabled, the texture color will be
+ -- multiplied with the color from the color map
+ Enabled = false,
+ File = asset.resource("viridis.cmap")
+ }
+ }
+ },
+ GUI = {
+ Name = "Textured",
+ Path = "/Example/Point Clouds",
+ Description = "Point cloud with a texture per point"
+ }
+}
+
+-- Point cloud with more advanced color mapping and fixed point sizing.
+-- Here we have predefined a couple of parameters to use for the color mapping.
+-- Also, missing/NaN values are mapped to a specific color.
+-- Finally, no additive blending is used for the color, meaning that the color of
+-- overlapping points will not be mixed/added
+local ColorMappedAdvanced_NoBlend = {
+ Identifier = "ExamplePoints_ColorMappedNoBlend",
+ Parent = earthAsset.Earth.Identifier,
+ Transform = {
+ Rotation = {
+ Type = "StaticRotation",
+ Rotation = { 0, 0, math.pi }
+ }
+ },
+ Renderable = {
+ Type = "RenderablePointCloud",
+ File = asset.resource("data/dummydata.csv"),
+ UseAdditiveBlending = false, -- Disable additive blending
+ Coloring = {
+ ColorMapping = {
+ File = asset.resource("viridis.cmap"),
+ ParameterOptions = {
+ { Key = "number_withNan" }, -- no range => compute min and max
+ { Key = "normaldist_withMissing", Range = { -0.5, 0.5 } }
+ },
+ ShowMissingData = true,
+ NoDataColor = { 0.5, 0.5, 0.5, 1.0 }
+ }
+ },
+ SizeSettings = {
+ ScaleExponent = 6.5
+ }
+ },
+ GUI = {
+ Name = "Color Mapped (Advanced) - No blending",
+ Path = "/Example/Point Clouds",
+ Description = [[Color mapped point cloud without additive blending, with missing
+ values shown in grey, and a limited choice of parameter options to use for
+ the color mapping.]]
+ }
+}
+
+
+asset.onInitialize(function()
+ openspace.addSceneGraphNode(FixedColor_FixedSize)
+ openspace.addSceneGraphNode(FixedColor_MaxSize)
+ openspace.addSceneGraphNode(FixedColor_ScaleBasedOnData)
+ openspace.addSceneGraphNode(Textured)
+ openspace.addSceneGraphNode(ColorMapped_FixedSize)
+ openspace.addSceneGraphNode(ColorMappedAdvanced_NoBlend)
+end)
+
+asset.onDeinitialize(function()
+ openspace.removeSceneGraphNode(ColorMappedAdvanced_NoBlend)
+ openspace.removeSceneGraphNode(ColorMapped_FixedSize)
+ openspace.removeSceneGraphNode(Textured)
+ openspace.removeSceneGraphNode(FixedColor_ScaleBasedOnData)
+ openspace.removeSceneGraphNode(FixedColor_MaxSize)
+ openspace.removeSceneGraphNode(FixedColor_FixedSize)
+end)
+
+asset.export(FixedColor_FixedSize)
+asset.export(FixedColor_MaxSize)
+asset.export(FixedColor_ScaleBasedOnData)
+asset.export(Textured)
+asset.export(ColorMapped_FixedSize)
+asset.export(ColorMappedAdvanced_NoBlend)
+
+
+
+asset.meta = {
+ Name = "Example - Point Clouds",
+ Version = "1.0",
+ Description = [[Examples of point clouds with a few different settings for sizing and
+ coloring]],
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/examples/pointclouds/points_colormappingsettings.asset b/data/assets/examples/pointclouds/points_colormappingsettings.asset
new file mode 100644
index 0000000000..83ca91f125
--- /dev/null
+++ b/data/assets/examples/pointclouds/points_colormappingsettings.asset
@@ -0,0 +1,78 @@
+local earthAsset = asset.require("scene/solarsystem/planets/earth/earth")
+
+
+
+local Example = {
+ Identifier = "ExamplePoints_ColorMapping",
+ Parent = earthAsset.Earth.Identifier,
+ Renderable = {
+ Type = "RenderablePointCloud",
+ File = asset.resource("data/dummydata.csv"),
+ Coloring = {
+ ColorMapping = {
+ File = asset.resource("viridis.cmap"),
+ -- Set the default choice of parameter and value range explicitly. Values
+ -- outside this range will be given special colors
+ Parameter = "normaldist_withMissing",
+ ValueRange = { -0.25, 0.25 },
+ -- Show missing data values, so we can show these in a specific color
+ ShowMissingData = true,
+ -- Color for missing data points
+ NoDataColor = { 1.0, 0.0, 0.0, 1.0 },
+ -- Color for point with values above the given range. If not set, or if
+ -- UseAboveRangeColor is false, the color will be set to the last value
+ -- in the color map (as per default)
+ AboveRangeColor = { 0.0, 1.0, 0.0, 1.0 },
+ -- Color for point with values below the given range. If not set, or if
+ -- UseAboveRangeColor is false, the color will be set to the first value
+ -- in the color map (as per default)
+ BelowRangeColor = { 0.0, 0.0, 1.0, 1.0 },
+
+ -- Some other parameters that can be set are the following (these are all the
+ -- default values):
+
+ -- If true, completely hide all values outside the range
+ HideValuesOutsideRange = false,
+ -- Toggle whether the above range color should be used
+ UseAboveRangeColor = true,
+ -- Toggle whether the below range color should be used
+ UseBelowRangeColor = true
+ }
+ },
+ SizeSettings = {
+ -- Reduce the size of the point a little bit so that they don't overlap so much
+ ScaleFactor = 0.5
+ }
+ },
+ GUI = {
+ Name = "Advanced Color Mapping Settings",
+ Path = "/Example/Point Clouds",
+ Description = [[Example of a point cloud where the range is set explicitly and
+ specific colors are used for values outside the range, as well as for missing
+ data values.]]
+ }
+}
+
+
+asset.onInitialize(function()
+ openspace.addSceneGraphNode(Example)
+end)
+
+asset.onDeinitialize(function()
+ openspace.removeSceneGraphNode(Example)
+end)
+
+asset.export(Example)
+
+
+
+asset.meta = {
+ Name = "Example - Advanced Color Mapping Settings",
+ Version = "1.0",
+ Description = [[Example of a point cloud where the range is set explicitly and
+ specific colors are used for values outside the range, as well as for missing
+ data values]],
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/examples/pointclouds/points_datamapping.asset b/data/assets/examples/pointclouds/points_datamapping.asset
new file mode 100644
index 0000000000..791e945257
--- /dev/null
+++ b/data/assets/examples/pointclouds/points_datamapping.asset
@@ -0,0 +1,68 @@
+local earthAsset = asset.require("scene/solarsystem/planets/earth/earth")
+
+
+
+local Example = {
+ Identifier = "ExamplePoints_DataMapping",
+ Parent = earthAsset.Earth.Identifier,
+ Renderable = {
+ Type = "RenderablePointCloud",
+ File = asset.resource("data/dummydata.csv"),
+ DataMapping = {
+ -- Using the DataMapping, we can specify the X, Y and Z values of the point
+ -- positions to be set by any value in the dataset, without changing the dataset
+ -- used for the rendering
+ X = "a",
+ Y = "b",
+ Z = "a",
+ -- It is also possible to specify a numeric value that corresponds to missing
+ -- values in the dataset. These will be interpreted as NaN values
+ MissingDataValue = 29,
+ -- And some column that we do not want to include in the loading. Here we can for
+ -- example skip the regular position columns
+ ExcludeColumns = { "x", "y", "z" }
+ },
+ -- Interpret values as Parsec rather than meter. The values in the a and b columns
+ -- are much smaller than the x, y and z
+ Unit = "pc",
+ -- To show the values corresponding to missing values, use a color map and show
+ -- missing data values in a specific color
+ Coloring = {
+ ColorMapping = {
+ File = asset.resource("viridis.cmap"),
+ ShowMissingData = true,
+ NoDataColor = { 1.0, 0.0, 0.0, 1.0 }
+ }
+ },
+ },
+ GUI = {
+ Name = "Data Mapping",
+ Path = "/Example/Point Clouds",
+ Description = [[Example of a point cloud where the X, Y and Z position are mapped to
+ other columns in the dataset.]]
+ }
+}
+
+
+asset.onInitialize(function()
+ openspace.addSceneGraphNode(Example)
+end)
+
+asset.onDeinitialize(function()
+ openspace.removeSceneGraphNode(Example)
+end)
+
+asset.export(Example)
+
+
+
+asset.meta = {
+ Name = "Example - Point Cloud with Custom Data Mapping",
+ Version = "1.0",
+ Description = [[Example of a point cloud where the X, Y and Z position are mapped to
+ other columns in the dataset. The data mapping also includes some settings for
+ missing data values and columns to exclude when loading the dataset]],
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/examples/pointclouds/points_fading.asset b/data/assets/examples/pointclouds/points_fading.asset
new file mode 100644
index 0000000000..2b9b5ea604
--- /dev/null
+++ b/data/assets/examples/pointclouds/points_fading.asset
@@ -0,0 +1,88 @@
+local earthAsset = asset.require("scene/solarsystem/planets/earth/earth")
+
+
+
+local EarthRadius = 6371000
+
+local Example = {
+ Identifier = "ExamplePoints_Fading",
+ Parent = earthAsset.Earth.Identifier,
+ Renderable = {
+ Type = "RenderablePointCloud",
+ File = asset.resource("data/dummydata.csv"),
+ Coloring = {
+ FixedColor = { 0.0, 0.3, 1.0 }
+ },
+ Fading = {
+ -- Control at what distance the points fade in. The points will be invisible
+ -- when the camera is closer than the first value, and fully visible when the
+ -- camera is further away then the last value. In-between they will linearly
+ -- fade in or out
+ FadeInDistances = { 15.0 * EarthRadius, 35.0 * EarthRadius }
+ }
+ },
+ GUI = {
+ Name = "PointCloud - Fading",
+ Path = "/Example/Point Clouds",
+ Description = [[Example of a point cloud with distance-based fading (the points
+ are visible when the camera reaches a certain distance away from the origin)]]
+ }
+}
+
+local Example_Invert = {
+ Identifier = "ExamplePoints_FadingInverted",
+ Parent = earthAsset.Earth.Identifier,
+ -- Rotate so that the points don't overlap with the previous ones
+ Transform = {
+ Rotation = {
+ Type = "StaticRotation",
+ Rotation = { 0, math.pi, 0 }
+ }
+ },
+ Renderable = {
+ Type = "RenderablePointCloud",
+ File = asset.resource("data/dummydata.csv"),
+ Coloring = {
+ FixedColor = { 1.0, 0.3, 0.0 }
+ },
+ Fading = {
+ -- Use the same fade distances, but invert the fading so that the points are
+ -- visible when the camera is closer to the origin that the first value, and
+ -- invisible when further away than the last value
+ FadeInDistances = { 15.0 * EarthRadius, 35.0 * EarthRadius },
+ Invert = true
+ }
+ },
+ GUI = {
+ Name = "PointCloud - Fading (Inverted)",
+ Path = "/Example/Point Clouds",
+ Description = [[Example of a point cloud with inverted distance-based fading
+ (the points are visible when the camera is close to the origin, and invisible
+ when further away)]]
+ }
+}
+
+
+asset.onInitialize(function()
+ openspace.addSceneGraphNode(Example)
+ openspace.addSceneGraphNode(Example_Invert)
+end)
+
+asset.onDeinitialize(function()
+ openspace.removeSceneGraphNode(Example_Invert)
+ openspace.removeSceneGraphNode(Example)
+end)
+
+asset.export(Example)
+asset.export(Example_Invert)
+
+
+
+asset.meta = {
+ Name = "Example - Point Cloud with Fading",
+ Version = "1.0",
+ Description = [[Example of a point cloud with distance-based fading]],
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/examples/pointclouds/points_units_labels.asset b/data/assets/examples/pointclouds/points_units_labels.asset
new file mode 100644
index 0000000000..e124879bcb
--- /dev/null
+++ b/data/assets/examples/pointclouds/points_units_labels.asset
@@ -0,0 +1,98 @@
+local earthAsset = asset.require("scene/solarsystem/planets/earth/earth")
+
+-- @TODO The labels are not correctly oriented towards the camera!
+
+local Example = {
+ Identifier = "ExamplePoints_UnitsAndLabels",
+ Parent = earthAsset.Earth.Identifier,
+ Renderable = {
+ Type = "RenderablePointCloud",
+ File = asset.resource("data/dummydata.csv"),
+ Coloring = {
+ FixedColor = { 0.3, 0.8, 0.3 }
+ },
+ DataMapping = {
+ -- When loading labels from a CSV file, we need to provide information about
+ -- which column corresponds to the name to be used for the labels (this is
+ -- not required for SPECK files)
+ Name = "number_withNan"
+ },
+ -- Add a unit to interpret the points to be in kilometers rather than meters
+ Unit = "Km",
+ -- Add some labels. We also need to enable them for them to be visible.
+ -- Since we do not specify a label file (see below), the positions and text of
+ -- of the labels will be set based on the information in the CSV file
+ Labels = {
+ Enabled = true,
+ Size = 7.5
+ }
+ },
+ GUI = {
+ Name = "Units & Labels",
+ Path = "/Example/Point Clouds",
+ Description = [[Example of a point cloud with labels created by specifying a 'Name'
+ column for the dataset. The positions of the labels will exactly match that of the
+ points]]
+ }
+}
+
+local Example_LabelFromFile = {
+ Identifier = "ExamplePoints_UnitsAndLabels_File",
+ Parent = earthAsset.Earth.Identifier,
+ -- Rotate to not overlap with the other dataset
+ Transform = {
+ Rotation = {
+ Type = "StaticRotation",
+ Rotation = { 0, 0, -0.5 * math.pi }
+ }
+ },
+ Renderable = {
+ Type = "RenderablePointCloud",
+ File = asset.resource("data/dummydata.csv"),
+ Coloring = {
+ FixedColor = { 0.0, 0.3, 1.0 }
+ },
+ -- Add a unit to interpret the points to be in kilometers rather than meters
+ Unit = "Km",
+ -- Also load a label file with the positions of the label (in this case they are the
+ -- same as in the CSV file, but that is not always the case)
+ Labels = {
+ Enabled = true,
+ File = asset.resource("data/dummydata.label"),
+ Size = 7.5,
+ -- When we add an explicit label file we also have to specify the unit, if it is
+ -- different than meters
+ Unit = "Km"
+ }
+ },
+ GUI = {
+ Name = "Units & Labels (Explicit Label file)",
+ Path = "/Example/Point Clouds",
+ Description = [[Example of a point cloud with labels, created from a label file]]
+ }
+}
+
+
+asset.onInitialize(function()
+ openspace.addSceneGraphNode(Example)
+ openspace.addSceneGraphNode(Example_LabelFromFile)
+end)
+
+asset.onDeinitialize(function()
+ openspace.removeSceneGraphNode(Example_LabelFromFile)
+ openspace.removeSceneGraphNode(Example)
+end)
+
+asset.export(Example)
+asset.export(Example_LabelFromFile)
+
+
+asset.meta = {
+ Name = "Example - Point Cloud with Unit and Labels",
+ Version = "1.0",
+ Description = [[Example of point clouds with labels, either set from the data file
+ itself or from a separate .label file]],
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/examples/pointclouds/polygon_cloud.asset b/data/assets/examples/pointclouds/polygon_cloud.asset
new file mode 100644
index 0000000000..6b2ba10677
--- /dev/null
+++ b/data/assets/examples/pointclouds/polygon_cloud.asset
@@ -0,0 +1,45 @@
+local Example = {
+ Identifier = "ExamplePoints_Polygon",
+ Renderable = {
+ Type = "RenderablePolygonCloud",
+ File = asset.resource("data/dummydata.csv"),
+ Coloring = {
+ FixedColor = { 0.8, 0.0, 0.0 }
+ },
+ -- Specify the number of sides for the polygon. 3 = triangle, 4 = square,
+ -- 5 = pentagon, 6 = hexagon, and so on
+ PolygonSides = 6,
+ -- Scale up the dataset, so that it is interpreted in Kilometers instead of meters,
+ -- for increased visiblity
+ Unit = "Km"
+ },
+ GUI = {
+ Name = "Polygon Cloud",
+ Path = "/Example/Point Clouds",
+ Description = [[Example of a polygon cloud, which is a point cloud where a uniform
+ polygon is used for the shape of the points]]
+ }
+}
+
+
+asset.onInitialize(function()
+ openspace.addSceneGraphNode(Example)
+end)
+
+asset.onDeinitialize(function()
+ openspace.removeSceneGraphNode(Example)
+end)
+
+asset.export(Example)
+
+
+
+asset.meta = {
+ Name = "Example - Polygon Cloud",
+ Version = "1.0",
+ Description = [[Example of a polygon cloud, which is a point cloud where a uniform
+ polygon is used for the shape of the points]],
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/examples/pointclouds/viridis.cmap b/data/assets/examples/pointclouds/viridis.cmap
new file mode 100644
index 0000000000..2c00fba35d
--- /dev/null
+++ b/data/assets/examples/pointclouds/viridis.cmap
@@ -0,0 +1,258 @@
+# Viridis Color map
+256
+0.267004 0.004874 0.329415 1.000000
+0.268510 0.009605 0.335427 1.000000
+0.269944 0.014625 0.341379 1.000000
+0.271305 0.019942 0.347269 1.000000
+0.272594 0.025563 0.353093 1.000000
+0.273809 0.031497 0.358853 1.000000
+0.274952 0.037752 0.364543 1.000000
+0.276022 0.044167 0.370164 1.000000
+0.277018 0.050344 0.375715 1.000000
+0.277941 0.056324 0.381191 1.000000
+0.278791 0.062145 0.386592 1.000000
+0.279566 0.067836 0.391917 1.000000
+0.280267 0.073417 0.397163 1.000000
+0.280894 0.078907 0.402329 1.000000
+0.281446 0.084320 0.407414 1.000000
+0.281924 0.089666 0.412415 1.000000
+0.282327 0.094955 0.417331 1.000000
+0.282656 0.100196 0.422160 1.000000
+0.282910 0.105393 0.426902 1.000000
+0.283091 0.110553 0.431554 1.000000
+0.283197 0.115680 0.436115 1.000000
+0.283229 0.120777 0.440584 1.000000
+0.283187 0.125848 0.444960 1.000000
+0.283072 0.130895 0.449241 1.000000
+0.282884 0.135920 0.453427 1.000000
+0.282623 0.140926 0.457517 1.000000
+0.282290 0.145912 0.461510 1.000000
+0.281887 0.150881 0.465405 1.000000
+0.281412 0.155834 0.469201 1.000000
+0.280868 0.160771 0.472899 1.000000
+0.280255 0.165693 0.476498 1.000000
+0.279574 0.170599 0.479997 1.000000
+0.278826 0.175490 0.483397 1.000000
+0.278012 0.180367 0.486697 1.000000
+0.277134 0.185228 0.489898 1.000000
+0.276194 0.190074 0.493001 1.000000
+0.275191 0.194905 0.496005 1.000000
+0.274128 0.199721 0.498911 1.000000
+0.273006 0.204520 0.501721 1.000000
+0.271828 0.209303 0.504434 1.000000
+0.270595 0.214069 0.507052 1.000000
+0.269308 0.218818 0.509577 1.000000
+0.267968 0.223549 0.512008 1.000000
+0.266580 0.228262 0.514349 1.000000
+0.265145 0.232956 0.516599 1.000000
+0.263663 0.237631 0.518762 1.000000
+0.262138 0.242286 0.520837 1.000000
+0.260571 0.246922 0.522828 1.000000
+0.258965 0.251537 0.524736 1.000000
+0.257322 0.256130 0.526563 1.000000
+0.255645 0.260703 0.528312 1.000000
+0.253935 0.265254 0.529983 1.000000
+0.252194 0.269783 0.531579 1.000000
+0.250425 0.274290 0.533103 1.000000
+0.248629 0.278775 0.534556 1.000000
+0.246811 0.283237 0.535941 1.000000
+0.244972 0.287675 0.537260 1.000000
+0.243113 0.292092 0.538516 1.000000
+0.241237 0.296485 0.539709 1.000000
+0.239346 0.300855 0.540844 1.000000
+0.237441 0.305202 0.541921 1.000000
+0.235526 0.309527 0.542944 1.000000
+0.233603 0.313828 0.543914 1.000000
+0.231674 0.318106 0.544834 1.000000
+0.229739 0.322361 0.545706 1.000000
+0.227802 0.326594 0.546532 1.000000
+0.225863 0.330805 0.547314 1.000000
+0.223925 0.334994 0.548053 1.000000
+0.221989 0.339161 0.548752 1.000000
+0.220057 0.343307 0.549413 1.000000
+0.218130 0.347432 0.550038 1.000000
+0.216210 0.351535 0.550627 1.000000
+0.214298 0.355619 0.551184 1.000000
+0.212395 0.359683 0.551710 1.000000
+0.210503 0.363727 0.552206 1.000000
+0.208623 0.367752 0.552675 1.000000
+0.206756 0.371758 0.553117 1.000000
+0.204903 0.375746 0.553533 1.000000
+0.203063 0.379716 0.553925 1.000000
+0.201239 0.383670 0.554294 1.000000
+0.199430 0.387607 0.554642 1.000000
+0.197636 0.391528 0.554969 1.000000
+0.195860 0.395433 0.555276 1.000000
+0.194100 0.399323 0.555565 1.000000
+0.192357 0.403199 0.555836 1.000000
+0.190631 0.407061 0.556089 1.000000
+0.188923 0.410910 0.556326 1.000000
+0.187231 0.414746 0.556547 1.000000
+0.185556 0.418570 0.556753 1.000000
+0.183898 0.422383 0.556944 1.000000
+0.182256 0.426184 0.557120 1.000000
+0.180629 0.429975 0.557282 1.000000
+0.179019 0.433756 0.557430 1.000000
+0.177423 0.437527 0.557565 1.000000
+0.175841 0.441290 0.557685 1.000000
+0.174274 0.445044 0.557792 1.000000
+0.172719 0.448791 0.557885 1.000000
+0.171176 0.452530 0.557965 1.000000
+0.169646 0.456262 0.558030 1.000000
+0.168126 0.459988 0.558082 1.000000
+0.166617 0.463708 0.558119 1.000000
+0.165117 0.467423 0.558141 1.000000
+0.163625 0.471133 0.558148 1.000000
+0.162142 0.474838 0.558140 1.000000
+0.160665 0.478540 0.558115 1.000000
+0.159194 0.482237 0.558073 1.000000
+0.157729 0.485932 0.558013 1.000000
+0.156270 0.489624 0.557936 1.000000
+0.154815 0.493313 0.557840 1.000000
+0.153364 0.497000 0.557724 1.000000
+0.151918 0.500685 0.557587 1.000000
+0.150476 0.504369 0.557430 1.000000
+0.149039 0.508051 0.557250 1.000000
+0.147607 0.511733 0.557049 1.000000
+0.146180 0.515413 0.556823 1.000000
+0.144759 0.519093 0.556572 1.000000
+0.143343 0.522773 0.556295 1.000000
+0.141935 0.526453 0.555991 1.000000
+0.140536 0.530132 0.555659 1.000000
+0.139147 0.533812 0.555298 1.000000
+0.137770 0.537492 0.554906 1.000000
+0.136408 0.541173 0.554483 1.000000
+0.135066 0.544853 0.554029 1.000000
+0.133743 0.548535 0.553541 1.000000
+0.132444 0.552216 0.553018 1.000000
+0.131172 0.555899 0.552459 1.000000
+0.129933 0.559582 0.551864 1.000000
+0.128729 0.563265 0.551229 1.000000
+0.127568 0.566949 0.550556 1.000000
+0.126453 0.570633 0.549841 1.000000
+0.125394 0.574318 0.549086 1.000000
+0.124395 0.578002 0.548287 1.000000
+0.123463 0.581687 0.547445 1.000000
+0.122606 0.585371 0.546557 1.000000
+0.121831 0.589055 0.545623 1.000000
+0.121148 0.592739 0.544641 1.000000
+0.120565 0.596422 0.543611 1.000000
+0.120092 0.600104 0.542530 1.000000
+0.119738 0.603785 0.541400 1.000000
+0.119512 0.607464 0.540218 1.000000
+0.119423 0.611141 0.538982 1.000000
+0.119483 0.614817 0.537692 1.000000
+0.119699 0.618490 0.536347 1.000000
+0.120081 0.622161 0.534946 1.000000
+0.120638 0.625828 0.533488 1.000000
+0.121380 0.629492 0.531973 1.000000
+0.122312 0.633153 0.530398 1.000000
+0.123444 0.636809 0.528763 1.000000
+0.124780 0.640461 0.527068 1.000000
+0.126326 0.644107 0.525311 1.000000
+0.128087 0.647749 0.523491 1.000000
+0.130067 0.651384 0.521608 1.000000
+0.132268 0.655014 0.519661 1.000000
+0.134692 0.658636 0.517649 1.000000
+0.137339 0.662252 0.515571 1.000000
+0.140210 0.665859 0.513427 1.000000
+0.143303 0.669459 0.511215 1.000000
+0.146616 0.673050 0.508936 1.000000
+0.150148 0.676631 0.506589 1.000000
+0.153894 0.680203 0.504172 1.000000
+0.157851 0.683765 0.501686 1.000000
+0.162016 0.687316 0.499129 1.000000
+0.166383 0.690856 0.496502 1.000000
+0.170948 0.694384 0.493803 1.000000
+0.175707 0.697900 0.491033 1.000000
+0.180653 0.701402 0.488189 1.000000
+0.185783 0.704891 0.485273 1.000000
+0.191090 0.708366 0.482284 1.000000
+0.196571 0.711827 0.479221 1.000000
+0.202219 0.715272 0.476084 1.000000
+0.208030 0.718701 0.472873 1.000000
+0.214000 0.722114 0.469588 1.000000
+0.220124 0.725509 0.466226 1.000000
+0.226397 0.728888 0.462789 1.000000
+0.232815 0.732247 0.459277 1.000000
+0.239374 0.735588 0.455688 1.000000
+0.246070 0.738910 0.452024 1.000000
+0.252899 0.742211 0.448284 1.000000
+0.259857 0.745492 0.444467 1.000000
+0.266941 0.748751 0.440573 1.000000
+0.274149 0.751988 0.436601 1.000000
+0.281477 0.755203 0.432552 1.000000
+0.288921 0.758394 0.428426 1.000000
+0.296479 0.761561 0.424223 1.000000
+0.304148 0.764704 0.419943 1.000000
+0.311925 0.767822 0.415586 1.000000
+0.319809 0.770914 0.411152 1.000000
+0.327796 0.773980 0.406640 1.000000
+0.335885 0.777018 0.402049 1.000000
+0.344074 0.780029 0.397381 1.000000
+0.352360 0.783011 0.392636 1.000000
+0.360741 0.785964 0.387814 1.000000
+0.369214 0.788888 0.382914 1.000000
+0.377779 0.791781 0.377939 1.000000
+0.386433 0.794644 0.372886 1.000000
+0.395174 0.797475 0.367757 1.000000
+0.404001 0.800275 0.362552 1.000000
+0.412913 0.803041 0.357269 1.000000
+0.421908 0.805774 0.351910 1.000000
+0.430983 0.808473 0.346476 1.000000
+0.440137 0.811138 0.340967 1.000000
+0.449368 0.813768 0.335384 1.000000
+0.458674 0.816363 0.329727 1.000000
+0.468053 0.818921 0.323998 1.000000
+0.477504 0.821444 0.318195 1.000000
+0.487026 0.823929 0.312321 1.000000
+0.496615 0.826376 0.306377 1.000000
+0.506271 0.828786 0.300362 1.000000
+0.515992 0.831158 0.294279 1.000000
+0.525776 0.833491 0.288127 1.000000
+0.535621 0.835785 0.281908 1.000000
+0.545524 0.838039 0.275626 1.000000
+0.555484 0.840254 0.269281 1.000000
+0.565498 0.842430 0.262877 1.000000
+0.575563 0.844566 0.256415 1.000000
+0.585678 0.846661 0.249897 1.000000
+0.595839 0.848717 0.243329 1.000000
+0.606045 0.850733 0.236712 1.000000
+0.616293 0.852709 0.230052 1.000000
+0.626579 0.854645 0.223353 1.000000
+0.636902 0.856542 0.216620 1.000000
+0.647257 0.858400 0.209861 1.000000
+0.657642 0.860219 0.203082 1.000000
+0.668054 0.861999 0.196293 1.000000
+0.678489 0.863742 0.189503 1.000000
+0.688944 0.865448 0.182725 1.000000
+0.699415 0.867117 0.175971 1.000000
+0.709898 0.868751 0.169257 1.000000
+0.720391 0.870350 0.162603 1.000000
+0.730889 0.871916 0.156029 1.000000
+0.741388 0.873449 0.149561 1.000000
+0.751884 0.874951 0.143228 1.000000
+0.762373 0.876424 0.137064 1.000000
+0.772852 0.877868 0.131109 1.000000
+0.783315 0.879285 0.125405 1.000000
+0.793760 0.880678 0.120005 1.000000
+0.804182 0.882046 0.114965 1.000000
+0.814576 0.883393 0.110347 1.000000
+0.824940 0.884720 0.106217 1.000000
+0.835270 0.886029 0.102646 1.000000
+0.845561 0.887322 0.099702 1.000000
+0.855810 0.888601 0.097452 1.000000
+0.866013 0.889868 0.095953 1.000000
+0.876168 0.891125 0.095250 1.000000
+0.886271 0.892374 0.095374 1.000000
+0.896320 0.893616 0.096335 1.000000
+0.906311 0.894855 0.098125 1.000000
+0.916242 0.896091 0.100717 1.000000
+0.926106 0.897330 0.104071 1.000000
+0.935904 0.898570 0.108131 1.000000
+0.945636 0.899815 0.112838 1.000000
+0.955300 0.901065 0.118128 1.000000
+0.964894 0.902323 0.123941 1.000000
+0.974417 0.903590 0.130215 1.000000
+0.983868 0.904867 0.136897 1.000000
+0.993248 0.906157 0.143936 1.000000
diff --git a/data/assets/scene/digitaluniverse/2dF.asset b/data/assets/scene/digitaluniverse/2dF.asset
index fca4597e97..48441443d8 100644
--- a/data/assets/scene/digitaluniverse/2dF.asset
+++ b/data/assets/scene/digitaluniverse/2dF.asset
@@ -9,26 +9,33 @@ local speck = asset.resource({
Name = "2dF Speck Files",
Type = "HttpSynchronization",
Identifier = "digitaluniverse_2dF_speck",
- Version = 2
+ Version = 3
})
local Object = {
Identifier = "2dF",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
- Color = { 1.0, 1.0, 1.0 },
Opacity = 1.0,
File = speck .. "2dF.speck",
Unit = "Mpc",
Texture = textures .. "point3A.png",
- ColorMap = speck .. "2dF.cmap",
- ColorOption = { "redshift", "proximity" },
- ColorRange = { { 0.0, 0.075 }, { 1.0, 25.0 } },
- ScaleFactor = 520.0,
- BillboardMinMaxSize = { 0.0, 4.7 },
- EnablePixelSizeControl = true
+ Coloring = {
+ ColorMapping = {
+ File = speck .. "2dF.cmap",
+ ParameterOptions = {
+ { Key = "proximity", Range = { 1.0, 25.0 } },
+ { Key = "redshift", Range = { 0.0, 0.075 } }
+ }
+ }
+ },
+ SizeSettings = {
+ ScaleExponent = 22.6,
+ MaxSize = 0.2,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "2dF Galaxies",
@@ -64,7 +71,7 @@ asset.export(Object)
asset.meta = {
Name = "2dF Galaxies",
- Version = "2.1",
+ Version = "3.0",
Description = "Digital Universe asset for the The Two-degree Field (2dF) Survey",
Author = "Brian Abbott (AMNH), Eric Gawiser (Rutgers U)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/2mass.asset b/data/assets/scene/digitaluniverse/2mass.asset
index da92e173fc..daf8dfe6d9 100644
--- a/data/assets/scene/digitaluniverse/2mass.asset
+++ b/data/assets/scene/digitaluniverse/2mass.asset
@@ -9,28 +9,34 @@ local speck = asset.resource({
Name = "2MASS Speck Files",
Type = "HttpSynchronization",
Identifier = "digitaluniverse_2mass_speck",
- Version = 1
+ Version = 2
})
local Object = {
Identifier = "2MASS",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
- Color = { 1.0, 0.4, 0.2 },
Opacity = 1.0,
File = speck .. "2MASS.speck",
Unit = "Mpc",
Texture = textures .. "point3A.png",
- ColorMap = speck .. "lss.cmap",
- ColorOption = { "redshift", "prox5Mpc" },
- ColorRange = { { 0.0, 0.075 }, { 1.0, 50.0 } },
- CorrectionSizeEndDistance = 20.6,
- CorrectionSizeFactor = 15.0,
- ScaleFactor = 510.78,
- BillboardMinMaxSize = { 0.0, 11.15 },
- EnablePixelSizeControl = true
+ Coloring = {
+ FixedColor = { 1.0, 0.4, 0.2 },
+ ColorMapping = {
+ File = speck .. "lss.cmap",
+ ParameterOptions = {
+ { Key = "prox5Mpc", Range = { 1.0, 50.0 } },
+ { Key = "redshift", Range = { 0.0, 0.075 } }
+ }
+ }
+ },
+ SizeSettings = {
+ ScaleExponent = 22.2,
+ MaxSize = 0.44,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "2MASS Galaxies",
@@ -60,7 +66,7 @@ asset.export(Object)
asset.meta = {
Name = "2MASS Galaxies",
- Version = "1.1",
+ Version = "2.0",
Description = "Digital Universe asset for the Two Micron All-Sky Survey (2MASS) survey",
Author = "Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/6dF.asset b/data/assets/scene/digitaluniverse/6dF.asset
index 34bdd92b3b..f3d5528369 100644
--- a/data/assets/scene/digitaluniverse/6dF.asset
+++ b/data/assets/scene/digitaluniverse/6dF.asset
@@ -9,26 +9,34 @@ local speck = asset.resource({
Name = "6dF Speck Files",
Type = "HttpSynchronization",
Identifier = "digitaluniverse_6dF_speck",
- Version = 2
+ Version = 3
})
local Object = {
Identifier = "6dF",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
- Color = { 1.0, 1.0, 0.0 },
Opacity = 1.0,
File = speck .. "6dF.speck",
Unit = "Mpc",
Texture = textures .. "point3A.png",
- ColorMap = speck .. "6dF.cmap",
- ColorOption = { "redshift", "proximity" },
- ColorRange = { { 0.0, 0.075 }, { 1.0, 10.0 } },
- ScaleFactor = 534.0,
- BillboardMinMaxSize = { 0.0, 9.0 },
- EnablePixelSizeControl = true
+ Coloring = {
+ FixedColor = { 1.0, 1.0, 0.0 },
+ ColorMapping = {
+ File = speck .. "6dF.cmap",
+ ParameterOptions = {
+ { Key = "proximity", Range = { 1.0, 10.0 } },
+ { Key = "redshift", Range = { 0.0, 0.075 } }
+ }
+ }
+ },
+ SizeSettings = {
+ ScaleExponent = 22.5,
+ MaxSize = 0.2,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "6dF Galaxies",
@@ -62,7 +70,7 @@ asset.export(Object)
asset.meta = {
Name = "6dF Galaxies",
- Version = "2.1",
+ Version = "3.0",
Description = "Digital Universe asset for The Six-degree Field (6dF) Galaxy Survey",
Author = "Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/abell.asset b/data/assets/scene/digitaluniverse/abell.asset
index b7c5de498d..43ef6c6796 100644
--- a/data/assets/scene/digitaluniverse/abell.asset
+++ b/data/assets/scene/digitaluniverse/abell.asset
@@ -9,7 +9,7 @@ local speck = asset.resource({
Name = "Abell Speck Files",
Type = "HttpSynchronization",
Identifier = "digitaluniverse_abell_speck",
- Version = 2
+ Version = 3
})
@@ -23,7 +23,7 @@ local TransformMatrix = {
local Object = {
Identifier = "Abell",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
Labels = {
File = speck .. "abell.label",
@@ -34,16 +34,20 @@ local Object = {
Unit = "Mpc",
TransformationMatrix = TransformMatrix
},
- Color = { 1.0, 0.4, 0.2 },
Opacity = 1.0,
- --ColorMap = speck .. "abell.cmap",
+ Coloring = {
+ FixedColor = { 1.0, 0.4, 0.2 },
+ --ColorMap = speck .. "abell.cmap", -- TODO: Decide whether to add
+ },
File = speck .. "abell.speck",
Texture = textures .. "point3A.png",
Unit = "Mpc",
TransformationMatrix = TransformMatrix,
- ScaleFactor = 520.0,
- BillboardMinMaxSize = { 0.0, 7.0 },
- EnablePixelSizeControl = true
+ SizeSettings = {
+ ScaleExponent = 22.6,
+ MaxSize = 0.27,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "Abell Galaxy Clusters",
@@ -78,7 +82,7 @@ asset.export(Object)
asset.meta = {
Name = "Abell Galaxy Clusters",
- Version = "2.1",
+ Version = "3.0",
Description = "Digital Universe asset for The Abell catalog",
Author = "Stuart Levy (NCSA/UIUC), Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/alternatestarlabels.asset b/data/assets/scene/digitaluniverse/alternatestarlabels.asset
index 070e50eb7d..6ae6004962 100644
--- a/data/assets/scene/digitaluniverse/alternatestarlabels.asset
+++ b/data/assets/scene/digitaluniverse/alternatestarlabels.asset
@@ -9,7 +9,7 @@ local speck = asset.resource({
local Object = {
Identifier = "StarLabelsAlternate",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
Labels = {
Enabled = true,
@@ -19,7 +19,6 @@ local Object = {
MinMaxSize = { 6, 20 },
Unit = "pc"
},
- Color = { 1.0, 1.0, 1.0 },
Opacity = 0.65,
Unit = "pc"
},
@@ -51,7 +50,7 @@ asset.export(Object)
asset.meta = {
Name = "Stars Labels - Alternate",
- Version = "1.1",
+ Version = "2.0",
Description = "Digital Universe asset for alternate start labels",
Author = "Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/clusters.asset b/data/assets/scene/digitaluniverse/clusters.asset
index f266d6afb9..96ff69dad6 100644
--- a/data/assets/scene/digitaluniverse/clusters.asset
+++ b/data/assets/scene/digitaluniverse/clusters.asset
@@ -16,7 +16,7 @@ local TransformMatrix = {
local Object = {
Identifier = "GalaxyClusterLabels",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
Labels = {
Enabled = true,
@@ -27,7 +27,6 @@ local Object = {
Unit = "Mpc",
TransformationMatrix = TransformMatrix
},
- Color = { 1.0, 1.0, 1.0 },
Opacity = 0.65,
Unit = "Mpc",
TransformationMatrix = TransformMatrix
@@ -58,7 +57,7 @@ asset.export(Object)
asset.meta = {
Name = "Galaxy Clusters Labels",
- Version = "1.1",
+ Version = "2.0",
Description = "Digital Universe asset for Galaxy Clusters",
Author = "Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/deepsky.asset b/data/assets/scene/digitaluniverse/deepsky.asset
index 371fd66ea1..5aa89ea88b 100644
--- a/data/assets/scene/digitaluniverse/deepsky.asset
+++ b/data/assets/scene/digitaluniverse/deepsky.asset
@@ -16,7 +16,7 @@ local speck = asset.resource({
local DeepSkyObjects = {
Identifier = "DeepSkyObjects",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
Labels = {
File = speck .. "dso.label",
@@ -25,22 +25,19 @@ local DeepSkyObjects = {
MinMaxSize = { 16, 20 },
Unit = "pc"
},
- Color = { 1.0, 1.0, 0.0 },
Opacity = 0.99,
- ScaleFactor = 500.0,
+ Coloring = {
+ FixedColor = { 1.0, 1.0, 0.0 }
+ },
File = speck .. "dso.speck",
Texture = textures .. "point3.png",
- --ColorMap = speck .. "tully.cmap",
- --ColorMap = speck .. "lss.cmap",
- --ColorOption = { "proximity" },
- --ColorOption = { "prox5Mpc" },
- --ColorRange = { { 1.0, 30.0 } },
Unit = "pc",
--FadeInDistances = { 0.05, 1.0 }, -- Fade in value in the same unit as "Unit"
- BillboardMinMaxSize = { 0.0, 8.22 }, -- in pixels
- --CorrectionSizeEndDistance = 22.0,
- --CorrectionSizeFactor = 10.45
- EnablePixelSizeControl = true
+ SizeSettings = {
+ ScaleExponent = 21.7,
+ MaxSize = 0.32,
+ EnableMaxSizeControl = true
+ }
},
Transform = {
Rotation = {
@@ -112,7 +109,7 @@ asset.export(DeepSkyObjectsImages)
asset.meta = {
Name = "Deep Sky Objects Images",
- Version = "1.1",
+ Version = "2.0",
Description = "Digital Universe asset for Deep Sky Objects and their Images",
Author = "Nate Greenstein, Matt Everhart, Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/dwarfs.asset b/data/assets/scene/digitaluniverse/dwarfs.asset
index fe879a8ec6..fd13e0e4ec 100644
--- a/data/assets/scene/digitaluniverse/dwarfs.asset
+++ b/data/assets/scene/digitaluniverse/dwarfs.asset
@@ -9,14 +9,14 @@ local speck = asset.resource({
Name = "Brown Dwarf Speck Files",
Type = "HttpSynchronization",
Identifier = "digitaluniverse_dwarfs_speck",
- Version = 2
+ Version = 3
})
local Object = {
Identifier = "Dwarfs",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
Labels = {
File = speck .. "dwarfs.label",
@@ -25,19 +25,24 @@ local Object = {
MinMaxSize = { 10, 20 },
Unit = "pc"
},
- Color = { 0.4, 0.0, 0.1 },
Opacity = 1.0,
File = speck .. "dwarfs.speck",
Texture = textures .. "point3.png",
Unit = "pc",
- ColorMap = speck .. "dwarfs.cmap",
- ColorOption = { "typeindex" },
- --ColorRange = { { 1.0, 4.0} },
- ScaleFactor = 372.1,
- --CorrectionSizeEndDistance = 16.1,
- --CorrectionSizeFactor = 7.75,
- BillboardMinMaxSize = { 0.0, 20.0 },
- EnablePixelSizeControl = true
+ Coloring = {
+ FixedColor = { 0.4, 0.0, 0.1 },
+ ColorMapping = {
+ File = speck .. "dwarfs.cmap",
+ ParameterOptions = {
+ { Key = "typeindex", Range = { 1.0, 4.0 } }
+ }
+ }
+ },
+ SizeSettings = {
+ ScaleExponent = 16.2,
+ MaxSize = 0.7,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "Brown Dwarfs",
@@ -77,7 +82,7 @@ asset.export(Object)
asset.meta = {
Name = "Brown Dwarfs",
- Version = "2.1",
+ Version = "3.0",
Description = "Digital Universe asset for Brown Dwarfs",
Author = "Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/exoplanets.asset b/data/assets/scene/digitaluniverse/exoplanets.asset
index c20351cb17..c53f3ae27d 100644
--- a/data/assets/scene/digitaluniverse/exoplanets.asset
+++ b/data/assets/scene/digitaluniverse/exoplanets.asset
@@ -16,7 +16,7 @@ local speck = asset.resource({
local Object = {
Identifier = "Exoplanets",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
Labels = {
File = speck .. "expl.label",
@@ -25,16 +25,15 @@ local Object = {
MinMaxSize = { 10, 100 },
Unit = "pc"
},
- Color = { 1.0, 1.0, 1.0 },
Opacity = 1.0,
Texture = textures .. "target-blue.png",
File = speck .. "expl.speck",
Unit = "pc",
- ScaleFactor = 388.67923,
- CorrectionSizeEndDistance = 15.23,
- CorrectionSizeFactor = 13.3,
- BillboardMinMaxSize = { 0.0, 75.0 },
- EnablePixelSizeControl = true
+ SizeSettings = {
+ ScaleExponent = 16.9,
+ MaxSize = 2.8,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "Exoplanets",
@@ -64,7 +63,7 @@ asset.export(Object)
asset.meta = {
Name = "Exoplanets",
- Version = "1.1",
+ Version = "2.0",
Description = "Digital Universe asset for Exoplanets",
Author = "Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/exoplanets_candidates.asset b/data/assets/scene/digitaluniverse/exoplanets_candidates.asset
index 5fa0436b7e..e0bb934486 100644
--- a/data/assets/scene/digitaluniverse/exoplanets_candidates.asset
+++ b/data/assets/scene/digitaluniverse/exoplanets_candidates.asset
@@ -16,18 +16,20 @@ local speck = asset.resource({
local Object = {
Identifier = "PlanetaryCandidates",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
- Color = { 1.0, 1.0, 0.0 },
Opacity = 0.99,
- ScaleFactor = 410.0,
File = speck .. "exoplanet_candidates.speck",
Unit = "pc",
Texture = textures .. "halo.png",
- CorrectionSizeEndDistance = 15.86,
- CorrectionSizeFactor = 8.59,
- BillboardMinMaxSize = { 0.0, 30.0 },
- EnablePixelSizeControl = true
+ Coloring = {
+ FixedColor = { 1.0, 1.0, 0.0 }
+ },
+ SizeSettings = {
+ ScaleExponent = 17.8,
+ MaxSize = 1.0,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "Planetary Candidates",
@@ -60,7 +62,7 @@ asset.export(Object)
asset.meta = {
Name = "Planetary Candidates",
- Version = "2.1",
+ Version = "3.0",
Description = "Digital Universe asset for Planetary Candidates",
Author = "Brian Abbott, Emily Rice, and Jason No (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/globularclusters.asset b/data/assets/scene/digitaluniverse/globularclusters.asset
index 4e7095f8e4..2ce9c05cd5 100644
--- a/data/assets/scene/digitaluniverse/globularclusters.asset
+++ b/data/assets/scene/digitaluniverse/globularclusters.asset
@@ -16,7 +16,7 @@ local speck = asset.resource({
local Object = {
Identifier = "GlobularClusters",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePolygonCloud",
Enabled = false,
Labels = {
File = speck .. "gc.label",
@@ -25,15 +25,18 @@ local Object = {
MinMaxSize = { 4, 20 },
Unit = "pc"
},
- Color = { 0.8, 0.8, 0.0 },
+ Coloring = {
+ FixedColor = { 0.8, 0.8, 0.0 }
+ },
Opacity = 0.4,
File = speck .. "gc.speck",
- Texture = textures .. "point4.png",
PolygonSides = 5,
Unit = "pc",
- ScaleFactor = 431.0,
- BillboardMinMaxSize = { 0.0, 500.0 },
- EnablePixelSizeControl = true
+ SizeSettings = {
+ ScaleExponent = 18.9,
+ MaxSize = 13.0,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "Globular Clusters",
@@ -69,7 +72,7 @@ asset.export(Object)
asset.meta = {
Name = "Globular Clusters",
- Version = "2.1",
+ Version = "3.0",
Description = [[Census: 157 globular clusters. DU Version 2.6. Globular star clusters
are gravitationally bound groups of 100,000 to 1 million stars. They are compact,
spherical "balls" of stars with very high stellar densities in their centers (stars
diff --git a/data/assets/scene/digitaluniverse/grids.asset b/data/assets/scene/digitaluniverse/grids.asset
index 65989fab4d..413694058f 100644
--- a/data/assets/scene/digitaluniverse/grids.asset
+++ b/data/assets/scene/digitaluniverse/grids.asset
@@ -126,7 +126,7 @@ local EclipticSphereLabels = {
Identifier = "EclipticSphereLabels",
Parent = transforms.SolarSystemBarycenter.Name,
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
Labels = {
Enabled = true,
@@ -137,7 +137,6 @@ local EclipticSphereLabels = {
Unit = "pc",
TransformationMatrix = EclipticTransformationMatrix
},
- Color = { 1.0, 1.0, 1.0 },
Opacity = 0.65,
Unit = "pc",
TransformationMatrix = EclipticTransformationMatrix
@@ -178,7 +177,7 @@ local EquatorialSphereLabels = {
Identifier = "EquatorialSphereLabels",
Parent = transforms.SolarSystemBarycenter.Name,
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
Labels = {
Enabled = true,
@@ -189,7 +188,6 @@ local EquatorialSphereLabels = {
Unit = "pc",
TransformationMatrix = EquatorialTransformationMatrix
},
- Color = { 1.0, 1.0, 1.0 },
Opacity = 0.65,
Unit = "pc",
TransformationMatrix = EquatorialTransformationMatrix
@@ -226,7 +224,7 @@ local GalacticSphereLabels = {
Identifier = "GalacticSphereLabels",
Parent = transforms.SolarSystemBarycenter.Name,
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
Labels = {
Enabled = true,
@@ -236,7 +234,6 @@ local GalacticSphereLabels = {
MinMaxSize = { 1, 100 },
Unit = "pc"
},
- Color = { 1.0, 1.0, 1.0 },
Opacity = 0.65,
Unit = "pc"
},
@@ -699,7 +696,7 @@ asset.export(Plane20Gly)
asset.meta = {
Name = "Grids",
- Version = "2.1",
+ Version = "3.0",
Description = [[Various grids for showing size reference. Included: 10,000 light year
grid, 10 light year grid, 20 billion light year grid, 10 million light year grid,
100 light year grid, 100 million light year grid, Ecliptic Coordinate Sphere
diff --git a/data/assets/scene/digitaluniverse/groups.asset b/data/assets/scene/digitaluniverse/groups.asset
index 03cb117c68..a93d3608f4 100644
--- a/data/assets/scene/digitaluniverse/groups.asset
+++ b/data/assets/scene/digitaluniverse/groups.asset
@@ -16,7 +16,7 @@ local TransformMatrix = {
local Object = {
Identifier = "NearbyGalaxyGroups",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
Labels = {
Enabled = true,
@@ -27,9 +27,7 @@ local Object = {
Unit = "Mpc",
TransformationMatrix = TransformMatrix
},
- Color = { 1.0, 1.0, 1.0 },
Opacity = 0.65,
- --ScaleFactor = 10.0,
Unit = "Mpc",
TransformationMatrix = TransformMatrix
},
@@ -58,7 +56,7 @@ asset.export(Object)
asset.meta = {
Name = "Galaxy Group Labels",
- Version = "1.1",
+ Version = "2.0",
Author = "Brian Abbott (AMNH)",
Description = "Digital Universe asset for Galaxy Groups",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/h2regions.asset b/data/assets/scene/digitaluniverse/h2regions.asset
index c5fb3baced..f704d48757 100644
--- a/data/assets/scene/digitaluniverse/h2regions.asset
+++ b/data/assets/scene/digitaluniverse/h2regions.asset
@@ -16,7 +16,7 @@ local speck = asset.resource({
local Object = {
Identifier = "HIIRegions",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePolygonCloud",
Enabled = false,
Labels = {
File = speck .. "h2.label",
@@ -25,15 +25,18 @@ local Object = {
MinMaxSize = { 4, 20 },
Unit = "pc"
},
- Color = { 0.0, 0.5, 1.0 },
+ Coloring = {
+ FixedColor = { 0.0, 0.5, 1.0 }
+ },
Opacity = 0.70,
File = speck .. "h2.speck",
- Texture = textures .. "point4.png",
PolygonSides = 6,
Unit = "pc",
- ScaleFactor = 420.0,
- BillboardMinMaxSize = { 0.0, 300.0 },
- EnablePixelSizeControl = false
+ SizeSettings = {
+ ScaleExponent = 18.24,
+ MaxSize = 8.0,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "HII Regions",
@@ -67,7 +70,7 @@ asset.export(Object)
asset.meta = {
Name = "HII Regions",
- Version = "1.1",
+ Version = "2.0",
Description = "Digital Universe asset for HII Regions",
Author = "Carter Emmart, Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/hdf.asset b/data/assets/scene/digitaluniverse/hdf.asset
index f34094b0c2..964144e69c 100644
--- a/data/assets/scene/digitaluniverse/hdf.asset
+++ b/data/assets/scene/digitaluniverse/hdf.asset
@@ -23,19 +23,24 @@ local ColorMap = asset.resource({
local Object = {
Identifier = "HubbleDeepField",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
- Color = { 1.0, 1.0, 1.0 },
Opacity = 1.0,
File = HUDFSpeck .. "hudf.speck",
Texture = circle .. "circle.png",
- ColorMap = ColorMap .. "hudf.cmap",
- ColorOption = { "redshift", "proximity" },
- ColorRange = { { 0.0, 0.075 }, { 1.0, 25.0 } },
+ Coloring = {
+ ColorMapping = {
+ File = ColorMap .. "hudf.cmap",
+ ParameterOptions = {
+ { Key = "proximity", Range = { 1.0, 25.0 } },
+ { Key = "redshift", Range = { 0.0, 0.075 } }
+ }
+ }
+ },
Unit = "Mpc",
- ScaleFactor = 505.0,
- BillboardMaxSize = 4.7,
- EnablePixelSizeControl = true
+ SizeSettings = {
+ ScaleExponent = 21.9
+ }
},
GUI = {
Name = "Hubble Deep Field",
@@ -62,7 +67,7 @@ asset.export(Object)
asset.meta = {
Name = "Hubble Ultra Deep Field",
- Version = "1.2",
+ Version = "2.0",
Description = "Hubble Ultra Deep Field galaxy survey",
Author = "Frank Summers (STScI), Brian Abbott (AMNH)",
URL = "http://www.haydenplanetarium.org/universe",
diff --git a/data/assets/scene/digitaluniverse/localdwarfs.asset b/data/assets/scene/digitaluniverse/localdwarfs.asset
index 7426659150..b09da57150 100644
--- a/data/assets/scene/digitaluniverse/localdwarfs.asset
+++ b/data/assets/scene/digitaluniverse/localdwarfs.asset
@@ -16,7 +16,7 @@ local speck = asset.resource({
local Object = {
Identifier = "LocalDwarfGalaxies",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePolygonCloud",
Enabled = false,
Labels = {
File = speck .. "localgroup.label",
@@ -25,17 +25,29 @@ local Object = {
MinMaxSize = { 7, 20 },
Unit = "Mpc"
},
- Color = { 0.5, 1.0, 0.2 },
- ColorMap = speck .. "localgroup.cmap",
- ColorOption = { "association" },
+ Coloring = {
+ FixedColor = { 0.0, 1.0, 0.0 },
+ -- @TODO: This one wasn't actually properly used before the point cloud update.
+ -- All points were mapped to green. Decide if we want it around.
+ -- @TODO: Also, the cmap is currently not applied correctly, due to speck file
+ -- not being read properly (it inlcudes more information than just datavar-s).
+ -- This should be adressed. (2023-12-13, emmbr)
+ ColorMapping = {
+ File = speck .. "localgroup.cmap",
+ ParameterOptions = {
+ { Key = "association" }
+ }
+ }
+ },
Opacity = 0.3,
File = speck .. "localgroup.speck",
- Texture = textures .. "point4.png",
PolygonSides = 12,
Unit = "Mpc",
- ScaleFactor = 465.0,
- BillboardMinMaxSize = { 0.0, 20.0 },
- EnablePixelSizeControl = true
+ SizeSettings = {
+ ScaleExponent = 20.2,
+ MaxSize = 0.7,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "Local Group",
@@ -69,7 +81,7 @@ asset.export(Object)
asset.meta = {
Name = "Local Group",
- Version = "2.1",
+ Version = "3.0",
Description = "Digital Universe asset for the Local Goup",
Author = "Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/milkyway_label.asset b/data/assets/scene/digitaluniverse/milkyway_label.asset
index c2098b14ff..19088fdd44 100644
--- a/data/assets/scene/digitaluniverse/milkyway_label.asset
+++ b/data/assets/scene/digitaluniverse/milkyway_label.asset
@@ -16,7 +16,7 @@ local TransformMatrix = {
local HomeLabel = {
Identifier = "HomeLabel",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
Labels = {
Enabled = true,
@@ -26,15 +26,7 @@ local HomeLabel = {
MinMaxSize = { 16, 20 },
Unit = "Mpc",
TransformationMatrix = TransformMatrix
- },
- Color = { 1.0, 0.4, 0.2 },
- Opacity = 0.99,
- ScaleFactor = 500.0,
- Unit = "Mpc",
- TransformationMatrix = TransformMatrix,
- FadeInDistances = { 0.05, 1.0 },
- BillboardMinMaxSize = { 0.0, 8.22 },
- EnablePixelSizeControl = true
+ }
},
GUI = {
Name = "Home Label",
@@ -58,7 +50,7 @@ asset.export(HomeLabel)
asset.meta = {
Name = "Home Label",
- Version = "1.1",
+ Version = "2.0",
Description = "Label for the Milky Way titled 'Home', sided for the galactic level",
Author = "OpenSpace Team",
URL = "http://openspaceproject.com",
diff --git a/data/assets/scene/digitaluniverse/obassociations.asset b/data/assets/scene/digitaluniverse/obassociations.asset
index 73644a8c82..fd0610c6f1 100644
--- a/data/assets/scene/digitaluniverse/obassociations.asset
+++ b/data/assets/scene/digitaluniverse/obassociations.asset
@@ -9,14 +9,14 @@ local speck = asset.resource({
Name = "OB Associations Speck Files",
Type = "HttpSynchronization",
Identifier = "digitaluniverse_obassociations_speck",
- Version = 3
+ Version = 4
})
local Object = {
Identifier = "OBAssociations",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePolygonCloud",
Enabled = false,
Labels = {
File = speck .. "ob.label",
@@ -25,19 +25,25 @@ local Object = {
MinMaxSize = { 4, 25 },
Unit = "pc"
},
- Color = { 1.0, 1.0, 1.0 },
- ColorMap = speck .. "ob.cmap",
- ColorOption = { "arm" },
- SizeOption = { "diameter" },
- ExactColorMap = true,
+ Coloring = {
+ ColorMapping = {
+ File = speck .. "ob.cmap",
+ ParameterOptions = {
+ { Key = "arm" }
+ }
+ }
+ },
Opacity = 0.7,
File = speck .. "ob.speck",
Unit = "pc",
Texture = textures .. "point4.png",
PolygonSides = 7,
- ScaleFactor = 390.0,
- BillboardMinMaxSize = { 0.0, 450.0 },
- EnablePixelSizeControl = true
+ SizeSettings = {
+ SizeMapping = { "diameter" },
+ ScaleExponent = 16.9,
+ MaxSize = 17,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "OB Associations",
@@ -71,7 +77,7 @@ asset.export(Object)
asset.meta = {
Name = "OB Associations",
- Version = "2.1",
+ Version = "3.0",
Description = "Digital Universe asset for OB Associations",
Author = "Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/openclusters.asset b/data/assets/scene/digitaluniverse/openclusters.asset
index e16a67dcbf..d7a4e2a551 100644
--- a/data/assets/scene/digitaluniverse/openclusters.asset
+++ b/data/assets/scene/digitaluniverse/openclusters.asset
@@ -16,7 +16,7 @@ local speck = asset.resource({
local Object = {
Identifier = "OpenStarClusters",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePolygonCloud",
Enabled = false,
Labels = {
File = speck .. "oc.label",
@@ -25,15 +25,18 @@ local Object = {
MinMaxSize = { 4, 30 },
Unit = "pc"
},
- Color = { 0.1, 0.8, 0.4 },
+ Coloring = {
+ FixedColor = { 0.1, 0.8, 0.4 }
+ },
Opacity = 0.5,
File = speck .. "oc.speck",
Unit = "pc",
- Texture = textures .. "point4.png",
PolygonSides = 12,
- ScaleFactor = 405.75,
- BillboardMinMaxSize = { 0.0, 604.0 },
- EnablePixelSizeControl = true
+ SizeSettings = {
+ ScaleExponent = 17.6,
+ MaxSize = 23.0,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "Open Star Clusters",
@@ -68,7 +71,7 @@ asset.export(Object)
asset.meta = {
Name = "Open Star Clusters",
- Version = "2.1",
+ Version = "3.0",
Description = "Digital Universe asset for Open Star Clusters",
Author = "Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/planetarynebulae.asset b/data/assets/scene/digitaluniverse/planetarynebulae.asset
index 48837eac3d..f9638d1392 100644
--- a/data/assets/scene/digitaluniverse/planetarynebulae.asset
+++ b/data/assets/scene/digitaluniverse/planetarynebulae.asset
@@ -16,7 +16,7 @@ local speck = asset.resource({
local Object = {
Identifier = "PlanetaryNebulae",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePolygonCloud",
Enabled = false,
Labels = {
File = speck .. "pn.label",
@@ -25,15 +25,18 @@ local Object = {
MinMaxSize = { 4, 25 },
Unit = "pc"
},
- Color = { 0.4, 0.4, 0.9 },
+ Coloring = {
+ FixedColor = { 0.4, 0.4, 0.9 }
+ },
Opacity = 0.65,
File = speck .. "pn.speck",
- Texture = textures .. "point4.png",
PolygonSides = 3,
Unit = "pc",
- ScaleFactor = 425.0,
- BillboardMinMaxSize = { 0.0, 500.0 },
- EnablePixelSizeControl = true
+ SizeSettings = {
+ ScaleExponent = 18.46,
+ MaxSize = 19.0,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "Planetary Nebulae",
@@ -64,7 +67,7 @@ asset.export(Object)
asset.meta = {
Name = "Planetary Nebulae",
- Version = "2.1",
+ Version = "3.0",
Description = "Digital Universe asset for Planetary Nebulae",
Author = "Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/pulsars.asset b/data/assets/scene/digitaluniverse/pulsars.asset
index 8118e80fe8..fd8a4edee1 100644
--- a/data/assets/scene/digitaluniverse/pulsars.asset
+++ b/data/assets/scene/digitaluniverse/pulsars.asset
@@ -16,7 +16,7 @@ local speck = asset.resource({
local Object = {
Identifier = "Pulsars",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePolygonCloud",
Enabled = false,
Labels = {
File = speck .. "pulsar.label",
@@ -25,15 +25,18 @@ local Object = {
MinMaxSize = { 4, 20 },
Unit = "pc"
},
- Color = { 0.7, 0.0, 0.0 },
+ Coloring = {
+ FixedColor = { 0.7, 0.0, 0.0 }
+ },
Opacity = 1.0,
File = speck .. "pulsar.speck",
- Texture = textures .. "point4.png",
PolygonSides = 4,
Unit = "pc",
- ScaleFactor = 424.0,
- BillboardMinMaxSize = { 0.0, 500.0 },
- EnablePixelSizeControl = false
+ SizeSettings = {
+ ScaleExponent = 18.4,
+ MaxSize = 19.0,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "Pulsars",
@@ -68,7 +71,7 @@ asset.export(Object)
asset.meta = {
Name = "Pulsars",
- Version = "2.1",
+ Version = "3.0",
Description = "Digital Universe asset for Pulsars",
Author = "Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/quasars.asset b/data/assets/scene/digitaluniverse/quasars.asset
index 783b1b9b1b..93efec3236 100644
--- a/data/assets/scene/digitaluniverse/quasars.asset
+++ b/data/assets/scene/digitaluniverse/quasars.asset
@@ -23,21 +23,32 @@ local colormaps = asset.resource({
local Object = {
Identifier = "Quasars",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = true,
- Color = { 1.0, 0.4, 0.2 },
Opacity = 0.95,
File = speck .. "quasars.speck",
Texture = textures .. "point3A.png",
Unit = "Mpc",
- ScaleFactor = 540.9,
- FadeInDistances = { 1000.0, 10000.0 }, -- Fade in value in the same unit as "Unit"
- BillboardMinMaxSize = { 0.0, 11.1 },
- EnablePixelSizeControl = true,
- ColorMap = colormaps .. "viridis.cmap",
- ColorOption = { "redshift", "Tlookback", "distMpc" },
- ColorRange = { { 0.102, 7.085 }, { 1.4, 13.0 }, { 440.5, 8852.099609 } },
- UseColorMap = false
+ Fading = {
+ FadeInDistances = { 1000.0, 10000.0 } -- Fade in value in the same unit as "Unit"
+ },
+ Coloring = {
+ FixedColor = { 1.0, 0.4, 0.2 },
+ ColorMapping = {
+ Enabled = false,
+ File = colormaps .. "viridis.cmap",
+ ParameterOptions = {
+ { Key = "distMpc", Range = { 440.5, 8852.099609 } },
+ { Key = "redshift", Range = { 0.102, 7.085 } },
+ { Key = "Tlookback", Range = { 1.4, 13.0 } }
+ }
+ }
+ },
+ SizeSettings = {
+ ScaleExponent = 23.5,
+ MaxSize = 0.3,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "Quasars",
@@ -68,7 +79,7 @@ asset.export(Object)
asset.meta = {
Name = "Quasars",
- Version = "2.1",
+ Version = "3.0",
Description = "Digital Universe asset for Quasars",
Author = "Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/sdss.asset b/data/assets/scene/digitaluniverse/sdss.asset
index b1159ddf92..0ffa195d31 100644
--- a/data/assets/scene/digitaluniverse/sdss.asset
+++ b/data/assets/scene/digitaluniverse/sdss.asset
@@ -9,31 +9,37 @@ local speck = asset.resource({
Name = "Sloan Digital Sky Survey Speck Files",
Type = "HttpSynchronization",
Identifier = "digitaluniverse_sloandss_speck",
- Version = 2
+ Version = 3
})
local Object = {
Identifier = "SloanDigitalSkySurvey",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = true,
- Color = { 0.8, 0.8, 1.0 },
Opacity = 0.8,
- ScaleFactor = 520.0,
File = speck .. "SDSSgals.speck",
- ColorMap = speck .. "SDSSgals.cmap",
- ColorOption = { "redshift", "proximity" },
- ColorRange = { { 0.0, 0.075 }, { 1.0, 50.0 } },
+ Coloring = {
+ FixedColor = { 0.8, 0.8, 1.0 },
+ ColorMapping = {
+ File = speck .. "SDSSgals.cmap",
+ ParameterOptions = {
+ { Key = "proximity", Range = { 1.0, 50.0 } },
+ { Key = "redshift", Range = { 0.0, 0.075 } }
+ }
+ }
+ },
Texture = textures .. "point3A.png",
Unit = "Mpc",
- FadeInDistances = { 220.0, 650.0 }, -- Fade in value in the same unit as "Unit"
- BillboardMinMaxSize = { 0.0, 5.5 },
- CorrectionSizeEndDistance = 20.65,
- CorrectionSizeFactor = 10.41,
- TextSize = 14.8,
- TextMinMaxSize = { 10, 50 },
- EnablePixelSizeControl = true
+ Fading = {
+ FadeInDistances = { 220.0, 650.0 } -- Fade in value in the same unit as "Unit"
+ },
+ SizeSettings = {
+ ScaleExponent = 22.6,
+ MaxSize = 0.15,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "Sloan Digital Sky Survey",
@@ -71,7 +77,7 @@ asset.export(Object)
asset.meta = {
Name = "Sloan Digital Sky Survey",
- Version = "2.1",
+ Version = "3.0",
Description = "Digital Universe asset for The Sloan Digital Sky Survey (SDSS)",
Author = "Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/starlabels.asset b/data/assets/scene/digitaluniverse/starlabels.asset
index bd33b78b85..1babd0160f 100644
--- a/data/assets/scene/digitaluniverse/starlabels.asset
+++ b/data/assets/scene/digitaluniverse/starlabels.asset
@@ -9,7 +9,7 @@ local speck = asset.resource({
local Object = {
Identifier = "StarsLabels",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
Labels = {
Enabled = true,
@@ -19,7 +19,6 @@ local Object = {
MinMaxSize = { 6, 50 },
Unit = "pc"
},
- Color = { 1.0, 1.0, 1.0 },
Opacity = 0.65,
Unit = "pc"
},
@@ -45,7 +44,7 @@ asset.export(Object)
asset.meta = {
Name = "Star Labels",
- Version = "2.1",
+ Version = "3.0",
Description = "Digital Universe asset for labels of the stars",
Author = "Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/superclusters.asset b/data/assets/scene/digitaluniverse/superclusters.asset
index 4959dc3c47..77260619f7 100644
--- a/data/assets/scene/digitaluniverse/superclusters.asset
+++ b/data/assets/scene/digitaluniverse/superclusters.asset
@@ -16,7 +16,7 @@ local speck = asset.resource({
local Object = {
Identifier = "GalaxySuperclusters",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
Labels = {
Enabled = true,
@@ -27,14 +27,15 @@ local Object = {
Unit = "Mpc"
},
DrawElements = false,
- Color = { 1.0, 1.0, 1.0 },
Opacity = 0.65,
File = speck .. "superclust.speck",
Texture = textures .. "point3A.png",
Unit = "Mpc",
- ScaleFactor = 531.0,
- -- BillboardMinMaxSize = { 0.0, 7.2 },
- EnablePixelSizeControl = true
+ SizeSettings = {
+ ScaleExponent = 23.1,
+ MaxSize = 0.2,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "Galaxy Superclusters",
@@ -63,7 +64,7 @@ asset.export(Object)
asset.meta = {
Name = "Galaxy Superclusters",
- Version = "2.1",
+ Version = "3.0",
Description = "Digital Universe asset for Galaxy Superclusters",
Author = "Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/supernovaremnants.asset b/data/assets/scene/digitaluniverse/supernovaremnants.asset
index 5332888150..6a6c8816a8 100644
--- a/data/assets/scene/digitaluniverse/supernovaremnants.asset
+++ b/data/assets/scene/digitaluniverse/supernovaremnants.asset
@@ -16,7 +16,7 @@ local speck = asset.resource({
local Object = {
Identifier = "SupernovaRemnants",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePolygonCloud",
Enabled = false,
Labels = {
File = speck .. "snr.label",
@@ -25,17 +25,18 @@ local Object = {
MinMaxSize = { 4, 100 },
Unit = "pc"
},
- Color = { 1.0, 0.5, 0.0 },
+ Coloring = {
+ FixedColor = { 1.0, 0.5, 0.0 }
+ },
Opacity = 0.32,
File = speck .. "snr.speck",
- Texture = textures .. "point4.png",
PolygonSides = 7,
Unit = "pc",
- ScaleFactor = 424.0,
- --CorrectionSizeEndDistance = 17.5,
- --CorrectionSizeFactor = 13.96,
- BillboardMinMaxSize = { 0.0, 500.0 },
- EnablePixelSizeControl = true
+ SizeSettings = {
+ ScaleExponent = 18.4,
+ MaxSize = 19.0,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "Supernova Remnants",
@@ -62,7 +63,7 @@ asset.export(Object)
asset.meta = {
Name = "Supernova Remnants",
- Version = "2.1",
+ Version = "3.0",
Description = "Digital Universe asset for Supernova Remnants",
Author = "Brian Abbott (AMNH)",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/digitaluniverse/tully.asset b/data/assets/scene/digitaluniverse/tully.asset
index b4a20b1e4b..b7739c503d 100644
--- a/data/assets/scene/digitaluniverse/tully.asset
+++ b/data/assets/scene/digitaluniverse/tully.asset
@@ -9,7 +9,7 @@ local speck = asset.resource({
Name = "Tully Speck Files",
Type = "HttpSynchronization",
Identifier = "digitaluniverse_tully_speck",
- Version = 2
+ Version = 3
})
@@ -23,7 +23,7 @@ local TransformMatrix = {
local TullyGalaxies = {
Identifier = "TullyGalaxies",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = true,
Labels = {
File = speck .. "tully.label",
@@ -33,23 +33,28 @@ local TullyGalaxies = {
Unit = "Mpc",
TransformationMatrix = TransformMatrix
},
- Color = { 1.0, 0.4, 0.2 },
Opacity = 0.99,
- ScaleFactor = 504.0,
File = speck .. "tully.speck",
Texture = textures .. "point3A.png",
- --ColorMap = speck .. "tully.cmap",
- ColorMap = speck .. "lss.cmap",
- --ColorOption = { "proximity" },
- ColorOption = { "prox5Mpc" },
- ColorRange = { { 1.0, 30.0 } },
+ Coloring = {
+ FixedColor = { 1.0, 0.4, 0.2 },
+ ColorMapping = {
+ File = speck .. "lss.cmap",
+ ParameterOptions = {
+ { Key = "prox5Mpc", Range = { 1.0, 30.0 } }
+ }
+ }
+ },
Unit = "Mpc",
TransformationMatrix = TransformMatrix,
- FadeInDistances = { 0.001, 1.0 }, -- Fade in value in the same unit as "Unit"
- BillboardMinMaxSize = { 0.0, 7.0 }, -- in pixels
- --CorrectionSizeEndDistance = 22.0,
- --CorrectionSizeFactor = 10.45
- EnablePixelSizeControl = true
+ Fading = {
+ FadeInDistances = { 0.001, 1.0 } -- Fade in value in the same unit as "Unit"
+ },
+ SizeSettings = {
+ ScaleExponent = 21.9,
+ MaxSize = 0.3,
+ EnableMaxSizeControl = true
+ }
},
GUI = {
Name = "Tully Galaxies",
@@ -125,7 +130,7 @@ asset.export(TullyGalaxiesImages)
asset.meta = {
Name = "Tully Galaxies",
- Version = "3.1",
+ Version = "4.0",
Description = [[Digital Universe asset for Tully Galaxies, including point cloud and
images]],
Author = "Stuart Levy (NCSA/UIUC), Brian Abbott (AMNH)",
diff --git a/data/assets/scene/digitaluniverse/voids.asset b/data/assets/scene/digitaluniverse/voids.asset
index 6f38436ee0..40db6e91b0 100644
--- a/data/assets/scene/digitaluniverse/voids.asset
+++ b/data/assets/scene/digitaluniverse/voids.asset
@@ -9,7 +9,7 @@ local speck = asset.resource({
local Object = {
Identifier = "Voids",
Renderable = {
- Type = "RenderableBillboardsCloud",
+ Type = "RenderablePointCloud",
Enabled = false,
Labels = {
Enabled = true,
@@ -20,7 +20,6 @@ local Object = {
Unit = "Mpc"
},
DrawElements = false,
- Color = { 1.0, 1.0, 1.0 },
Opacity = 0.65,
Unit = "Mpc"
},
@@ -55,7 +54,7 @@ asset.export(Object)
asset.meta = {
Name = "Voids",
- Version = "2.1",
+ Version = "3.0",
Author = "Brian Abbott (AMNH)",
Description = "Digital Universe asset for Cosmic voids",
URL = "https://www.amnh.org/research/hayden-planetarium/digital-universe",
diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/bepicolombo.asset b/data/assets/scene/solarsystem/missions/bepicolombo/bepicolombo.asset
new file mode 100644
index 0000000000..616728c08b
--- /dev/null
+++ b/data/assets/scene/solarsystem/missions/bepicolombo/bepicolombo.asset
@@ -0,0 +1,16 @@
+asset.require("./model")
+asset.require("./trails")
+asset.require("./mission")
+asset.require("./fov")
+
+
+
+asset.meta = {
+ Name = "BepiColombo",
+ Version = "1.0",
+ Description =
+ "This asset includes all of the other assets for the BepiColombo mission.",
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov.asset
new file mode 100644
index 0000000000..6dfe003e15
--- /dev/null
+++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov.asset
@@ -0,0 +1,10 @@
+asset.require("./fov/bela")
+asset.require("./fov/hga")
+asset.require("./fov/mertis")
+asset.require("./fov/mgns")
+asset.require("./fov/mixs")
+asset.require("./fov/phebus")
+asset.require("./fov/serena")
+asset.require("./fov/sibbiosys")
+asset.require("./fov/sixs")
+asset.require("./fov/startracker")
diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/bela.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/bela.asset
new file mode 100644
index 0000000000..e99a422999
--- /dev/null
+++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/bela.asset
@@ -0,0 +1,108 @@
+local transforms = asset.require("../model")
+local kernels = asset.require("../kernels")
+
+
+
+local BelaReceiver = {
+ Identifier = "BepiColomboMPO_BelaReceiver",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.BelaReceiver,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_BELA_RX",
+ Method = "CIRCLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO BELA Receiver",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local BelaTransmitterMain = {
+ Identifier = "BepiColomboMPO_BelaTransmitterMain",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.BelaTransmitterMain,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_BELA_TX_MAIN",
+ Method = "CIRCLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO BELA Transmitter Main",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local BelaTransmitterRed = {
+ Identifier = "BepiColomboMPO_BelaTransmitterRed",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.BelaTransmitterRed,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_BELA_TX_RED",
+ Method = "CIRCLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO BELA Transmitter Main",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+asset.onInitialize(function()
+ -- Circle shapes are currently not supported
+ -- openspace.addSceneGraphNode(BelaReceiver)
+ -- openspace.addSceneGraphNode(BelaTransmitterMain)
+ -- openspace.addSceneGraphNode(BelaTransmitterRed)
+end)
+
+asset.onDeinitialize(function()
+ -- openspace.removeSceneGraphNode(BelaTransmitterRed)
+ -- openspace.removeSceneGraphNode(BelaTransmitterMain)
+ -- openspace.removeSceneGraphNode(BelaReceiver)
+end)
+
+
+
+asset.meta = {
+ Name = "BELA",
+ Version = "1.0",
+ Description = [[
+ BELA for the first time will return a digitized laser reflection signal (only in a
+ dedicated instrument mode in order to keep the overall data volume moderate). This
+ will allow characterizing the surface roughness with unprecedented detail and
+ accuracy. BELA's albedo measurement capability will be particularly important for
+ permanently shaded craters where ice is suspected to be found. Here, BELA can observe
+ with its laser where most other remote sensing instruments will fail to obtain a
+ signal. In its normal operational mode, BELA employs a modified digital filter
+ matching algorithms for return pulse detection, while other similar instruments
+ (MOLA, MLA) use analog filter matching. The digital filters can be exchanged at any
+ time by telecommand and/or parameter upload.
+ ]],
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/hga.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/hga.asset
new file mode 100644
index 0000000000..e4e5e6c7e6
--- /dev/null
+++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/hga.asset
@@ -0,0 +1,48 @@
+local transforms = asset.require("../model")
+local kernels = asset.require("../kernels")
+
+
+
+local HGA = {
+ Identifier = "BepiColomboMPO_HGA",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.HGA,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_HGA",
+ Method = "CIRCLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO HGA",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+
+asset.onInitialize(function()
+ -- Circle shapes are currently not supported
+ -- openspace.addSceneGraphNode(HGA)
+end)
+
+asset.onDeinitialize(function()
+ -- openspace.removeSceneGraphNode(HGA)
+end)
+
+
+
+asset.meta = {
+ Name = "HGA",
+ Version = "1.0",
+ Description = "Shows the field-view for the High Gain Antenna of the MPO spacecraft.",
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/mertis.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/mertis.asset
new file mode 100644
index 0000000000..2746bc7a0b
--- /dev/null
+++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/mertis.asset
@@ -0,0 +1,104 @@
+local transforms = asset.require("../model")
+local kernels = asset.require("../kernels")
+
+
+
+local MertisTis = {
+ Identifier = "BepiColomboMPO_MertisTis",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.MertisTis,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_MERTIS_TIS",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO MERTIS TIS",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local MertisTisPlanet = {
+ Identifier = "BepiColomboMPO_MertisTisPlanet",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.MertisTisPlanet,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_MERTIS_TIS_PLANET",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO MERTIS TIS Planet",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local MertisTisSpace = {
+ Identifier = "BepiColomboMPO_MertisTisSpace",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.MertisTisSpace,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_MERTIS_TIS_SPACE",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO MERTIS TIS Space",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+
+asset.onInitialize(function()
+ openspace.addSceneGraphNode(MertisTis)
+ openspace.addSceneGraphNode(MertisTisPlanet)
+ openspace.addSceneGraphNode(MertisTisSpace)
+end)
+
+asset.onDeinitialize(function()
+ openspace.removeSceneGraphNode(MertisTisSpace)
+ openspace.removeSceneGraphNode(MertisTisPlanet)
+ openspace.removeSceneGraphNode(MertisTis)
+end)
+
+
+
+asset.meta = {
+ Name = "MERTIS",
+ Version = "1.0",
+ Description = [[
+ The Mercury Radiometer and Thermal Infrared Spectrometer (MERTIS) is an innovative
+ instrument for studying the surface composition and mineralogy of planet Mercury.
+ MERTIS combines an uncooled grating push broom IR-spectrometer (TIS) with a radiometer
+ (TIR), which will operate in the wavelength region of 7-14 and 7-40 um, respectively.
+ The spatial resolution of the MERTIS observations will be about 500 m globally and
+ better than 500 m for approximately 5-10 percent of the surface.
+ ]],
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/mgns.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/mgns.asset
new file mode 100644
index 0000000000..d54ce926c3
--- /dev/null
+++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/mgns.asset
@@ -0,0 +1,57 @@
+local transforms = asset.require("../model")
+local kernels = asset.require("../kernels")
+
+
+
+local MGNS = {
+ Identifier = "BepiColomboMPO_MGNS",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.MGNS,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_MGNS",
+ Method = "CIRCLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO MGNS",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+
+asset.onInitialize(function()
+ -- Circle shapes are currently not supported
+ -- openspace.addSceneGraphNode(MGNS)
+end)
+
+asset.onDeinitialize(function()
+ -- openspace.removeSceneGraphNode(MGNS)
+end)
+
+
+
+asset.meta = {
+ Name = "MGNS",
+ Version = "1.0",
+ Description = [[
+ The Mercury Gamma-ray and Neutron Spectrometer (MGNS) on board BepiColombo Mercury
+ Planet Orbiter is designed to observe and study the gamma-ray and neutron emissions of
+ Mercury. The MGNS is a multifunctional scientific instrument, comprising one gamma-ray
+ spectrometer and four neutron detectors. The sensor unit of the gamma-ray spectrometer
+ consists of one 3 by 3 inches high energy resolution inorganic scintillator crystal,
+ i.e. CeBr3, whereas the sensor unit of the neutron detectors consists of three 3He
+ gas-filled tubes and one stilbene organic scintillator crystal with plastic
+ scintillator as its anticoincidence shield.
+ ]],
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/mixs.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/mixs.asset
new file mode 100644
index 0000000000..5696e1fed2
--- /dev/null
+++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/mixs.asset
@@ -0,0 +1,81 @@
+local transforms = asset.require("../model")
+local kernels = asset.require("../kernels")
+
+
+
+local MIXS_C = {
+ Identifier = "BepiColomboMPO_MIXS-C",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.MIXS_C,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_MIXS-C",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO MIXS-C",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local MIXS_T = {
+ Identifier = "BepiColomboMPO_MIXS-T",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.MIXS_T,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_MIXS-T",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO MIXS-T",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+
+asset.onInitialize(function()
+ openspace.addSceneGraphNode(MIXS_C)
+ openspace.addSceneGraphNode(MIXS_T)
+end)
+
+asset.onDeinitialize(function()
+ openspace.removeSceneGraphNode(MIXS_T)
+ openspace.removeSceneGraphNode(MIXS_C)
+end)
+
+
+
+asset.meta = {
+ Name = "MIXS",
+ Version = "1.0",
+ Description = [[
+ The MIXS instrument contains two parallel telescopes, designed to map the X-ray
+ emission from Mercury at two angular resolutions. The narrow-field telescope (MIXS-T)
+ uses a grazing incidence optic with a 1 degree field-of-view (FOV) and an imaging
+ detector with 64 x 64 pixels. The wide-field telescope (MIXS-C) uses a collimator to
+ define a FOV of ~10 degrees Full Width at Zero Maximum (FWZM). Its detector is
+ identical to MIXS-T, but as the collimator has no imaging capability, the pixels are
+ aggregated into a single output. The optical axes are aligned with the nadir-pointing
+ axis of the spacecraft.
+ ]],
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/phebus.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/phebus.asset
new file mode 100644
index 0000000000..86d52904ec
--- /dev/null
+++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/phebus.asset
@@ -0,0 +1,137 @@
+local transforms = asset.require("../model")
+local kernels = asset.require("../kernels")
+
+
+
+local PhebusSlit75 = {
+ Identifier = "BepiColomboMPO_PhebusSlit75",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.PhebusSlit75,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_PHEBUS_SLIT_75",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Phebus Slit 75",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local PhebusSlit100 = {
+ Identifier = "BepiColomboMPO_PhebusSlit100",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.PhebusSlit100,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_PHEBUS_SLIT_100",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Phebus Slit 100",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local Phebus75 = {
+ Identifier = "BepiColomboMPO_Phebus75",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.Phebus75,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_PHEBUS_75",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Phebus 75",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local Phebus100 = {
+ Identifier = "BepiColomboMPO_Phebus100",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.Phebus100,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_PHEBUS_100",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Phebus 100",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+
+asset.onInitialize(function()
+ openspace.addSceneGraphNode(PhebusSlit75)
+ openspace.addSceneGraphNode(PhebusSlit100)
+ openspace.addSceneGraphNode(Phebus75)
+ openspace.addSceneGraphNode(Phebus100)
+end)
+
+asset.onDeinitialize(function()
+ openspace.removeSceneGraphNode(Phebus100)
+ openspace.removeSceneGraphNode(Phebus75)
+ openspace.removeSceneGraphNode(PhebusSlit100)
+ openspace.removeSceneGraphNode(PhebusSlit75)
+end)
+
+
+
+asset.meta = {
+ Name = "Phebus",
+ Version = "1.0",
+ Description = [[
+ The PHEBUS instrument is a UV spectrometer covering the spectral range going from
+ 50 nm to 315 nm with two additional narrow bands in the visible around 404 nm (K line)
+ and 422 nm (Ca line). Photons from the source (exosphere of Mercury) are collected by
+ a SiC primary mirror installed inside a one-degree of freedom rotating mechanism
+ (360 degrees). The primary mirror focuses the photons on a slit. Spectrometric
+ information is obtained by the use of two gratings sharing the same pupil. Photons
+ going through the slit are scattered according to their wavelength onto two separate
+ intensified cross-delay anode detectors. One detector (labelled EUV) covers the
+ 55-155 nm wavelength range. The second one (labelled FUV) covers the 145-315nm
+ wavelength range. The two intensifiers based on Micro-Channel Plates use high voltages
+ at values around 3600-5000 V. The two visible narrow spectral bands are obtained by
+ two prisms on the side of the FUV detector that feed two identical Photo-Multiplier
+ Tubes. The high voltage level that is necessary for these PMT is around 1000 V. They
+ are called NUV Ca and NUV K detectors.
+ ]],
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/serena.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/serena.asset
new file mode 100644
index 0000000000..ce050aa3ec
--- /dev/null
+++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/serena.asset
@@ -0,0 +1,56 @@
+local transforms = asset.require("../model")
+local kernels = asset.require("../kernels")
+
+
+
+local SerenaElena = {
+ Identifier = "BepiColomboMPO_SerenaElena",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElena,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA",
+ Method = "POLYGON",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+
+asset.onInitialize(function()
+ openspace.addSceneGraphNode(SerenaElena)
+end)
+
+asset.onDeinitialize(function()
+ openspace.removeSceneGraphNode(SerenaElena)
+end)
+
+
+
+asset.meta = {
+ Name = "Serena",
+ Version = "1.0",
+ Description = [[
+ The Search for Exospheric Refilling and Emitted Natural Abundances (SERENA) is a
+ single instrument composed by 4 units devoted to the detection of neutral and ionized
+ particles in the Hermean environment. It addresses some of the main scientific
+ objectives of the BepiColombo mission: composition, origin and dynamics of Mercury's
+ exosphere and polar deposits; and structure and dynamics of Mercury's magnetosphere.
+ Each unit is able to operate individually and to achieve its specific scientific
+ objectives. In addition, the opportunity to operate sensors simultaneously greatly
+ improves the success of scientific objectives and allows for additional objectives.
+ ]],
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/serena_anodes.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/serena_anodes.asset
new file mode 100644
index 0000000000..9476efd37f
--- /dev/null
+++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/serena_anodes.asset
@@ -0,0 +1,832 @@
+local transforms = asset.require("../model")
+local kernels = asset.require("../kernels")
+
+
+
+local SerenaElenaAN01 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN01",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN01,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_01",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN01",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN02 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN02",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN02,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_02",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN02",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN03 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN03",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN03,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_03",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN03",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN04 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN04",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN04,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_04",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN04",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN05 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN05",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN05,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_05",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN05",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN06 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN06",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN06,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_06",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN06",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN07 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN07",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN07,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_07",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN07",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN08 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN08",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN08,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_08",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN08",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN09 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN09",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN09,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_09",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN09",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN10 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN10",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN10,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_10",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN10",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN11 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN11",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN11,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_11",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN11",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN12 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN12",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN12,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_12",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN12",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN13 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN13",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN13,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_13",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN13",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN14 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN14",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN14,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_14",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN14",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN15 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN15",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN15,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_15",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN15",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN16 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN16",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN16,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_16",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN16",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN17 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN17",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN17,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_17",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN17",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN18 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN18",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN18,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_18",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN18",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN19 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN19",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN19,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_19",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN19",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN20 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN20",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN20,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_20",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN20",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN21 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN21",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN21,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_21",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN21",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN22 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN22",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN22,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_22",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN22",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN23 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN23",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN23,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_23",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN23",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN24 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN24",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN24,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_24",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN24",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN25 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN25",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN25,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_25",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN25",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN26 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN26",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN26,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_26",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN26",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN27 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN27",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN27,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_27",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN27",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN28 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN28",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN28,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_28",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN28",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN29 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN29",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN29,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_29",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN29",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN30 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN30",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN30,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_30",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN30",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN31 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN31",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN31,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_31",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN31",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SerenaElenaAN32 = {
+ Identifier = "BepiColomboMPO_SerenaElena_AN32",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SerenaElenaAN32,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SERENA_ELENA_AN_32",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Serena Elena AN32",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+
+
+asset.onInitialize(function()
+ openspace.addSceneGraphNode(SerenaElenaAN01)
+ openspace.addSceneGraphNode(SerenaElenaAN02)
+ openspace.addSceneGraphNode(SerenaElenaAN03)
+ openspace.addSceneGraphNode(SerenaElenaAN04)
+ openspace.addSceneGraphNode(SerenaElenaAN05)
+ openspace.addSceneGraphNode(SerenaElenaAN06)
+ openspace.addSceneGraphNode(SerenaElenaAN07)
+ openspace.addSceneGraphNode(SerenaElenaAN08)
+ openspace.addSceneGraphNode(SerenaElenaAN09)
+ openspace.addSceneGraphNode(SerenaElenaAN10)
+ openspace.addSceneGraphNode(SerenaElenaAN11)
+ openspace.addSceneGraphNode(SerenaElenaAN12)
+ openspace.addSceneGraphNode(SerenaElenaAN13)
+ openspace.addSceneGraphNode(SerenaElenaAN14)
+ openspace.addSceneGraphNode(SerenaElenaAN15)
+ openspace.addSceneGraphNode(SerenaElenaAN16)
+ openspace.addSceneGraphNode(SerenaElenaAN17)
+ openspace.addSceneGraphNode(SerenaElenaAN18)
+ openspace.addSceneGraphNode(SerenaElenaAN19)
+ openspace.addSceneGraphNode(SerenaElenaAN20)
+ openspace.addSceneGraphNode(SerenaElenaAN21)
+ openspace.addSceneGraphNode(SerenaElenaAN22)
+ openspace.addSceneGraphNode(SerenaElenaAN23)
+ openspace.addSceneGraphNode(SerenaElenaAN24)
+ openspace.addSceneGraphNode(SerenaElenaAN25)
+ openspace.addSceneGraphNode(SerenaElenaAN26)
+ openspace.addSceneGraphNode(SerenaElenaAN27)
+ openspace.addSceneGraphNode(SerenaElenaAN28)
+ openspace.addSceneGraphNode(SerenaElenaAN29)
+ openspace.addSceneGraphNode(SerenaElenaAN30)
+ openspace.addSceneGraphNode(SerenaElenaAN31)
+ openspace.addSceneGraphNode(SerenaElenaAN32)
+end)
+
+asset.onDeinitialize(function()
+ openspace.removeSceneGraphNode(SerenaElenaAN32)
+ openspace.removeSceneGraphNode(SerenaElenaAN31)
+ openspace.removeSceneGraphNode(SerenaElenaAN30)
+ openspace.removeSceneGraphNode(SerenaElenaAN29)
+ openspace.removeSceneGraphNode(SerenaElenaAN28)
+ openspace.removeSceneGraphNode(SerenaElenaAN27)
+ openspace.removeSceneGraphNode(SerenaElenaAN26)
+ openspace.removeSceneGraphNode(SerenaElenaAN25)
+ openspace.removeSceneGraphNode(SerenaElenaAN24)
+ openspace.removeSceneGraphNode(SerenaElenaAN23)
+ openspace.removeSceneGraphNode(SerenaElenaAN22)
+ openspace.removeSceneGraphNode(SerenaElenaAN21)
+ openspace.removeSceneGraphNode(SerenaElenaAN20)
+ openspace.removeSceneGraphNode(SerenaElenaAN19)
+ openspace.removeSceneGraphNode(SerenaElenaAN18)
+ openspace.removeSceneGraphNode(SerenaElenaAN17)
+ openspace.removeSceneGraphNode(SerenaElenaAN16)
+ openspace.removeSceneGraphNode(SerenaElenaAN15)
+ openspace.removeSceneGraphNode(SerenaElenaAN14)
+ openspace.removeSceneGraphNode(SerenaElenaAN13)
+ openspace.removeSceneGraphNode(SerenaElenaAN12)
+ openspace.removeSceneGraphNode(SerenaElenaAN11)
+ openspace.removeSceneGraphNode(SerenaElenaAN10)
+ openspace.removeSceneGraphNode(SerenaElenaAN09)
+ openspace.removeSceneGraphNode(SerenaElenaAN08)
+ openspace.removeSceneGraphNode(SerenaElenaAN07)
+ openspace.removeSceneGraphNode(SerenaElenaAN06)
+ openspace.removeSceneGraphNode(SerenaElenaAN05)
+ openspace.removeSceneGraphNode(SerenaElenaAN04)
+ openspace.removeSceneGraphNode(SerenaElenaAN03)
+ openspace.removeSceneGraphNode(SerenaElenaAN02)
+ openspace.removeSceneGraphNode(SerenaElenaAN01)
+end)
+
+
+
+asset.meta = {
+ Name = "Serena Anodes",
+ Version = "1.0",
+ Description = [[
+ The Search for Exospheric Refilling and Emitted Natural Abundances (SERENA) is a
+ single instrument composed by 4 units devoted to the detection of neutral and ionized
+ particles in the Hermean environment. It addresses some of the main scientific
+ objectives of the BepiColombo mission: composition, origin and dynamics of Mercury's
+ exosphere and polar deposits; and structure and dynamics of Mercury's magnetosphere.
+ Each unit is able to operate individually and to achieve its specific scientific
+ objectives. In addition, the opportunity to operate sensors simultaneously greatly
+ improves the success of scientific objectives and allows for additional objectives.
+ ]],
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/sibbiosys.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/sibbiosys.asset
new file mode 100644
index 0000000000..b5199d9b94
--- /dev/null
+++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/sibbiosys.asset
@@ -0,0 +1,378 @@
+local transforms = asset.require("../model")
+local kernels = asset.require("../kernels")
+
+
+
+local SimbioSys_HRIC_FPA = {
+ Identifier = "BepiColomboMPO_SIMBIOSYS_HRIC_FPA",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SymbioSysHricFpa,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SIMBIO-SYS_HRIC_FPA",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Simbio-Sys HRIC FPA",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SimbioSys_HRIC_F550 = {
+ Identifier = "BepiColomboMPO_SIMBIOSYS_HRIC_F550",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SymbioSysHricF550,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SIMBIO-SYS_HRIC_F550",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Simbio-Sys HRIC F550",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SimbioSys_HRIC_FPAN = {
+ Identifier = "BepiColomboMPO_SIMBIOSYS_HRIC_FPAN",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SymbioSysHricFpan,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SIMBIO-SYS_HRIC_FPAN",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Simbio-Sys HRIC FPAN",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SimbioSys_HRIC_F750 = {
+ Identifier = "BepiColomboMPO_SIMBIOSYS_HRIC_F750",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SymbioSysHricF750,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SIMBIO-SYS_HRIC_F750",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Simbio-Sys HRIC F750",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SimbioSys_HRIC_F880 = {
+ Identifier = "BepiColomboMPO_SIMBIOSYS_HRIC_F880",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SymbioSysHricF880,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SIMBIO-SYS_HRIC_F880",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Simbio-Sys HRIC F880",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SimbioSys_STC_L = {
+ Identifier = "BepiColomboMPO_SIMBIOSYS_STC_L",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SymbioSysSTCL,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SIMBIO-SYS_STC-L",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Simbio-Sys STC L",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SimbioSys_STC_H = {
+ Identifier = "BepiColomboMPO_SIMBIOSYS_STC_H",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SymbioSysSTCH,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SIMBIO-SYS_STC-H",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Simbio-Sys STC H",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SimbioSys_STC_L_F920 = {
+ Identifier = "BepiColomboMPO_SIMBIOSYS_STC_L_F920",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SymbioSysSTCLF920,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SIMBIO-SYS_STC-L_F920",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Simbio-Sys STC L F920",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SimbioSys_STC_L_F550 = {
+ Identifier = "BepiColomboMPO_SIMBIOSYS_STC_L_F550",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SymbioSysSTCLF550,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SIMBIO-SYS_STC-L_F550",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Simbio-Sys STC L F550",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SimbioSys_STC_L_P700 = {
+ Identifier = "BepiColomboMPO_SIMBIOSYS_STC_L_P700",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SymbioSysSTCLP700,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SIMBIO-SYS_STC-L_P700",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Simbio-Sys STC L P700",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SimbioSys_STC_H_P700 = {
+ Identifier = "BepiColomboMPO_SIMBIOSYS_STC_H_P700",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SymbioSysSTCHP700,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SIMBIO-SYS_STC-H_P700",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Simbio-Sys STC H P700",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SimbioSys_STC_H_F420 = {
+ Identifier = "BepiColomboMPO_SIMBIOSYS_STC_H_F420",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SymbioSysSTCHF420,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SIMBIO-SYS_STC-H_F420",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Simbio-Sys STC H F420",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SimbioSys_STC_H_F750 = {
+ Identifier = "BepiColomboMPO_SIMBIOSYS_STC_H_F750",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SymbioSysSTCHF750,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SIMBIO-SYS_STC-H_F750",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Simbio-Sys STC H F750",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SimbioSys_VIHI = {
+ Identifier = "BepiColomboMPO_SIMBIOSYS_VIHI",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.SymbioSysVIHI,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SIMBIO-SYS_VIHI",
+ Method = "RECTANGLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Simbio-Sys VIHI",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+
+asset.onInitialize(function()
+ openspace.addSceneGraphNode(SimbioSys_HRIC_FPA)
+ openspace.addSceneGraphNode(SimbioSys_HRIC_F550)
+ openspace.addSceneGraphNode(SimbioSys_HRIC_FPAN)
+ openspace.addSceneGraphNode(SimbioSys_HRIC_F750)
+ openspace.addSceneGraphNode(SimbioSys_HRIC_F880)
+ openspace.addSceneGraphNode(SimbioSys_STC_L)
+ openspace.addSceneGraphNode(SimbioSys_STC_H)
+ openspace.addSceneGraphNode(SimbioSys_STC_L_F920)
+ openspace.addSceneGraphNode(SimbioSys_STC_L_F550)
+ openspace.addSceneGraphNode(SimbioSys_STC_L_P700)
+ openspace.addSceneGraphNode(SimbioSys_STC_H_P700)
+ openspace.addSceneGraphNode(SimbioSys_STC_H_F420)
+ openspace.addSceneGraphNode(SimbioSys_STC_H_F750)
+ openspace.addSceneGraphNode(SimbioSys_VIHI)
+end)
+
+asset.onDeinitialize(function()
+ openspace.removeSceneGraphNode(SimbioSys_VIHI)
+ openspace.removeSceneGraphNode(SimbioSys_STC_H_F750)
+ openspace.removeSceneGraphNode(SimbioSys_STC_H_F420)
+ openspace.removeSceneGraphNode(SimbioSys_STC_H_P700)
+ openspace.removeSceneGraphNode(SimbioSys_STC_L_P700)
+ openspace.removeSceneGraphNode(SimbioSys_STC_L_F550)
+ openspace.removeSceneGraphNode(SimbioSys_STC_L_F920)
+ openspace.removeSceneGraphNode(SimbioSys_STC_H)
+ openspace.removeSceneGraphNode(SimbioSys_STC_L)
+ openspace.removeSceneGraphNode(SimbioSys_HRIC_F880)
+ openspace.removeSceneGraphNode(SimbioSys_HRIC_F750)
+ openspace.removeSceneGraphNode(SimbioSys_HRIC_FPAN)
+ openspace.removeSceneGraphNode(SimbioSys_HRIC_F550)
+ openspace.removeSceneGraphNode(SimbioSys_HRIC_FPA)
+end)
+
+
+
+asset.meta = {
+ Name = "SYMBIO-SYS",
+ Version = "1.0",
+ Description = [[
+ SIMBIO-SYS has been conceived to be integrated on the BepiColombo MPO pointing in the
+ nadir direction in order to perform the remote sensing of the Mercury surface during
+ the satellite orbits. The SIMBIO-SYS instrument architecture is based on 3 different
+ channels composing the instrument front-end with a common main electronics and power
+ supply.
+ ]],
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/sixs.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/sixs.asset
new file mode 100644
index 0000000000..a523a5c653
--- /dev/null
+++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/sixs.asset
@@ -0,0 +1,104 @@
+local transforms = asset.require("../model")
+local kernels = asset.require("../kernels")
+
+
+
+local SixsX1 = {
+ Identifier = "BepiColomboMPO_SixsX1",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.Sixs_X1,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SIXS-X-1",
+ Method = "ELLIPSE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Sixs X1",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SixsX2 = {
+ Identifier = "BepiColomboMPO_SixsX2",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.Sixs_X2,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SIXS-X-2",
+ Method = "ELLIPSE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Sixs X2",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local SixsX3 = {
+ Identifier = "BepiColomboMPO_SixsX3",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.Sixs_X3,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_SIXS-X-3",
+ Method = "ELLIPSE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Sixs X3",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+
+asset.onInitialize(function()
+ -- Circle shapes are currently not supported
+ -- openspace.addSceneGraphNode(SixsX1)
+ -- openspace.addSceneGraphNode(SixsX2)
+ -- openspace.addSceneGraphNode(SixsX3)
+end)
+
+asset.onDeinitialize(function()
+ -- openspace.removeSceneGraphNode(SixsX3)
+ -- openspace.removeSceneGraphNode(SixsX2)
+ -- openspace.removeSceneGraphNode(SixsX1)
+end)
+
+
+
+asset.meta = {
+ Name = "Sixs",
+ Version = "1.0",
+ Description = [[
+ The scientific investigation performed by the Solar Intensity X-ray and particle
+ Spectrometer (SIXS) is the determination of solar impact on the Hermean surface in the
+ form of direct X-rays and energetic particles, which induce observable X-ray emission
+ via interaction with the surface of the planet. Particles of concern here are highly
+ energetic solar protons and electrons.
+ ]],
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/startracker.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/startracker.asset
new file mode 100644
index 0000000000..924aa134a2
--- /dev/null
+++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/startracker.asset
@@ -0,0 +1,107 @@
+local transforms = asset.require("../model")
+local kernels = asset.require("../kernels")
+
+
+
+local StarTracker1 = {
+ Identifier = "BepiColomboMPO_StarTracker1",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.StarTracker1,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_STR-1",
+ Method = "CIRCLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Star Tracker 1",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local StarTracker2 = {
+ Identifier = "BepiColomboMPO_StarTracker2",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.StarTracker2,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_STR-2",
+ Method = "CIRCLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Star Tracker 2",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+local StarTracker3 = {
+ Identifier = "BepiColomboMPO_StarTracker3",
+ Parent = transforms.BepiColombo.Identifier,
+ Renderable = {
+ Type = "RenderableFov",
+ Body = kernels.ID.MPO,
+ Frame = kernels.Frame.StarTracker3,
+ RGB = { 0.8, 0.7, 0.7 },
+ Instrument = {
+ Name = "MPO_STR-3",
+ Method = "CIRCLE",
+ Aberration = "NONE"
+ },
+ AlwaysDrawFov = true,
+ PotentialTargets = { "MERCURY", "EARTH", "VENUS" },
+ FrameConversions = {}
+ },
+ GUI = {
+ Name = "MPO Star Tracker 3",
+ Path = "/Solar System/Missions/BepiColombo/Instruments",
+ }
+}
+
+
+asset.onInitialize(function()
+ -- Circle shapes are currently not supported
+ -- openspace.addSceneGraphNode(StarTracker1)
+ -- openspace.addSceneGraphNode(StarTracker2)
+ -- openspace.addSceneGraphNode(StarTracker3)
+end)
+
+asset.onDeinitialize(function()
+ -- openspace.removeSceneGraphNode(StarTracker1)
+ -- openspace.removeSceneGraphNode(StarTracker2)
+ -- openspace.removeSceneGraphNode(StarTracker3)
+end)
+
+
+
+asset.meta = {
+ Name = "Star Tracker",
+ Version = "1.0",
+ Description = [[
+ From a functional point of view, the Autonomous Star Trackers can be seen as a video
+ camera plus an image processing unit that, starting from an image of the sky, extracts
+ the attitude information for the AOCS, measured with respect to the J2000 inertial
+ reference system.
+
+ The STR can track up to 15 stars simultaneously and consists of a Single box that
+ contains the optical head, the main electronics and a baffle which is thermally
+ decoupled from the box.
+ ]],
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/kernels.asset b/data/assets/scene/solarsystem/missions/bepicolombo/kernels.asset
new file mode 100644
index 0000000000..7503619b7a
--- /dev/null
+++ b/data/assets/scene/solarsystem/missions/bepicolombo/kernels.asset
@@ -0,0 +1,303 @@
+local kernels = asset.resource({
+ Name = "BepiColombo Kernels",
+ Type = "HttpSynchronization",
+ Identifier = "bepicolombo_kernels",
+ Version = 1
+})
+
+
+local BepiColomboKernels = {
+ -- Kernel list based on bc_ops_v413_20240112_001.tm
+ kernels .. "bc_mpo_magboom_default_s20191107_v01.bc",
+ kernels .. "bc_mpo_hga_scm_20181020_20190101_s20201020_v02.bc",
+ kernels .. "bc_mpo_hga_scm_20190101_20200101_s20230309_v01.bc",
+ kernels .. "bc_mpo_hga_scm_20200101_20210101_s20230309_v01.bc",
+ kernels .. "bc_mpo_hga_scm_20210101_20220101_s20230309_v01.bc",
+ kernels .. "bc_mpo_hga_scm_20220101_20230101_s20221229_v01.bc",
+ kernels .. "bc_mpo_hga_scm_20230101_20240101_s20240104_v01.bc",
+ kernels .. "bc_mpo_hga_scm_20240101_20240111_s20240110_v01.bc",
+ kernels .. "bc_mpo_mga_scm_20181020_20190101_s20200109_v02.bc",
+ kernels .. "bc_mpo_mga_scm_20190101_20200101_s20230309_v01.bc",
+ kernels .. "bc_mpo_mga_scm_20200101_20210101_s20230309_v01.bc",
+ kernels .. "bc_mpo_mga_scm_20210101_20220101_s20230309_v01.bc",
+ kernels .. "bc_mpo_mga_scm_20220101_20230101_s20221229_v01.bc",
+ kernels .. "bc_mpo_mga_scm_20230101_20240101_s20240104_v01.bc",
+ kernels .. "bc_mpo_mga_scm_20240101_20240111_s20240110_v01.bc",
+ kernels .. "bc_mpo_sa_scm_20181020_20190101_s20211202_v01.bc",
+ kernels .. "bc_mpo_sa_scm_20190101_20200101_s20230309_v01.bc",
+ kernels .. "bc_mpo_sa_scm_20200101_20210101_s20230309_v01.bc",
+ kernels .. "bc_mpo_sa_scm_20210101_20220101_s20230309_v01.bc",
+ kernels .. "bc_mpo_sa_scm_20220101_20230101_s20221229_v01.bc",
+ kernels .. "bc_mpo_sa_scm_20230101_20240101_s20240104_v01.bc",
+ kernels .. "bc_mpo_sa_scm_20240101_20240111_s20240110_v01.bc",
+ kernels .. "bc_mtm_sa_scm_20181020_20190101_s20200109_v02.bc",
+ kernels .. "bc_mtm_sa_scm_20190101_20200101_s20230309_v01.bc",
+ kernels .. "bc_mtm_sa_scm_20200101_20210101_s20230309_v01.bc",
+ kernels .. "bc_mtm_sa_scm_20210101_20220101_s20230309_v01.bc",
+ kernels .. "bc_mtm_sa_scm_20220101_20230101_s20221229_v01.bc",
+ kernels .. "bc_mtm_sa_scm_20230101_20240101_s20240104_v01.bc",
+ kernels .. "bc_mtm_sa_scm_20240101_20240111_s20240110_v01.bc",
+ kernels .. "bc_mmo_sc_scp_20180317_20251220_f20170228_v02.bc",
+ kernels .. "bc_mmo_sc_slt_50038_20251220_20280305_f20170228_v02.bc",
+ kernels .. "bc_mtm_sc_scp_20180317_20251219_f20181121_v02.bc",
+ kernels .. "bc_mtm_sep_scp_20181019_20251205_f20181127_v02.bc",
+ kernels .. "bc_mpo_sc_prelaunch_f20181121_v01.bc",
+ kernels .. "bc_mpo_sc_fcp_00160_20181020_20240216_f20181127_v01.bc",
+ kernels .. "bc_mpo_sc_scc_20181019_20190101_s20230309_v01.bc",
+ kernels .. "bc_mpo_sc_scc_20190101_20200101_s20230309_v01.bc",
+ kernels .. "bc_mpo_sc_scc_20200101_20210101_s20230309_v01.bc",
+ kernels .. "bc_mpo_sc_scc_20210101_20220101_s20230309_v01.bc",
+ kernels .. "bc_mpo_sc_scc_20220101_20230101_s20221229_v01.bc",
+ kernels .. "bc_mpo_sc_scc_20230101_20240101_s20240104_v01.bc",
+ kernels .. "bc_mpo_sc_scc_20240101_20240111_s20240110_v01.bc",
+ kernels .. "bc_mpo_sc_scm_20181020_20190101_s20230309_v01.bc",
+ kernels .. "bc_mpo_sc_scm_20190101_20200101_s20230309_v01.bc",
+ kernels .. "bc_mpo_sc_scm_20200101_20210101_s20210618_v01.bc",
+ kernels .. "bc_mpo_sc_scm_20210101_20220101_s20230309_v01.bc",
+ kernels .. "bc_mpo_sc_scm_20220101_20230101_s20230309_v01.bc",
+ kernels .. "bc_mpo_sc_scm_20230101_20240101_s20240104_v01.bc",
+ kernels .. "bc_mpo_sc_scm_20240101_20240111_s20240110_v01.bc",
+ kernels .. "bc_mpo_v34.tf",
+ kernels .. "bc_mtm_v12.tf",
+ kernels .. "bc_mmo_v13.tf",
+ kernels .. "bc_ops_v01.tf",
+ kernels .. "bc_sci_v12.tf",
+ kernels .. "bc_dsk_surfaces_v03.tf",
+ kernels .. "rssd0004.tf",
+ kernels .. "earth_topo_201023.tf",
+ kernels .. "earthstns_jaxa_20230905.tf",
+ kernels .. "earthfixeditrf93.tf",
+ kernels .. "estrack_v04.tf",
+ kernels .. "bc_mmo_sc_bus_v02.bds",
+ kernels .. "bc_mpo_sc_bus_v02.bds",
+ kernels .. "bc_mpo_sc_hga_v02.bds",
+ kernels .. "bc_mpo_sc_mga_v02.bds",
+ kernels .. "bc_mpo_sc_mosif_v02.bds",
+ kernels .. "bc_mpo_sc_sa_v02.bds",
+ kernels .. "bc_mtm_sc_bus_v02.bds",
+ kernels .. "bc_mtm_sc_samx_v02.bds",
+ kernels .. "bc_mtm_sc_sapx_v02.bds",
+ kernels .. "mercury_m002_mes_v02.bds",
+
+ kernels .. "bc_mpo_bela_v09.ti",
+ kernels .. "bc_mpo_mertis_v08.ti",
+ kernels .. "bc_mpo_mgns_v02.ti",
+ kernels .. "bc_mpo_mixs_v06.ti",
+ kernels .. "bc_mpo_phebus_v06.ti",
+ kernels .. "bc_mpo_serena_v08.ti",
+ kernels .. "bc_mpo_simbio-sys_v10.ti",
+ kernels .. "bc_mpo_sixs_v08.ti",
+ kernels .. "bc_mpo_str_v02.ti",
+ kernels .. "bc_mpo_aux_v01.ti",
+ kernels .. "bc_mtm_mcam_v05.ti",
+ kernels .. "bc_mmo_mppe_v04.ti",
+ kernels .. "bc_mmo_msasi_v03.ti",
+ kernels .. "bc_mmo_ssas_v01.ti",
+
+ kernels .. "de403_masses.tpc",
+ kernels .. "gm_de431.tpc",
+ kernels .. "pck00011_bc_v00.tpc",
+
+ kernels .. "earth_070425_370426_predict.bpc",
+ kernels .. "earth_000101_240403_240109.bpc",
+
+ kernels .. "bc_mpo_step_20240110.tsc",
+ kernels .. "bc_mpo_fict_20181127.tsc",
+ kernels .. "bc_mmo_fict_20170228.tsc",
+
+ kernels .. "de432s.bsp",
+ kernels .. "earthstns_itrf93_201023.bsp",
+ kernels .. "earthstns_jaxa_20230905.bsp",
+ kernels .. "estrack_v04.bsp",
+ kernels .. "bc_sci_v02.bsp",
+ kernels .. "bc_mmo_struct_v01.bsp",
+ kernels .. "bc_mmo_scp_20181019_20251220_v02.bsp",
+ kernels .. "bc_mtm_struct_v06.bsp",
+ kernels .. "bc_mtm_scp_20181019_20251219_v03.bsp",
+ kernels .. "bc_mpo_cog_v03.bsp",
+ kernels .. "bc_mpo_cog_00160_20181118_20240201_v01.bsp",
+ kernels .. "bc_mpo_struct_v09.bsp",
+ kernels .. "bc_mpo_schulte_vector_v01.bsp",
+ kernels .. "bc_mpo_prelaunch_v01.bsp",
+ kernels .. "bc_mpo_fcp_00160_20181020_20260328_v01.bsp"
+
+
+-- kernels .. "bc_mpo_step_20240110.tsc",
+--
+-- kernels .. "de432s.bsp",
+-- kernels .. "bc_mpo_fcp_00160_20181020_20260328_v01.bsp",
+-- kernels .. "bc_mmo_struct_v01.bsp",
+-- kernels .. "bc_mtm_struct_v06.bsp",
+-- kernels .. "bc_mpo_struct_v09.bsp",
+--
+-- kernels .. "bc_mmo_mppe_v04.ti",
+-- kernels .. "bc_mmo_msasi_v03.ti",
+-- kernels .. "bc_mmo_ssas_v01.ti",
+-- kernels .. "bc_mpo_aux_v01.ti",
+-- kernels .. "bc_mpo_bela_v09.ti",
+-- kernels .. "bc_mpo_mertis_v08.ti",
+-- kernels .. "bc_mpo_mgns_v02.ti",
+-- kernels .. "bc_mpo_mixs_v06.ti",
+-- kernels .. "bc_mpo_phebus_v06.ti",
+-- kernels .. "bc_mpo_serena_v08.ti",
+-- kernels .. "bc_mpo_simbio-sys_v10.ti",
+-- kernels .. "bc_mpo_sixs_v08.ti",
+-- kernels .. "bc_mpo_str_v02.ti",
+-- kernels .. "bc_mtm_mcam_v05.ti",
+--
+-- kernels .. "bc_sci_v12.tf",
+-- kernels .. "bc_mmo_v13.tf",
+-- kernels .. "bc_mpo_v34.tf",
+-- kernels .. "bc_mtm_v12.tf",
+-- kernels .. "bc_ops_v01.tf",
+--
+-- kernels .. "bc_mpo_sc_fcp_00160_20181020_20240216_f20181127_v01.bc",
+-- -- kernels .. "bc_mpo_sc_scm_20240101_20240111_s20240110_v01.bc",
+-- -- kernels .. "bc_mpo_sc_scm_20230101_20240101_s20240104_v01.bc",
+-- -- kernels .. "bc_mpo_sc_scm_20220101_20230101_s20230309_v01.bc",
+-- -- kernels .. "bc_mpo_sc_scm_20210101_20220101_s20230309_v01.bc",
+-- -- kernels .. "bc_mpo_sc_scm_20200101_20210101_s20210618_v01.bc",
+-- -- kernels .. "bc_mpo_sc_scm_20190101_20200101_s20230309_v01.bc",
+-- -- kernels .. "bc_mpo_sc_scm_20181020_20190101_s20230309_v01.bc",
+--
+-- kernels .. "bc_mpo_sc_scc_20240101_20240111_s20240110_v01.bc",
+-- kernels .. "bc_mpo_sc_scc_20230101_20240101_s20240104_v01.bc",
+-- kernels .. "bc_mpo_sc_scc_20220101_20230101_s20221229_v01.bc",
+-- kernels .. "bc_mpo_sc_scc_20210101_20220101_s20230309_v01.bc",
+-- kernels .. "bc_mpo_sc_scc_20200101_20210101_s20230309_v01.bc",
+-- kernels .. "bc_mpo_sc_scc_20190101_20200101_s20230309_v01.bc",
+-- kernels .. "bc_mpo_sc_scc_20181019_20190101_s20230309_v01.bc",
+--
+-- kernels .. "bc_mpo_hga_scm_20240101_20240111_s20240110_v01.bc",
+-- kernels .. "bc_mpo_hga_scm_20181020_20190101_s20201020_v02.bc",
+-- kernels .. "bc_mpo_hga_scm_20190101_20200101_s20230309_v01.bc",
+-- kernels .. "bc_mpo_hga_scm_20200101_20210101_s20230309_v01.bc",
+-- kernels .. "bc_mpo_hga_scm_20210101_20220101_s20230309_v01.bc",
+-- kernels .. "bc_mpo_hga_scm_20220101_20230101_s20221229_v01.bc",
+-- kernels .. "bc_mpo_hga_scm_20230101_20240101_s20240104_v01.bc",
+-- kernels .. "bc_mpo_magboom_default_s20191107_v01.bc",
+-- kernels .. "bc_mpo_mertis_zero_s20191107_v02.bc",
+-- kernels .. "bc_mpo_mga_scm_20181020_20190101_s20200109_v02.bc",
+-- kernels .. "bc_mpo_mga_scm_20190101_20200101_s20230309_v01.bc",
+-- kernels .. "bc_mpo_mga_scm_20200101_20210101_s20230309_v01.bc",
+-- kernels .. "bc_mpo_mga_scm_20210101_20220101_s20230309_v01.bc",
+-- kernels .. "bc_mpo_mga_scm_20220101_20230101_s20221229_v01.bc",
+-- kernels .. "bc_mpo_mga_scm_20230101_20240101_s20240104_v01.bc",
+-- kernels .. "bc_mpo_mga_scm_20240101_20240111_s20240110_v01.bc",
+-- kernels .. "bc_mpo_mga_zero_s20191107_v02.bc",
+-- kernels .. "bc_mpo_phebus_zero_s20210408_v02.bc",
+-- kernels .. "bc_mpo_sa_scm_20181020_20190101_s20211202_v01.bc",
+-- kernels .. "bc_mpo_sa_scm_20190101_20200101_s20230309_v01.bc",
+-- kernels .. "bc_mpo_sa_scm_20200101_20210101_s20230309_v01.bc",
+-- kernels .. "bc_mpo_sa_scm_20210101_20220101_s20230309_v01.bc",
+-- kernels .. "bc_mpo_sa_scm_20220101_20230101_s20221229_v01.bc",
+-- kernels .. "bc_mpo_sa_scm_20230101_20240101_s20240104_v01.bc",
+-- kernels .. "bc_mpo_sa_scm_20240101_20240111_s20240110_v01.bc",
+-- kernels .. "bc_mpo_sa_zero_s20191107_v02.bc",
+-- kernels .. "bc_mpo_sa_zero_s20191107_v02.bc",
+-- kernels .. "bc_mpo_serena_zero_s20191207_v02.bc"
+}
+
+local ID = {
+ MPO = "-121"
+}
+
+local Frame = {
+ MPO = "MPO_SPACECRAFT",
+
+ HGA = "MPO_HGA",
+ BelaReceiver = "MPO_BELA_RX",
+ BelaTransmitterMain = "MPO_BELA_TX_MAIN",
+ BelaTransmitterRed = "MPO_BELA_TX_RED",
+ MertisTis = "MPO_MERTIS_TIS",
+ MertisTisPlanet = "MPO_MERTIS_TIS_PLANET",
+ MertisTisSpace = "MPO_MERTIS_TIS_SPACE",
+ MGNS = "MPO_MGNS",
+ MIXS_C = "MPO_MIXS-C",
+ MIXS_T = "MPO_MIXS-T",
+ PhebusSlit75 = "MPO_PHEBUS_SLIT_75",
+ PhebusSlit100 = "MPO_PHEBUS_SLIT_100",
+ Phebus75 = "MPO_PHEBUS_75",
+ Phebus100 = "MPO_PHEBUS_100",
+ SerenaElena = "MPO_SERENA_ELENA",
+ SerenaElenaAN01 = "MPO_SERENA_ELENA_AN_01",
+ SerenaElenaAN02 = "MPO_SERENA_ELENA_AN_02",
+ SerenaElenaAN03 = "MPO_SERENA_ELENA_AN_03",
+ SerenaElenaAN04 = "MPO_SERENA_ELENA_AN_04",
+ SerenaElenaAN05 = "MPO_SERENA_ELENA_AN_05",
+ SerenaElenaAN06 = "MPO_SERENA_ELENA_AN_06",
+ SerenaElenaAN07 = "MPO_SERENA_ELENA_AN_07",
+ SerenaElenaAN08 = "MPO_SERENA_ELENA_AN_08",
+ SerenaElenaAN09 = "MPO_SERENA_ELENA_AN_09",
+ SerenaElenaAN10 = "MPO_SERENA_ELENA_AN_10",
+ SerenaElenaAN11 = "MPO_SERENA_ELENA_AN_11",
+ SerenaElenaAN12 = "MPO_SERENA_ELENA_AN_12",
+ SerenaElenaAN13 = "MPO_SERENA_ELENA_AN_13",
+ SerenaElenaAN14 = "MPO_SERENA_ELENA_AN_14",
+ SerenaElenaAN15 = "MPO_SERENA_ELENA_AN_15",
+ SerenaElenaAN16 = "MPO_SERENA_ELENA_AN_16",
+ SerenaElenaAN17 = "MPO_SERENA_ELENA_AN_17",
+ SerenaElenaAN18 = "MPO_SERENA_ELENA_AN_18",
+ SerenaElenaAN19 = "MPO_SERENA_ELENA_AN_19",
+ SerenaElenaAN20 = "MPO_SERENA_ELENA_AN_20",
+ SerenaElenaAN21 = "MPO_SERENA_ELENA_AN_21",
+ SerenaElenaAN22 = "MPO_SERENA_ELENA_AN_22",
+ SerenaElenaAN23 = "MPO_SERENA_ELENA_AN_23",
+ SerenaElenaAN24 = "MPO_SERENA_ELENA_AN_24",
+ SerenaElenaAN25 = "MPO_SERENA_ELENA_AN_25",
+ SerenaElenaAN26 = "MPO_SERENA_ELENA_AN_26",
+ SerenaElenaAN27 = "MPO_SERENA_ELENA_AN_27",
+ SerenaElenaAN28 = "MPO_SERENA_ELENA_AN_28",
+ SerenaElenaAN29 = "MPO_SERENA_ELENA_AN_29",
+ SerenaElenaAN30 = "MPO_SERENA_ELENA_AN_30",
+ SerenaElenaAN31 = "MPO_SERENA_ELENA_AN_31",
+ SerenaElenaAN32 = "MPO_SERENA_ELENA_AN_32",
+ SymbioSysHricFpa = "MPO_SIMBIO-SYS_HRIC_FPA",
+ SymbioSysHricF550 = "MPO_SIMBIO-SYS_HRIC_F550",
+ SymbioSysHricFpan = "MPO_SIMBIO-SYS_HRIC_FPAN",
+ SymbioSysHricF750 = "MPO_SIMBIO-SYS_HRIC_F750",
+ SymbioSysHricF880 = "MPO_SIMBIO-SYS_HRIC_F880",
+ SymbioSysSTCL = "MPO_SIMBIO-SYS_STC-L",
+ SymbioSysSTCH = "MPO_SIMBIO-SYS_STC-H",
+ SymbioSysSTCLF920 = "MPO_SIMBIO-SYS_STC-L_F920",
+ SymbioSysSTCLF550 = "MPO_SIMBIO-SYS_STC-L_F550",
+ SymbioSysSTCLP700 = "MPO_SIMBIO-SYS_STC-L_P700",
+ SymbioSysSTCHP700 = "MPO_SIMBIO-SYS_STC-H_P700",
+ SymbioSysSTCHF420 = "MPO_SIMBIO-SYS_STC-H_F420",
+ SymbioSysSTCHF750 = "MPO_SIMBIO-SYS_STC-H_F750",
+ SymbioSysVIHI = "MPO_SIMBIO-SYS_VIHI",
+ Sixs_X1 = "MPO_SIXS-X-1",
+ Sixs_X2 = "MPO_SIXS-X-2",
+ Sixs_X3 = "MPO_SIXS-X-3",
+ StarTracker1 = "MPO_STR-1",
+ StarTracker2 = "MPO_STR-2",
+ StarTracker3 = "MPO_STR-3",
+
+
+
+
+
+}
+
+
+asset.onInitialize(function()
+ openspace.spice.loadKernel(BepiColomboKernels)
+end)
+
+asset.onDeinitialize(function()
+ openspace.spice.unloadKernel(BepiColomboKernels)
+end)
+
+asset.export("ID", ID)
+asset.export("Frame", Frame)
+
+
+
+asset.meta = {
+ Name = "BepiColombo Kernels",
+ Version = "1.0",
+ Description = "This asset contains the SPICE kernels for the BepiColombo mission.",
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/mission.asset b/data/assets/scene/solarsystem/missions/bepicolombo/mission.asset
new file mode 100644
index 0000000000..717e23b6c2
--- /dev/null
+++ b/data/assets/scene/solarsystem/missions/bepicolombo/mission.asset
@@ -0,0 +1,88 @@
+local Mission = {
+ Name = "BepiColombo",
+ Image = "https://scifleet.esa.int/downloads/bepi_mcs/bepicolombo.png",
+ Description = [[BepiColombo is Europe's first mission to Mercury. It will launch in October 2018 on a journey to the smallest and least explored terrestrial planet in our Solar System. Arriving at Mercury in December 2025, it will endure temperatures in excess of 350°C and gather data during a 1 year nominal mission. The mission comprises two spacecraft: 1. Mercury Planetary Orbiter (MPO), 2. Mercury Magnetospheric Orbiter (MMO). BepiColombo is a joint mission between ESA and the Japan Aerospace Exploration Agency (JAXA), executed under ESA leadership.]],
+ TimeRange = {
+ Start = "2018 OCT 20 01:45:00",
+ End = "2028 MAY 01 12:00:00" -- Preliminary time
+ },
+ Milestones = {
+ {
+ Name = "Launch",
+ Date = "2018 OCT 20 01:45:00"
+ },
+ {
+ Name = "Earth flyby",
+ Date = "2020 APR 10 04:25"
+ },
+ {
+ Name = "First Venus flyby",
+ Date = "2020 OCT 15 03:58:00"
+ },
+ {
+ Name = "Second Venus flyby",
+ Date = "2021 AUG 10 13:51:00"
+ },
+ {
+ Name = "First Mercury flyby",
+ Date = "2021 OCT 01 23:34:41"
+ },
+ {
+ Name = "Second Mercury flyby",
+ Date = "2022 JUN 23 09:44:00"
+ },
+ {
+ Name = "Third Mercury flyby",
+ Date = "2023 JUN 19 19:34:00"
+ },
+ {
+ Name = "Fourth Mercury flyby",
+ Date = "2024 SEP 05 12:00:00" -- Preliminary time
+ },
+ {
+ Name = "Fifth Mercury flyby",
+ Date = "2024 DEC 02 12:00:00" -- Preliminary time
+ },
+ {
+ Name = "Sixth Mercury flyby",
+ Date = "2025 JAN 09 12:00:00" -- Preliminary time
+ },
+ {
+ Name = "Mercury orbit insertion",
+ Date = "2025 DEC 05 12:00:00" -- Preliminary time
+ },
+ {
+ Name = "MPO in final science orbit",
+ Date = "2026 MAR 14 12:00:00" -- Preliminary time
+ },
+ {
+ Name = "End of nominal mission",
+ Date = "2027 MAY 01 12:00:00" -- Preliminary time
+ },
+ {
+ Name = "End of extended mission",
+ Date = "2028 MAY 01 12:00:00" -- Preliminary time
+ }
+ },
+ Phases = {}
+}
+
+
+asset.onInitialize(function()
+ openspace.loadMission(Mission)
+end)
+
+asset.onDeinitialize(function()
+ openspace.unloadMission(Mission.Name)
+end)
+
+
+
+asset.meta = {
+ Name = "BepiColombo Mission",
+ Version = "1.0",
+ Description = "This asset contains the mission profile information for the BepiColombo mission. The data in this file has been taken from https://www.esa.int/Science_Exploration/Space_Science/BepiColombo/BepiColombo_factsheet",
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/model.asset b/data/assets/scene/solarsystem/missions/bepicolombo/model.asset
new file mode 100644
index 0000000000..05aec4d10e
--- /dev/null
+++ b/data/assets/scene/solarsystem/missions/bepicolombo/model.asset
@@ -0,0 +1,84 @@
+local transform = asset.require("scene/solarsystem/sun/transforms")
+local sun = asset.require("scene/solarsystem/sun/sun")
+local kernels = asset.require("./kernels")
+local coreKernels = asset.require("spice/core")
+
+
+
+local modelFolder = asset.resource({
+ Name = "BepiColombo Model",
+ Type = "HttpSynchronization",
+ Identifier = "bepicolombo_models",
+ Version = 1
+})
+
+
+local BepiColombo = {
+ Identifier = "BepiColombo",
+ Parent = transform.SolarSystemBarycenter.Identifier,
+ Transform = {
+ Translation = {
+ Type = "SpiceTranslation",
+ Target = kernels.ID.MPO,
+ Observer = coreKernels.ID.SolarSystemBarycenter
+ },
+ Rotation = {
+ Type = "SpiceRotation",
+ SourceFrame = kernels.Frame.MPO,
+ DestinationFrame = coreKernels.Frame.Galactic
+ }
+ },
+ GUI = {
+ Name = "BepiColombo",
+ Path = "/Solar System/Missions/BepiColombo"
+ }
+}
+
+local Model = {
+ Identifier = "BepiColomboModel",
+ Parent = BepiColombo.Identifier,
+ Transform = {
+ Translation = {
+ Type = "StaticTranslation",
+ Position = { 0.0, -0.275, 0.0 }
+ }
+ },
+ Renderable = {
+ Type = "RenderableModel",
+ GeometryFile = modelFolder .. "bepi_mcs.fbx",
+ ModelScale = 0.00075, -- The number has been determined by eyeballing it
+ LightSources = {
+ sun.LightSource
+ },
+ PerformShading = true,
+ AmbientIntensity = 0.075
+ },
+ GUI = {
+ Name = "BepiColombo Model",
+ Path = "/Solar System/Missions/BepiColombo"
+ }
+}
+
+
+asset.onInitialize(function()
+ openspace.addSceneGraphNode(BepiColombo)
+ openspace.addSceneGraphNode(Model)
+end)
+
+asset.onDeinitialize(function()
+ openspace.removeSceneGraphNode(Model)
+ openspace.removeSceneGraphNode(BepiColombo)
+end)
+
+asset.export(BepiColombo)
+
+
+
+asset.meta = {
+ Name = "BepiColombo Model",
+ Version = "1.0",
+ Description = "This asset contains the model of the BepiColombo spacecraft. The model is retrieved from https://s2e2.cosmos.esa.int/bitbucket/projects/SPICE_KERNELS/repos/bepicolombo",
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/trails.asset b/data/assets/scene/solarsystem/missions/bepicolombo/trails.asset
new file mode 100644
index 0000000000..b2220287c2
--- /dev/null
+++ b/data/assets/scene/solarsystem/missions/bepicolombo/trails.asset
@@ -0,0 +1,73 @@
+local kernels = asset.require("./kernels")
+local mercury = asset.require("scene/solarsystem/planets/mercury/transforms")
+local solarsystem = asset.require("scene/solarsystem/sun/transforms")
+local coreKernels = asset.require("spice/core")
+
+
+
+local BepiColomboTrailSun = {
+ Identifier = "BepiColomboTrailSun",
+ Parent = solarsystem.SolarSystemBarycenter.Identifier,
+ Renderable = {
+ Type = "RenderableTrailTrajectory",
+ Translation = {
+ Type = "SpiceTranslation",
+ Target = kernels.ID.MPO,
+ Observer = coreKernels.ID.SolarSystemBarycenter
+ },
+ Color = { 0.70, 0.50, 0.20 },
+ StartTime = "2018 OCT 20 01:45:00",
+ EndTime = "2028 MAY 01 12:00:00",
+ SampleInterval = 60000
+ },
+ GUI = {
+ Name = "BepiColombo Trail (Sun)",
+ Path = "/Solar System/Missions/BepiColombo"
+ }
+}
+
+local BepiColomboTrailMercury = {
+ Identifier = "BepiColomboTrailMercury",
+ Parent = mercury.MercuryBarycenter.Identifier,
+ Renderable = {
+ Type = "RenderableTrailTrajectory",
+ Translation = {
+ Type = "SpiceTranslation",
+ Target = kernels.ID.MPO,
+ Observer = coreKernels.ID.Mercury
+ },
+ Color = { 0.625, 0.255, 0.45 },
+ StartTime = "2025 DEC 05 12:00:00",
+ EndTime = "2028 MAY 01 12:00:00",
+ SampleInterval = 600
+ },
+ GUI = {
+ Name = "BepiColombo Trail (Mercury)",
+ Path = "/Solar System/Missions/BepiColombo"
+ }
+}
+
+
+asset.onInitialize(function()
+ openspace.addSceneGraphNode(BepiColomboTrailSun)
+ openspace.addSceneGraphNode(BepiColomboTrailMercury)
+end)
+
+asset.onDeinitialize(function()
+ openspace.removeSceneGraphNode(BepiColomboTrailMercury)
+ openspace.removeSceneGraphNode(BepiColomboTrailSun)
+end)
+
+asset.export(BepiColomboTrailSun)
+asset.export(BepiColomboTrailMercury)
+
+
+
+asset.meta = {
+ Name = "BepiColombo Trails",
+ Version = "1.0",
+ Description = "This asset contains the trails for the BepiColombo spacecraft relative to the Sun and Mercury.",
+ Author = "OpenSpace Team",
+ URL = "http://openspaceproject.com",
+ License = "MIT license"
+}
diff --git a/data/assets/scene/solarsystem/missions/voyager/voyager2.asset b/data/assets/scene/solarsystem/missions/voyager/voyager2.asset
index b7c8a5b60d..169d7fbe06 100644
--- a/data/assets/scene/solarsystem/missions/voyager/voyager2.asset
+++ b/data/assets/scene/solarsystem/missions/voyager/voyager2.asset
@@ -1,5 +1,6 @@
local sun = asset.require("scene/solarsystem/sun/sun")
local sunTransforms = asset.require("scene/solarsystem/sun/transforms")
+local coreKernels = asset.require("spice/core")
@@ -57,7 +58,7 @@ local Voyager2 = {
Rotation = {
Type = "SpiceRotation",
SourceFrame = "VG2_SC_BUS",
- DestinationFrame = "GALACTIC"
+ DestinationFrame = coreKernels.Frame.Galactic
}
},
GUI = {
diff --git a/data/assets/scene/solarsystem/telescopes/euclid/spice.asset b/data/assets/scene/solarsystem/telescopes/euclid/kernels.asset
similarity index 100%
rename from data/assets/scene/solarsystem/telescopes/euclid/spice.asset
rename to data/assets/scene/solarsystem/telescopes/euclid/kernels.asset
diff --git a/data/assets/scene/solarsystem/telescopes/euclid/model.asset b/data/assets/scene/solarsystem/telescopes/euclid/model.asset
index c837d8a779..a809d2f482 100644
--- a/data/assets/scene/solarsystem/telescopes/euclid/model.asset
+++ b/data/assets/scene/solarsystem/telescopes/euclid/model.asset
@@ -1,6 +1,7 @@
local transform = asset.require("scene/solarsystem/planets/earth/transforms")
local sun = asset.require("scene/solarsystem/sun/sun")
-local spice = asset.require("./spice")
+local kernels = asset.require("./kernels")
+local coreKernels = asset.require("spice/core")
@@ -23,8 +24,8 @@ local Euclid = {
Transform = {
Translation = {
Type = "SpiceTranslation",
- Target = spice.ID.Euclid,
- Observer = "EARTH BARYCENTER"
+ Target = kernels.ID.Euclid,
+ Observer = coreKernels.ID.EarthBarycenter
},
Rotation = {
Type = "FixedRotation",
diff --git a/data/assets/scene/solarsystem/telescopes/euclid/trails.asset b/data/assets/scene/solarsystem/telescopes/euclid/trails.asset
index b00a11b34e..9f54671974 100644
--- a/data/assets/scene/solarsystem/telescopes/euclid/trails.asset
+++ b/data/assets/scene/solarsystem/telescopes/euclid/trails.asset
@@ -1,7 +1,8 @@
-local spice = asset.require("./spice")
+local kernels = asset.require("./kernels")
local earth = asset.require("scene/solarsystem/planets/earth/transforms")
local solarsystem = asset.require("scene/solarsystem/sun/transforms")
local transforms = asset.require("scene/solarsystem/planets/earth/lagrange_points/l2")
+local coreKernels = asset.require("spice/core")
local StartTime = "2023 JUL 01 15:53:08.239"
@@ -14,8 +15,8 @@ local EuclidTrailSun = {
Type = "RenderableTrailTrajectory",
Translation = {
Type = "SpiceTranslation",
- Target = spice.ID.Euclid,
- Observer = "SSB"
+ Target = kernels.ID.Euclid,
+ Observer = coreKernels.ID.SolarSystemBarycenter
},
Color = { 0.70, 0.50, 0.20 },
StartTime = StartTime,
@@ -35,8 +36,8 @@ local EuclidTrailEarth = {
Type = "RenderableTrailTrajectory",
Translation = {
Type = "SpiceTranslation",
- Target = spice.ID.Euclid,
- Observer = "EARTH BARYCENTER"
+ Target = kernels.ID.Euclid,
+ Observer = coreKernels.ID.EarthBarycenter
},
Color = { 0.325, 0.65, 0.55 },
StartTime = StartTime,
@@ -61,9 +62,9 @@ local EuclidTrailOrbit = {
Type = "RenderableTrailOrbit",
Translation = {
Type = "SpiceTranslation",
- Target = spice.ID.Euclid,
- Observer = 392, -- L2
- Frame = "GALACTIC"
+ Target = kernels.ID.Euclid,
+ Observer = l2.ID.L2,
+ Frame = coreKernels.Frame.Galactic
},
Color = { 0.863, 0.0, 0.902 },
Period = 182.621099, -- About 6 months
@@ -88,9 +89,9 @@ local EuclidTrailCoRevOrbit = {
Type = "RenderableTrailOrbit",
Translation = {
Type = "SpiceTranslation",
- Target = spice.ID.Euclid,
- Observer = 392, -- L2
- Frame = "L2_COREV"
+ Target = kernels.ID.Euclid,
+ Observer = l2.ID.L2,
+ Frame = l2.Frame.L2Corevolving
},
Color = { 0.863, 0.0, 0.902 },
Period = 182.621099, -- About 6 months
diff --git a/data/assets/scene/solarsystem/telescopes/jwst/trail.asset b/data/assets/scene/solarsystem/telescopes/jwst/trail.asset
index 83f0d266eb..823714fe8d 100644
--- a/data/assets/scene/solarsystem/telescopes/jwst/trail.asset
+++ b/data/assets/scene/solarsystem/telescopes/jwst/trail.asset
@@ -91,7 +91,7 @@ local JWSTTrailOrbit = {
Type = "SpiceTranslation",
Target = kernels.ID.JWST,
Observer = transforms.ID.L2,
- Frame = "GALACTIC"
+ Frame = coreKernels.Frame.Galactic
},
Color = { 0.863, 0.0, 0.902 },
Period = 182.621099, -- About 6 months
diff --git a/data/assets/util/webgui.asset b/data/assets/util/webgui.asset
index c7243a5f5e..eb5ae44c16 100644
--- a/data/assets/util/webgui.asset
+++ b/data/assets/util/webgui.asset
@@ -4,7 +4,7 @@ local guiCustomization = asset.require("customization/gui")
-- Select which commit hashes to use for the frontend and backend
-local frontendHash = "17af9032d000a9865a00afe88eff88a822167eea"
+local frontendHash = "95683e59c7fa1891e7db7b83e4eeea15f9da11f1"
local frontend = asset.resource({
Identifier = "WebGuiFrontend",
diff --git a/data/profiles/bepicolombo.profile b/data/profiles/bepicolombo.profile
new file mode 100644
index 0000000000..6cef837a3c
--- /dev/null
+++ b/data/profiles/bepicolombo.profile
@@ -0,0 +1,183 @@
+{
+ "assets": [
+ "base",
+ "base_keybindings",
+ "scene/solarsystem/missions/bepicolombo/bepicolombo",
+ "scene/solarsystem/planets/earth/earth"
+ ],
+ "camera": {
+ "altitude": 17000000.0,
+ "anchor": "Earth",
+ "latitude": 58.5877,
+ "longitude": 16.1924,
+ "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": [
+ "BepiColombo",
+ "Mercury",
+ "Earth",
+ "Venus",
+ "Sun"
+ ],
+ "meta": {
+ "author": "OpenSpace Team",
+ "description": "Default OpenSpace Profile. Adds Earth satellites not contained in other profiles",
+ "license": "MIT License",
+ "name": "Default",
+ "url": "https://www.openspaceproject.com",
+ "version": "1.0"
+ },
+ "properties": [
+ {
+ "name": "Scene.BepiColomboMPO_MertisTis.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_MertisTisPlanet.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_MertisTisSpace.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_Phebus100.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_Phebus75.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_PhebusSlit100.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_PhebusSlit75.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_SerenaElena.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_SIMBIOSYS_HRIC_F550.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_SIMBIOSYS_HRIC_F750.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_SIMBIOSYS_HRIC_F880.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_SIMBIOSYS_HRIC_FPA.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_SIMBIOSYS_HRIC_FPAN.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_SIMBIOSYS_STC_H.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_SIMBIOSYS_STC_H_F420.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_SIMBIOSYS_STC_H_F750.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_SIMBIOSYS_STC_H_P700.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_SIMBIOSYS_STC_L.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_SIMBIOSYS_STC_L_F550.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_SIMBIOSYS_STC_L_F920.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_SIMBIOSYS_STC_L_P700.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_SIMBIOSYS_VIHI.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_MIXS-C.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ },
+ {
+ "name": "Scene.BepiColomboMPO_MIXS-T.Renderable.Enabled",
+ "type": "setPropertyValueSingle",
+ "value": "false"
+ }
+ ],
+ "time": {
+ "is_paused": false,
+ "type": "relative",
+ "value": "-1d"
+ },
+ "version": {
+ "major": 1,
+ "minor": 3
+ }
+}
diff --git a/ext/ghoul b/ext/ghoul
index 82f83b40fd..ba6aece1de 160000
--- a/ext/ghoul
+++ b/ext/ghoul
@@ -1 +1 @@
-Subproject commit 82f83b40fda985e9adc25ab94f253fe127bdeee0
+Subproject commit ba6aece1deb12599fcaa61be133658534ed84425
diff --git a/modules/digitaluniverse/shaders/points_sprite_fs.glsl b/include/openspace/data/csvloader.h
similarity index 83%
rename from modules/digitaluniverse/shaders/points_sprite_fs.glsl
rename to include/openspace/data/csvloader.h
index fa56e68087..dcc4163415 100644
--- a/modules/digitaluniverse/shaders/points_sprite_fs.glsl
+++ b/include/openspace/data/csvloader.h
@@ -22,26 +22,18 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
****************************************************************************************/
-#include "fragment.glsl"
+#ifndef __OPENSPACE_CORE___CSVLOADER___H__
+#define __OPENSPACE_CORE___CSVLOADER___H__
-in float vs_screenSpaceDepth;
+#include
+#include
+#include
-uniform vec3 color;
-uniform float alphaValue;
-uniform sampler2D spriteTexture;
+namespace openspace::dataloader::csv {
+Dataset loadCsvFile(std::filesystem::path path,
+ std::optional specs = std::nullopt);
-Fragment getFragment() {
- Fragment frag;
+} // namespace openspace::dataloader
- if (alphaValue == 0.0) {
- discard;
- }
-
- frag.color = texture(spriteTexture, gl_PointCoord) * vec4(color, alphaValue);
- //frag.depth = gs_screenSpaceDepth;
- frag.depth = vs_screenSpaceDepth;
- frag.blend = BLEND_MODE_ADDITIVE;
-
- return frag;
-}
+#endif // __OPENSPACE_CORE___CSVLOADER___H__
diff --git a/modules/space/speckloader.h b/include/openspace/data/dataloader.h
similarity index 72%
rename from modules/space/speckloader.h
rename to include/openspace/data/dataloader.h
index 74d4150841..4c8ef8e918 100644
--- a/modules/space/speckloader.h
+++ b/include/openspace/data/dataloader.h
@@ -22,20 +22,28 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
****************************************************************************************/
-#ifndef __OPENSPACE_MODULE_SPACE___SPECKLOADER___H__
-#define __OPENSPACE_MODULE_SPACE___SPECKLOADER___H__
+#ifndef __OPENSPACE_CORE___DATALOADER___H__
+#define __OPENSPACE_CORE___DATALOADER___H__
+#include
#include
#include
+#include
#include
#include
#include
#include
-namespace openspace::speck {
-
-BooleanType(SkipAllZeroLines);
+namespace openspace::dataloader {
+/**
+ * A dataset representing objects with positions and various other data columns.
+ * Based on the SPECK format originally used for the digital universe datasets.
+ * Mostly used for point-data.
+ *
+ * The read data files may also have associated texture values to be used for the
+ * points.
+ */
struct Dataset {
struct Variable {
int index = -1;
@@ -59,8 +67,14 @@ struct Dataset {
};
std::vector entries;
+ /// This variable can be used to get an understanding of the world scale size of
+ /// the dataset
+ float maxPositionComponent = 0.f;
+
int index(std::string_view variableName) const;
bool normalizeVariable(std::string_view variableName);
+ glm::vec2 findValueRange(int variableIndex) const;
+ glm::vec2 findValueRange(std::string_view variableName) const;
};
struct Labelset {
@@ -76,49 +90,50 @@ struct Labelset {
};
struct ColorMap {
+ std::optional belowRangeColor;
+ std::optional aboveRangeColor;
+ std::optional nanColor;
std::vector entries;
};
namespace data {
Dataset loadFile(std::filesystem::path path,
- SkipAllZeroLines skipAllZeroLines = SkipAllZeroLines::Yes);
+ std::optional specs = std::nullopt);
std::optional loadCachedFile(std::filesystem::path path);
void saveCachedFile(const Dataset& dataset, std::filesystem::path path);
- Dataset loadFileWithCache(std::filesystem::path speckPath,
- SkipAllZeroLines skipAllZeroLines = SkipAllZeroLines::Yes);
+ Dataset loadFileWithCache(std::filesystem::path path,
+ std::optional specs = std::nullopt);
} // namespace data
namespace label {
Labelset loadFile(std::filesystem::path path,
- SkipAllZeroLines skipAllZeroLines = SkipAllZeroLines::Yes);
+ std::optional specs = std::nullopt);
std::optional loadCachedFile(std::filesystem::path path);
void saveCachedFile(const Labelset& labelset, std::filesystem::path path);
- Labelset loadFileWithCache(std::filesystem::path speckPath,
- SkipAllZeroLines skipAllZeroLines = SkipAllZeroLines::Yes);
+ Labelset loadFileWithCache(std::filesystem::path path);
+ Labelset loadFromDataset(const dataloader::Dataset& dataset);
} // namespace label
namespace color {
ColorMap loadFile(std::filesystem::path path,
- SkipAllZeroLines skipAllZeroLines = SkipAllZeroLines::Yes);
+ std::optional specs = std::nullopt);
std::optional loadCachedFile(std::filesystem::path path);
void saveCachedFile(const ColorMap& colorMap, std::filesystem::path path);
- ColorMap loadFileWithCache(std::filesystem::path path,
- SkipAllZeroLines skipAllZeroLines = SkipAllZeroLines::Yes);
+ ColorMap loadFileWithCache(std::filesystem::path path);
} // namespace color
+} // namespace openspace::dataloader
-} // namespace openspace::speck
-
-#endif // __OPENSPACE_MODULE_SPACE___SPECKLOADER___H__
+#endif // __OPENSPACE_CORE___DATALOADER___H__
diff --git a/include/openspace/data/datamapping.h b/include/openspace/data/datamapping.h
new file mode 100644
index 0000000000..791f4d4420
--- /dev/null
+++ b/include/openspace/data/datamapping.h
@@ -0,0 +1,77 @@
+/*****************************************************************************************
+ * *
+ * OpenSpace *
+ * *
+ * Copyright (c) 2014-2023 *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this *
+ * software and associated documentation files (the "Software"), to deal in the Software *
+ * without restriction, including without limitation the rights to use, copy, modify, *
+ * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to *
+ * permit persons to whom the Software is furnished to do so, subject to the following *
+ * conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included in all copies *
+ * or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, *
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A *
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT *
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF *
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE *
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ ****************************************************************************************/
+
+#ifndef __OPENSPACE_CORE___DATAMAPPING___H__
+#define __OPENSPACE_CORE___DATAMAPPING___H__
+
+#include
+#include
+#include
+
+namespace openspace::documentation { struct Documentation; }
+namespace ghoul { class Dictionary; }
+
+namespace openspace::dataloader {
+
+struct DataMapping {
+ static DataMapping createFromDictionary(const ghoul::Dictionary& dictionary);
+ static documentation::Documentation Documentation();
+
+ bool hasExcludeColumns() const;
+ bool isExcludeColumn(std::string_view column) const;
+
+ std::optional xColumnName;
+ std::optional yColumnName;
+ std::optional zColumnName;
+ std::optional nameColumn;
+
+ std::optional missingDataValue;
+
+ bool isCaseSensitive = false;
+
+ std::vector excludeColumns;
+
+ // OBS! When new parameters are added they should be included in the generateHash
+ // function
+};
+
+/**
+ * Generate a string based on the data mapping, that can be used to uniquely
+ * identify the dataset.
+ */
+std::string generateHashString(const DataMapping& dm);
+
+bool isPositionColumn(const std::string& c, const std::optional& mapping);
+
+bool isColumnX(const std::string& c, const std::optional& mapping);
+
+bool isColumnY(const std::string& c, const std::optional& mapping);
+
+bool isColumnZ(const std::string& c, const std::optional& mapping);
+
+bool isNameColumn(const std::string& c, const std::optional& mapping);
+
+} // namespace openspace::dataloader
+
+#endif // __OPENSPACE_CORE___DATAMAPPING___H__
diff --git a/modules/digitaluniverse/shaders/points_vs.glsl b/include/openspace/data/speckloader.h
similarity index 77%
rename from modules/digitaluniverse/shaders/points_vs.glsl
rename to include/openspace/data/speckloader.h
index d27c7c35a9..0ff86a8ba7 100644
--- a/modules/digitaluniverse/shaders/points_vs.glsl
+++ b/include/openspace/data/speckloader.h
@@ -22,29 +22,22 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
****************************************************************************************/
-#version __CONTEXT__
+#ifndef __OPENSPACE_CORE___SPECKLOADER___H__
+#define __OPENSPACE_CORE___SPECKLOADER___H__
-#include "PowerScaling/powerScaling_vs.hglsl"
+#include
+#include
+#include
-in dvec4 in_position;
-in dvec4 in_colormap;
+namespace openspace::dataloader::speck {
-out float vs_screenSpaceDepth;
-out float vs_scaleFactor;
-out vec4 colorMap;
+Dataset loadSpeckFile(std::filesystem::path path,
+ std::optional specs = std::nullopt);
-uniform dmat4 modelViewProjectionTransform;
-uniform float scaleFactor;
+Labelset loadLabelFile(std::filesystem::path path);
+ColorMap loadCmapFile(std::filesystem::path path);
-void main() {
- vec4 positionClipSpace = vec4(modelViewProjectionTransform * in_position);
- vec4 positionScreenSpace = vec4(z_normalization(positionClipSpace));
+} // namespace openspace::dataloader::speck
- vs_screenSpaceDepth = positionScreenSpace.w;
- vs_scaleFactor = scaleFactor;
- colorMap = vec4(in_colormap);
-
- gl_PointSize = scaleFactor;
- gl_Position = positionScreenSpace;
-}
+#endif // __OPENSPACE_CORE___SPECKLOADER___H__
diff --git a/include/openspace/engine/configuration.h b/include/openspace/engine/configuration.h
index b6174030bf..20eb637564 100644
--- a/include/openspace/engine/configuration.h
+++ b/include/openspace/engine/configuration.h
@@ -78,6 +78,7 @@ struct Configuration {
Logging logging;
std::string scriptLog;
+ int scriptLogRotation = 3;
struct DocumentationInfo {
std::string path;
diff --git a/include/openspace/interaction/sessionrecording.h b/include/openspace/interaction/sessionrecording.h
index 7579e9d28e..7e667c0a68 100644
--- a/include/openspace/interaction/sessionrecording.h
+++ b/include/openspace/interaction/sessionrecording.h
@@ -594,6 +594,7 @@ public:
protected:
properties::BoolProperty _renderPlaybackInformation;
properties::BoolProperty _ignoreRecordedScale;
+ properties::BoolProperty _addModelMatrixinAscii;
enum class RecordedType {
Camera = 0,
diff --git a/include/openspace/navigation/navigationhandler.h b/include/openspace/navigation/navigationhandler.h
index ebec211fd3..267d85507d 100644
--- a/include/openspace/navigation/navigationhandler.h
+++ b/include/openspace/navigation/navigationhandler.h
@@ -181,9 +181,9 @@ private:
Camera* _camera = nullptr;
std::function _playbackEndCallback;
- static constexpr double InteractionHystersis = 0.0125;
bool _inAnchorApproachSphere = false;
bool _inAnchorReachSphere = false;
+ const SceneGraphNode* _lastAnchor = nullptr;
OrbitalNavigator _orbitalNavigator;
KeyframeNavigator _keyframeNavigator;
diff --git a/include/openspace/navigation/path.h b/include/openspace/navigation/path.h
index 5be7c88fca..6371cd0633 100644
--- a/include/openspace/navigation/path.h
+++ b/include/openspace/navigation/path.h
@@ -53,7 +53,7 @@ public:
};
Path(Waypoint start, Waypoint end, Type type,
- std::optional duration = std::nullopt);
+ std::optional duration = std::nullopt);
Waypoint startPoint() const;
Waypoint endPoint() const;
@@ -63,6 +63,21 @@ public:
*/
double pathLength() const;
+ /**
+ * Return the remaining distance to traverse, in meters.
+ */
+ double remainingDistance() const;
+
+ /**
+ * Estimate a value for the remaining time to reach the target, based on the
+ * currently progressed time and the estimation for how long the path will
+ * take to traverse. Note that the computation is not exact.
+ *
+ * \param speedScale The speed scale factor that may affect how fast the camera moves
+ * \return The estimated remaining time
+ */
+ float estimatedRemainingTime(float speedScale) const;
+
/**
* Return a vector of positions corresponding to the control points of the path's
* spline curve.
@@ -170,11 +185,12 @@ private:
std::unique_ptr _curve;
- double _speedFactorFromDuration = 1.0;
+ float _speedFactorFromDuration = 1.f;
+ float _expectedDuration = 0.f;
// Playback variables
double _traveledDistance = 0.0; // Meters
- double _progressedTime = 0.0; // Time since playback started (seconds)
+ float _progressedTime = 0.f; // Time since playback started (seconds)
bool _shouldQuit = false;
CameraPose _prevPose;
};
diff --git a/include/openspace/navigation/pathnavigator.h b/include/openspace/navigation/pathnavigator.h
index 1cd6082035..a8d1897cac 100644
--- a/include/openspace/navigation/pathnavigator.h
+++ b/include/openspace/navigation/pathnavigator.h
@@ -64,6 +64,9 @@ public:
bool hasCurrentPath() const;
bool hasFinished() const;
bool isPlayingPath() const;
+ bool isPaused() const;
+
+ float estimatedRemainingTimeInPath() const;
void updateCamera(double deltaTime);
void createPath(const ghoul::Dictionary& dictionary);
@@ -102,7 +105,7 @@ private:
*/
void findRelevantNodes();
- void removeRollRotation(CameraPose& pose, double deltaTime);
+ void removeRollRotation(CameraPose& pose);
std::unique_ptr _currentPath = nullptr;
bool _isPlaying = false;
diff --git a/include/openspace/navigation/waypoint.h b/include/openspace/navigation/waypoint.h
index 57dca42b10..3a12dd39d2 100644
--- a/include/openspace/navigation/waypoint.h
+++ b/include/openspace/navigation/waypoint.h
@@ -47,6 +47,7 @@ public:
glm::dquat rotation() const;
SceneGraphNode* node() const;
std::string nodeIdentifier() const;
+ std::optional aimIdentifier() const;
double validBoundingSphere() const;
private:
@@ -54,6 +55,11 @@ private:
std::string _nodeIdentifier;
// To be able to handle nodes with faulty bounding spheres
double _validBoundingSphere = 0.0;
+
+ // Keep track of if there was an aim node, specified in for example the
+ // navigation state used to create this waypoint. It may be required in
+ // certain situations
+ std::optional _aimNodeIdentifier;
};
/**
diff --git a/include/openspace/rendering/colormappingcomponent.h b/include/openspace/rendering/colormappingcomponent.h
new file mode 100644
index 0000000000..60b9fb7868
--- /dev/null
+++ b/include/openspace/rendering/colormappingcomponent.h
@@ -0,0 +1,117 @@
+/*****************************************************************************************
+ * *
+ * OpenSpace *
+ * *
+ * Copyright (c) 2014-2023 *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this *
+ * software and associated documentation files (the "Software"), to deal in the Software *
+ * without restriction, including without limitation the rights to use, copy, modify, *
+ * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to *
+ * permit persons to whom the Software is furnished to do so, subject to the following *
+ * conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included in all copies *
+ * or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, *
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A *
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT *
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF *
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE *
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ ****************************************************************************************/
+
+#ifndef __OPENSPACE_MODULE_BASE___COLORMAPCOMPONENT___H__
+#define __OPENSPACE_MODULE_BASE___COLORMAPCOMPONENT___H__
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace openspace {
+
+namespace documentation { struct Documentation; }
+
+/**
+ * This is a component that can be used to consistently hold parameters and properties
+ * for controlling color mapping in different types of renderables. This includes things
+ * like the color map file itself (converted to a texture), colors to use for missing
+ * values and the available data columns and value ranges.
+ *
+ * @TODO Also provide a small shader snippet that can be included in fragment shaders
+ * that use this color mapping. As well as a set of uniforms? Now every
+ * renderable needs to handle this separately. (emmbr, 2023-10-13)
+ */
+class ColorMappingComponent : public properties::PropertyOwner {
+public:
+ ColorMappingComponent();
+ explicit ColorMappingComponent(const ghoul::Dictionary& dictionary);
+ ~ColorMappingComponent() override = default;
+
+ ghoul::opengl::Texture* texture() const;
+
+ /**
+ * Initialize the color map information (ranges, etc.) based on the input dataset.
+ *
+ * \param dataset The *loaded* input dataset
+ */
+ void initialize(const dataloader::Dataset& dataset);
+
+ /**
+ * Initialize a 1D texture based on the entries in the color map file.
+ */
+ void initializeTexture();
+
+ static documentation::Documentation Documentation();
+
+ glm::vec4 colorFromColorMap(float value) const;
+
+ properties::BoolProperty enabled;
+ properties::OptionProperty dataColumn;
+ properties::StringProperty colorMapFile;
+ properties::Vec2Property valueRange;
+ properties::TriggerProperty setRangeFromData;
+
+ properties::BoolProperty hideOutsideRange;
+ properties::BoolProperty useNanColor;
+ properties::Vec4Property nanColor;
+
+ properties::BoolProperty useAboveRangeColor;
+ properties::Vec4Property aboveRangeColor;
+
+ properties::BoolProperty useBelowRangeColor;
+ properties::Vec4Property belowRangeColor;
+
+private:
+ /**
+ * Fill parameter options list and range data based on the dataset and provided
+ * information.
+ */
+ void initializeParameterData(const dataloader::Dataset& dataset);
+
+ // One item per color parameter option
+ std::vector _colorRangeData;
+
+ std::unique_ptr _texture;
+
+ dataloader::ColorMap _colorMap;
+
+ std::optional _providedParameter;
+ std::optional _providedRange;
+
+ bool _hasNanColorInAsset = false;
+ bool _hasBelowRangeColorInAsset = false;
+ bool _hasAboveRangeColorInAsset = false;
+};
+
+} // namespace openspace
+
+#endif // __OPENSPACE_MODULE_BASE___COLORMAPCOMPONENT___H__
diff --git a/modules/space/labelscomponent.h b/include/openspace/rendering/labelscomponent.h
similarity index 78%
rename from modules/space/labelscomponent.h
rename to include/openspace/rendering/labelscomponent.h
index 9d8759fa7f..ee0c9b6bf3 100644
--- a/modules/space/labelscomponent.h
+++ b/include/openspace/rendering/labelscomponent.h
@@ -22,13 +22,13 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
****************************************************************************************/
-#ifndef __OPENSPACE_MODULE_SPACE___LABELSCOMPONENT___H__
-#define __OPENSPACE_MODULE_SPACE___LABELSCOMPONENT___H__
+#ifndef __OPENSPACE_CORE___LABELSCOMPONENT___H__
+#define __OPENSPACE_CORE___LABELSCOMPONENT___H__
#include
#include
-#include
+#include
#include
#include
#include
@@ -47,10 +47,24 @@ namespace documentation { struct Documentation; }
class LabelsComponent : public properties::PropertyOwner, public Fadeable {
public:
explicit LabelsComponent(const ghoul::Dictionary& dictionary);
+
+ /**
+ * Create a labels component from an already loaded dataset. That dataset should have
+ * a comment per point to be used for the labels.
+ *
+ * \param dictionary A dictionary with the other information used for constructing
+ * the dataset
+ * \param dataset The dataset to create the labelset from, including xyz position and
+ * a string to be used for the text.
+ * \param unit The unit to use when interpreting the point information in the dataset
+ */
+ explicit LabelsComponent(const ghoul::Dictionary& dictionary,
+ const dataloader::Dataset& dataset, DistanceUnit unit);
+
~LabelsComponent() override = default;
- speck::Labelset& labelSet();
- const speck::Labelset& labelSet() const;
+ dataloader::Labelset& labelSet();
+ const dataloader::Labelset& labelSet() const;
void initialize();
@@ -68,13 +82,16 @@ public:
private:
std::filesystem::path _labelFile;
DistanceUnit _unit = DistanceUnit::Parsec;
- speck::Labelset _labelset;
+ dataloader::Labelset _labelset;
+
+ bool _useCache = true;
std::shared_ptr _font = nullptr;
glm::dmat4 _transformationMatrix = glm::dmat4(1.0);
- // Properties
+ bool _createdFromDataset = false;
+
properties::BoolProperty _enabled;
properties::Vec3Property _color;
properties::FloatProperty _size;
@@ -85,4 +102,4 @@ private:
} // namespace openspace
-#endif // __OPENSPACE_MODULE_SPACE___LABELSCOMPONENT___H__
+#endif // __OPENSPACE_CORE___LABELSCOMPONENT___H__
diff --git a/include/openspace/scene/scene.h b/include/openspace/scene/scene.h
index 7aed9df083..72580a8a9e 100644
--- a/include/openspace/scene/scene.h
+++ b/include/openspace/scene/scene.h
@@ -213,24 +213,6 @@ public:
*/
void updateInterpolations();
- /**
- * Adds the provided \p time as an interesting time to this scene. The same time can
- * be added multiple times.
- *
- * \param time The time that should be added
- *
- * \pre \p time.time must not be empty
- * \pre \p time.name must not be empty
- */
- void addInterestingTime(InterestingTime time);
-
- /**
- * Returns the list of all interesting times that are defined for this scene.
- *
- * \return The list of all interesting times that are defined for this scene
- */
- const std::vector& interestingTimes() const;
-
/**
* Returns the Lua library that contains all Lua functions available to change the
* scene graph.
@@ -334,7 +316,6 @@ private:
SceneGraphNode _rootDummy;
std::unique_ptr _initializer;
std::string _profilePropertyName;
- std::vector _interestingTimes;
bool _valueIsTable = false;
std::mutex _programUpdateLock;
diff --git a/include/openspace/util/distanceconversion.h b/include/openspace/util/distanceconversion.h
index 989951b229..52e568e63c 100644
--- a/include/openspace/util/distanceconversion.h
+++ b/include/openspace/util/distanceconversion.h
@@ -157,20 +157,16 @@ DistanceUnitNamesPlural = {
};
constexpr bool isValidDistanceUnitName(std::string_view name) {
- int i = 0;
for (std::string_view val : DistanceUnitNamesSingular) {
if (val == name) {
return true;
}
- ++i;
}
- i = 0;
for (std::string_view val : DistanceUnitNamesPlural) {
if (val == name) {
return true;
}
- ++i;
}
return false;
}
diff --git a/include/openspace/util/spicemanager.h b/include/openspace/util/spicemanager.h
index 9b045426c3..3883050ad9 100644
--- a/include/openspace/util/spicemanager.h
+++ b/include/openspace/util/spicemanager.h
@@ -232,6 +232,14 @@ public:
*/
void unloadKernel(KernelHandle kernelId);
+ /**
+ * Returns a list of all loaded kernels in the kernel pool that have been loaded
+ * through the SpiceManager. The kernels are reported in order of their loading.
+ *
+ * \return The list of all loaded kernels that have been loaded through this manager
+ */
+ std::vector loadedKernels() const;
+
/**
* Unloads a SPICE kernel identified by the \p filePath which was used in the
* loading call to #loadKernel. The unloading is done by calling the `unload_c`
diff --git a/include/openspace/util/timeconversion.h b/include/openspace/util/timeconversion.h
index e4aaa8846e..753d84c7da 100644
--- a/include/openspace/util/timeconversion.h
+++ b/include/openspace/util/timeconversion.h
@@ -100,20 +100,16 @@ TimeUnitNamesPlural = {
};
constexpr bool isValidTimeUnitName(std::string_view name) {
- int i = 0;
for (std::string_view val : TimeUnitNamesSingular) {
if (val == name) {
return true;
}
- ++i;
}
- i = 0;
for (std::string_view val : TimeUnitNamesPlural) {
if (val == name) {
return true;
}
- ++i;
}
return false;
}
diff --git a/modules/base/CMakeLists.txt b/modules/base/CMakeLists.txt
index 8ec357b586..5a13eb1d07 100644
--- a/modules/base/CMakeLists.txt
+++ b/modules/base/CMakeLists.txt
@@ -44,6 +44,8 @@ set(HEADER_FILES
rendering/grids/renderablegrid.h
rendering/grids/renderableradialgrid.h
rendering/grids/renderablesphericalgrid.h
+ rendering/pointcloud/renderablepointcloud.h
+ rendering/pointcloud/renderablepolygoncloud.h
rendering/renderablecartesianaxes.h
rendering/renderabledisc.h
rendering/renderablelabel.h
@@ -104,6 +106,8 @@ set(SOURCE_FILES
rendering/grids/renderablegrid.cpp
rendering/grids/renderableradialgrid.cpp
rendering/grids/renderablesphericalgrid.cpp
+ rendering/pointcloud/renderablepointcloud.cpp
+ rendering/pointcloud/renderablepolygoncloud.cpp
rendering/renderablecartesianaxes.cpp
rendering/renderabledisc.cpp
rendering/renderablelabel.cpp
@@ -150,6 +154,9 @@ set(SHADER_FILES
shaders/arrow_vs.glsl
shaders/axes_fs.glsl
shaders/axes_vs.glsl
+ shaders/billboardpoint_fs.glsl
+ shaders/billboardpoint_gs.glsl
+ shaders/billboardpoint_vs.glsl
shaders/disc_fs.glsl
shaders/disc_vs.glsl
shaders/grid_vs.glsl
@@ -162,6 +169,9 @@ set(SHADER_FILES
shaders/model_vs.glsl
shaders/plane_fs.glsl
shaders/plane_vs.glsl
+ shaders/polygon_fs.glsl
+ shaders/polygon_gs.glsl
+ shaders/polygon_vs.glsl
shaders/prism_fs.glsl
shaders/prism_vs.glsl
shaders/renderabletrail_fs.glsl
diff --git a/modules/base/basemodule.cpp b/modules/base/basemodule.cpp
index 87593558a4..0a14de14bd 100644
--- a/modules/base/basemodule.cpp
+++ b/modules/base/basemodule.cpp
@@ -43,6 +43,8 @@
#include
#include
#include
+#include
+#include
#include
#include
#include
@@ -145,6 +147,8 @@ void BaseModule::internalInitialize(const ghoul::Dictionary&) {
fRenderable->registerClass(
"RenderablePlaneTimeVaryingImage"
);
+ fRenderable->registerClass("RenderablePointCloud");
+ fRenderable->registerClass("RenderablePolygonCloud");
fRenderable->registerClass("RenderablePrism");
fRenderable->registerClass(
"RenderableTimeVaryingSphere"
@@ -232,6 +236,8 @@ std::vector BaseModule::documentations() const {
RenderablePlaneImageLocal::Documentation(),
RenderablePlaneImageOnline::Documentation(),
RenderablePlaneTimeVaryingImage::Documentation(),
+ RenderablePointCloud::Documentation(),
+ RenderablePolygonCloud::Documentation(),
RenderablePrism::Documentation(),
RenderableRadialGrid::Documentation(),
RenderableSphere::Documentation(),
diff --git a/modules/base/rendering/grids/renderableboxgrid.cpp b/modules/base/rendering/grids/renderableboxgrid.cpp
index 7af3822024..e0099c512e 100644
--- a/modules/base/rendering/grids/renderableboxgrid.cpp
+++ b/modules/base/rendering/grids/renderableboxgrid.cpp
@@ -76,7 +76,7 @@ namespace {
// [[codegen::verbatim(LabelsInfo.description)]]
std::optional labels
- [[codegen::reference("space_labelscomponent")]];
+ [[codegen::reference("labelscomponent")]];
};
#include "renderableboxgrid_codegen.cpp"
} // namespace
@@ -124,7 +124,6 @@ bool RenderableBoxGrid::isReady() const {
void RenderableBoxGrid::initialize() {
if (_hasLabels) {
_labels->initialize();
- _labels->loadLabels();
}
}
diff --git a/modules/base/rendering/grids/renderableboxgrid.h b/modules/base/rendering/grids/renderableboxgrid.h
index e4a24c7df0..025ec3b36c 100644
--- a/modules/base/rendering/grids/renderableboxgrid.h
+++ b/modules/base/rendering/grids/renderableboxgrid.h
@@ -27,9 +27,9 @@
#include
-#include
#include
#include
+#include
#include
namespace ghoul::opengl {
diff --git a/modules/base/rendering/grids/renderablegrid.cpp b/modules/base/rendering/grids/renderablegrid.cpp
index ceddd1bd0f..413885e4a4 100644
--- a/modules/base/rendering/grids/renderablegrid.cpp
+++ b/modules/base/rendering/grids/renderablegrid.cpp
@@ -122,7 +122,7 @@ namespace {
// [[codegen::verbatim(LabelsInfo.description)]]
std::optional labels
- [[codegen::reference("space_labelscomponent")]];
+ [[codegen::reference("labelscomponent")]];
};
#include "renderablegrid_codegen.cpp"
} // namespace
@@ -192,7 +192,6 @@ bool RenderableGrid::isReady() const {
void RenderableGrid::initialize() {
if (_hasLabels) {
_labels->initialize();
- _labels->loadLabels();
}
}
diff --git a/modules/base/rendering/grids/renderablegrid.h b/modules/base/rendering/grids/renderablegrid.h
index f9ddc2a1d9..14385f0847 100644
--- a/modules/base/rendering/grids/renderablegrid.h
+++ b/modules/base/rendering/grids/renderablegrid.h
@@ -27,12 +27,12 @@
#include
-#include
#include
#include
#include
#include
#include
+#include
#include
namespace ghoul::opengl { class ProgramObject; }
diff --git a/modules/base/rendering/grids/renderableradialgrid.cpp b/modules/base/rendering/grids/renderableradialgrid.cpp
index 4f528fd15b..48ed3815e3 100644
--- a/modules/base/rendering/grids/renderableradialgrid.cpp
+++ b/modules/base/rendering/grids/renderableradialgrid.cpp
@@ -104,7 +104,7 @@ namespace {
// [[codegen::verbatim(LabelsInfo.description)]]
std::optional labels
- [[codegen::reference("space_labelscomponent")]];
+ [[codegen::reference("labelscomponent")]];
};
#include "renderableradialgrid_codegen.cpp"
} // namespace
@@ -169,7 +169,6 @@ bool RenderableRadialGrid::isReady() const {
void RenderableRadialGrid::initialize() {
if (_hasLabels) {
_labels->initialize();
- _labels->loadLabels();
}
}
diff --git a/modules/base/rendering/grids/renderableradialgrid.h b/modules/base/rendering/grids/renderableradialgrid.h
index 88689832fd..cf55c07ab0 100644
--- a/modules/base/rendering/grids/renderableradialgrid.h
+++ b/modules/base/rendering/grids/renderableradialgrid.h
@@ -27,13 +27,13 @@
#include
-#include
#include
#include
#include
#include
#include
#include
+#include
#include
namespace ghoul::opengl { class ProgramObject; }
diff --git a/modules/base/rendering/grids/renderablesphericalgrid.cpp b/modules/base/rendering/grids/renderablesphericalgrid.cpp
index b196d5d460..5a4007e82d 100644
--- a/modules/base/rendering/grids/renderablesphericalgrid.cpp
+++ b/modules/base/rendering/grids/renderablesphericalgrid.cpp
@@ -79,7 +79,7 @@ namespace {
// [[codegen::verbatim(LabelsInfo.description)]]
std::optional labels
- [[codegen::reference("space_labelscomponent")]];
+ [[codegen::reference("labelscomponent")]];
};
#include "renderablesphericalgrid_codegen.cpp"
} // namespace
@@ -136,7 +136,6 @@ bool RenderableSphericalGrid::isReady() const {
void RenderableSphericalGrid::initialize() {
if (_hasLabels) {
_labels->initialize();
- _labels->loadLabels();
}
}
diff --git a/modules/base/rendering/grids/renderablesphericalgrid.h b/modules/base/rendering/grids/renderablesphericalgrid.h
index 992dd7090f..5f6ac23b63 100644
--- a/modules/base/rendering/grids/renderablesphericalgrid.h
+++ b/modules/base/rendering/grids/renderablesphericalgrid.h
@@ -27,10 +27,10 @@
#include
-#include
#include
#include
#include
+#include
#include
namespace ghoul::opengl { class ProgramObject; }
diff --git a/modules/base/rendering/pointcloud/renderablepointcloud.cpp b/modules/base/rendering/pointcloud/renderablepointcloud.cpp
new file mode 100644
index 0000000000..6c8e08031f
--- /dev/null
+++ b/modules/base/rendering/pointcloud/renderablepointcloud.cpp
@@ -0,0 +1,1058 @@
+/*****************************************************************************************
+ * *
+ * OpenSpace *
+ * *
+ * Copyright (c) 2014-2023 *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this *
+ * software and associated documentation files (the "Software"), to deal in the Software *
+ * without restriction, including without limitation the rights to use, copy, modify, *
+ * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to *
+ * permit persons to whom the Software is furnished to do so, subject to the following *
+ * conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included in all copies *
+ * or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, *
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A *
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT *
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF *
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE *
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ ****************************************************************************************/
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace {
+ constexpr std::string_view _loggerCat = "RenderablePointCloud";
+
+ constexpr std::array UniformNames = {
+ "cameraViewMatrix", "projectionMatrix", "modelMatrix", "cameraPosition",
+ "cameraLookUp", "renderOption", "maxAngularSize", "color", "opacity",
+ "scaleExponent", "scaleFactor", "up", "right", "fadeInValue", "hasSpriteTexture",
+ "spriteTexture", "useColorMap", "colorMapTexture", "cmapRangeMin", "cmapRangeMax",
+ "nanColor", "useNanColor", "hideOutsideRange", "enableMaxSizeControl",
+ "aboveRangeColor", "useAboveRangeColor", "belowRangeColor", "useBelowRangeColor",
+ "hasDvarScaling"
+ };
+
+ enum RenderOption {
+ ViewDirection = 0,
+ PositionNormal
+ };
+
+ constexpr openspace::properties::Property::PropertyInfo SpriteTextureInfo = {
+ "Texture",
+ "Point Sprite Texture",
+ "The path to the texture that should be used as the point sprite",
+ openspace::properties::Property::Visibility::AdvancedUser
+ };
+
+ constexpr openspace::properties::Property::PropertyInfo UseSpriteTextureInfo = {
+ "UseTexture",
+ "Use Texture",
+ "If true, use the provided sprite texture to render the point. If false, draw "
+ "the points using the default point shape.",
+ openspace::properties::Property::Visibility::AdvancedUser
+ };
+
+ constexpr openspace::properties::Property::PropertyInfo PointColorInfo = {
+ "FixedColor",
+ "Fixed Color",
+ "This value is used to define the color of the points when no color map is"
+ "used",
+ openspace::properties::Property::Visibility::NoviceUser
+ };
+
+ constexpr openspace::properties::Property::PropertyInfo DrawElementsInfo = {
+ "DrawElements",
+ "Draw Elements",
+ "Enables/Disables the drawing of the points",
+ // @VISIBILITY(1.25)
+ openspace::properties::Property::Visibility::NoviceUser
+ };
+
+ static const openspace::properties::PropertyOwner::PropertyOwnerInfo LabelsInfo = {
+ "Labels",
+ "Labels",
+ "The labels for the points. If no label file is provided, the labels will be "
+ "created to match the points in the data file. For a CSV file, you should then "
+ "specify which column is the 'Name' column in the data mapping. For SPECK files "
+ "the labels are created from the comment at the end of each line"
+ };
+
+ constexpr openspace::properties::Property::PropertyInfo RenderOptionInfo = {
+ "RenderOption",
+ "Render Option",
+ "Option wether the point billboards should face the camera or not. Used for "
+ "non-linear display environments such as fisheye.",
+ openspace::properties::Property::Visibility::AdvancedUser
+ };
+
+ constexpr openspace::properties::Property::PropertyInfo FadeInDistancesInfo = {
+ "FadeInDistances",
+ "Fade-In Start and End Distances",
+ "These values determine the initial and final distances from the origin of "
+ "the dataset at which the points will start and end fading-in. The distances "
+ "are specified in the same unit as the points, that is, the one provodied as the "
+ "Unit, or meters. With normal fading the points are fully visible once the "
+ "camera is outside this range and fully invisible when inside the range. With "
+ "inverted fading the situation is the opposite: the points are visible inside "
+ "hen closer than the min value of the range and invisible when further away.",
+ // @VISIBILITY(3.25)
+ openspace::properties::Property::Visibility::AdvancedUser
+ };
+
+ constexpr openspace::properties::Property::PropertyInfo EnableDistanceFadeInfo = {
+ "Enabled",
+ "Enable Distance-based Fading",
+ "Enables/disables the Fade-in effect based on camera distance. Automatically set "
+ "to true if FadeInDistances are specified in the asset.",
+ openspace::properties::Property::Visibility::User
+ };
+
+ constexpr openspace::properties::Property::PropertyInfo InvertFadeInfo = {
+ "Invert",
+ "Invert",
+ "This property can be used the invert the fading so that the points are "
+ "invisible when the camera is further away than the max fade distance "
+ "and fully visible when it is closer than the min distance.",
+ openspace::properties::Property::Visibility::AdvancedUser
+ };
+
+ constexpr openspace::properties::Property::PropertyInfo UseAdditiveBlendingInfo = {
+ "UseAdditiveBlending",
+ "Use Additive Blending",
+ "If true (default), the color of points rendered on top of each other is "
+ "blended additively, resulting in a brighter color where points overlap. "
+ "If false, no such blending will take place and the color of the point "
+ "will not be modified by blending. Note that this may lead to weird behaviors "
+ "when the points are rendered with transparency.",
+ openspace::properties::Property::Visibility::AdvancedUser
+ };
+
+ constexpr openspace::properties::Property::PropertyInfo NumShownDataPointsInfo = {
+ "NumberOfDataPoints",
+ "Number of Shown Data Points",
+ "This read only property includes information about how many points are being "
+ "rendered.",
+ openspace::properties::Property::Visibility::User
+ };
+
+ constexpr openspace::properties::Property::PropertyInfo ScaleExponentInfo = {
+ "ScaleExponent",
+ "Scale Exponent",
+ "This value is used as in exponential scaling to set the absolute size of the "
+ "point. In general, the larger distance the dataset covers, the larger this "
+ "value should be. If not included, it is computed based on the maximum "
+ "positional component of the data points. This is useful for showing the "
+ "dataset at all, but you will likely want to change it to something that looks "
+ "good.",
+ openspace::properties::Property::Visibility::User
+ };
+
+ constexpr openspace::properties::Property::PropertyInfo ScaleFactorInfo = {
+ "ScaleFactor",
+ "Scale Factor",
+ "This value is used as a multiplicative factor to adjust the size of the points, "
+ "after the exponential scaling and any max size control effects. Simply just "
+ "increases or decreases the visual size of the points.",
+ openspace::properties::Property::Visibility::User
+ };
+
+ constexpr openspace::properties::Property::PropertyInfo UseMaxSizeControlInfo = {
+ "EnableMaxSizeControl",
+ "Enable Max Size Control",
+ "If true, the Max Size property will be used as an upper limit for the size of "
+ "the point. This reduces the size of the points when approaching them, so that "
+ "they stick to a maximum visual size depending on the Max Size value.",
+ openspace::properties::Property::Visibility::AdvancedUser
+ };
+
+ constexpr openspace::properties::Property::PropertyInfo MaxSizeInfo = {
+ "MaxSize",
+ "Max Size",
+ "This value controls the maximum allowed size for the points, when the max size "
+ "control feature is enabled. This limits the visual size of the points based on "
+ "the distance to the camera. The larger the value, the larger the points are "
+ "allowed to become. In the background, the computations are made by limiting the "
+ "size to a certain angle based on the field of view of the camera. So a value of "
+ "1 limits the point size to take up a maximum of one degree of the view space.",
+ openspace::properties::Property::Visibility::AdvancedUser
+ };
+
+ constexpr openspace::properties::Property::PropertyInfo SizeMappingEnabledInfo = {
+ "Enabled",
+ "Size Mapping Enabled",
+ "If this value is set to 'true' and at least one column was loaded as an option "
+ "for size mapping, the chosen data column will be used to scale the size of the "
+ "points. The first option in the list is selected per default.",
+ openspace::properties::Property::Visibility::NoviceUser
+ };
+
+ constexpr openspace::properties::Property::PropertyInfo SizeMappingOptionInfo = {
+ "Parameter",
+ "Parameter Option",
+ "This value determines which parameter is used for scaling of the point. The "
+ "parameter value will be used as a miltiplicative factor to scale the size of "
+ "the points. Note that they may however still be scaled by max size adjustment "
+ "effects.",
+ openspace::properties::Property::Visibility::AdvancedUser
+ };
+
+ // A RenderablePointCloud can be used to render point-based datasets in 3D space,
+ // optionally including color mapping, a sprite texture and labels. There are several
+ // properties that affect the visuals of the points, such as settings for scaling,
+ // fading, sprite texture, color mapping and whether the colors of overlapping points
+ // should be blended additively or not.
+ //
+ // The point size depends on a few different things:
+ //
+ // - At the core, scaling is done based on an exponential value, the 'ScaleExponent'.
+ // A relatively small change to this value will lead to a large change in size.
+ // When no exponent is set, one will be created based on the coordinates in the
+ // dataset. The points will be visible, but may be appeared as too large or small.
+ // One option is to not specify the exponent when loading the dataset for the the,
+ // first time, to make sure the points are visual, and then adapt the value
+ // interactively when OpenSpace is running until you find a value that you find
+ // suitable.
+ //
+ // - There is also an option to limit the size of the points based on a given max
+ // size value.
+ //
+ // - To easily change the visual size of the points, the multiplicative 'ScaleFactor'
+ // may be used. A value of 2 makes the points twice as large, visually, compared
+ // to 1.
+ //
+ // See example files in data/assets/examples/pointcloud for some concrete examples of
+ // point clouds with different settings.
+ struct [[codegen::Dictionary(RenderablePointCloud)]] Parameters {
+ // The path to the data file that contains information about the point to be
+ // rendered. Can be either a CSV or SPECK file
+ std::optional file;
+
+ // If true (default), the loaded dataset will be cached so that it can be loaded
+ // faster at a later time. This does however mean that any updates to the values
+ // in the dataset will not lead to changes in the rendering without first removing
+ // the cached file. Set it to false to disable caching. This can be useful for
+ // example when working on importing a new dataset
+ std::optional useCaching;
+
+ // A dictionary specifying details on how to load the dataset. Updating the data
+ // mapping will lead to a new cached version of the dataset
+ std::optional dataMapping
+ [[codegen::reference("dataloader_datamapping")]];
+
+ // [[codegen::verbatim(SpriteTextureInfo.description)]]
+ std::optional texture;
+
+ // [[codegen::verbatim(UseSpriteTextureInfo.description)]]
+ std::optional useTexture;
+
+ // [[codegen::verbatim(DrawElementsInfo.description)]]
+ std::optional drawElements;
+
+ enum class [[codegen::map(RenderOption)]] RenderOption {
+ ViewDirection [[codegen::key("Camera View Direction")]],
+ PositionNormal [[codegen::key("Camera Position Normal")]]
+ };
+ // [[codegen::verbatim(RenderOptionInfo.description)]]
+ std::optional renderOption;
+
+ // [[codegen::verbatim(UseAdditiveBlendingInfo.description)]]
+ std::optional useAdditiveBlending;
+
+ enum class [[codegen::map(openspace::DistanceUnit)]] Unit {
+ Meter [[codegen::key("m")]],
+ Kilometer [[codegen::key("Km")]],
+ Parsec [[codegen::key("pc")]],
+ Kiloparsec [[codegen::key("Kpc")]],
+ Megaparsec [[codegen::key("Mpc")]],
+ Gigaparsec [[codegen::key("Gpc")]],
+ Gigalightyear [[codegen::key("Gly")]]
+ };
+ // The unit used for all distances. Should match the unit of any
+ // distances/positions in the data files
+ std::optional unit;
+
+ // [[codegen::verbatim(LabelsInfo.description)]]
+ std::optional labels
+ [[codegen::reference("labelscomponent")]];
+
+ struct SizeSettings {
+ // A list specifying all parameters that may be used for size mapping, i.e.
+ // scaling the points based on the provided data columns
+ std::optional> sizeMapping;
+
+ // [[codegen::verbatim(ScaleExponentInfo.description)]]
+ std::optional scaleExponent;
+
+ // [[codegen::verbatim(ScaleFactorInfo.description)]]
+ std::optional scaleFactor;
+
+ // [[codegen::verbatim(UseMaxSizeControlInfo.description)]]
+ std::optional enableMaxSizeControl;
+
+ // [[codegen::verbatim(MaxSizeInfo.description)]]
+ std::optional maxSize;
+ };
+ // Settings related to the scale of the points, whether they should limit to
+ // a certain max size, etc.
+ std::optional sizeSettings;
+
+ struct ColorSettings {
+ // [[codegen::verbatim(PointColorInfo.description)]]
+ std::optional fixedColor [[codegen::color()]];
+
+ // Settings related to the choice of color map, parameters, etc.
+ std::optional colorMapping
+ [[codegen::reference("colormappingcomponent")]];
+ };
+ // Settings related to the coloring of the points, such as a fixed color,
+ // color map, etc.
+ std::optional coloring;
+
+ struct Fading {
+ // [[codegen::verbatim(EnableDistanceFadeInfo.description)]]
+ std::optional enabled;
+
+ // [[codegen::verbatim(FadeInDistancesInfo.description)]]
+ std::optional fadeInDistances;
+
+ // [[codegen::verbatim(InvertFadeInfo.description)]]
+ std::optional invert;
+ };
+ // Settings related to fading based on camera distance. Can be used to either
+ // fade away or fade in the points when reaching a certain distance from the
+ // origin of the dataset
+ std::optional fading;
+
+ // Transformation matrix to be applied to the position of each object
+ std::optional transformationMatrix;
+ };
+
+#include "renderablepointcloud_codegen.cpp"
+} // namespace
+
+namespace openspace {
+
+documentation::Documentation RenderablePointCloud::Documentation() {
+ return codegen::doc("base_renderablepointcloud");
+}
+
+RenderablePointCloud::SizeSettings::SizeSettings(const ghoul::Dictionary& dictionary)
+ : properties::PropertyOwner({ "Sizing", "Sizing", ""})
+ , scaleExponent(ScaleExponentInfo, 1.f, 0.f, 25.f)
+ , scaleFactor(ScaleFactorInfo, 1.f, 0.f, 50.f)
+ , useMaxSizeControl(UseMaxSizeControlInfo, false)
+ , maxAngularSize(MaxSizeInfo, 1.f, 0.f, 45.f)
+{
+ const Parameters p = codegen::bake(dictionary);
+
+ if (p.sizeSettings.has_value()) {
+ const Parameters::SizeSettings settings = *p.sizeSettings;
+
+ scaleFactor = settings.scaleFactor.value_or(scaleFactor);
+ scaleExponent = settings.scaleExponent.value_or(scaleExponent);
+ useMaxSizeControl = settings.enableMaxSizeControl.value_or(useMaxSizeControl);
+ maxAngularSize = settings.maxSize.value_or(maxAngularSize);
+
+ if (settings.sizeMapping.has_value()) {
+ std::vector opts = *settings.sizeMapping;
+ for (size_t i = 0; i < opts.size(); ++i) {
+ // Note that options are added in order
+ sizeMapping.parameterOption.addOption(static_cast(i), opts[i]);
+ }
+ sizeMapping.enabled = true;
+
+ addPropertySubOwner(sizeMapping);
+ }
+ }
+
+ addProperty(scaleFactor);
+ addProperty(scaleExponent);
+ addProperty(useMaxSizeControl);
+ addProperty(maxAngularSize);
+}
+
+RenderablePointCloud::SizeSettings::SizeMapping::SizeMapping()
+ : properties::PropertyOwner({ "SizeMapping", "Size Mapping", "" })
+ , enabled(SizeMappingEnabledInfo, false)
+ , parameterOption(
+ SizeMappingOptionInfo,
+ properties::OptionProperty::DisplayType::Dropdown
+ )
+{
+ addProperty(enabled);
+ addProperty(parameterOption);
+}
+
+RenderablePointCloud::ColorSettings::ColorSettings(const ghoul::Dictionary& dictionary)
+ : properties::PropertyOwner({ "Coloring", "Coloring", "" })
+ , pointColor(PointColorInfo, glm::vec3(1.f), glm::vec3(0.f), glm::vec3(1.f))
+{
+ const Parameters p = codegen::bake(dictionary);
+
+ if (p.coloring.has_value()) {
+ const Parameters::ColorSettings settings = *p.coloring;
+ pointColor = settings.fixedColor.value_or(pointColor);
+
+ if (settings.colorMapping.has_value()) {
+ colorMapping = std::make_unique(
+ *settings.colorMapping
+ );
+ addPropertySubOwner(colorMapping.get());
+ }
+ }
+ pointColor.setViewOption(properties::Property::ViewOptions::Color);
+ addProperty(pointColor);
+}
+
+RenderablePointCloud::Fading::Fading(const ghoul::Dictionary& dictionary)
+ : properties::PropertyOwner({ "Fading", "Fading", "" })
+ , enabled(EnableDistanceFadeInfo, false)
+ , fadeInDistances(
+ FadeInDistancesInfo,
+ glm::vec2(0.f),
+ glm::vec2(0.f),
+ glm::vec2(100.f)
+ )
+ , invert(InvertFadeInfo, false)
+{
+ const Parameters p = codegen::bake(dictionary);
+
+ if (p.fading.has_value()) {
+ const Parameters::Fading f = *p.fading;
+
+ if (f.fadeInDistances.has_value()) {
+ fadeInDistances = *f.fadeInDistances;
+ // Set the allowed max value based of that which was entered. Just to give
+ // useful values for the slider
+ fadeInDistances.setMaxValue(10.f * glm::vec2(fadeInDistances.value().y));
+ }
+
+ enabled = f.enabled.value_or(f.fadeInDistances.has_value());
+ invert = f.invert.value_or(invert);
+ }
+
+ addProperty(enabled);
+ fadeInDistances.setViewOption(properties::Property::ViewOptions::MinMaxRange);
+ addProperty(fadeInDistances);
+ addProperty(invert);
+}
+
+RenderablePointCloud::RenderablePointCloud(const ghoul::Dictionary& dictionary)
+ : Renderable(dictionary)
+ , _spriteTexturePath(SpriteTextureInfo)
+ , _useSpriteTexture(UseSpriteTextureInfo, true)
+ , _drawElements(DrawElementsInfo, true)
+ , _useAdditiveBlending(UseAdditiveBlendingInfo, true)
+ , _renderOption(RenderOptionInfo, properties::OptionProperty::DisplayType::Dropdown)
+ , _nDataPoints(NumShownDataPointsInfo, 0)
+ , _fading(dictionary)
+ , _colorSettings(dictionary)
+ , _sizeSettings(dictionary)
+{
+ const Parameters p = codegen::bake(dictionary);
+
+ addProperty(Fadeable::_opacity);
+
+ if (p.file.has_value()) {
+ _hasDataFile = true;
+ _dataFile = absPath(*p.file).string();
+ }
+
+ if (p.dataMapping.has_value()) {
+ _dataMapping = dataloader::DataMapping::createFromDictionary(*p.dataMapping);
+ }
+
+ _drawElements = p.drawElements.value_or(_drawElements);
+ addProperty(_drawElements);
+
+ _renderOption.addOption(RenderOption::ViewDirection, "Camera View Direction");
+ _renderOption.addOption(RenderOption::PositionNormal, "Camera Position Normal");
+
+ if (p.renderOption.has_value()) {
+ _renderOption = codegen::map(*p.renderOption);
+ }
+ else {
+ _renderOption = RenderOption::ViewDirection;
+ }
+ addProperty(_renderOption);
+
+ _useAdditiveBlending = p.useAdditiveBlending.value_or(_useAdditiveBlending);
+ addProperty(_useAdditiveBlending);
+
+ if (p.unit.has_value()) {
+ _unit = codegen::map(*p.unit);
+ }
+ else {
+ _unit = DistanceUnit::Meter;
+ }
+
+ _spriteTexturePath.onChange([this]() { _spriteTextureIsDirty = true; });
+ addProperty(_spriteTexturePath);
+
+ _useSpriteTexture = p.useTexture.value_or(_useSpriteTexture);
+ addProperty(_useSpriteTexture);
+
+ if (p.texture.has_value()) {
+ _spriteTexturePath = absPath(*p.texture).string();
+ }
+
+ _hasSpriteTexture = p.texture.has_value();
+
+ _transformationMatrix = p.transformationMatrix.value_or(_transformationMatrix);
+
+ if (p.sizeSettings.has_value() && p.sizeSettings->sizeMapping.has_value()) {
+ _sizeSettings.sizeMapping.parameterOption.onChange(
+ [this]() { _dataIsDirty = true; }
+ );
+ _hasDatavarSize = true;
+ }
+
+ addPropertySubOwner(_sizeSettings);
+ addPropertySubOwner(_colorSettings);
+
+ if (p.fading.has_value()) {
+ addPropertySubOwner(_fading);
+ }
+
+ if (p.coloring.has_value() && (*p.coloring).colorMapping.has_value()) {
+ _hasColorMapFile = true;
+
+ _colorSettings.colorMapping->dataColumn.onChange(
+ [this]() { _dataIsDirty = true; }
+ );
+
+ _colorSettings.colorMapping->setRangeFromData.onChange([this]() {
+ int parameterIndex = currentColorParameterIndex();
+ _colorSettings.colorMapping->valueRange = _dataset.findValueRange(
+ parameterIndex
+ );
+ });
+ }
+
+ if (_hasDataFile) {
+ bool useCaching = p.useCaching.value_or(true);
+ if (useCaching) {
+ _dataset = dataloader::data::loadFileWithCache(_dataFile, _dataMapping);
+ }
+ else {
+ _dataset = dataloader::data::loadFile(_dataFile, _dataMapping);
+ }
+ _nDataPoints = static_cast(_dataset.entries.size());
+
+ // If no scale exponent was specified, compute one that will at least show the
+ // points based on the scale of the positions in the dataset
+ if (!p.sizeSettings.has_value() || !p.sizeSettings->scaleExponent.has_value()) {
+ double dist = _dataset.maxPositionComponent * toMeter(_unit);
+ if (dist > 0.0) {
+ float exponent = static_cast(std::log10(dist));
+ // Reduce the actually used exponent a little bit, as just using the
+ // logarithm as is leads to very large points
+ _sizeSettings.scaleExponent = 0.9f * exponent;
+ }
+ }
+ }
+
+ if (p.labels.has_value()) {
+ if (!p.labels->hasKey("File") && _hasDataFile) {
+ // Load the labelset from the dataset if no file was included
+ _labels = std::make_unique(*p.labels, _dataset, _unit);
+ }
+ else {
+ _labels = std::make_unique(*p.labels);
+ }
+
+ _hasLabels = true;
+ addPropertySubOwner(_labels.get());
+ // Fading of the labels should also depend on the fading of the renderable
+ _labels->setParentFadeable(this);
+ }
+
+ _nDataPoints.setReadOnly(true);
+ addProperty(_nDataPoints);
+}
+
+bool RenderablePointCloud::isReady() const {
+ bool isReady = _program;
+
+ // If we have labels, they also need to be loaded
+ if (_hasLabels) {
+ isReady = isReady && _labels->isReady();
+ }
+ return isReady;
+}
+
+void RenderablePointCloud::initialize() {
+ ZoneScoped;
+
+ if (_hasDataFile && _hasColorMapFile) {
+ _colorSettings.colorMapping->initialize(_dataset);
+ }
+
+ if (_hasLabels) {
+ _labels->initialize();
+ }
+}
+
+void RenderablePointCloud::initializeGL() {
+ ZoneScoped;
+
+ _program = BaseModule::ProgramObjectManager.request(
+ "RenderablePointCloud",
+ []() {
+ return global::renderEngine->buildRenderProgram(
+ "RenderablePointCloud",
+ absPath("${MODULE_BASE}/shaders/billboardpoint_vs.glsl"),
+ absPath("${MODULE_BASE}/shaders/billboardpoint_fs.glsl"),
+ absPath("${MODULE_BASE}/shaders/billboardpoint_gs.glsl")
+ );
+ }
+ );
+
+ ghoul::opengl::updateUniformLocations(*_program, _uniformCache, UniformNames);
+
+ if (_hasColorMapFile) {
+ _colorSettings.colorMapping->initializeTexture();
+ }
+}
+
+void RenderablePointCloud::deinitializeGL() {
+ glDeleteBuffers(1, &_vbo);
+ _vbo = 0;
+ glDeleteVertexArrays(1, &_vao);
+ _vao = 0;
+
+ BaseModule::ProgramObjectManager.release(
+ "RenderablePointCloud",
+ [](ghoul::opengl::ProgramObject* p) {
+ global::renderEngine->removeRenderProgram(p);
+ }
+ );
+ _program = nullptr;
+
+ BaseModule::TextureManager.release(_spriteTexture);
+ _spriteTexture = nullptr;
+}
+
+void RenderablePointCloud::bindTextureForRendering() const {
+ if (_spriteTexture) {
+ _spriteTexture->bind();
+ }
+}
+
+float RenderablePointCloud::computeDistanceFadeValue(const RenderData& data) const {
+ if (!_fading.enabled) {
+ return 1.f;
+ }
+
+ float fadeValue = 1.f;
+ glm::dmat4 invModelMatrix = glm::inverse(calcModelTransform(data));
+
+ glm::dvec3 cameraPosModelSpace = glm::dvec3(
+ invModelMatrix * glm::dvec4(data.camera.positionVec3(), 1.0)
+ );
+
+ float distCamera = static_cast(
+ glm::length(cameraPosModelSpace) / toMeter(_unit)
+ );
+
+ const glm::vec2 fadeRange = _fading.fadeInDistances;
+ const float fadeRangeWidth = (fadeRange.y - fadeRange.x);
+ float funcValue = (distCamera - fadeRange.x) / fadeRangeWidth;
+ funcValue = glm::clamp(funcValue, 0.f, 1.f);
+
+ if (_fading.invert) {
+ funcValue = 1.f - funcValue;
+ }
+
+ return fadeValue * funcValue;
+}
+
+void RenderablePointCloud::renderBillboards(const RenderData& data,
+ const glm::dmat4& modelMatrix,
+ const glm::dvec3& orthoRight,
+ const glm::dvec3& orthoUp,
+ float fadeInVariable)
+{
+ if (!_hasDataFile || _dataset.entries.empty()) {
+ return;
+ }
+
+ glEnablei(GL_BLEND, 0);
+
+ if (_useAdditiveBlending) {
+ glDepthMask(false);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ }
+ else {
+ // Normal blending, with transparency
+ glDepthMask(true);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ _program->activate();
+
+ _program->setUniform(_uniformCache.cameraPos, data.camera.positionVec3());
+ _program->setUniform(
+ _uniformCache.cameraLookup,
+ glm::vec3(data.camera.lookUpVectorWorldSpace())
+ );
+ _program->setUniform(_uniformCache.renderOption, _renderOption.value());
+ _program->setUniform(_uniformCache.modelMatrix, modelMatrix);
+
+ _program->setUniform(
+ _uniformCache.cameraViewMatrix,
+ data.camera.combinedViewMatrix()
+ );
+
+ _program->setUniform(
+ _uniformCache.projectionMatrix,
+ glm::dmat4(data.camera.projectionMatrix())
+ );
+
+ _program->setUniform(_uniformCache.up, glm::vec3(orthoUp));
+ _program->setUniform(_uniformCache.right, glm::vec3(orthoRight));
+ _program->setUniform(_uniformCache.fadeInValue, fadeInVariable);
+ _program->setUniform(_uniformCache.opacity, opacity());
+
+ _program->setUniform(_uniformCache.scaleExponent, _sizeSettings.scaleExponent);
+ _program->setUniform(_uniformCache.scaleFactor, _sizeSettings.scaleFactor);
+ _program->setUniform(_uniformCache.enableMaxSizeControl, _sizeSettings.useMaxSizeControl);
+ _program->setUniform(_uniformCache.maxAngularSize, _sizeSettings.maxAngularSize);
+ _program->setUniform(_uniformCache.hasDvarScaling, _sizeSettings.sizeMapping.enabled);
+
+ bool useTexture = _hasSpriteTexture && _useSpriteTexture;
+ _program->setUniform(_uniformCache.hasSpriteTexture, useTexture);
+
+ ghoul::opengl::TextureUnit spriteTextureUnit;
+ _program->setUniform(_uniformCache.spriteTexture, spriteTextureUnit);
+ if (useTexture) {
+ spriteTextureUnit.activate();
+ bindTextureForRendering();
+ }
+
+ _program->setUniform(_uniformCache.color, _colorSettings.pointColor);
+
+ bool useColorMap = _hasColorMapFile && _colorSettings.colorMapping->enabled &&
+ _colorSettings.colorMapping->texture();
+
+ _program->setUniform(_uniformCache.useColormap, useColorMap);
+
+ ghoul::opengl::TextureUnit colorMapTextureUnit;
+ _program->setUniform(_uniformCache.colorMapTexture, colorMapTextureUnit);
+
+ if (useColorMap) {
+ colorMapTextureUnit.activate();
+ _colorSettings.colorMapping->texture()->bind();
+
+ const glm::vec2 range = _colorSettings.colorMapping->valueRange;
+ _program->setUniform(_uniformCache.cmapRangeMin, range.x);
+ _program->setUniform(_uniformCache.cmapRangeMax, range.y);
+ _program->setUniform(
+ _uniformCache.hideOutsideRange,
+ _colorSettings.colorMapping->hideOutsideRange
+ );
+
+ _program->setUniform(
+ _uniformCache.nanColor,
+ _colorSettings.colorMapping->nanColor
+ );
+ _program->setUniform(
+ _uniformCache.useNanColor,
+ _colorSettings.colorMapping->useNanColor
+ );
+
+ _program->setUniform(
+ _uniformCache.aboveRangeColor,
+ _colorSettings.colorMapping->aboveRangeColor
+ );
+ _program->setUniform(
+ _uniformCache.useAboveRangeColor,
+ _colorSettings.colorMapping->useAboveRangeColor
+ );
+
+ _program->setUniform(
+ _uniformCache.belowRangeColor,
+ _colorSettings.colorMapping->belowRangeColor
+ );
+ _program->setUniform(
+ _uniformCache.useBelowRangeColor,
+ _colorSettings.colorMapping->useBelowRangeColor
+ );
+ }
+
+ glBindVertexArray(_vao);
+ glDrawArrays(GL_POINTS, 0, static_cast(_dataset.entries.size()));
+ glBindVertexArray(0);
+ _program->deactivate();
+
+ global::renderEngine->openglStateCache().resetBlendState();
+ global::renderEngine->openglStateCache().resetDepthState();
+}
+
+void RenderablePointCloud::render(const RenderData& data, RendererTasks&) {
+ float fadeInVar = computeDistanceFadeValue(data);
+
+ if (fadeInVar < 0.01f) {
+ return;
+ }
+
+ glm::dmat4 modelMatrix = calcModelTransform(data);
+
+ glm::dvec3 cameraViewDirectionWorld = -data.camera.viewDirectionWorldSpace();
+ glm::dvec3 cameraUpDirectionWorld = data.camera.lookUpVectorWorldSpace();
+ glm::dvec3 orthoRight = glm::normalize(
+ glm::cross(cameraUpDirectionWorld, cameraViewDirectionWorld)
+ );
+ if (orthoRight == glm::dvec3(0.0)) {
+ glm::dvec3 otherVector = glm::vec3(
+ cameraUpDirectionWorld.y,
+ cameraUpDirectionWorld.x,
+ cameraUpDirectionWorld.z
+ );
+ orthoRight = glm::normalize(glm::cross(otherVector, cameraViewDirectionWorld));
+ }
+ glm::dvec3 orthoUp = glm::normalize(glm::cross(cameraViewDirectionWorld, orthoRight));
+
+ if (_hasDataFile && _drawElements) {
+ renderBillboards(data, modelMatrix, orthoRight, orthoUp, fadeInVar);
+ }
+
+ if (_hasLabels) {
+ glm::dmat4 modelViewProjectionMatrix =
+ calcModelViewProjectionTransform(data, modelMatrix);
+
+ _labels->render(data, modelViewProjectionMatrix, orthoRight, orthoUp, fadeInVar);
+ }
+}
+
+void RenderablePointCloud::update(const UpdateData&) {
+ ZoneScoped;
+
+ if (_dataIsDirty) {
+ updateBufferData();
+ }
+
+ if (_spriteTextureIsDirty) {
+ updateSpriteTexture();
+ }
+}
+
+int RenderablePointCloud::nAttributesPerPoint() const {
+ int n = 4; // position
+ n += _hasColorMapFile ? 1 : 0;
+ n += _hasDatavarSize ? 1 : 0;
+ return n;
+}
+
+void RenderablePointCloud::updateBufferData() {
+ if (!_hasDataFile || _dataset.entries.empty()) {
+ return;
+ }
+
+ ZoneScopedN("Data dirty");
+ TracyGpuZone("Data dirty");
+ LDEBUG("Regenerating data");
+
+ std::vector slice = createDataSlice();
+
+ int size = static_cast(slice.size());
+
+ if (_vao == 0) {
+ glGenVertexArrays(1, &_vao);
+ LDEBUG(fmt::format("Generating Vertex Array id '{}'", _vao));
+ }
+ if (_vbo == 0) {
+ glGenBuffers(1, &_vbo);
+ LDEBUG(fmt::format("Generating Vertex Buffer Object id '{}'", _vbo));
+ }
+
+ glBindVertexArray(_vao);
+ glBindBuffer(GL_ARRAY_BUFFER, _vbo);
+ glBufferData(GL_ARRAY_BUFFER, size * sizeof(float), slice.data(), GL_STATIC_DRAW);
+
+ const int attibutesPerPoint = nAttributesPerPoint();
+ int attributeOffset = 0;
+
+ GLint positionAttrib = _program->attributeLocation("in_position");
+ glEnableVertexAttribArray(positionAttrib);
+ glVertexAttribPointer(
+ positionAttrib,
+ 4,
+ GL_FLOAT,
+ GL_FALSE,
+ attibutesPerPoint * sizeof(float),
+ nullptr
+ );
+ attributeOffset += 4;
+
+ if (_hasColorMapFile) {
+ GLint colorParamAttrib = _program->attributeLocation("in_colorParameter");
+ glEnableVertexAttribArray(colorParamAttrib);
+ glVertexAttribPointer(
+ colorParamAttrib,
+ 1,
+ GL_FLOAT,
+ GL_FALSE,
+ attibutesPerPoint * sizeof(float),
+ reinterpret_cast(attributeOffset * sizeof(float))
+ );
+ attributeOffset += 1;
+ }
+
+ if (_hasDatavarSize) {
+ GLint scalingAttrib = _program->attributeLocation("in_scalingParameter");
+ glEnableVertexAttribArray(scalingAttrib);
+ glVertexAttribPointer(
+ scalingAttrib,
+ 1,
+ GL_FLOAT,
+ GL_FALSE,
+ attibutesPerPoint * sizeof(float),
+ reinterpret_cast(attributeOffset * sizeof(float))
+ );
+ attributeOffset += 1;
+ }
+
+ glBindVertexArray(0);
+
+ _dataIsDirty = false;
+}
+
+void RenderablePointCloud::updateSpriteTexture() {
+ bool shouldUpdate = _hasSpriteTexture && _spriteTextureIsDirty &&
+ !_spriteTexturePath.value().empty();
+
+ if (!shouldUpdate) {
+ return;
+ }
+
+ ZoneScopedN("Sprite texture");
+ TracyGpuZone("Sprite texture");
+
+ ghoul::opengl::Texture* texture = _spriteTexture;
+
+ unsigned int hash = ghoul::hashCRC32File(_spriteTexturePath);
+
+ _spriteTexture = BaseModule::TextureManager.request(
+ std::to_string(hash),
+ [path = _spriteTexturePath]() -> std::unique_ptr {
+ std::filesystem::path p = absPath(path);
+ LINFO(fmt::format("Loaded texture from {}", p));
+ std::unique_ptr t =
+ ghoul::io::TextureReader::ref().loadTexture(p.string(), 2);
+ t->uploadTexture();
+ t->setFilter(ghoul::opengl::Texture::FilterMode::AnisotropicMipMap);
+ t->purgeFromRAM();
+ return t;
+ }
+ );
+
+ BaseModule::TextureManager.release(texture);
+ _spriteTextureIsDirty = false;
+}
+
+int RenderablePointCloud::currentColorParameterIndex() const {
+ const properties::OptionProperty& property =
+ _colorSettings.colorMapping->dataColumn;
+
+ if (!_hasColorMapFile || property.options().empty()) {
+ return 0;
+ }
+
+ return _dataset.index(property.option().description);
+}
+
+int RenderablePointCloud::currentSizeParameterIndex() const {
+ const properties::OptionProperty& property =
+ _sizeSettings.sizeMapping.parameterOption;
+
+ if (!_hasDatavarSize || property.options().empty()) {
+ return 0;
+ }
+
+ return _dataset.index(property.option().description);
+}
+
+std::vector RenderablePointCloud::createDataSlice() {
+ ZoneScoped;
+
+ if (_dataset.entries.empty()) {
+ return std::vector();
+ }
+
+ std::vector result;
+ result.reserve(nAttributesPerPoint() * _dataset.entries.size());
+
+ // What datavar is in use for the index color
+ int colorParamIndex = currentColorParameterIndex();
+
+ // What datavar is in use for the size scaling (if present)
+ int sizeParamIndex = currentSizeParameterIndex();
+
+ double maxRadius = 0.0;
+ double biggestCoord = -1.0;
+
+ for (const dataloader::Dataset::Entry& e : _dataset.entries) {
+ const double unitMeter = toMeter(_unit);
+ glm::dvec4 position = glm::dvec4(glm::dvec3(e.position) * unitMeter, 1.0);
+ position = _transformationMatrix * position;
+
+ const double r = glm::length(position);
+ maxRadius = std::max(maxRadius, r);
+
+ // Positions
+ for (int j = 0; j < 4; ++j) {
+ result.push_back(static_cast(position[j]));
+ }
+
+ // Colors
+ if (_hasColorMapFile) {
+ biggestCoord = std::max(biggestCoord, glm::compMax(position));
+ result.push_back(e.data[colorParamIndex]);
+ }
+
+ // Size data
+ if (_hasDatavarSize) {
+ // @TODO: Consider more detailed control over the scaling. Currently the value
+ // is multiplied with the value as is. Should have similar mapping properties
+ // as the color mapping
+ result.push_back(e.data[sizeParamIndex]);
+ }
+ }
+ setBoundingSphere(maxRadius);
+ return result;
+}
+
+} // namespace openspace
diff --git a/modules/digitaluniverse/rendering/renderablebillboardscloud.h b/modules/base/rendering/pointcloud/renderablepointcloud.h
similarity index 57%
rename from modules/digitaluniverse/rendering/renderablebillboardscloud.h
rename to modules/base/rendering/pointcloud/renderablepointcloud.h
index 93701b6aea..ab51cfe2d9 100644
--- a/modules/digitaluniverse/rendering/renderablebillboardscloud.h
+++ b/modules/base/rendering/pointcloud/renderablepointcloud.h
@@ -22,27 +22,27 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
****************************************************************************************/
-#ifndef __OPENSPACE_MODULE_DIGITALUNIVERSE___RENDERABLEBILLBOARDSCLOUD___H__
-#define __OPENSPACE_MODULE_DIGITALUNIVERSE___RENDERABLEBILLBOARDSCLOUD___H__
+#ifndef __OPENSPACE_MODULE_BASE___RENDERABLEPOINTCLOUD___H__
+#define __OPENSPACE_MODULE_BASE___RENDERABLEPOINTCLOUD___H__
#include
-#include
#include
#include
#include
#include
#include
+#include
#include
#include
#include
+#include
+#include
#include
#include
#include
#include
-#include
-namespace ghoul::filesystem { class File; }
namespace ghoul::opengl {
class ProgramObject;
class Texture;
@@ -52,10 +52,15 @@ namespace openspace {
namespace documentation { struct Documentation; }
-class RenderableBillboardsCloud : public Renderable {
+/**
+ * This class describes a point cloud renderable that can be used to draw billboraded
+ * points based on a data file with 3D positions. Alternatively the points can also
+ * be colored and sized based on a separate column in the data file.
+ */
+class RenderablePointCloud : public Renderable {
public:
- explicit RenderableBillboardsCloud(const ghoul::Dictionary& dictionary);
- ~RenderableBillboardsCloud() override = default;
+ explicit RenderablePointCloud(const ghoul::Dictionary& dictionary);
+ ~RenderablePointCloud() override = default;
void initialize() override;
void initializeGL() override;
@@ -68,88 +73,104 @@ public:
static documentation::Documentation Documentation();
-private:
+protected:
+ int nAttributesPerPoint() const;
+ void updateBufferData();
+ void updateSpriteTexture();
+
+ /// Find the index of the currently chosen color parameter in the dataset
+ int currentColorParameterIndex() const;
+ /// Find the index of the currently chosen size parameter in the dataset
+ int currentSizeParameterIndex() const;
+
std::vector createDataSlice();
- void createPolygonTexture();
- void renderToTexture(GLuint textureToRenderTo, GLuint textureWidth,
- GLuint textureHeight);
- void loadPolygonGeometryForRendering();
- void renderPolygonGeometry(GLuint vao);
+
+ virtual void bindTextureForRendering() const;
+
+ float computeDistanceFadeValue(const RenderData& data) const;
+
void renderBillboards(const RenderData& data, const glm::dmat4& modelMatrix,
const glm::dvec3& orthoRight, const glm::dvec3& orthoUp, float fadeInVariable);
- bool _hasSpeckFile = false;
bool _dataIsDirty = true;
- bool _hasSpriteTexture = false;
bool _spriteTextureIsDirty = true;
+
+ bool _hasSpriteTexture = false;
+ bool _hasDataFile = false;
bool _hasColorMapFile = false;
- bool _isColorMapExact = false;
bool _hasDatavarSize = false;
- bool _hasPolygon = false;
bool _hasLabels = false;
- int _polygonSides = 0;
+ struct SizeSettings : properties::PropertyOwner {
+ explicit SizeSettings(const ghoul::Dictionary& dictionary);
- GLuint _pTexture = 0;
+ struct SizeMapping : properties::PropertyOwner {
+ SizeMapping();
+ properties::BoolProperty enabled;
+ properties::OptionProperty parameterOption;
+ };
+ SizeMapping sizeMapping;
- properties::FloatProperty _scaleFactor;
- properties::BoolProperty _useColorMap;
- properties::Vec3Property _pointColor;
+ properties::FloatProperty scaleExponent;
+ properties::FloatProperty scaleFactor;
+
+ properties::BoolProperty useMaxSizeControl;
+ properties::FloatProperty maxAngularSize;
+ };
+ SizeSettings _sizeSettings;
+
+ struct ColorSettings : properties::PropertyOwner {
+ explicit ColorSettings(const ghoul::Dictionary& dictionary);
+ properties::Vec3Property pointColor;
+ std::unique_ptr colorMapping;
+ };
+ ColorSettings _colorSettings;
+
+ struct Fading : properties::PropertyOwner {
+ explicit Fading(const ghoul::Dictionary& dictionary);
+ properties::Vec2Property fadeInDistances;
+ properties::BoolProperty enabled;
+ properties::BoolProperty invert;
+ };
+ Fading _fading;
+
+ properties::BoolProperty _useSpriteTexture;
properties::StringProperty _spriteTexturePath;
+
+ properties::BoolProperty _useAdditiveBlending;
+
properties::BoolProperty _drawElements;
- properties::BoolProperty _pixelSizeControl;
- properties::OptionProperty _colorOption;
- properties::Vec2Property _optionColorRangeData;
- properties::OptionProperty _datavarSizeOption;
- properties::Vec2Property _fadeInDistances;
- properties::BoolProperty _disableFadeInDistance;
- properties::Vec2Property _billboardMinMaxSize;
- properties::FloatProperty _correctionSizeEndDistance;
- properties::FloatProperty _correctionSizeFactor;
- properties::BoolProperty _useLinearFiltering;
- properties::TriggerProperty _setRangeFromData;
properties::OptionProperty _renderOption;
- ghoul::opengl::Texture* _polygonTexture = nullptr;
+ properties::UIntProperty _nDataPoints;
+
ghoul::opengl::Texture* _spriteTexture = nullptr;
ghoul::opengl::ProgramObject* _program = nullptr;
- ghoul::opengl::ProgramObject* _renderToPolygonProgram = nullptr;
UniformCache(
- cameraViewProjectionMatrix, modelMatrix, cameraPos, cameraLookup, renderOption,
- minBillboardSize, maxBillboardSize, correctionSizeEndDistance,
- correctionSizeFactor, color, alphaValue, scaleFactor, up, right, fadeInValue,
- screenSize, spriteTexture, hasColormap, useColormap, enabledRectSizeControl,
- hasDvarScaling
+ cameraViewMatrix, projectionMatrix, modelMatrix, cameraPos, cameraLookup,
+ renderOption, maxAngularSize, color, opacity, scaleExponent, scaleFactor, up,
+ right, fadeInValue, hasSpriteTexture, spriteTexture, useColormap, colorMapTexture,
+ cmapRangeMin, cmapRangeMax, nanColor, useNanColor, hideOutsideRange,
+ enableMaxSizeControl, aboveRangeColor, useAboveRangeColor, belowRangeColor,
+ useBelowRangeColor, hasDvarScaling
) _uniformCache;
- std::string _speckFile;
- std::string _colorMapFile;
- std::string _colorOptionString;
- std::string _datavarSizeOptionString;
+ std::string _dataFile;
DistanceUnit _unit = DistanceUnit::Parsec;
- speck::Dataset _dataset;
- speck::ColorMap _colorMap;
+ dataloader::Dataset _dataset;
+ dataloader::DataMapping _dataMapping;
- // Everything related to the labels is handled by LabelsComponent
std::unique_ptr _labels;
- std::vector _colorRangeData;
- std::unordered_map _optionConversionMap;
- std::unordered_map _optionConversionSizeMap;
-
glm::dmat4 _transformationMatrix = glm::dmat4(1.0);
GLuint _vao = 0;
GLuint _vbo = 0;
-
- // For polygons
- GLuint _polygonVao = 0;
- GLuint _polygonVbo = 0;
};
} // namespace openspace
-#endif // __OPENSPACE_MODULE_DIGITALUNIVERSE___RENDERABLEBILLBOARDSCLOUD___H__
+#endif // __OPENSPACE_MODULE_BASE___RENDERABLEPOINTCLOUD___H__
diff --git a/modules/base/rendering/pointcloud/renderablepolygoncloud.cpp b/modules/base/rendering/pointcloud/renderablepolygoncloud.cpp
new file mode 100644
index 0000000000..672586f435
--- /dev/null
+++ b/modules/base/rendering/pointcloud/renderablepolygoncloud.cpp
@@ -0,0 +1,193 @@
+/*****************************************************************************************
+ * *
+ * OpenSpace *
+ * *
+ * Copyright (c) 2014-2023 *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this *
+ * software and associated documentation files (the "Software"), to deal in the Software *
+ * without restriction, including without limitation the rights to use, copy, modify, *
+ * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to *
+ * permit persons to whom the Software is furnished to do so, subject to the following *
+ * conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included in all copies *
+ * or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, *
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A *
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT *
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF *
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE *
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ ****************************************************************************************/
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace {
+ constexpr std::string_view _loggerCat = "RenderablePolygonCloud";
+
+ // A RenderablePolygonCloud is a RenderablePointCloud where the shape of the points
+ // is a uniform polygon with a given number of sides instead of a texture. For
+ // instance, PolygonSides = 5 results in the points being rendered as pentagons.
+ // Note that while this renderable inherits the texture property from
+ // RenderablePointCloud, any added texture value will be ignored in favor of the
+ // polygon shape.
+ //
+ // See documentation of RenderablePointCloud for details on the other parts of the
+ // point cloud rendering.
+ struct [[codegen::Dictionary(RenderablePolygonCloud)]] Parameters {
+ // The number of sides for the polygon used to represent each point. Default is
+ // 3, i.e. to use triangles
+ std::optional polygonSides [[codegen::greaterequal(3)]];
+ };
+
+#include "renderablepolygoncloud_codegen.cpp"
+} // namespace
+
+namespace openspace {
+
+documentation::Documentation RenderablePolygonCloud::Documentation() {
+ return codegen::doc(
+ "base_renderablepolygoncloud",
+ RenderablePointCloud::Documentation()
+ );
+}
+
+RenderablePolygonCloud::RenderablePolygonCloud(const ghoul::Dictionary& dictionary)
+ : RenderablePointCloud(dictionary)
+{
+ const Parameters p = codegen::bake(dictionary);
+
+ _nPolygonSides = p.polygonSides.value_or(_nPolygonSides);
+
+ // The texture to use for the rendering will be generated in initializeGl. Make sure
+ // we use it in the rnedering
+ _hasSpriteTexture = true;
+}
+
+void RenderablePolygonCloud::initializeGL() {
+ ZoneScoped;
+
+ RenderablePointCloud::initializeGL();
+ createPolygonTexture();
+}
+
+void RenderablePolygonCloud::deinitializeGL() {
+ glDeleteBuffers(1, &_polygonVbo);
+ _polygonVbo = 0;
+ glDeleteVertexArrays(1, &_polygonVao);
+ _polygonVao = 0;
+
+ glDeleteTextures(1, &_pTexture);
+
+ RenderablePointCloud::deinitializeGL();
+}
+
+void RenderablePolygonCloud::bindTextureForRendering() const {
+ glBindTexture(GL_TEXTURE_2D, _pTexture);
+}
+
+void RenderablePolygonCloud::createPolygonTexture() {
+ ZoneScoped;
+
+ LDEBUG("Creating Polygon Texture");
+ constexpr gl::GLsizei TexSize = 512;
+
+ glGenTextures(1, &_pTexture);
+ glBindTexture(GL_TEXTURE_2D, _pTexture);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ // Stopped using a buffer object for GL_PIXEL_UNPACK_BUFFER
+ glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, TexSize, TexSize, 0, GL_RGBA, GL_BYTE, nullptr);
+
+ renderToTexture(_pTexture, TexSize, TexSize);
+}
+
+void RenderablePolygonCloud::renderToTexture(GLuint textureToRenderTo,
+ GLuint textureWidth, GLuint textureHeight)
+{
+ LDEBUG("Rendering to Texture");
+
+ // Saves initial Application's OpenGL State
+ GLint defaultFBO;
+ GLint viewport[4];
+ glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO);
+ glGetIntegerv(GL_VIEWPORT, viewport);
+
+ GLuint textureFBO;
+ glGenFramebuffers(1, &textureFBO);
+ glBindFramebuffer(GL_FRAMEBUFFER, textureFBO);
+ GLenum drawBuffers[1] = { GL_COLOR_ATTACHMENT0 };
+ glDrawBuffers(1, drawBuffers);
+
+ glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureToRenderTo, 0);
+
+ glViewport(viewport[0], viewport[1], textureWidth, textureHeight);
+
+ if (_polygonVao == 0) {
+ glGenVertexArrays(1, &_polygonVao);
+ }
+ if (_polygonVbo == 0) {
+ glGenBuffers(1, &_polygonVbo);
+ }
+
+ glBindVertexArray(_polygonVao);
+ glBindBuffer(GL_ARRAY_BUFFER, _polygonVbo);
+
+ constexpr std::array VertexData = {
+ // x y z w
+ 0.f, 0.f, 0.f, 1.f,
+ };
+
+ glBufferData(GL_ARRAY_BUFFER, sizeof(VertexData), VertexData.data(), GL_STATIC_DRAW);
+ glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), nullptr);
+ glEnableVertexAttribArray(0);
+ glBindVertexArray(0);
+
+ renderPolygonGeometry(_polygonVao);
+
+ // Restores Applications' OpenGL State
+ glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO);
+ glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
+
+ glDeleteBuffers(1, &_polygonVbo);
+ glDeleteVertexArrays(1, &_polygonVao);
+ glDeleteFramebuffers(1, &textureFBO);
+}
+
+void RenderablePolygonCloud::renderPolygonGeometry(GLuint vao) {
+ std::unique_ptr program =
+ ghoul::opengl::ProgramObject::Build(
+ "RenderablePointCloud_Polygon",
+ absPath("${MODULE_BASE}/shaders/polygon_vs.glsl"),
+ absPath("${MODULE_BASE}/shaders/polygon_fs.glsl"),
+ absPath("${MODULE_BASE}/shaders/polygon_gs.glsl")
+ );
+
+ program->activate();
+ constexpr glm::vec4 Black = glm::vec4(0.f, 0.f, 0.f, 0.f);
+ glClearBufferfv(GL_COLOR, 0, glm::value_ptr(Black));
+
+ program->setUniform("sides", _nPolygonSides);
+ program->setUniform("polygonColor", _colorSettings.pointColor);
+
+ glBindVertexArray(vao);
+ glDrawArrays(GL_POINTS, 0, 1);
+ glBindVertexArray(0);
+
+ program->deactivate();
+}
+
+} // namespace openspace
diff --git a/modules/base/rendering/pointcloud/renderablepolygoncloud.h b/modules/base/rendering/pointcloud/renderablepolygoncloud.h
new file mode 100644
index 0000000000..f873636779
--- /dev/null
+++ b/modules/base/rendering/pointcloud/renderablepolygoncloud.h
@@ -0,0 +1,70 @@
+/*****************************************************************************************
+ * *
+ * OpenSpace *
+ * *
+ * Copyright (c) 2014-2023 *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this *
+ * software and associated documentation files (the "Software"), to deal in the Software *
+ * without restriction, including without limitation the rights to use, copy, modify, *
+ * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to *
+ * permit persons to whom the Software is furnished to do so, subject to the following *
+ * conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included in all copies *
+ * or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, *
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A *
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT *
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF *
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE *
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ ****************************************************************************************/
+
+#ifndef __OPENSPACE_MODULE_BASE___RENDERABLEPOLYGONCLOUD___H__
+#define __OPENSPACE_MODULE_BASE___RENDERABLEPOLYGONCLOUD___H__
+
+#include
+
+#include
+
+namespace ghoul::opengl { class Texture; }
+
+namespace openspace {
+
+namespace documentation { struct Documentation; }
+
+/**
+ * A billboarded point cloud, but with dynamically created uniform polygon shapes instead
+ * of a custom texture. Overwrites the sprite set in parent class, RenderablePointCloud
+ */
+class RenderablePolygonCloud : public RenderablePointCloud {
+public:
+ explicit RenderablePolygonCloud(const ghoul::Dictionary& dictionary);
+ ~RenderablePolygonCloud() override = default;
+
+ void initializeGL() override;
+ void deinitializeGL() override;
+
+ static documentation::Documentation Documentation();
+
+private:
+ void createPolygonTexture();
+ void renderToTexture(GLuint textureToRenderTo, GLuint textureWidth,
+ GLuint textureHeight);
+ void renderPolygonGeometry(GLuint vao);
+
+ void bindTextureForRendering() const override;
+
+ int _nPolygonSides = 3;
+
+ GLuint _pTexture = 0;
+
+ GLuint _polygonVao = 0;
+ GLuint _polygonVbo = 0;
+};
+
+} // namespace openspace
+
+#endif // __OPENSPACE_MODULE_BASE___RENDERABLEPOLYGONCLOUD___H__
diff --git a/modules/base/rendering/renderablecartesianaxes.cpp b/modules/base/rendering/renderablecartesianaxes.cpp
index 841a6b032e..a0f01d6c74 100644
--- a/modules/base/rendering/renderablecartesianaxes.cpp
+++ b/modules/base/rendering/renderablecartesianaxes.cpp
@@ -61,6 +61,18 @@ namespace {
openspace::properties::Property::Visibility::NoviceUser
};
+ // The RenderableCartesianAxes can be used to render the local Cartesian coordinate
+ // system, or reference frame, of another scene graph node. The colors of the axes
+ // can be customized but are per default set to Red, Green and Blue, for the X-, Y-
+ // and Z-axis, respectively.
+ //
+ // To add the axes, create a scene graph node with the RenderableCartesianAxes
+ // renderable and add it as a child to the other scene graph node, i.e. specify the
+ // other node as the Parent of the node with this renderable. Also, the axes have to
+ // be scaled to match the parent object for the axes to be visible in the scene, for
+ // example using a StaticScale.
+ //
+ // See example asset (@TODO: link to asset file).
struct [[codegen::Dictionary(RenderableCartesianAxes)]] Parameters {
// [[codegen::verbatim(XColorInfo.description)]]
std::optional xColor [[codegen::color()]];
@@ -70,7 +82,6 @@ namespace {
// [[codegen::verbatim(ZColorInfo.description)]]
std::optional zColor [[codegen::color()]];
-
};
#include "renderablecartesianaxes_codegen.cpp"
} // namespace
diff --git a/modules/base/rendering/renderablemodel.cpp b/modules/base/rendering/renderablemodel.cpp
index 1264099bd2..d6a9aa5569 100644
--- a/modules/base/rendering/renderablemodel.cpp
+++ b/modules/base/rendering/renderablemodel.cpp
@@ -593,7 +593,7 @@ void RenderableModel::initializeGL() {
}
// Set animation settings
- _geometry->setTimeScale(_animationTimeScale);
+ _geometry->setTimeScale(static_cast(_animationTimeScale));
}
// Initialize shaders
diff --git a/modules/base/shaders/billboardpoint_fs.glsl b/modules/base/shaders/billboardpoint_fs.glsl
new file mode 100644
index 0000000000..7b6b51c8e4
--- /dev/null
+++ b/modules/base/shaders/billboardpoint_fs.glsl
@@ -0,0 +1,115 @@
+/*****************************************************************************************
+ * *
+ * OpenSpace *
+ * *
+ * Copyright (c) 2014-2023 *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this *
+ * software and associated documentation files (the "Software"), to deal in the Software *
+ * without restriction, including without limitation the rights to use, copy, modify, *
+ * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to *
+ * permit persons to whom the Software is furnished to do so, subject to the following *
+ * conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included in all copies *
+ * or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, *
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A *
+ * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT *
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF *
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE *
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ ****************************************************************************************/
+
+#include "fragment.glsl"
+
+flat in float gs_colorParameter;
+flat in float vs_screenSpaceDepth;
+flat in vec4 vs_positionViewSpace;
+in vec2 texCoord;
+
+uniform float opacity;
+uniform vec3 color;
+
+uniform vec4 nanColor = vec4(0.5);
+uniform bool useNanColor = true;
+
+uniform vec4 aboveRangeColor;
+uniform bool useAboveRangeColor;
+
+uniform vec4 belowRangeColor;
+uniform bool useBelowRangeColor;
+
+uniform bool hasSpriteTexture;
+uniform sampler2D spriteTexture;
+
+uniform bool useColorMap;
+uniform sampler1D colorMapTexture;
+uniform float cmapRangeMin;
+uniform float cmapRangeMax;
+uniform bool hideOutsideRange;
+
+uniform float fadeInValue;
+
+vec4 sampleColorMap(float dataValue) {
+ if (useNanColor && isnan(dataValue)) {
+ return nanColor;
+ }
+
+ bool isOutside = dataValue < cmapRangeMin || dataValue > cmapRangeMax;
+ if (isnan(dataValue) || (hideOutsideRange && isOutside)) {
+ discard;
+ }
+
+ if (useBelowRangeColor && dataValue < cmapRangeMin) {
+ return belowRangeColor;
+ }
+
+ if (useAboveRangeColor && dataValue > cmapRangeMax) {
+ return aboveRangeColor;
+ }
+
+ float t = (dataValue - cmapRangeMin) / (cmapRangeMax - cmapRangeMin);
+ t = clamp(t, 0.0, 1.0);
+ return texture(colorMapTexture, t);
+}
+
+Fragment getFragment() {
+ if (fadeInValue == 0.0 || opacity == 0.0) {
+ discard;
+ }
+
+ if (!hasSpriteTexture) {
+ // Moving the origin to the center
+ vec2 st = (texCoord - vec2(0.5)) * 2.0;
+ if (length(st) > 1.0) {
+ discard;
+ }
+ }
+
+ vec4 fullColor = vec4(1.0);
+ if (hasSpriteTexture) {
+ fullColor = texture(spriteTexture, texCoord);
+ }
+
+ if (useColorMap) {
+ fullColor *= sampleColorMap(gs_colorParameter);
+ }
+ else {
+ fullColor.rgb *= color;
+ }
+
+ fullColor.a *= opacity * fadeInValue;
+ if (fullColor.a < 0.01) {
+ discard;
+ }
+
+ Fragment frag;
+ frag.color = fullColor;
+ frag.depth = vs_screenSpaceDepth;
+ frag.gPosition = vs_positionViewSpace;
+ frag.gNormal = vec4(0.0, 0.0, 0.0, 1.0);
+
+ return frag;
+}
diff --git a/modules/digitaluniverse/shaders/billboard_gs.glsl b/modules/base/shaders/billboardpoint_gs.glsl
similarity index 60%
rename from modules/digitaluniverse/shaders/billboard_gs.glsl
rename to modules/base/shaders/billboardpoint_gs.glsl
index 0e5cfc658d..51e58c3774 100644
--- a/modules/digitaluniverse/shaders/billboard_gs.glsl
+++ b/modules/base/shaders/billboardpoint_gs.glsl
@@ -27,21 +27,23 @@
#include "PowerScaling/powerScalingMath.hglsl"
layout(points) in;
-flat in vec4 colorMap[];
-flat in float dvarScaling[];
+flat in float colorParameter[];
+flat in float scalingParameter[];
layout(triangle_strip, max_vertices = 4) out;
-flat out vec4 gs_colorMap;
+flat out float gs_colorParameter;
out vec2 texCoord;
flat out float vs_screenSpaceDepth;
-out float ta;
+flat out vec4 vs_positionViewSpace;
// General settings
+uniform float scaleExponent;
uniform float scaleFactor;
uniform int renderOption;
-uniform dmat4 cameraViewProjectionMatrix;
+uniform dmat4 cameraViewMatrix;
+uniform dmat4 projectionMatrix;
uniform dmat4 modelMatrix;
-uniform bool enabledRectSizeControl;
+uniform bool enableMaxSizeControl;
uniform bool hasDvarScaling;
// RenderOption: CameraViewDirection
@@ -51,15 +53,10 @@ uniform vec3 right;
// RenderOption: CameraPositionNormal
uniform dvec3 cameraPosition;
uniform vec3 cameraLookUp;
-uniform float correctionSizeFactor;
-uniform float correctionSizeEndDistance;
-// Pixel size control: true
-uniform vec2 screenSize;
-uniform float maxBillboardSize;
-uniform float minBillboardSize;
-
-const double PARSEC = 0.308567756e17LF;
+// Max size control: true
+// The max size is an angle, in degrees, for the diameter
+uniform float maxAngularSize;
const vec2 corners[4] = vec2[4](
vec2(0.0, 0.0),
@@ -71,30 +68,15 @@ const vec2 corners[4] = vec2[4](
const int RenderOptionCameraViewDirection = 0;
const int RenderOptionCameraPositionNormal = 1;
-
void main() {
- ta = 1.0;
vec4 pos = gl_in[0].gl_Position;
- gs_colorMap = colorMap[0];
+ gs_colorParameter = colorParameter[0];
- double unit = PARSEC;
+ dvec4 dpos = modelMatrix * dvec4(dvec3(pos.xyz), 1.0);
- // Must be the same as the enum in RenderableBillboardsCloud.h
- if (pos.w == 1.0) { unit = 1E3; }
- else if (pos.w == 2.0) { unit = PARSEC; }
- else if (pos.w == 3.0) { unit = 1E3 * PARSEC; }
- else if (pos.w == 4.0) { unit = 1E6 * PARSEC; }
- else if (pos.w == 5.0) { unit = 1E9 * PARSEC; }
- else if (pos.w == 6.0) {
- // Conversion factor from Parsecs to GigalightYears
- unit = 306391534.73091 * PARSEC;
- }
-
- dvec4 dpos = modelMatrix * dvec4(dvec3(pos.xyz) * unit, 1.0);
-
- float scaleMultiply = exp(scaleFactor * 0.10);
+ float scaleMultiply = pow(10.0, scaleExponent);
if (hasDvarScaling) {
- scaleMultiply *= dvarScaling[0];
+ scaleMultiply *= scalingParameter[0];
}
vec3 scaledRight = vec3(0.0);
@@ -109,58 +91,38 @@ void main() {
vec3 newRight = normalize(cross(cameraLookUp, normal));
vec3 newUp = cross(normal, newRight);
- if (!enabledRectSizeControl) {
- double distCamera = length(cameraPosition - dpos.xyz);
- float expVar = float(-distCamera) / pow(10.0, correctionSizeEndDistance);
- float factorVar = pow(10.0, correctionSizeFactor);
- scaleMultiply *= 1.0 / (1.0 + factorVar * exp(expVar));
- }
-
scaledRight = scaleMultiply * newRight * 0.5;
scaledUp = scaleMultiply * newUp * 0.5;
}
- if (enabledRectSizeControl) {
- vec4 initialPosition = z_normalization(vec4(cameraViewProjectionMatrix *
- dvec4(dpos.xyz - dvec3(scaledRight - scaledUp), dpos.w)));
+ if (enableMaxSizeControl) {
+ // Limit the max size of the points, as the angle in "FOV" that the point is allowed
+ // to take up. Note that the max size is for the diameter, and we need the radius
+ float desiredAngleRadians = radians(maxAngularSize * 0.5);
- vs_screenSpaceDepth = initialPosition.w;
+ double distanceToCamera = length(dpos.xyz - cameraPosition);
+ double pointSize = length(dvec3(scaledRight));
+ // @TODO (2023-01-05, emmbr) Consider if this atan computation can be optimized using
+ // approximation
+ float angle = atan(float(pointSize / distanceToCamera));
- vec4 crossCorner = z_normalization(vec4(cameraViewProjectionMatrix *
- dvec4(dpos.xyz + dvec3(scaledRight + scaledUp), dpos.w)));
-
- // Testing size for rectangular viewport:
- vec2 halfViewSize = screenSize * 0.5;
- vec2 topRight = crossCorner.xy / crossCorner.w;
- vec2 bottomLeft = initialPosition.xy / initialPosition.w;
-
- // width and height
- vec2 sizes = abs(halfViewSize * (topRight - bottomLeft));
-
- if (enabledRectSizeControl && (length(sizes) > maxBillboardSize)) {
- float correctionScale = maxBillboardSize / length(sizes);
-
- scaledRight *= correctionScale;
- scaledUp *= correctionScale;
- }
- else {
- // linear alpha decay
- if (sizes.x < 2.0 * minBillboardSize) {
- float maxVar = 2.0 * minBillboardSize;
- float minVar = minBillboardSize;
- float var = sizes.y + sizes.x;
- ta = (var - minVar) / (maxVar - minVar);
- if (ta == 0.0) {
- return;
- }
- }
+ if ((angle > desiredAngleRadians) && (distanceToCamera > 0.0)) {
+ float correctionScaleFactor = float(distanceToCamera) * tan(desiredAngleRadians) / float(pointSize);
+ scaledRight *= correctionScaleFactor;
+ scaledUp *= correctionScaleFactor;
}
}
- // Saving one matrix multiplication:
+ dmat4 cameraViewProjectionMatrix = projectionMatrix * cameraViewMatrix;
+
vec4 dposClip = vec4(cameraViewProjectionMatrix * dpos);
- vec4 scaledRightClip = vec4(cameraViewProjectionMatrix * dvec4(scaledRight, 0.0));
- vec4 scaledUpClip = vec4(cameraViewProjectionMatrix * dvec4(scaledUp, 0.0));
+ vec4 scaledRightClip = scaleFactor *
+ vec4(cameraViewProjectionMatrix * dvec4(scaledRight, 0.0));
+ vec4 scaledUpClip = scaleFactor *
+ vec4(cameraViewProjectionMatrix * dvec4(scaledUp, 0.0));
+
+ vec4 dposViewSpace= vec4(cameraViewMatrix * dpos);
+ vs_positionViewSpace = dposViewSpace;
vec4 initialPosition = z_normalization(dposClip - scaledRightClip - scaledUpClip);
vs_screenSpaceDepth = initialPosition.w;
diff --git a/modules/digitaluniverse/shaders/billboard_vs.glsl b/modules/base/shaders/billboardpoint_vs.glsl
similarity index 91%
rename from modules/digitaluniverse/shaders/billboard_vs.glsl
rename to modules/base/shaders/billboardpoint_vs.glsl
index b1f0510a4a..35e8082b41 100644
--- a/modules/digitaluniverse/shaders/billboard_vs.glsl
+++ b/modules/base/shaders/billboardpoint_vs.glsl
@@ -27,15 +27,14 @@
#include "PowerScaling/powerScaling_vs.hglsl"
in vec4 in_position;
-in vec4 in_colormap;
-in float in_dvarScaling;
-
-flat out vec4 colorMap;
-flat out float dvarScaling;
+in float in_colorParameter;
+in float in_scalingParameter;
+flat out float colorParameter;
+flat out float scalingParameter;
void main() {
- colorMap = in_colormap;
- dvarScaling = in_dvarScaling;
+ colorParameter = in_colorParameter;
+ scalingParameter = in_scalingParameter;
gl_Position = in_position;
}
diff --git a/modules/digitaluniverse/shaders/billboardpolygon_fs.glsl b/modules/base/shaders/polygon_fs.glsl
similarity index 100%
rename from modules/digitaluniverse/shaders/billboardpolygon_fs.glsl
rename to modules/base/shaders/polygon_fs.glsl
diff --git a/modules/digitaluniverse/shaders/billboardpolygon_gs.glsl b/modules/base/shaders/polygon_gs.glsl
similarity index 100%
rename from modules/digitaluniverse/shaders/billboardpolygon_gs.glsl
rename to modules/base/shaders/polygon_gs.glsl
diff --git a/modules/digitaluniverse/shaders/billboardpolygon_vs.glsl b/modules/base/shaders/polygon_vs.glsl
similarity index 100%
rename from modules/digitaluniverse/shaders/billboardpolygon_vs.glsl
rename to modules/base/shaders/polygon_vs.glsl
diff --git a/modules/digitaluniverse/CMakeLists.txt b/modules/digitaluniverse/CMakeLists.txt
index 252b33d460..df3b0b2eeb 100644
--- a/modules/digitaluniverse/CMakeLists.txt
+++ b/modules/digitaluniverse/CMakeLists.txt
@@ -25,34 +25,22 @@
include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake)
set(HEADER_FILES
- rendering/renderablepoints.h
rendering/renderabledumeshes.h
- rendering/renderablebillboardscloud.h
rendering/renderableplanescloud.h
)
source_group("Header Files" FILES ${HEADER_FILES})
set(SOURCE_FILES
- rendering/renderablepoints.cpp
rendering/renderabledumeshes.cpp
- rendering/renderablebillboardscloud.cpp
rendering/renderableplanescloud.cpp
)
source_group("Source Files" FILES ${SOURCE_FILES})
set(SHADER_FILES
- shaders/billboard_fs.glsl
- shaders/billboard_gs.glsl
- shaders/billboard_vs.glsl
- shaders/billboardpolygon_fs.glsl
- shaders/billboardpolygon_gs.glsl
- shaders/billboardpolygon_vs.glsl
shaders/dumesh_vs.glsl
shaders/dumesh_fs.glsl
shaders/plane_vs.glsl
shaders/plane_fs.glsl
- shaders/points_sprite_fs.glsl
- shaders/points_vs.glsl
)
source_group("Shader Files" FILES ${SHADER_FILES})
diff --git a/modules/digitaluniverse/digitaluniversemodule.cpp b/modules/digitaluniverse/digitaluniversemodule.cpp
index b77708080b..92cb71ac1e 100644
--- a/modules/digitaluniverse/digitaluniversemodule.cpp
+++ b/modules/digitaluniverse/digitaluniversemodule.cpp
@@ -24,10 +24,8 @@
#include
-#include
#include
#include
-#include
#include
#include