From 9fd0e02cb798bcebd5e521acb5947863b6850504 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 16 May 2016 09:16:33 +0200 Subject: [PATCH 1/5] Flip placeholder texture --- data/scene/common/textures/placeholder.png | Bin 37041 -> 36965 bytes .../rendering/renderableplaneprojection.cpp | 7 +++++++ 2 files changed, 7 insertions(+) diff --git a/data/scene/common/textures/placeholder.png b/data/scene/common/textures/placeholder.png index 3119c996e7701a7380cb6fbdc890cd5a3a7d4fc3..4fde9d13c3c592e9e9b195cd959cb1796938d1f8 100644 GIT binary patch literal 36965 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 aN@UDIaSr*>w1e>ZZ>bk@5_!+xe*8Z#85a8h diff --git a/modules/newhorizons/rendering/renderableplaneprojection.cpp b/modules/newhorizons/rendering/renderableplaneprojection.cpp index 85f51e1305..3291ef6e8d 100644 --- a/modules/newhorizons/rendering/renderableplaneprojection.cpp +++ b/modules/newhorizons/rendering/renderableplaneprojection.cpp @@ -276,6 +276,13 @@ void RenderablePlaneProjection::updatePlane(const Image img, double currentTime) projection[1][0], projection[1][1], projection[1][2], projection[1][3], 0, 0, // Lower left 4 = 1 projection[0][0], projection[0][1], projection[0][2], projection[0][3], 1, 0, // Lower right 5 projection[3][0], projection[3][1], projection[3][2], projection[3][3], 1, 1, // Upper left 6 = 2 + //projection[1][0], projection[1][1], projection[1][2], projection[1][3], 0, 1, // Lower left 1 + //projection[3][0], projection[3][1], projection[3][2], projection[3][3], 1, 0, // Upper right 2 + //projection[2][0], projection[2][1], projection[2][2], projection[2][3], 0, 0, // Upper left 3 + //projection[1][0], projection[1][1], projection[1][2], projection[1][3], 0, 1, // Lower left 4 = 1 + //projection[0][0], projection[0][1], projection[0][2], projection[0][3], 1, 1, // Lower right 5 + //projection[3][0], projection[3][1], projection[3][2], projection[3][3], 1, 0, // Upper left 6 = 2 + }; //projection[1][0], projection[1][1], projection[1][2], projection[1][3], 0, 1, // Lower left 1 // projection[3][0], projection[3][1], projection[3][2], projection[3][3], 1, 0, // Upper right 2 From ffdaeeedccb6445d6ccb918733d933aada9f015f Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 16 May 2016 09:30:27 +0200 Subject: [PATCH 2/5] Renamed default_nh.scene to newhorizons.scene Remove all 'projection' suffices from newhorizons classes --- .gitignore | 34 ++++++++---------- .../{default_nh.scene => newhorizons.scene} | 8 ++++- .../callisto.data} | 0 .../callisto.mod} | 0 .../textures/Callisto-Text.png | Bin .../textures/defaultProj.png | Bin .../europa.data} | 0 .../europa.mod} | 0 .../textures/Europa-Text.png | Bin .../textures/defaultProj.png | Bin .../ganymede.data} | 0 .../ganymede.mod} | 0 .../textures/Ganymede-Text.png | Bin .../textures/defaultProj.png | Bin .../ioprojection.data => io/io.data} | 0 .../ioprojection.mod => io/io.mod} | 0 .../{ioprojection => io}/textures/Io-Text.png | Bin .../textures/defaultProj.png | Bin .../ProjectionsOfInterest.torrent | 0 .../jupiter.data} | 0 .../jupiter.mod} | 0 .../textures/1.jpg | Bin .../textures/2.jpg | Bin .../textures/3.jpg | Bin .../textures/Jupiter-text.png | Bin .../textures/defaultProj.png | Bin .../textures/defaultProj2.png | Bin .../textures/europaRise1.jpg | Bin .../textures/europaRise2.jpg | Bin .../textures/grid.jpg | Bin .../textures/jupiter.jpg | Bin .../textures/jupiterFlipped.jpg | Bin .../textures/jupiterFlipped_low.jpg | Bin .../lor_0034817584_0x630_sci_1.fit.jpg | Bin .../lor_0034817654_0x630_sci_1.fit.jpg | Bin .../textures/lor_0034817724_0x630_sci_1.jpg | Bin .../lor_0034817794_0x630_sci_1.fit.jpg | Bin .../textures/lorriTest1.jpg | Bin .../textures/lorriTest2.jpg | Bin .../textures/scope.png | Bin .../textures/show.jpg | Bin .../textures/show_3072.jpg | Bin .../textures/small.jpg | Bin .../textures/small.png | Bin .../textures/test.jpg | Bin .../charon.data} | 0 .../charon.mod} | 0 .../plutoprojection.data => pluto/pluto.data} | 0 .../plutoprojection.mod => pluto/pluto.mod} | 2 +- openspace.cfg | 2 +- 50 files changed, 24 insertions(+), 22 deletions(-) rename data/scene/{default_nh.scene => newhorizons.scene} (83%) rename data/scene/newhorizons/jupiter/{callistoprojection/callistoprojection.data => callisto/callisto.data} (100%) rename data/scene/newhorizons/jupiter/{callistoprojection/callistoprojection.mod => callisto/callisto.mod} (100%) rename data/scene/newhorizons/jupiter/{callistoprojection => callisto}/textures/Callisto-Text.png (100%) rename data/scene/newhorizons/jupiter/{callistoprojection => callisto}/textures/defaultProj.png (100%) rename data/scene/newhorizons/jupiter/{europaprojection/europaprojection.data => europa/europa.data} (100%) rename data/scene/newhorizons/jupiter/{europaprojection/europaprojection.mod => europa/europa.mod} (100%) rename data/scene/newhorizons/jupiter/{europaprojection => europa}/textures/Europa-Text.png (100%) rename data/scene/newhorizons/jupiter/{europaprojection => europa}/textures/defaultProj.png (100%) rename data/scene/newhorizons/jupiter/{ganymedeprojection/ganymedeprojection.data => ganymede/ganymede.data} (100%) rename data/scene/newhorizons/jupiter/{ganymedeprojection/ganymedeprojection.mod => ganymede/ganymede.mod} (100%) rename data/scene/newhorizons/jupiter/{ganymedeprojection => ganymede}/textures/Ganymede-Text.png (100%) rename data/scene/newhorizons/jupiter/{ganymedeprojection => ganymede}/textures/defaultProj.png (100%) rename data/scene/newhorizons/jupiter/{ioprojection/ioprojection.data => io/io.data} (100%) rename data/scene/newhorizons/jupiter/{ioprojection/ioprojection.mod => io/io.mod} (100%) rename data/scene/newhorizons/jupiter/{ioprojection => io}/textures/Io-Text.png (100%) rename data/scene/newhorizons/jupiter/{ioprojection => io}/textures/defaultProj.png (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/ProjectionsOfInterest.torrent (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection/jupiterprojection.data => jupiter/jupiter.data} (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection/jupiterprojection.mod => jupiter/jupiter.mod} (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/1.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/2.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/3.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/Jupiter-text.png (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/defaultProj.png (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/defaultProj2.png (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/europaRise1.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/europaRise2.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/grid.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/jupiter.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/jupiterFlipped.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/jupiterFlipped_low.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/lor_0034817584_0x630_sci_1.fit.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/lor_0034817654_0x630_sci_1.fit.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/lor_0034817724_0x630_sci_1.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/lor_0034817794_0x630_sci_1.fit.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/lorriTest1.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/lorriTest2.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/scope.png (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/show.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/show_3072.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/small.jpg (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/small.png (100%) rename data/scene/newhorizons/jupiter/{jupiterprojection => jupiter}/textures/test.jpg (100%) rename data/scene/newhorizons/pluto/{charonprojection/charonprojection.data => charon/charon.data} (100%) rename data/scene/newhorizons/pluto/{charonprojection/charonprojection.mod => charon/charon.mod} (100%) rename data/scene/newhorizons/pluto/{plutoprojection/plutoprojection.data => pluto/pluto.data} (100%) rename data/scene/newhorizons/pluto/{plutoprojection/plutoprojection.mod => pluto/pluto.mod} (99%) diff --git a/.gitignore b/.gitignore index a8232dc899..0fdf491ecb 100644 --- a/.gitignore +++ b/.gitignore @@ -44,12 +44,8 @@ gui/externaltimecontrol/mainwindow.h data/scene/rosetta/67P/obj/67P_rotated_5_130.obj data/spice/NewHorizonsKernels/ data/spice/RosettaKernels/ -data/scene/newhorizons/pluto/plutoprojection/textures/ -data/scene/newhorizons/pluto/plutoprojection/textures/Shenk_180.jpg -data/scene/newhorizons/pluto/plutoprojection/textures/barycenter.png -data/scene/newhorizons/pluto/plutoprojection/textures/defaultProj.png -data/scene/newhorizons/pluto/plutoprojection/textures/pluto_highres_180.jpg -data/scene/newhorizons/pluto/plutoprojection/utcEvents.txt +data/scene/newhorizons/pluto/pluto/textures/ +data/scene/newhorizons/pluto/pluto/utcEvents.txt data/scene/rosetta/rosetta/obj/mainbodyros.obj data/scene/rosetta/rosetta/obj/solarpanelleft.obj data/scene/rosetta/rosetta/obj/solarpanelright.obj @@ -69,7 +65,7 @@ data/scene/uranus/textures/uranus.jpg data/scene/venus/textures/venus.jpg data/scene/dawn/vestaprojection/VestaComet/VestaComet_5000.obj data/spice/DawnKernels/ -data/scene/newhorizons/jupiter/jupiterprojection/ProjectionsOfInterest/ +data/scene/newhorizons/jupiter/jupiter/ProjectionsOfInterest/ data/scene/rosetta/67P/textures/black.jpg data/scene/rosetta/67P/textures/defaultProj.png data/scene/rosetta/67P/textures/gray.jpg @@ -77,12 +73,12 @@ data/scene/rosetta/67P/textures/gray.png data/scene/rosetta/67P/textures/texmapflipped.jpg data/scene/rosetta/67P/textures/white.jpg data/scene/rosetta/67P/textures/white.png -data/scene/newhorizons/jupiter/callistoprojection/textures/callisto.jpg +data/scene/newhorizons/jupiter/callisto/textures/callisto.jpg data/scene/dawn/ceres/textures/gray.png -data/scene/newhorizons/pluto/charonprojection/textures/Charon-Text.png -data/scene/newhorizons/pluto/charonprojection/textures/charon_highres.jpg -data/scene/newhorizons/pluto/charonprojection/textures/charon_highres_annotated.jpg -data/scene/newhorizons/pluto/charonprojection/textures/defaultProj.png +data/scene/newhorizons/pluto/charon/textures/Charon-Text.png +data/scene/newhorizons/pluto/charon/textures/charon_highres.jpg +data/scene/newhorizons/pluto/charon/textures/charon_highres_annotated.jpg +data/scene/newhorizons/pluto/charon/textures/defaultProj.png data/scene/dawn/dawn/obj/mainbodydawn.obj data/scene/dawn/dawn/obj/solarpanelleft.obj data/scene/dawn/dawn/obj/solarpanelright.obj @@ -93,9 +89,9 @@ data/scene/earth/textures/earth_bluemarble.jpg data/scene/earth/textures/earth_bluemarble_height.jpg data/scene/earth/textures/earth_night.jpg data/scene/earth/textures/marker.png -data/scene/newhorizons/jupiter/europaprojection/textures/europa.jpg -data/scene/newhorizons/jupiter/ganymedeprojection/textures/ganymede.jpg -data/scene/newhorizons/jupiter/ioprojection/textures/io.jpg +data/scene/newhorizons/jupiter/europa/textures/europa.jpg +data/scene/newhorizons/jupiter/ganymede/textures/ganymede.jpg +data/scene/newhorizons/jupiter/io/textures/io.jpg data/scene/jupiter/jupiter/textures/jupiter.jpg data/scene/mars/textures/mars.jpg data/scene/mercury/textures/mercury.jpg @@ -109,9 +105,9 @@ data/scene/newhorizons/newhorizons/textures/labels.png data/scene/pluto/textures/ data/scene/pluto/textures/Shenk_180.jpg data/scene/pluto/textures/pluto_highres_180.jpg -data/scene/newhorizons/pluto/plutoprojection/assets/core_v9h_obs_getmets_v8_time_fix_nofrcd_mld.txt -data/scene/newhorizons/pluto/plutoprojection/textures/3.jpg -data/scene/newhorizons/pluto/plutoprojection/textures/Pluto-Text.png +data/scene/newhorizons/pluto/pluto/assets/core_v9h_obs_getmets_v8_time_fix_nofrcd_mld.txt +data/scene/newhorizons/pluto/pluto/textures/3.jpg +data/scene/newhorizons/pluto/pluto/textures/Pluto-Text.png data/scene/dawn/vestaprojection/VestaComet/VestaComet.mtl data/scene/dawn/vestaprojection/textures/defaultProj_backup.png data/scene/dawn/vestaprojection/textures/dummy.jpg @@ -120,7 +116,7 @@ data/scene/dawn/vestaprojection/textures/projectMe.png data/spice/MAR063.BSP data/spice/de430_1850-2150.bsp data/spice/jup260.bsp -data/scene/newhorizons/pluto/plutoprojection/images +data/scene/newhorizons/pluto/pluto/images data/spice/nh_kernels/ data/scene/jupiter/jupiter/textures/Jupiter-text.png data/scene/jupiter/callisto/textures/callisto.jpg diff --git a/data/scene/default_nh.scene b/data/scene/newhorizons.scene similarity index 83% rename from data/scene/default_nh.scene rename to data/scene/newhorizons.scene index c4fa4bbd9e..0eba56c86f 100644 --- a/data/scene/default_nh.scene +++ b/data/scene/newhorizons.scene @@ -8,7 +8,13 @@ function preInitialization() critical objects. ]]-- - openspace.time.setTime("2015-07-14T10:00:00.00") + -- openspace.time.setTime("2015-07-08T15:57:45.00") + -- openspace.time.setTime("2015-07-12T07:41:00.00") + -- openspace.time.setTime("2015-07-12T15:43:00.00") + -- openspace.time.setTime("2015-07-12T22:19:20.00") + -- openspace.time.setTime("2015-07-13T20:59:00.00") + -- openspace.time.setTime("2015-07-14T02:41:55.00") + openspace.time.setTime("2015-07-14T10:05:00.00") openspace.time.setDeltaTime(0) dofile(openspace.absPath('${SCRIPTS}/bind_keys.lua')) end diff --git a/data/scene/newhorizons/jupiter/callistoprojection/callistoprojection.data b/data/scene/newhorizons/jupiter/callisto/callisto.data similarity index 100% rename from data/scene/newhorizons/jupiter/callistoprojection/callistoprojection.data rename to data/scene/newhorizons/jupiter/callisto/callisto.data diff --git a/data/scene/newhorizons/jupiter/callistoprojection/callistoprojection.mod b/data/scene/newhorizons/jupiter/callisto/callisto.mod similarity index 100% rename from data/scene/newhorizons/jupiter/callistoprojection/callistoprojection.mod rename to data/scene/newhorizons/jupiter/callisto/callisto.mod diff --git a/data/scene/newhorizons/jupiter/callistoprojection/textures/Callisto-Text.png b/data/scene/newhorizons/jupiter/callisto/textures/Callisto-Text.png similarity index 100% rename from data/scene/newhorizons/jupiter/callistoprojection/textures/Callisto-Text.png rename to data/scene/newhorizons/jupiter/callisto/textures/Callisto-Text.png diff --git a/data/scene/newhorizons/jupiter/callistoprojection/textures/defaultProj.png b/data/scene/newhorizons/jupiter/callisto/textures/defaultProj.png similarity index 100% rename from data/scene/newhorizons/jupiter/callistoprojection/textures/defaultProj.png rename to data/scene/newhorizons/jupiter/callisto/textures/defaultProj.png diff --git a/data/scene/newhorizons/jupiter/europaprojection/europaprojection.data b/data/scene/newhorizons/jupiter/europa/europa.data similarity index 100% rename from data/scene/newhorizons/jupiter/europaprojection/europaprojection.data rename to data/scene/newhorizons/jupiter/europa/europa.data diff --git a/data/scene/newhorizons/jupiter/europaprojection/europaprojection.mod b/data/scene/newhorizons/jupiter/europa/europa.mod similarity index 100% rename from data/scene/newhorizons/jupiter/europaprojection/europaprojection.mod rename to data/scene/newhorizons/jupiter/europa/europa.mod diff --git a/data/scene/newhorizons/jupiter/europaprojection/textures/Europa-Text.png b/data/scene/newhorizons/jupiter/europa/textures/Europa-Text.png similarity index 100% rename from data/scene/newhorizons/jupiter/europaprojection/textures/Europa-Text.png rename to data/scene/newhorizons/jupiter/europa/textures/Europa-Text.png diff --git a/data/scene/newhorizons/jupiter/europaprojection/textures/defaultProj.png b/data/scene/newhorizons/jupiter/europa/textures/defaultProj.png similarity index 100% rename from data/scene/newhorizons/jupiter/europaprojection/textures/defaultProj.png rename to data/scene/newhorizons/jupiter/europa/textures/defaultProj.png diff --git a/data/scene/newhorizons/jupiter/ganymedeprojection/ganymedeprojection.data b/data/scene/newhorizons/jupiter/ganymede/ganymede.data similarity index 100% rename from data/scene/newhorizons/jupiter/ganymedeprojection/ganymedeprojection.data rename to data/scene/newhorizons/jupiter/ganymede/ganymede.data diff --git a/data/scene/newhorizons/jupiter/ganymedeprojection/ganymedeprojection.mod b/data/scene/newhorizons/jupiter/ganymede/ganymede.mod similarity index 100% rename from data/scene/newhorizons/jupiter/ganymedeprojection/ganymedeprojection.mod rename to data/scene/newhorizons/jupiter/ganymede/ganymede.mod diff --git a/data/scene/newhorizons/jupiter/ganymedeprojection/textures/Ganymede-Text.png b/data/scene/newhorizons/jupiter/ganymede/textures/Ganymede-Text.png similarity index 100% rename from data/scene/newhorizons/jupiter/ganymedeprojection/textures/Ganymede-Text.png rename to data/scene/newhorizons/jupiter/ganymede/textures/Ganymede-Text.png diff --git a/data/scene/newhorizons/jupiter/ganymedeprojection/textures/defaultProj.png b/data/scene/newhorizons/jupiter/ganymede/textures/defaultProj.png similarity index 100% rename from data/scene/newhorizons/jupiter/ganymedeprojection/textures/defaultProj.png rename to data/scene/newhorizons/jupiter/ganymede/textures/defaultProj.png diff --git a/data/scene/newhorizons/jupiter/ioprojection/ioprojection.data b/data/scene/newhorizons/jupiter/io/io.data similarity index 100% rename from data/scene/newhorizons/jupiter/ioprojection/ioprojection.data rename to data/scene/newhorizons/jupiter/io/io.data diff --git a/data/scene/newhorizons/jupiter/ioprojection/ioprojection.mod b/data/scene/newhorizons/jupiter/io/io.mod similarity index 100% rename from data/scene/newhorizons/jupiter/ioprojection/ioprojection.mod rename to data/scene/newhorizons/jupiter/io/io.mod diff --git a/data/scene/newhorizons/jupiter/ioprojection/textures/Io-Text.png b/data/scene/newhorizons/jupiter/io/textures/Io-Text.png similarity index 100% rename from data/scene/newhorizons/jupiter/ioprojection/textures/Io-Text.png rename to data/scene/newhorizons/jupiter/io/textures/Io-Text.png diff --git a/data/scene/newhorizons/jupiter/ioprojection/textures/defaultProj.png b/data/scene/newhorizons/jupiter/io/textures/defaultProj.png similarity index 100% rename from data/scene/newhorizons/jupiter/ioprojection/textures/defaultProj.png rename to data/scene/newhorizons/jupiter/io/textures/defaultProj.png diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/ProjectionsOfInterest.torrent b/data/scene/newhorizons/jupiter/jupiter/ProjectionsOfInterest.torrent similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/ProjectionsOfInterest.torrent rename to data/scene/newhorizons/jupiter/jupiter/ProjectionsOfInterest.torrent diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/jupiterprojection.data b/data/scene/newhorizons/jupiter/jupiter/jupiter.data similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/jupiterprojection.data rename to data/scene/newhorizons/jupiter/jupiter/jupiter.data diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/jupiterprojection.mod b/data/scene/newhorizons/jupiter/jupiter/jupiter.mod similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/jupiterprojection.mod rename to data/scene/newhorizons/jupiter/jupiter/jupiter.mod diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/1.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/1.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/1.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/1.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/2.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/2.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/2.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/2.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/3.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/3.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/3.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/3.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/Jupiter-text.png b/data/scene/newhorizons/jupiter/jupiter/textures/Jupiter-text.png similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/Jupiter-text.png rename to data/scene/newhorizons/jupiter/jupiter/textures/Jupiter-text.png diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/defaultProj.png b/data/scene/newhorizons/jupiter/jupiter/textures/defaultProj.png similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/defaultProj.png rename to data/scene/newhorizons/jupiter/jupiter/textures/defaultProj.png diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/defaultProj2.png b/data/scene/newhorizons/jupiter/jupiter/textures/defaultProj2.png similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/defaultProj2.png rename to data/scene/newhorizons/jupiter/jupiter/textures/defaultProj2.png diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/europaRise1.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/europaRise1.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/europaRise1.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/europaRise1.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/europaRise2.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/europaRise2.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/europaRise2.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/europaRise2.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/grid.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/grid.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/grid.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/grid.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/jupiter.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/jupiter.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/jupiter.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/jupiter.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/jupiterFlipped.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/jupiterFlipped.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/jupiterFlipped.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/jupiterFlipped.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/jupiterFlipped_low.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/jupiterFlipped_low.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/jupiterFlipped_low.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/jupiterFlipped_low.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/lor_0034817584_0x630_sci_1.fit.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/lor_0034817584_0x630_sci_1.fit.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/lor_0034817584_0x630_sci_1.fit.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/lor_0034817584_0x630_sci_1.fit.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/lor_0034817654_0x630_sci_1.fit.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/lor_0034817654_0x630_sci_1.fit.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/lor_0034817654_0x630_sci_1.fit.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/lor_0034817654_0x630_sci_1.fit.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/lor_0034817724_0x630_sci_1.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/lor_0034817724_0x630_sci_1.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/lor_0034817724_0x630_sci_1.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/lor_0034817724_0x630_sci_1.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/lor_0034817794_0x630_sci_1.fit.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/lor_0034817794_0x630_sci_1.fit.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/lor_0034817794_0x630_sci_1.fit.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/lor_0034817794_0x630_sci_1.fit.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/lorriTest1.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/lorriTest1.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/lorriTest1.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/lorriTest1.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/lorriTest2.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/lorriTest2.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/lorriTest2.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/lorriTest2.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/scope.png b/data/scene/newhorizons/jupiter/jupiter/textures/scope.png similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/scope.png rename to data/scene/newhorizons/jupiter/jupiter/textures/scope.png diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/show.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/show.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/show.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/show.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/show_3072.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/show_3072.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/show_3072.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/show_3072.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/small.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/small.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/small.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/small.jpg diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/small.png b/data/scene/newhorizons/jupiter/jupiter/textures/small.png similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/small.png rename to data/scene/newhorizons/jupiter/jupiter/textures/small.png diff --git a/data/scene/newhorizons/jupiter/jupiterprojection/textures/test.jpg b/data/scene/newhorizons/jupiter/jupiter/textures/test.jpg similarity index 100% rename from data/scene/newhorizons/jupiter/jupiterprojection/textures/test.jpg rename to data/scene/newhorizons/jupiter/jupiter/textures/test.jpg diff --git a/data/scene/newhorizons/pluto/charonprojection/charonprojection.data b/data/scene/newhorizons/pluto/charon/charon.data similarity index 100% rename from data/scene/newhorizons/pluto/charonprojection/charonprojection.data rename to data/scene/newhorizons/pluto/charon/charon.data diff --git a/data/scene/newhorizons/pluto/charonprojection/charonprojection.mod b/data/scene/newhorizons/pluto/charon/charon.mod similarity index 100% rename from data/scene/newhorizons/pluto/charonprojection/charonprojection.mod rename to data/scene/newhorizons/pluto/charon/charon.mod diff --git a/data/scene/newhorizons/pluto/plutoprojection/plutoprojection.data b/data/scene/newhorizons/pluto/pluto/pluto.data similarity index 100% rename from data/scene/newhorizons/pluto/plutoprojection/plutoprojection.data rename to data/scene/newhorizons/pluto/pluto/pluto.data diff --git a/data/scene/newhorizons/pluto/plutoprojection/plutoprojection.mod b/data/scene/newhorizons/pluto/pluto/pluto.mod similarity index 99% rename from data/scene/newhorizons/pluto/plutoprojection/plutoprojection.mod rename to data/scene/newhorizons/pluto/pluto/pluto.mod index c61baa4836..798e7f6bcf 100644 --- a/data/scene/newhorizons/pluto/plutoprojection/plutoprojection.mod +++ b/data/scene/newhorizons/pluto/pluto/pluto.mod @@ -50,7 +50,7 @@ return { MieColor = {1.0, 1.0, 1.0} }, Projection = { - Sequence = "${OPENSPACE_DATA}/scene/newhorizons/pluto/plutoprojection/images", + Sequence = "${OPENSPACE_DATA}/scene/newhorizons/pluto/plutoprojection/all_images", EventFile = "${OPENSPACE_DATA}/scene/newhorizons/pluto/plutoprojection/assets/core_v9h_obs_getmets_v8_time_fix_nofrcd_mld.txt", SequenceType = "hybrid", Observer = "NEW HORIZONS", diff --git a/openspace.cfg b/openspace.cfg index d17e612453..a2420ef11d 100644 --- a/openspace.cfg +++ b/openspace.cfg @@ -7,7 +7,7 @@ return { -- Sets the scene that is to be loaded by OpenSpace. A scene file is a description -- of all entities that will be visible during an instance of OpenSpace - Scene = "${SCENE}/default_nh.scene", + Scene = "${SCENE}/newhorizons.scene", Paths = { SGCT = "${BASE_PATH}/config/sgct", From ecc6c8d63f9a44f514d884308ae36cb585c12bf7 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 16 May 2016 12:57:53 +0200 Subject: [PATCH 3/5] Reintroduce powerscaled coordinates to modelgeometry to fix scaling issue Correctly set magnification property in RenderableModelProjection --- modules/base/rendering/multimodelgeometry.cpp | 13 +++++++++++-- .../rendering/renderablemodelprojection.cpp | 12 +++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/modules/base/rendering/multimodelgeometry.cpp b/modules/base/rendering/multimodelgeometry.cpp index a7827b82a6..afbd612fcb 100644 --- a/modules/base/rendering/multimodelgeometry.cpp +++ b/modules/base/rendering/multimodelgeometry.cpp @@ -28,6 +28,8 @@ #include "ghoul/io/model/modelreadermultiformat.h" #include "ghoul/opengl/vertexbufferobject.h" +#include + namespace { const std::string _loggerCat = "MultiModelGeometry"; } @@ -65,9 +67,16 @@ namespace openspace { _vertices.reserve(vertices.size()); for (const auto & v : vertices) { + psc p = PowerScaledCoordinate::CreatePowerScaledCoordinate( + v.location[0], + v.location[1], + v.location[2] + ); + Vertex vv; - memcpy(vv.location, v.location, sizeof(GLfloat) * 3); - vv.location[3] = 1.0; + //memcpy(vv.location, v.location, sizeof(GLfloat) * 3); + memcpy(vv.location, glm::value_ptr(p.vec4()), sizeof(GLfloat) * 4); + //vv.location[3] = 1.0; memcpy(vv.tex, v.tex, sizeof(GLfloat) * 2); memcpy(vv.normal, v.normal, sizeof(GLfloat) * 3); _vertices.push_back(vv); diff --git a/modules/newhorizons/rendering/renderablemodelprojection.cpp b/modules/newhorizons/rendering/renderablemodelprojection.cpp index e91fab7cca..375e507d46 100644 --- a/modules/newhorizons/rendering/renderablemodelprojection.cpp +++ b/modules/newhorizons/rendering/renderablemodelprojection.cpp @@ -192,8 +192,8 @@ bool RenderableModelProjection::initialize() { if (_programObject == nullptr) { RenderEngine& renderEngine = OsEng.renderEngine(); _programObject = renderEngine.buildRenderProgram("ModelShader", - "${MODULES}/newhorizons/shaders/modelShader_vs.glsl", - "${MODULES}/newhorizons/shaders/modelShader_fs.glsl"); + "${MODULE_NEWHORIZONS}/shaders/modelShader_vs.glsl", + "${MODULE_NEWHORIZONS}/shaders/modelShader_fs.glsl"); if (!_programObject) return false; @@ -202,8 +202,8 @@ bool RenderableModelProjection::initialize() { if (_fboProgramObject == nullptr) { _fboProgramObject = ghoul::opengl::ProgramObject::Build("ProjectionPass", - "${MODULES}/newhorizons/shaders/projectionPass_vs.glsl", - "${MODULES}/newhorizons/shaders/projectionPass_fs.glsl"); + "${MODULE_NEWHORIZONS}/shaders/projectionPass_vs.glsl", + "${MODULE_NEWHORIZONS}/shaders/projectionPass_fs.glsl"); if (!_fboProgramObject) return false; } @@ -336,7 +336,9 @@ void RenderableModelProjection::render(const RenderData& data) { _viewProjection = data.camera.viewProjectionMatrix(); _programObject->setUniform("ViewProjection", _viewProjection); _programObject->setUniform("ModelTransform", _transform); - setPscUniforms(*_programObject.get(), data.camera, data.position); + setPscUniforms(*_programObject, data.camera, data.position); + + _geometry->setUniforms(*_programObject); textureBind(); _geometry->render(); From 31e6b0e2b3812793f37191d560db86093aa432c8 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 16 May 2016 14:50:48 +0200 Subject: [PATCH 4/5] Add debugging module with RenderableDebugPlane, closing #56 --- modules/base/rendering/renderableplane.cpp | 2 +- modules/debugging/CMakeLists.txt | 45 ++++ modules/debugging/debuggingmodule.cpp | 48 ++++ modules/debugging/debuggingmodule.h | 42 ++++ modules/debugging/include.cmake | 1 + .../rendering/renderabledebugplane.cpp | 206 ++++++++++++++++++ .../rendering/renderabledebugplane.h | 85 ++++++++ 7 files changed, 428 insertions(+), 1 deletion(-) create mode 100644 modules/debugging/CMakeLists.txt create mode 100644 modules/debugging/debuggingmodule.cpp create mode 100644 modules/debugging/debuggingmodule.h create mode 100644 modules/debugging/include.cmake create mode 100644 modules/debugging/rendering/renderabledebugplane.cpp create mode 100644 modules/debugging/rendering/renderabledebugplane.h diff --git a/modules/base/rendering/renderableplane.cpp b/modules/base/rendering/renderableplane.cpp index 5ec10b5f51..e85ce0a3c3 100644 --- a/modules/base/rendering/renderableplane.cpp +++ b/modules/base/rendering/renderableplane.cpp @@ -257,7 +257,7 @@ void RenderablePlane::createPlane() { // ============================ const GLfloat size = _size.value()[0]; const GLfloat w = _size.value()[1]; - const GLfloat vertex_data[] = { // square of two triangles (sigh) + const GLfloat vertex_data[] = { // x y z w s t -size, -size, 0.f, w, 0.f, 0.f, size, size, 0.f, w, 1.f, 1.f, diff --git a/modules/debugging/CMakeLists.txt b/modules/debugging/CMakeLists.txt new file mode 100644 index 0000000000..b82abfb28a --- /dev/null +++ b/modules/debugging/CMakeLists.txt @@ -0,0 +1,45 @@ +######################################################################################### +# # +# OpenSpace # +# # +# Copyright (c) 2014-2016 # +# # +# 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(${OPENSPACE_CMAKE_EXT_DIR}/module_definition.cmake) + +set(HEADER_FILES + ${CMAKE_CURRENT_SOURCE_DIR}/rendering/renderabledebugplane.h +) +source_group("Header Files" FILES ${HEADER_FILES}) + +set(SOURCE_FILES + ${CMAKE_CURRENT_SOURCE_DIR}/rendering/renderabledebugplane.cpp +) +source_group("Source Files" FILES ${SOURCE_FILES}) + +set(SHADER_FILES +) +source_group("Shader Files" FILES ${SHADER_FILES}) + +create_new_module( + "Debugging" + debugging_module + ${HEADER_FILES} ${SOURCE_FILES} ${SHADER_FILES} +) diff --git a/modules/debugging/debuggingmodule.cpp b/modules/debugging/debuggingmodule.cpp new file mode 100644 index 0000000000..b1e28763ac --- /dev/null +++ b/modules/debugging/debuggingmodule.cpp @@ -0,0 +1,48 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2016 * + * * + * 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 + +namespace openspace { + +DebuggingModule::DebuggingModule() + : OpenSpaceModule("Debugging") +{} + +void DebuggingModule::internalInitialize() { + auto fRenderable = FactoryManager::ref().factory(); + ghoul_assert(fRenderable, "No renderable factory existed"); + + fRenderable->registerClass("RenderableDebugPlane"); + +} + +} // namespace openspace diff --git a/modules/debugging/debuggingmodule.h b/modules/debugging/debuggingmodule.h new file mode 100644 index 0000000000..8a33551351 --- /dev/null +++ b/modules/debugging/debuggingmodule.h @@ -0,0 +1,42 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2016 * + * * + * 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 __DEBUGGINGMODULE_H__ +#define __DEBUGGINGMODULE_H__ + +#include + +namespace openspace { + +class DebuggingModule : public OpenSpaceModule { +public: + DebuggingModule(); + +protected: + void internalInitialize() override; +}; + +} // namespace openspace + +#endif // __DEBUGGINGMODULE_H__ diff --git a/modules/debugging/include.cmake b/modules/debugging/include.cmake new file mode 100644 index 0000000000..ffea0ac430 --- /dev/null +++ b/modules/debugging/include.cmake @@ -0,0 +1 @@ +set(DEFAULT_MODULE ON) diff --git a/modules/debugging/rendering/renderabledebugplane.cpp b/modules/debugging/rendering/renderabledebugplane.cpp new file mode 100644 index 0000000000..e7dae5cd15 --- /dev/null +++ b/modules/debugging/rendering/renderabledebugplane.cpp @@ -0,0 +1,206 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2016 * + * * + * 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. * + ****************************************************************************************/ + +// @TODO: Clean up this class and make it not copy much code from RenderablePlane ---abock + +#include + + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace { + const std::string _loggerCat = "RenderablePlaneTexture"; +} + +namespace openspace { + +RenderableDebugPlane::RenderableDebugPlane(const ghoul::Dictionary& dictionary) + : Renderable(dictionary) + , _texture("texture", "Texture", -1, -1, 255) + , _billboard("billboard", "Billboard", false) + , _size("size", "Size", glm::vec2(1,1), glm::vec2(0.f), glm::vec2(1.f, 25.f)) + , _origin(Origin::Center) + , _shader(nullptr) + , _quad(0) + , _vertexPositionBuffer(0) +{ + glm::vec2 size; + dictionary.getValue("Size", size); + _size = size; + + if (dictionary.hasKey("Name")){ + dictionary.getValue("Name", _nodeName); + } + + std::string origin; + if (dictionary.getValue("Origin", origin)) { + if (origin == "LowerLeft") { + _origin = Origin::LowerLeft; + } + else if (origin == "LowerRight") { + _origin = Origin::LowerRight; + } + else if (origin == "UpperLeft") { + _origin = Origin::UpperLeft; + } + else if (origin == "UpperRight") { + _origin = Origin::UpperRight; + } + else if (origin == "Center") { + _origin = Origin::Center; + } + } + + // Attempt to get the billboard value + bool billboard = false; + if (dictionary.getValue("Billboard", billboard)) { + _billboard = billboard; + } + + addProperty(_texture); + + addProperty(_billboard); + + addProperty(_size); + _size.onChange([this](){ _planeIsDirty = true; }); + + setBoundingSphere(_size.value()); +} + +RenderableDebugPlane::~RenderableDebugPlane() { +} + +bool RenderableDebugPlane::isReady() const { + bool ready = true; + if (!_shader) + ready &= false; + return ready; +} + +bool RenderableDebugPlane::initialize() { + glGenVertexArrays(1, &_quad); // generate array + glGenBuffers(1, &_vertexPositionBuffer); // generate buffer + createPlane(); + + if (_shader == nullptr) { + // Plane Program + + RenderEngine& renderEngine = OsEng.renderEngine(); + _shader = renderEngine.buildRenderProgram("PlaneProgram", + "${MODULE_BASE}/shaders/plane_vs.glsl", + "${MODULE_BASE}/shaders/plane_fs.glsl" + ); + if (!_shader) + return false; + } + + + return isReady(); +} + +bool RenderableDebugPlane::deinitialize() { + glDeleteVertexArrays(1, &_quad); + _quad = 0; + + glDeleteBuffers(1, &_vertexPositionBuffer); + _vertexPositionBuffer = 0; + + RenderEngine& renderEngine = OsEng.renderEngine(); + if (_shader) { + renderEngine.removeRenderProgram(_shader); + _shader = nullptr; + } + + return true; +} + +void RenderableDebugPlane::render(const RenderData& data) { + glm::mat4 transform = glm::mat4(1.0); + if (_billboard) + transform = glm::inverse(data.camera.viewRotationMatrix()); + + // Activate shader + _shader->activate(); + + _shader->setUniform("ViewProjection", data.camera.viewProjectionMatrix()); + _shader->setUniform("ModelTransform", transform); + setPscUniforms(*_shader.get(), data.camera, data.position); + + ghoul::opengl::TextureUnit unit; + unit.activate(); + glBindTexture(GL_TEXTURE_2D, _texture); + _shader->setUniform("texture1", unit); + + glBindVertexArray(_quad); + glDrawArrays(GL_TRIANGLES, 0, 6); + + _shader->deactivate(); +} + +void RenderableDebugPlane::update(const UpdateData& data) { + if (_shader->isDirty()) + _shader->rebuildFromFile(); + + if (_planeIsDirty) + createPlane(); +} + +void RenderableDebugPlane::createPlane() { + // ============================ + // GEOMETRY (quad) + // ============================ + const GLfloat size = _size.value()[0]; + const GLfloat w = _size.value()[1]; + const GLfloat vertex_data[] = { + // x y z w s t + -size, -size, 0.f, w, 0.f, 0.f, + size, size, 0.f, w, 1.f, 1.f, + -size, size, 0.f, w, 0.f, 1.f, + -size, -size, 0.f, w, 0.f, 0.f, + size, -size, 0.f, w, 1.f, 0.f, + size, size, 0.f, w, 1.f, 1.f, + }; + + glBindVertexArray(_quad); // bind array + glBindBuffer(GL_ARRAY_BUFFER, _vertexPositionBuffer); // bind buffer + glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_data), vertex_data, GL_STATIC_DRAW); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 6, reinterpret_cast(0)); + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 6, reinterpret_cast(sizeof(GLfloat) * 4)); +} + +} // namespace openspace diff --git a/modules/debugging/rendering/renderabledebugplane.h b/modules/debugging/rendering/renderabledebugplane.h new file mode 100644 index 0000000000..40b2621aba --- /dev/null +++ b/modules/debugging/rendering/renderabledebugplane.h @@ -0,0 +1,85 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2016 * + * * + * 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 __RENDERABLEDEBUGPLANE_H__ +#define __RENDERABLEDEBUGPLANE_H__ + +#include + +#include +#include +#include + +namespace ghoul { + namespace filesystem { + class File; + } + namespace opengl { + class ProgramObject; + class Texture; + } +} + +namespace openspace { + struct LinePoint; + +class RenderableDebugPlane: public Renderable { + + enum class Origin { + LowerLeft, LowerRight, UpperLeft, UpperRight, Center + }; + +public: + RenderableDebugPlane(const ghoul::Dictionary& dictionary); + ~RenderableDebugPlane(); + + bool initialize() override; + bool deinitialize() override; + + bool isReady() const override; + + void render(const RenderData& data) override; + void update(const UpdateData& data) override; + +private: + void createPlane(); + + properties::IntProperty _texture; + properties::BoolProperty _billboard; + properties::Vec2Property _size; + + Origin _origin; + std::string _nodeName; + + bool _planeIsDirty; + + std::unique_ptr _shader; + + GLuint _quad; + GLuint _vertexPositionBuffer; +}; + +} // namespace openspace + +#endif // __RENDERABLEDEBUGPLANE_H__ From d2e913b70e3d4d96c5a62f123128488a14462e32 Mon Sep 17 00:00:00 2001 From: Michael Nilsson Date: Tue, 17 May 2016 12:49:16 -0400 Subject: [PATCH 5/5] moved histogram class to core --- .../rendering => include/openspace/util}/histogram.h | 0 modules/multiresvolume/CMakeLists.txt | 2 -- modules/multiresvolume/rendering/errorhistogrammanager.cpp | 2 +- modules/multiresvolume/rendering/errorhistogrammanager.h | 2 +- modules/multiresvolume/rendering/histogrammanager.cpp | 2 +- modules/multiresvolume/rendering/histogrammanager.h | 2 +- modules/multiresvolume/rendering/localerrorhistogrammanager.cpp | 2 +- modules/multiresvolume/rendering/localerrorhistogrammanager.h | 2 +- modules/multiresvolume/rendering/localtfbrickselector.cpp | 2 +- modules/multiresvolume/rendering/simpletfbrickselector.cpp | 2 +- modules/multiresvolume/rendering/tfbrickselector.cpp | 2 +- src/CMakeLists.txt | 2 ++ {modules/multiresvolume/rendering => src/util}/histogram.cpp | 2 +- 13 files changed, 12 insertions(+), 12 deletions(-) rename {modules/multiresvolume/rendering => include/openspace/util}/histogram.h (100%) rename {modules/multiresvolume/rendering => src/util}/histogram.cpp (99%) diff --git a/modules/multiresvolume/rendering/histogram.h b/include/openspace/util/histogram.h similarity index 100% rename from modules/multiresvolume/rendering/histogram.h rename to include/openspace/util/histogram.h diff --git a/modules/multiresvolume/CMakeLists.txt b/modules/multiresvolume/CMakeLists.txt index a5afd80256..a316db5dc3 100644 --- a/modules/multiresvolume/CMakeLists.txt +++ b/modules/multiresvolume/CMakeLists.txt @@ -37,7 +37,6 @@ set(HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/rendering/simpletfbrickselector.h ${CMAKE_CURRENT_SOURCE_DIR}/rendering/renderablemultiresvolume.h ${CMAKE_CURRENT_SOURCE_DIR}/rendering/tsp.h - ${CMAKE_CURRENT_SOURCE_DIR}/rendering/histogram.h ${CMAKE_CURRENT_SOURCE_DIR}/rendering/histogrammanager.h ${CMAKE_CURRENT_SOURCE_DIR}/rendering/errorhistogrammanager.h ${CMAKE_CURRENT_SOURCE_DIR}/rendering/localerrorhistogrammanager.h @@ -54,7 +53,6 @@ set(SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/rendering/simpletfbrickselector.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rendering/renderablemultiresvolume.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rendering/tsp.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/rendering/histogram.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rendering/histogrammanager.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rendering/errorhistogrammanager.cpp ${CMAKE_CURRENT_SOURCE_DIR}/rendering/localerrorhistogrammanager.cpp diff --git a/modules/multiresvolume/rendering/errorhistogrammanager.cpp b/modules/multiresvolume/rendering/errorhistogrammanager.cpp index 10cb91d111..73f559b9fb 100644 --- a/modules/multiresvolume/rendering/errorhistogrammanager.cpp +++ b/modules/multiresvolume/rendering/errorhistogrammanager.cpp @@ -28,7 +28,7 @@ #include #include -#include +#include #include diff --git a/modules/multiresvolume/rendering/errorhistogrammanager.h b/modules/multiresvolume/rendering/errorhistogrammanager.h index 672adffc81..99e793670d 100644 --- a/modules/multiresvolume/rendering/errorhistogrammanager.h +++ b/modules/multiresvolume/rendering/errorhistogrammanager.h @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include diff --git a/modules/multiresvolume/rendering/histogrammanager.cpp b/modules/multiresvolume/rendering/histogrammanager.cpp index ed4d21eefe..da0c1b1a8c 100644 --- a/modules/multiresvolume/rendering/histogrammanager.cpp +++ b/modules/multiresvolume/rendering/histogrammanager.cpp @@ -28,7 +28,7 @@ #include #include -#include +#include namespace { const std::string _loggerCat = "HistogramManager"; diff --git a/modules/multiresvolume/rendering/histogrammanager.h b/modules/multiresvolume/rendering/histogrammanager.h index 8c81d578c2..6ddefd14c2 100644 --- a/modules/multiresvolume/rendering/histogrammanager.h +++ b/modules/multiresvolume/rendering/histogrammanager.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace openspace { diff --git a/modules/multiresvolume/rendering/localerrorhistogrammanager.cpp b/modules/multiresvolume/rendering/localerrorhistogrammanager.cpp index 67333eb86b..e90de1d97a 100644 --- a/modules/multiresvolume/rendering/localerrorhistogrammanager.cpp +++ b/modules/multiresvolume/rendering/localerrorhistogrammanager.cpp @@ -28,7 +28,7 @@ #include #include -#include +#include #include diff --git a/modules/multiresvolume/rendering/localerrorhistogrammanager.h b/modules/multiresvolume/rendering/localerrorhistogrammanager.h index 000aff8597..4184696e02 100644 --- a/modules/multiresvolume/rendering/localerrorhistogrammanager.h +++ b/modules/multiresvolume/rendering/localerrorhistogrammanager.h @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include diff --git a/modules/multiresvolume/rendering/localtfbrickselector.cpp b/modules/multiresvolume/rendering/localtfbrickselector.cpp index 72e4e3df17..009ef735e2 100644 --- a/modules/multiresvolume/rendering/localtfbrickselector.cpp +++ b/modules/multiresvolume/rendering/localtfbrickselector.cpp @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/modules/multiresvolume/rendering/simpletfbrickselector.cpp b/modules/multiresvolume/rendering/simpletfbrickselector.cpp index bea62f22a9..5b874b924d 100644 --- a/modules/multiresvolume/rendering/simpletfbrickselector.cpp +++ b/modules/multiresvolume/rendering/simpletfbrickselector.cpp @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/modules/multiresvolume/rendering/tfbrickselector.cpp b/modules/multiresvolume/rendering/tfbrickselector.cpp index bf7e50c24d..f976b714c6 100644 --- a/modules/multiresvolume/rendering/tfbrickselector.cpp +++ b/modules/multiresvolume/rendering/tfbrickselector.cpp @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f6532392b5..3230037d24 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -86,6 +86,7 @@ set(OPENSPACE_SOURCE ${OPENSPACE_BASE_DIR}/src/util/screenlog.cpp ${OPENSPACE_BASE_DIR}/src/util/spicemanager.cpp ${OPENSPACE_BASE_DIR}/src/util/syncbuffer.cpp + ${OPENSPACE_BASE_DIR}/src/util/histogram.cpp ${OPENSPACE_BASE_DIR}/src/util/time.cpp ${OPENSPACE_BASE_DIR}/src/util/time_lua.inl ) @@ -163,6 +164,7 @@ set(OPENSPACE_HEADER ${OPENSPACE_BASE_DIR}/include/openspace/util/syncbuffer.h ${OPENSPACE_BASE_DIR}/include/openspace/util/time.h ${OPENSPACE_BASE_DIR}/include/openspace/util/updatestructures.h + ${OPENSPACE_BASE_DIR}/include/openspace/util/histogram.h ) # Place files into source groups diff --git a/modules/multiresvolume/rendering/histogram.cpp b/src/util/histogram.cpp similarity index 99% rename from modules/multiresvolume/rendering/histogram.cpp rename to src/util/histogram.cpp index 57fc8eeb04..4108b097f3 100644 --- a/modules/multiresvolume/rendering/histogram.cpp +++ b/src/util/histogram.cpp @@ -22,7 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include +#include #include