Skip to content

Commit

Permalink
geometry height reference property
Browse files Browse the repository at this point in the history
  • Loading branch information
hpinkos committed Jun 26, 2018
1 parent 0025abc commit 31448d7
Show file tree
Hide file tree
Showing 21 changed files with 1,269 additions and 122 deletions.
86 changes: 86 additions & 0 deletions Apps/Sandcastle/gallery/Geometry Height Reference.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
<meta name="description" content="An example for how to use the GeometryHeightProperty to height reference a corridor, ellipse, polygon or rectangle.">
<meta name="cesium-sandcastle-labels" content="Geometries">
<title>Cesium Demo</title>
<script type="text/javascript" src="../Sandcastle-header.js"></script>
<script type="text/javascript" src="../../../ThirdParty/requirejs-2.1.20/require.js"></script>
<script type="text/javascript">
if(typeof require === "function") {
require.config({
baseUrl : '../../../Source',
waitSeconds : 120
});
}
</script>
</head>
<body class="sandcastle-loading" data-sandcastle-bucket="bucket-requirejs.html">
<style>
@import url(../templates/bucket.css);
</style>
<div id="cesiumContainer" class="fullSize"></div>
<div id="loadingOverlay"><h1>Loading...</h1></div>
<div id="toolbar"></div>
<script id="cesium_sandcastle_script">
function startup(Cesium) {
'use strict';
//Sandcastle_Begin
var viewer = new Cesium.Viewer('cesiumContainer', {
baseLayerPicker: false,
terrainProvider: Cesium.createWorldTerrain()
});
viewer.scene.globe.depthTestAgainstTerrain = true;

var baseLon = 6.850615989890521;
var baseLat = 45.89546589994886;
function addEntity(i, j) {
var lon1 = baseLon + 0.0001*i;
var lon2 = baseLon + 0.0001*i + 0.0001;

var lat1 = baseLat + 0.0001*j;
var lat2 = baseLat + 0.0001*j + 0.0001;
var a = Cesium.Cartesian3.fromDegrees(lon1, lat1);
var b = Cesium.Cartesian3.fromDegrees(lon1, lat2);
var c = Cesium.Cartesian3.fromDegrees(lon2, lat2);
var d = Cesium.Cartesian3.fromDegrees(lon2, lat1);

var positions = [a, b, c, d];
viewer.entities.add({
polygon : {
hierarchy : positions,
material : Cesium.Color.fromRandom({alpha: 1}),
height : new Cesium.GeometryHeightProperty(10.0, Cesium.HeightReference.RELATIVE_TO_GROUND),
extrudedHeight : new Cesium.GeometryHeightProperty(0.0, Cesium.HeightReference.CLAMP_TO_GROUND)
}
});
}

for (var i = 0; i < 4; i++) {
for (var j = 0; j < 4; j++) {
addEntity(i, j);
}
}

viewer.scene.camera.flyTo({
destination: new Cesium.Cartesian3(4415716.090770245, 530458.0589739879, 4558358.470675762),
orientation: {
heading: 2.9422859539310506,
pitch: -0.26904591127394784,
roll: 0.0006888582061437276
}
});
//Sandcastle_End
Sandcastle.finishedLoading();
}
if (typeof Cesium !== "undefined") {
startup(Cesium);
} else if (typeof require === "function") {
require(["Cesium"], startup);
}
</script>
</body>
</html>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
80 changes: 58 additions & 22 deletions Source/DataSources/CorridorGeometryUpdater.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
define([
'../Core/Cartesian3',
'../Core/Check',
'../Core/Color',
'../Core/ColorGeometryInstanceAttribute',
Expand All @@ -8,17 +9,22 @@ define([
'../Core/DeveloperError',
'../Core/DistanceDisplayConditionGeometryInstanceAttribute',
'../Core/GeometryInstance',
'../Core/GeometryOffsetAttribute',
'../Core/Iso8601',
'../Core/OffsetGeometryInstanceAttribute',
'../Core/ShowGeometryInstanceAttribute',
'../Scene/GroundPrimitive',
'../Scene/HeightReference',
'../Scene/MaterialAppearance',
'../Scene/PerInstanceColorAppearance',
'./ColorMaterialProperty',
'./DynamicGeometryUpdater',
'./GeometryHeightProperty',
'./GeometryUpdater',
'./GroundGeometryUpdater',
'./Property'
], function(
Cartesian3,
Check,
Color,
ColorGeometryInstanceAttribute,
Expand All @@ -28,19 +34,26 @@ define([
DeveloperError,
DistanceDisplayConditionGeometryInstanceAttribute,
GeometryInstance,
GeometryOffsetAttribute,
Iso8601,
OffsetGeometryInstanceAttribute,
ShowGeometryInstanceAttribute,
GroundPrimitive,
HeightReference,
MaterialAppearance,
PerInstanceColorAppearance,
ColorMaterialProperty,
DynamicGeometryUpdater,
GeometryHeightProperty,
GeometryUpdater,
GroundGeometryUpdater,
Property) {
'use strict';

var scratchColor = new Color();
var defaultOffset = Cartesian3.ZERO;
var offsetScratch = new Cartesian3();
var scratchCorridorGeometry = new CorridorGeometry({positions: [], width: 1});

function CorridorGeometryOptions(entity) {
this.id = entity;
Expand All @@ -51,6 +64,7 @@ define([
this.height = undefined;
this.extrudedHeight = undefined;
this.granularity = undefined;
this.offsetAttribute = undefined;
}

/**
Expand Down Expand Up @@ -99,11 +113,11 @@ define([
var entity = this._entity;
var isAvailable = entity.isAvailable(time);

var attributes;
var attributes = {
show : new ShowGeometryInstanceAttribute(isAvailable && entity.isShowing && this._showProperty.getValue(time) && this._fillProperty.getValue(time)),
distanceDisplayCondition : DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(this._distanceDisplayConditionProperty.getValue(time))
};

var color;
var show = new ShowGeometryInstanceAttribute(isAvailable && entity.isShowing && this._showProperty.getValue(time) && this._fillProperty.getValue(time));
var distanceDisplayCondition = DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(this._distanceDisplayConditionProperty.getValue(time));
if (this._materialProperty instanceof ColorMaterialProperty) {
var currentColor;
if (defined(this._materialProperty.color) && (this._materialProperty.color.isConstant || isAvailable)) {
Expand All @@ -112,17 +126,11 @@ define([
if (!defined(currentColor)) {
currentColor = Color.WHITE;
}
color = ColorGeometryInstanceAttribute.fromColor(currentColor);
attributes = {
show : show,
distanceDisplayCondition : distanceDisplayCondition,
color : color
};
} else {
attributes = {
show : show,
distanceDisplayCondition : distanceDisplayCondition
};
attributes.color = ColorGeometryInstanceAttribute.fromColor(currentColor);
}

if (defined(this._options.offsetAttribute)) {
attributes.offset = OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty, time, defaultOffset, offsetScratch));
}

return new GeometryInstance({
Expand Down Expand Up @@ -153,17 +161,31 @@ define([
var isAvailable = entity.isAvailable(time);
var outlineColor = Property.getValueOrDefault(this._outlineColorProperty, time, Color.BLACK, scratchColor);

var attributes = {
show : new ShowGeometryInstanceAttribute(isAvailable && entity.isShowing && this._showProperty.getValue(time) && this._showOutlineProperty.getValue(time)),
color : ColorGeometryInstanceAttribute.fromColor(outlineColor),
distanceDisplayCondition : DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(this._distanceDisplayConditionProperty.getValue(time))
};

if (defined(this._options.offsetAttribute)) {
attributes.offset = OffsetGeometryInstanceAttribute.fromCartesian3(Property.getValueOrDefault(this._terrainOffsetProperty, time, defaultOffset, offsetScratch));
}

return new GeometryInstance({
id : entity,
geometry : new CorridorOutlineGeometry(this._options),
attributes : {
show : new ShowGeometryInstanceAttribute(isAvailable && entity.isShowing && this._showProperty.getValue(time) && this._showOutlineProperty.getValue(time)),
color : ColorGeometryInstanceAttribute.fromColor(outlineColor),
distanceDisplayCondition : DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(this._distanceDisplayConditionProperty.getValue(time))
}
attributes : attributes
});
};

CorridorGeometryUpdater.prototype._computeCenter = function(time, result) {
var positions = Property.getValueOrUndefined(this._entity.corridor.positions, time);
if (!defined(positions) || positions.length === 0) {
return;
}
return Cartesian3.clone(positions[Math.floor(positions.length / 2.0)], result);
};

CorridorGeometryUpdater.prototype._isHidden = function(entity, corridor) {
return !defined(corridor.positions) || GeometryUpdater.prototype._isHidden.call(this, entity, corridor);
};
Expand Down Expand Up @@ -207,6 +229,12 @@ define([
options.granularity = defined(granularity) ? granularity.getValue(Iso8601.MINIMUM_VALUE) : undefined;
options.width = defined(width) ? width.getValue(Iso8601.MINIMUM_VALUE) : undefined;
options.cornerType = defined(cornerType) ? cornerType.getValue(Iso8601.MINIMUM_VALUE) : undefined;
options.offsetAttribute = GeometryHeightProperty.computeGeometryOffsetAttribute(height, extrudedHeight, Iso8601.MINIMUM_VALUE);

if (extrudedHeight instanceof GeometryHeightProperty && Property.getValueOrDefault(extrudedHeight.height, Iso8601.MINIMUM_VALUE, HeightReference.NONE) === HeightReference.CLAMP_TO_GROUND) {
scratchCorridorGeometry.setOptions(options);
options.extrudedHeight = GeometryHeightProperty.getMinimumTerrainValue(scratchCorridorGeometry.rectangle);
}
};

CorridorGeometryUpdater.DynamicGeometryUpdater = DynamicCorridorGeometryUpdater;
Expand All @@ -230,12 +258,20 @@ define([

DynamicCorridorGeometryUpdater.prototype._setOptions = function(entity, corridor, time) {
var options = this._options;
var height = corridor.height;
var extrudedHeight = corridor.extrudedHeight;
options.positions = Property.getValueOrUndefined(corridor.positions, time);
options.width = Property.getValueOrUndefined(corridor.width, time);
options.height = Property.getValueOrUndefined(corridor.height, time);
options.extrudedHeight = Property.getValueOrUndefined(corridor.extrudedHeight, time);
options.height = Property.getValueOrUndefined(height, time);
options.extrudedHeight = Property.getValueOrUndefined(extrudedHeight, time);
options.granularity = Property.getValueOrUndefined(corridor.granularity, time);
options.cornerType = Property.getValueOrUndefined(corridor.cornerType, time);
options.offsetAttribute = GeometryHeightProperty.computeGeometryOffsetAttribute(height, extrudedHeight, time);

if (extrudedHeight instanceof GeometryHeightProperty && Property.getValueOrDefault(extrudedHeight.height, time, HeightReference.NONE) === HeightReference.CLAMP_TO_GROUND) {
scratchCorridorGeometry.setOptions(options);
options.extrudedHeight = GeometryHeightProperty.getMinimumTerrainValue(scratchCorridorGeometry.rectangle);
}
};

return CorridorGeometryUpdater;
Expand Down
Loading

0 comments on commit 31448d7

Please sign in to comment.