From 363df3707d11ae8e5e7cfd03fc7044ae0718e211 Mon Sep 17 00:00:00 2001
From: BujarMuharemi <bujar.muharemi.28@gmail.com>
Date: Thu, 2 Dec 2021 13:12:33 +0100
Subject: [PATCH] added shadowPalette; RoofView works;

---
 public/js/globe.js         | 74 ++++++++++++++++++++++++--------------
 public/js/shadowPalette.js | 23 ++++++++++++
 public/main.html           |  4 +++
 3 files changed, 75 insertions(+), 26 deletions(-)
 create mode 100644 public/js/shadowPalette.js

diff --git a/public/js/globe.js b/public/js/globe.js
index 5da84ee..f9ce889 100644
--- a/public/js/globe.js
+++ b/public/js/globe.js
@@ -5,15 +5,19 @@ var viewer = new Cesium.Viewer('cesiumContainer', {
     baseLayerPicker: false,
     navigationHelpButton: false,
     timeline: true,
+    //shadows:true,
     animation: false,
     sceneModePicker: false,
     geocoder: false,
+    
 });
 
 viewer.scene.globe.depthTestAgainstTerrain = true;
 //--------------------hover over surfaces--------------------
 var singleChart = document.getElementById('singleChartContainer');
 
+console.log(viewer.ShadowMap);
+
 // HTML overlay for showing feature name on mouseover
 var nameOverlay = document.createElement("div");
 viewer.container.appendChild(nameOverlay);
@@ -27,7 +31,7 @@ nameOverlay.style.padding = "4px";
 nameOverlay.style.backgroundColor = "white";
 
 
-var chosenDate = new Cesium.GregorianDate; //the chosen Date from the Timeline
+var chosenDate = new Cesium.GregorianDate(2021,12,2,11); //the chosen Date from the Timeline
 
 //getting clicked Date from the timeline element
 viewer.timeline.container.onmouseup = (e) => {
@@ -150,8 +154,8 @@ viewer.screenSpaceEventHandler.setInputAction(function onMouseMove(movement) {
 
     }
     
-    else {
-
+    //Building View
+    else if(document.getElementById("building").checked){
         // A feature was picked, so show it's overlay content
         nameOverlay.style.display = "block";
         nameOverlay.style.bottom = viewer.canvas.clientHeight - movement.endPosition.y + "px";
@@ -177,6 +181,12 @@ viewer.screenSpaceEventHandler.setInputAction(function onMouseMove(movement) {
             });
         }
     }
+
+    //Roof View
+    else if(document.getElementById("roof").checked){
+        console.log("clicked when in roof view and on hover");
+    }
+    
 },
     Cesium.ScreenSpaceEventType.MOUSE_MOVE);
 
@@ -261,6 +271,7 @@ viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {
     fillTableProperties(gmlID, surID)
    
 
+    //Surface View
     if (document.getElementById("surface").checked) {
 
         //save the selected feature's original color
@@ -279,19 +290,17 @@ viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {
 
                     t.color = Cesium.Color.LIME;
 
-                    for (const [key, value] of Object.entries(shadowdata)) {
-                        if(key === t.getProperty("gml_id")){
-                            console.log("hour:",chosenDate.hour);
-                            shadowHourValue = value[chosenDate.hour-1]
-                            console.log(value[chosenDate.hour-1]);
-
-                            if(value[chosenDate.hour-1]===0){
-                                t.color = Cesium.Color.BLACK;                      
-                            }
+                    //color surfaces depending on their shadow value
+                    for (const [key, value] of Object.entries(shadowdata)) { //looping threw the shadowdata array
+                        if(key === t.getProperty("gml_id")){ //checking if the ids of the current surface match the id in the shadowdata array
+                            //console.log("hour:",chosenDate.hour);
+                            shadowHourValue = value[chosenDate.hour-1] //getting the current chosen hour from the timeline
+                            //console.log("shadowHourValue",shadowHourValue);
+                            
+                            t.color = Cesium.Color.fromCssColorString(getShadowPalette(shadowHourValue)); //coloring the surface
+                            
                         }
-                    }
-
-                    
+                    }                    
                 }
             });
         } else {
@@ -328,7 +337,8 @@ viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {
 
     }
 
-    else {
+    //Building View
+    else if(document.getElementById("building").checked){
         //save the selected feature's original color
         if (pickedhigh) {
             highlightedFeatures.forEach(h => {
@@ -380,6 +390,28 @@ viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {
 
     }
 
+    //Roof View
+    //BUG: shows random attributes ui element ??
+    else if(document.getElementById("roof").checked){
+        console.log("clicked when in roof view and on click");
+
+        //looping threw all surfaces
+        tileContent.forEach(t => {
+            if(t.getProperty("description").includes("Roof")){  //HACK: checking if the are a roof surface (should come from feature_type)            
+                
+                for (const [key, value] of Object.entries(shadowdata)) { //looping threw the shadowdata array            
+                    if(key === t.getProperty("gml_id")){    //checking the id
+                        shadowHourValue = value[chosenDate.hour-1]; //getting the current chosen hour from the timeline                 
+                        t.color = Cesium.Color.fromCssColorString(getShadowPalette(shadowHourValue));   //coloring the surface
+                        
+                    }
+                }
+                
+            }
+            
+        });
+    }
+
 },
     Cesium.ScreenSpaceEventType.LEFT_CLICK);
 
@@ -449,13 +481,3 @@ function fillTableProperties(gID, sID) {
     }
 
 }
-
-function randomRoofColor(){
-    var r = Math.floor(Math.random() * 10);
-    var shade =29*r;
-    
-    var color = new Cesium.Color;
-    Cesium.Color.fromBytes(shade,shade,shade,255,color);
-    //console.log(color);
-    return color;
-}
diff --git a/public/js/shadowPalette.js b/public/js/shadowPalette.js
new file mode 100644
index 0000000..7b7ed6a
--- /dev/null
+++ b/public/js/shadowPalette.js
@@ -0,0 +1,23 @@
+//Shadow palette for coloring the roofs
+
+//color pallet      white->black
+var shadowPalette = ['#ffffff','#f0f0f0','#d9d9d9','#bdbdbd','#969696','#737373','#525252','#252525'];
+//const shadowPalette = colorPalette.reverse(); 
+
+//returns the responding color from the shadowPalette, depending on the inputShadowValue(0 to 1 in float)
+function getShadowPalette(inputShadowValue){ 
+    //TODO: add check for wrong inputShadowValues
+    //checking for the float values
+    if(!Number.isInteger(inputShadowValue)){ 
+        var index = Math.ceil((shadowPalette.length-1)*inputShadowValue);
+        //console.log(shadowPalette[index]);
+        return shadowPalette[index];
+    }
+    //edge case for 0 and 1
+    else{
+        //console.log("black",shadowPalette[shadowPalette.length-1]);
+        return shadowPalette[shadowPalette.length-1];
+    }
+    
+}
+
diff --git a/public/main.html b/public/main.html
index 134f095..fef43da 100644
--- a/public/main.html
+++ b/public/main.html
@@ -242,6 +242,7 @@
 						<input id="building" type="radio" name="credit-card" value="building" checked>
 						<div class="lang" key="buildingview">Building-View</div>
 						<label class="drinkcard-cc building" for="building"></label>
+						
 						<input id="surface" type="radio" name="credit-card" value="surface">
 						<div class="lang" key="surfaceview">Surface-View</div>
 						<label class="drinkcard-cc surface" for="surface"></label>
@@ -342,6 +343,9 @@
 		<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"
 			integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous">
 		</script>
+
+		<script type="text/javascript" src="js/shadowPalette.js"></script>
+
 		<script type="text/javascript" src="js/sidebar.js"></script>
 		<script type="text/javascript" src="js/globe.js"></script>
 		<script type="text/javascript" src="js/areaCharts.js"></script>
-- 
GitLab