From fc58ff0ec075ce28dac0decc46177175a23fc32c Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Tue, 3 Oct 2017 13:34:36 -0500
Subject: [PATCH 01/62] Update EllipsoidGeometry.js
Added partial ellipsoid capability.
---
Source/Core/EllipsoidGeometry.js | 302 +++++++++++++++++++++++--------
1 file changed, 230 insertions(+), 72 deletions(-)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index 73dfd009ba9e..bb0a7eb831a9 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -50,6 +50,11 @@ define([
*
* @param {Object} [options] Object with the following properties:
* @param {Cartesian3} [options.radii=Cartesian3(1.0, 1.0, 1.0)] The radii of the ellipsoid in the x, y, and z directions.
+ * @param {Cartesian3} [options.innerRadii=options.radii] The inner radii of the ellipsoid in the x, y, and z directions.
+ * @param {Number} [options.azimuthMin=0.0] The minimum azimuth in degrees (0 is north, +CW).
+ * @param {Number} [options.azimuthMax=360.0] The maximum azimuth in degrees (0 is north, +CW).
+ * @param {Number} [options.elevationMin=-90.0] The minimum elevation in degrees (0 is tangential to earth surface, +UP).
+ * @param {Number} [options.elevationMax=90.0] The maximum elevation in degrees (0 is tangential to earth surface, +UP).
* @param {Number} [options.stackPartitions=64] The number of times to partition the ellipsoid into stacks.
* @param {Number} [options.slicePartitions=64] The number of times to partition the ellipsoid into radial slices.
* @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
@@ -70,8 +75,13 @@ define([
options = defaultValue(options, defaultValue.EMPTY_OBJECT);
var radii = defaultValue(options.radii, defaultRadii);
- var stackPartitions = Math.round(defaultValue(options.stackPartitions, 64));
- var slicePartitions = Math.round(defaultValue(options.slicePartitions, 64));
+ var innerRadii = defaultValue(options.innerRadii, radii);
+ var azimuthMin = defaultValue(options.azimuthMin, 0);
+ var azimuthMax = defaultValue(options.azimuthMax, 360);
+ var elevationMin = defaultValue(options.elevationMin, -90);
+ var elevationMax = defaultValue(options.elevationMax, 90);
+ var stackPartitions = defaultValue(options.stackPartitions, 64);
+ var slicePartitions = defaultValue(options.slicePartitions, 64);
var vertexFormat = defaultValue(options.vertexFormat, VertexFormat.DEFAULT);
//>>includeStart('debug', pragmas.debug);
@@ -84,6 +94,11 @@ define([
//>>includeEnd('debug');
this._radii = Cartesian3.clone(radii);
+ this._innerRadii = Cartesian3.clone(innerRadii);
+ this._azimuthMin = azimuthMin;
+ this._azimuthMax = azimuthMax;
+ this._elevationMin = elevationMin;
+ this._elevationMax = elevationMax;
this._stackPartitions = stackPartitions;
this._slicePartitions = slicePartitions;
this._vertexFormat = VertexFormat.clone(vertexFormat);
@@ -94,7 +109,7 @@ define([
* The number of elements used to pack the object into an array.
* @type {Number}
*/
- EllipsoidGeometry.packedLength = Cartesian3.packedLength + VertexFormat.packedLength + 2;
+ EllipsoidGeometry.packedLength = 2 * (Cartesian3.packedLength) + VertexFormat.packedLength + 6;
/**
* Stores the provided instance into the provided array.
@@ -120,20 +135,33 @@ define([
Cartesian3.pack(value._radii, array, startingIndex);
startingIndex += Cartesian3.packedLength;
+ Cartesian3.pack(value._innerRadii, array, startingIndex);
+ startingIndex += Cartesian3.packedLength;
+
VertexFormat.pack(value._vertexFormat, array, startingIndex);
startingIndex += VertexFormat.packedLength;
+ array[startingIndex++] = value._azimuthMin;
+ array[startingIndex++] = value._azimuthMax;
+ array[startingIndex++] = value._elevationMin;
+ array[startingIndex++] = value._elevationMax;
array[startingIndex++] = value._stackPartitions;
- array[startingIndex] = value._slicePartitions;
+ array[startingIndex++] = value._slicePartitions;
return array;
};
var scratchRadii = new Cartesian3();
+ var scratchInnerRadii = new Cartesian3();
var scratchVertexFormat = new VertexFormat();
var scratchOptions = {
radii : scratchRadii,
+ innerRadii : scratchInnerRadii,
vertexFormat : scratchVertexFormat,
+ azimuthMin : undefined,
+ azimuthMax : undefined,
+ elevationMin : undefined,
+ elevationMax : undefined,
stackPartitions : undefined,
slicePartitions : undefined
};
@@ -158,20 +186,36 @@ define([
var radii = Cartesian3.unpack(array, startingIndex, scratchRadii);
startingIndex += Cartesian3.packedLength;
+ var innerRadii = Cartesian3.unpack(array, startingIndex, scratchInnerRadii);
+ startingIndex += Cartesian3.packedLength;
+
var vertexFormat = VertexFormat.unpack(array, startingIndex, scratchVertexFormat);
startingIndex += VertexFormat.packedLength;
+ var azimuthMin = array[startingIndex++];
+ var azimuthMax = array[startingIndex++];
+ var elevationMin = array[startingIndex++];
+ var elevationMax = array[startingIndex++];
var stackPartitions = array[startingIndex++];
- var slicePartitions = array[startingIndex];
+ var slicePartitions = array[startingIndex++];
if (!defined(result)) {
+ scratchOptions.azimuthMin = azimuthMin;
+ scratchOptions.azimuthMax = azimuthMax;
+ scratchOptions.elevationMin = elevationMin;
+ scratchOptions.elevationMax = elevationMax;
scratchOptions.stackPartitions = stackPartitions;
scratchOptions.slicePartitions = slicePartitions;
return new EllipsoidGeometry(scratchOptions);
}
result._radii = Cartesian3.clone(radii, result._radii);
+ result._innerRadii = Cartesian3.clone(innerRadii, result._innerRadii);
result._vertexFormat = VertexFormat.clone(vertexFormat, result._vertexFormat);
+ result._azimuthMin = azimuthMin;
+ result._azimuthMax = azimuthMax;
+ result._elevationMin = elevationMin;
+ result._elevationMax = elevationMax;
result._stackPartitions = stackPartitions;
result._slicePartitions = slicePartitions;
@@ -186,24 +230,71 @@ define([
*/
EllipsoidGeometry.createGeometry = function(ellipsoidGeometry) {
var radii = ellipsoidGeometry._radii;
-
if ((radii.x <= 0) || (radii.y <= 0) || (radii.z <= 0)) {
return;
}
+ var innerRadii = ellipsoidGeometry._innerRadii;
+ if ((innerRadii.x <= 0) || (innerRadii.y <= 0) || innerRadii.z <= 0) {
+ return;
+ }
+
+ // The azimuth input assumes 0 is north with CW+. The geometry uses an
+ // ENU frame where 0 is east with CCW+. We have to convert the azimuth
+ // to ENU here.
+ var azMin = 450.0 - ellipsoidGeometry._azimuthMax;
+ var azMax = 450.0 - ellipsoidGeometry._azimuthMin;
+
+ var azimuthMin = azMin * Math.PI / 180.0;
+ var azimuthMax = azMax * Math.PI / 180.0;
+ var elevationMin = ellipsoidGeometry._elevationMin * Math.PI / 180.0;
+ var elevationMax = ellipsoidGeometry._elevationMax * Math.PI / 180.0;
+ var inclination1 = (Math.PI / 2.0 - elevationMax);
+ var inclination2 = (Math.PI / 2.0 - elevationMin);
+
var ellipsoid = Ellipsoid.fromCartesian3(radii);
var vertexFormat = ellipsoidGeometry._vertexFormat;
- // The extra slice and stack are for duplicating points at the x axis and poles.
- // We need the texture coordinates to interpolate from (2 * pi - delta) to 2 * pi instead of
- // (2 * pi - delta) to 0.
- var slicePartitions = ellipsoidGeometry._slicePartitions + 1;
- var stackPartitions = ellipsoidGeometry._stackPartitions + 1;
+ var slicePartitions = Math.round(ellipsoidGeometry._slicePartitions * Math.abs(azimuthMax - azimuthMin) / CesiumMath.TWO_PI);
+ var stackPartitions = Math.round(ellipsoidGeometry._stackPartitions * Math.abs(elevationMax - elevationMin) / CesiumMath.TWO_PI);
+ if (slicePartitions < 2) {
+ slicePartitions = 2;
+ }
+ if (stackPartitions < 2) {
+ stackPartitions = 2;
+ }
+
+ // Allow for extra indices if there is an inner surface and if we need
+ // to close the sides if the azimuth range is not a full circle
+ var extraIndices = 0;
+ var vertexMultiplier = 1.0;
+ var hasInnerSurface = ((innerRadii.x !== radii.x) || (innerRadii.y !== radii.y) || innerRadii.z !== radii.z);
+ var isTopOpen = false;
+ var isBotOpen = false;
+ var isAzimuthOpen = false;
+ if (hasInnerSurface) {
+ vertexMultiplier = 2.0;
+ if (ellipsoidGeometry._elevationMax < 90.0) {
+ isTopOpen = true;
+ extraIndices += (slicePartitions - 1);
+ }
+ if (ellipsoidGeometry._elevationMin > -90.0) {
+ isBotOpen = true;
+ extraIndices += (slicePartitions - 1);
+ }
+ if ((azimuthMax - azimuthMin) % CesiumMath.TWO_PI) {
+ isAzimuthOpen = true;
+ extraIndices += ((stackPartitions - 1) * 2) + 1;
+ } else {
+ extraIndices += 1;
+ }
+ }
- var vertexCount = stackPartitions * slicePartitions;
+ var vertexCount = stackPartitions * slicePartitions * vertexMultiplier;
var positions = new Float64Array(vertexCount * 3);
- var numIndices = 6 * (slicePartitions - 1) * (stackPartitions - 2);
+ // Multiply by 6 because there are two triangles per sector
+ var numIndices = 6 * (vertexCount + extraIndices + 1 - (slicePartitions + stackPartitions) * vertexMultiplier);
var indices = IndexDatatype.createTypedArray(vertexCount, numIndices);
var normals = (vertexFormat.normal) ? new Float32Array(vertexCount * 3) : undefined;
@@ -211,46 +302,147 @@ define([
var bitangents = (vertexFormat.bitangent) ? new Float32Array(vertexCount * 3) : undefined;
var st = (vertexFormat.st) ? new Float32Array(vertexCount * 2) : undefined;
- var cosTheta = new Array(slicePartitions);
- var sinTheta = new Array(slicePartitions);
-
var i;
var j;
+ var theta;
+ var phi;
var index = 0;
+ // Calculate sin/cos phi
+ var sinPhi = new Array(stackPartitions);
+ var cosPhi = new Array(stackPartitions);
+ for (i = 0; i < stackPartitions; i++) {
+ phi = inclination1 + i * (inclination2 - inclination1) / (stackPartitions - 1);
+ sinPhi[i] = sin(phi);
+ cosPhi[i] = cos(phi);
+ }
+
+ // Calculate sin/cos theta
+ var sinTheta = new Array(slicePartitions);
+ var cosTheta = new Array(slicePartitions);
for (i = 0; i < slicePartitions; i++) {
- var theta = CesiumMath.TWO_PI * i / (slicePartitions - 1);
+ theta = azimuthMin + i * (azimuthMax - azimuthMin) / (slicePartitions - 1);
cosTheta[i] = cos(theta);
sinTheta[i] = sin(theta);
+ }
+
+ // Create outer surface
+ for (i = 0; i < stackPartitions; i++) {
+ for (j = 0; j < slicePartitions; j++) {
+ positions[index++] = radii.x * sinPhi[i] * cosTheta[j];
+ positions[index++] = radii.y * sinPhi[i] * sinTheta[j];
+ positions[index++] = radii.z * cosPhi[i];
+ }
+ }
- // duplicate first point for correct
- // texture coordinates at the north pole.
- positions[index++] = 0.0;
- positions[index++] = 0.0;
- positions[index++] = radii.z;
+ // Create inner surface
+ if (hasInnerSurface) {
+ for (i = 0; i < stackPartitions; i++) {
+ for (j = 0; j < slicePartitions; j++) {
+ positions[index++] = innerRadii.x * sinPhi[i] * cosTheta[j];
+ positions[index++] = innerRadii.y * sinPhi[i] * sinTheta[j];
+ positions[index++] = innerRadii.z * cosPhi[i];
+ }
+ }
}
- for (i = 1; i < stackPartitions - 1; i++) {
- var phi = Math.PI * i / (stackPartitions - 1);
- var sinPhi = sin(phi);
+ // Create indices for outer surface
+ index = 0;
+ var topOffset;
+ var bottomOffset;
+ for (i = 0; i < (stackPartitions - 1); i++) {
+ topOffset = i * slicePartitions;
+ bottomOffset = (i + 1) * slicePartitions;
- var xSinPhi = radii.x * sinPhi;
- var ySinPhi = radii.y * sinPhi;
- var zCosPhi = radii.z * cos(phi);
+ for (j = 0; j < slicePartitions - 1; j++) {
+ indices[index++] = bottomOffset + j;
+ indices[index++] = bottomOffset + j + 1;
+ indices[index++] = topOffset + j + 1;
- for (j = 0; j < slicePartitions; j++) {
- positions[index++] = cosTheta[j] * xSinPhi;
- positions[index++] = sinTheta[j] * ySinPhi;
- positions[index++] = zCosPhi;
+ indices[index++] = bottomOffset + j;
+ indices[index++] = topOffset + j + 1;
+ indices[index++] = topOffset + j;
}
}
- for (i = 0; i < slicePartitions; i++) {
- // duplicate first point for correct
- // texture coordinates at the south pole.
- positions[index++] = 0.0;
- positions[index++] = 0.0;
- positions[index++] = -radii.z;
+ // Create indices for inner surface
+ if (hasInnerSurface) {
+ var offset = stackPartitions * slicePartitions;
+ for (i = 0; i < (stackPartitions - 1); i++) {
+ topOffset = offset + i * slicePartitions;
+ bottomOffset = offset + (i + 1) * slicePartitions;
+
+ for (j = 0; j < slicePartitions - 1; j++) {
+ indices[index++] = topOffset + j;
+ indices[index++] = topOffset + j + 1;
+ indices[index++] = bottomOffset + j;
+
+ indices[index++] = bottomOffset + j;
+ indices[index++] = bottomOffset + j + 1;
+ indices[index++] = topOffset + j + 1;
+ }
+ }
+ }
+
+ if (hasInnerSurface) {
+ if (isTopOpen) {
+ // Connect the top of the inner surface to the top of the outer surface
+ var innerOffset = stackPartitions * slicePartitions;
+ for (i = 0; i < slicePartitions - 1; i++) {
+ indices[index++] = i;
+ indices[index++] = i + 1;
+ indices[index++] = innerOffset + i + 1;
+
+ indices[index++] = i;
+ indices[index++] = innerOffset + i + 1;
+ indices[index++] = innerOffset + i;
+ }
+ }
+
+ if (isBotOpen) {
+ // Connect the bottom of the inner surface to the bottom of the outer surface
+ var outerOffset = stackPartitions * slicePartitions - slicePartitions;
+ innerOffset = stackPartitions * slicePartitions * vertexMultiplier - slicePartitions;
+ for (i = 0; i < slicePartitions - 1; i++) {
+ indices[index++] = outerOffset + i;
+ indices[index++] = outerOffset + i + 1;
+ indices[index++] = innerOffset + i + 1;
+
+ indices[index++] = outerOffset + i;
+ indices[index++] = innerOffset + i;
+ indices[index++] = innerOffset + i + 1;
+ }
+ }
+ }
+
+ // Connect the edges if azimuth is not closed
+ if (isAzimuthOpen) {
+ var outerOffset;
+ var innerOffset = slicePartitions * stackPartitions;
+ for (i = 0; i < stackPartitions - 1; i++) {
+ outerOffset = slicePartitions * i;
+ indices[index++] = outerOffset;
+ indices[index++] = outerOffset + slicePartitions;
+ indices[index++] = innerOffset;
+
+ indices[index++] = outerOffset + slicePartitions;
+ indices[index++] = innerOffset;
+ indices[index++] = innerOffset + slicePartitions;
+ innerOffset += slicePartitions;
+ }
+
+ innerOffset = slicePartitions * stackPartitions + slicePartitions - 1;
+ for (i = 0; i < stackPartitions - 1; i++) {
+ outerOffset = slicePartitions * (i + 1) - 1;
+ indices[index++] = outerOffset;
+ indices[index++] = outerOffset + slicePartitions;
+ indices[index++] = innerOffset;
+
+ indices[index++] = outerOffset + slicePartitions;
+ indices[index++] = innerOffset;
+ indices[index++] = innerOffset + slicePartitions;
+ innerOffset += slicePartitions;
+ }
}
var attributes = new GeometryAttributes();
@@ -358,40 +550,6 @@ define([
}
}
- index = 0;
- for (j = 0; j < slicePartitions - 1; j++) {
- indices[index++] = slicePartitions + j;
- indices[index++] = slicePartitions + j + 1;
- indices[index++] = j + 1;
- }
-
- var topOffset;
- var bottomOffset;
- for (i = 1; i < stackPartitions - 2; i++) {
- topOffset = i * slicePartitions;
- bottomOffset = (i + 1) * slicePartitions;
-
- for (j = 0; j < slicePartitions - 1; j++) {
- indices[index++] = bottomOffset + j;
- indices[index++] = bottomOffset + j + 1;
- indices[index++] = topOffset + j + 1;
-
- indices[index++] = bottomOffset + j;
- indices[index++] = topOffset + j + 1;
- indices[index++] = topOffset + j;
- }
- }
-
- i = stackPartitions - 2;
- topOffset = i * slicePartitions;
- bottomOffset = (i + 1) * slicePartitions;
-
- for (j = 0; j < slicePartitions - 1; j++) {
- indices[index++] = bottomOffset + j;
- indices[index++] = topOffset + j + 1;
- indices[index++] = topOffset + j;
- }
-
return new Geometry({
attributes : attributes,
indices : indices,
From 81d013c5d4fc382513d069bc0bfd829ade2fef74 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Tue, 3 Oct 2017 13:36:52 -0500
Subject: [PATCH 02/62] Update EllipsoidOutlineGeometry.js
Added partial ellipsoid capability.
---
Source/Core/EllipsoidOutlineGeometry.js | 268 ++++++++++++++++++------
1 file changed, 199 insertions(+), 69 deletions(-)
diff --git a/Source/Core/EllipsoidOutlineGeometry.js b/Source/Core/EllipsoidOutlineGeometry.js
index 888a700442b3..7c35abcd7ca0 100644
--- a/Source/Core/EllipsoidOutlineGeometry.js
+++ b/Source/Core/EllipsoidOutlineGeometry.js
@@ -40,6 +40,11 @@ define([
*
* @param {Object} [options] Object with the following properties:
* @param {Cartesian3} [options.radii=Cartesian3(1.0, 1.0, 1.0)] The radii of the ellipsoid in the x, y, and z directions.
+ * @param {Cartesian3} [options.innerRadii=options.radii] The inner radii of the ellipsoid in the x, y, and z directions.
+ * @param {Number} [options.azimuthMin=0.0] The minimum azimuth in degrees (0 is north, +CW).
+ * @param {Number} [options.azimuthMax=360.0] The maximum azimuth in degrees (0 is north, +CW).
+ * @param {Number} [options.elevationMin=-90.0] The minimum elevation in degrees (0 is tangential to earth surface, +UP).
+ * @param {Number} [options.elevationMax=90.0] The maximum elevation in degrees (0 is tangential to earth surface, +UP).
* @param {Number} [options.stackPartitions=10] The count of stacks for the ellipsoid (1 greater than the number of parallel lines).
* @param {Number} [options.slicePartitions=8] The count of slices for the ellipsoid (Equal to the number of radial lines).
* @param {Number} [options.subdivisions=128] The number of points per line, determining the granularity of the curvature.
@@ -60,9 +65,14 @@ define([
options = defaultValue(options, defaultValue.EMPTY_OBJECT);
var radii = defaultValue(options.radii, defaultRadii);
- var stackPartitions = Math.round(defaultValue(options.stackPartitions, 10));
- var slicePartitions = Math.round(defaultValue(options.slicePartitions, 8));
- var subdivisions = Math.round(defaultValue(options.subdivisions, 128));
+ var innerRadii = defaultValue(options.innerRadii, radii);
+ var azimuthMin = defaultValue(options.azimuthMin, 0);
+ var azimuthMax = defaultValue(options.azimuthMax, 360);
+ var elevationMin = defaultValue(options.elevationMin, -90);
+ var elevationMax = defaultValue(options.elevationMax, 90);
+ var stackPartitions = defaultValue(options.stackPartitions, 10);
+ var slicePartitions = defaultValue(options.slicePartitions, 8);
+ var subdivisions = defaultValue(options.subdivisions, 128);
//>>includeStart('debug', pragmas.debug);
if (stackPartitions < 1) {
@@ -77,6 +87,11 @@ define([
//>>includeEnd('debug');
this._radii = Cartesian3.clone(radii);
+ this._innerRadii = Cartesian3.clone(innerRadii);
+ this._azimuthMin = azimuthMin;
+ this._azimuthMax = azimuthMax;
+ this._elevationMin = elevationMin;
+ this._elevationMax = elevationMax;
this._stackPartitions = stackPartitions;
this._slicePartitions = slicePartitions;
this._subdivisions = subdivisions;
@@ -87,7 +102,7 @@ define([
* The number of elements used to pack the object into an array.
* @type {Number}
*/
- EllipsoidOutlineGeometry.packedLength = Cartesian3.packedLength + 3;
+ EllipsoidOutlineGeometry.packedLength = 2 * (Cartesian3.packedLength) + 7;
/**
* Stores the provided instance into the provided array.
@@ -113,16 +128,29 @@ define([
Cartesian3.pack(value._radii, array, startingIndex);
startingIndex += Cartesian3.packedLength;
+ Cartesian3.pack(value._innerRadii, array, startingIndex);
+ startingIndex += Cartesian3.packedLength;
+
+ array[startingIndex++] = value._azimuthMin;
+ array[startingIndex++] = value._azimuthMax;
+ array[startingIndex++] = value._elevationMin;
+ array[startingIndex++] = value._elevationMax;
array[startingIndex++] = value._stackPartitions;
array[startingIndex++] = value._slicePartitions;
- array[startingIndex] = value._subdivisions;
+ array[startingIndex++] = value._subdivisions;
return array;
};
var scratchRadii = new Cartesian3();
+ var scratchInnerRadii = new Cartesian3();
var scratchOptions = {
radii : scratchRadii,
+ innerRadii : scratchInnerRadii,
+ azimuthMin : undefined,
+ azimuthMax : undefined,
+ elevationMin : undefined,
+ elevationMax : undefined,
stackPartitions : undefined,
slicePartitions : undefined,
subdivisions : undefined
@@ -148,11 +176,22 @@ define([
var radii = Cartesian3.unpack(array, startingIndex, scratchRadii);
startingIndex += Cartesian3.packedLength;
+ var innerRadii = Cartesian3.unpack(array, startingIndex, scratchInnerRadii);
+ startingIndex += Cartesian3.packedLength;
+
+ var azimuthMin = array[startingIndex++];
+ var azimuthMax = array[startingIndex++];
+ var elevationMin = array[startingIndex++];
+ var elevationMax = array[startingIndex++];
var stackPartitions = array[startingIndex++];
var slicePartitions = array[startingIndex++];
var subdivisions = array[startingIndex++];
if (!defined(result)) {
+ scratchOptions.azimuthMin = azimuthMin;
+ scratchOptions.azimuthMax = azimuthMax;
+ scratchOptions.elevationMin = elevationMin;
+ scratchOptions.elevationMax = elevationMax;
scratchOptions.stackPartitions = stackPartitions;
scratchOptions.slicePartitions = slicePartitions;
scratchOptions.subdivisions = subdivisions;
@@ -160,6 +199,11 @@ define([
}
result._radii = Cartesian3.clone(radii, result._radii);
+ result._innerRadii = Cartesian3.clone(innerRadii, result._innerRadii);
+ result._azimuthMin = azimuthMin;
+ result._azimuthMax = azimuthMax;
+ result._elevationMin = elevationMin;
+ result._elevationMax = elevationMax;
result._stackPartitions = stackPartitions;
result._slicePartitions = slicePartitions;
result._subdivisions = subdivisions;
@@ -175,112 +219,198 @@ define([
*/
EllipsoidOutlineGeometry.createGeometry = function(ellipsoidGeometry) {
var radii = ellipsoidGeometry._radii;
-
if ((radii.x <= 0) || (radii.y <= 0) || (radii.z <= 0)) {
return;
}
+ var innerRadii = ellipsoidGeometry._innerRadii;
+ if ((innerRadii.x <= 0) || (innerRadii.y <= 0) || (innerRadii.z <= 0)) {
+ return;
+ }
+
+ // The azimuth input assumes 0 is north with CW+. The geometry uses an
+ // ENU frame where 0 is east with CCW+. We have to convert the azimuth
+ // to ENU here.
+ var azMin = 450.0 - ellipsoidGeometry._azimuthMax;
+ var azMax = 450.0 - ellipsoidGeometry._azimuthMin;
+
+ var azimuthMin = azMin * Math.PI / 180.0;
+ var azimuthMax = azMax * Math.PI / 180.0;
+ var elevationMin = ellipsoidGeometry._elevationMin * Math.PI / 180.0;
+ var elevationMax = ellipsoidGeometry._elevationMax * Math.PI / 180.0;
+ var inclination1 = (Math.PI / 2.0 - elevationMax);
+ var inclination2 = (Math.PI / 2.0 - elevationMin);
+
var ellipsoid = Ellipsoid.fromCartesian3(radii);
- var stackPartitions = ellipsoidGeometry._stackPartitions;
- var slicePartitions = ellipsoidGeometry._slicePartitions;
var subdivisions = ellipsoidGeometry._subdivisions;
- var indicesSize = subdivisions * (stackPartitions + slicePartitions - 1);
- var positionSize = indicesSize - slicePartitions + 2;
- var positions = new Float64Array(positionSize * 3);
- var indices = IndexDatatype.createTypedArray(positionSize, indicesSize * 2);
+ var slicePartitions = Math.round(ellipsoidGeometry._slicePartitions * Math.abs(azimuthMax - azimuthMin) / CesiumMath.TWO_PI);
+ var stackPartitions = Math.round(ellipsoidGeometry._stackPartitions * Math.abs(elevationMax - elevationMin) / CesiumMath.TWO_PI);
+ if (slicePartitions < 2) {
+ slicePartitions = 2;
+ }
+ if (stackPartitions < 2) {
+ stackPartitions = 2;
+ }
+
+ var extraIndices = 0;
+ var vertexMultiplier = 1.0;
+ var hasInnerSurface = ((innerRadii.x !== radii.x) || (innerRadii.y !== radii.y) || innerRadii.z !== radii.z);
+ var isTopOpen = false;
+ var isBotOpen = false;
+ if (hasInnerSurface) {
+ vertexMultiplier = 2.0;
+ // Add 2x slicePartitions to connect the top/bottom of the outer to
+ // the top/bottom of the inner
+ if (ellipsoidGeometry._elevationMax < 90.0) {
+ isTopOpen = true;
+ extraIndices += slicePartitions;
+ }
+ if (ellipsoidGeometry._elevationMin > -90.0) {
+ isBotOpen = true;
+ extraIndices += slicePartitions;
+ }
+ }
+
+ var vertexCount = subdivisions * vertexMultiplier * (stackPartitions + slicePartitions);
+ var positions = new Float64Array(vertexCount * 3);
+
+ // Multiply by two because two points define each line segment
+ var numIndices = 2 * (vertexCount + extraIndices - (slicePartitions + stackPartitions) * vertexMultiplier);
+ var indices = IndexDatatype.createTypedArray(vertexCount, numIndices);
var i;
var j;
var theta;
var phi;
- var cosPhi;
- var sinPhi;
var index = 0;
- var cosTheta = new Array(subdivisions);
+ // Calculate sin/cos phi
+ var sinPhi = new Array(stackPartitions);
+ var cosPhi = new Array(stackPartitions);
+ for (i = 0; i < stackPartitions; i++) {
+ phi = inclination1 + i * (inclination2 - inclination1) / (stackPartitions - 1);
+ sinPhi[i] = sin(phi);
+ cosPhi[i] = cos(phi);
+ }
+
+ // Calculate sin/cos theta
var sinTheta = new Array(subdivisions);
+ var cosTheta = new Array(subdivisions);
for (i = 0; i < subdivisions; i++) {
- theta = CesiumMath.TWO_PI * i / subdivisions;
- cosTheta[i] = cos(theta);
+ theta = azimuthMin + i * (azimuthMax - azimuthMin) / (subdivisions - 1);
sinTheta[i] = sin(theta);
+ cosTheta[i] = cos(theta);
}
- for (i = 1; i < stackPartitions; i++) {
- phi = Math.PI * i / stackPartitions;
- cosPhi = cos(phi);
- sinPhi = sin(phi);
-
+ // Calculate the latitude lines on the outer surface
+ for (i = 0; i < stackPartitions; i++) {
for (j = 0; j < subdivisions; j++) {
- positions[index++] = radii.x * cosTheta[j] * sinPhi;
- positions[index++] = radii.y * sinTheta[j] * sinPhi;
- positions[index++] = radii.z * cosPhi;
+ positions[index++] = radii.x * sinPhi[i] * cosTheta[j];
+ positions[index++] = radii.y * sinPhi[i] * sinTheta[j];
+ positions[index++] = radii.z * cosPhi[i];
}
}
- cosTheta.length = slicePartitions;
+ // Calculate the latitude lines on the inner surface
+ if (hasInnerSurface) {
+ for (i = 0; i < stackPartitions; i++) {
+ for (j = 0; j < subdivisions; j++) {
+ positions[index++] = innerRadii.x * sinPhi[i] * cosTheta[j];
+ positions[index++] = innerRadii.y * sinPhi[i] * sinTheta[j];
+ positions[index++] = innerRadii.z * cosPhi[i];
+ }
+ }
+ }
+
+ // Calculate sin/cos phi
+ sinPhi.length = subdivisions;
+ cosPhi.length = subdivisions;
+ for (i = 0; i < subdivisions; i++) {
+ phi = inclination1 + i * (inclination2 - inclination1) / (subdivisions - 1);
+ sinPhi[i] = sin(phi);
+ cosPhi[i] = cos(phi);
+ }
+
+ // Calculate sin/cos theta for each slice partition
sinTheta.length = slicePartitions;
+ cosTheta.length = slicePartitions;
for (i = 0; i < slicePartitions; i++) {
- theta = CesiumMath.TWO_PI * i / slicePartitions;
- cosTheta[i] = cos(theta);
+ theta = azimuthMin + i * (azimuthMax - azimuthMin) / (slicePartitions - 1);
sinTheta[i] = sin(theta);
+ cosTheta[i] = cos(theta);
}
- positions[index++] = 0;
- positions[index++] = 0;
- positions[index++] = radii.z;
-
- for (i = 1; i < subdivisions; i++) {
- phi = Math.PI * i / subdivisions;
- cosPhi = cos(phi);
- sinPhi = sin(phi);
-
+ // Calculate the longitude lines on the outer surface
+ for (i = 0; i < subdivisions; i++) {
for (j = 0; j < slicePartitions; j++) {
- positions[index++] = radii.x * cosTheta[j] * sinPhi;
- positions[index++] = radii.y * sinTheta[j] * sinPhi;
- positions[index++] = radii.z * cosPhi;
+ positions[index++] = radii.x * sinPhi[i] * cosTheta[j];
+ positions[index++] = radii.y * sinPhi[i] * sinTheta[j];
+ positions[index++] = radii.z * cosPhi[i];
}
}
- positions[index++] = 0;
- positions[index++] = 0;
- positions[index++] = -radii.z;
+ // Calculate the longitude lines on the inner surface
+ if (hasInnerSurface) {
+ for (i = 0; i < subdivisions; i++) {
+ for (j = 0; j < slicePartitions; j++) {
+ positions[index++] = innerRadii.x * sinPhi[i] * cosTheta[j];
+ positions[index++] = innerRadii.y * sinPhi[i] * sinTheta[j];
+ positions[index++] = innerRadii.z * cosPhi[i];
+ }
+ }
+ }
+ // Create indices for the latitude lines
index = 0;
- for (i = 0; i < stackPartitions - 1; ++i) {
- var topRowOffset = (i * subdivisions);
- for (j = 0; j < subdivisions - 1; ++j) {
- indices[index++] = topRowOffset + j;
- indices[index++] = topRowOffset + j + 1;
+ for (i = 0; i < stackPartitions*vertexMultiplier; i++) {
+ var topOffset = i * subdivisions;
+ for (j = 0; j < subdivisions - 1; j++) {
+ indices[index++] = topOffset + j;
+ indices[index++] = topOffset + j + 1;
}
-
- indices[index++] = topRowOffset + subdivisions - 1;
- indices[index++] = topRowOffset;
}
- var sliceOffset = subdivisions * (stackPartitions - 1);
- for (j = 1; j < slicePartitions + 1; ++j) {
- indices[index++] = sliceOffset;
- indices[index++] = sliceOffset + j;
+ // Create indices for the outer longitude lines
+ var offset = stackPartitions * subdivisions * vertexMultiplier;
+ for (i = 0; i < slicePartitions; i++) {
+ for (j = 0; j < subdivisions - 1; j++) {
+ indices[index++] = offset + i + (j * slicePartitions);
+ indices[index++] = offset + i + (j + 1) * slicePartitions;
+ }
}
- for (i = 0; i < subdivisions - 2; ++i) {
- var topOffset = (i * slicePartitions) + 1 + sliceOffset;
- var bottomOffset = ((i + 1) * slicePartitions) + 1 + sliceOffset;
-
- for (j = 0; j < slicePartitions - 1; ++j) {
- indices[index++] = bottomOffset + j;
- indices[index++] = topOffset + j;
+ // Create indices for the inner longitude lines
+ if (hasInnerSurface) {
+ offset = stackPartitions * subdivisions * vertexMultiplier + slicePartitions * subdivisions;
+ for (i = 0; i < slicePartitions; i++) {
+ for (j = 0; j < subdivisions - 1; j++) {
+ indices[index++] = offset + i + (j * slicePartitions);
+ indices[index++] = offset + i + (j + 1) * slicePartitions;
+ }
}
-
- indices[index++] = bottomOffset + slicePartitions - 1;
- indices[index++] = topOffset + slicePartitions - 1;
}
- var lastPosition = positions.length / 3 - 1;
- for (j = lastPosition - 1; j > lastPosition - slicePartitions - 1; --j) {
- indices[index++] = lastPosition;
- indices[index++] = j;
+ if (hasInnerSurface) {
+ var outerOffset = stackPartitions * subdivisions * vertexMultiplier;
+ var innerOffset = outerOffset + (subdivisions * slicePartitions);
+ if (isTopOpen) {
+ // Draw lines from the top of the inner surface to the top of the outer surface
+ for (i = 0; i < slicePartitions; i++) {
+ indices[index++] = outerOffset + i;
+ indices[index++] = innerOffset + i;
+ }
+ }
+
+ if (isBotOpen) {
+ // Draw lines from the top of the inner surface to the top of the outer surface
+ outerOffset += (subdivisions * slicePartitions) - slicePartitions;
+ innerOffset += (subdivisions * slicePartitions) - slicePartitions;
+ for (i = 0; i < slicePartitions; i++) {
+ indices[index++] = outerOffset + i;
+ indices[index++] = innerOffset + i;
+ }
+ }
}
var attributes = new GeometryAttributes({
From e379f89d889742e62205af1d595230627561c3e7 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Tue, 3 Oct 2017 13:42:04 -0500
Subject: [PATCH 03/62] Update CzmlDataSource.js
Added partial ellipsoid capability.
---
Source/DataSources/CzmlDataSource.js | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/Source/DataSources/CzmlDataSource.js b/Source/DataSources/CzmlDataSource.js
index eee6518fc964..6ecc89766b4e 100644
--- a/Source/DataSources/CzmlDataSource.js
+++ b/Source/DataSources/CzmlDataSource.js
@@ -1522,6 +1522,11 @@ define([
processPacketData(Boolean, ellipsoid, 'show', ellipsoidData.show, interval, sourceUri, entityCollection, query);
processPacketData(Cartesian3, ellipsoid, 'radii', ellipsoidData.radii, interval, sourceUri, entityCollection, query);
+ processPacketData(Cartesian3, ellipsoid, 'innerRadii', ellipsoidData.innerRadii, interval, sourceUri, entityCollection);
+ processPacketData(Number, ellipsoid, 'azimuthMin', ellipsoidData.azimuthMin, interval, sourceUri, entityCollection);
+ processPacketData(Number, ellipsoid, 'azimuthMax', ellipsoidData.azimuthMax, interval, sourceUri, entityCollection);
+ processPacketData(Number, ellipsoid, 'elevationMin', ellipsoidData.elevationMin, interval, sourceUri, entityCollection);
+ processPacketData(Number, ellipsoid, 'elevationMax', ellipsoidData.elevationMax, interval, sourceUri, entityCollection);
processPacketData(Boolean, ellipsoid, 'fill', ellipsoidData.fill, interval, sourceUri, entityCollection, query);
processMaterialPacketData(ellipsoid, 'material', ellipsoidData.material, interval, sourceUri, entityCollection, query);
processPacketData(Boolean, ellipsoid, 'outline', ellipsoidData.outline, interval, sourceUri, entityCollection, query);
From 899ed31d4dde783cc20c1120d64568b34268420c Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Tue, 3 Oct 2017 13:43:25 -0500
Subject: [PATCH 04/62] Update EllipsoidGeometryUpdater.js
Added partial ellipsoid capability.
---
.../DataSources/EllipsoidGeometryUpdater.js | 26 ++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/Source/DataSources/EllipsoidGeometryUpdater.js b/Source/DataSources/EllipsoidGeometryUpdater.js
index 5334661ca1d7..a23430af0e7b 100644
--- a/Source/DataSources/EllipsoidGeometryUpdater.js
+++ b/Source/DataSources/EllipsoidGeometryUpdater.js
@@ -72,6 +72,11 @@ define([
this.id = entity;
this.vertexFormat = undefined;
this.radii = undefined;
+ this.innerRadii = undefined;
+ this.azimuthMin = undefined;
+ this.azimuthMax = undefined;
+ this.elevationMin = undefined;
+ this.elevationMax = undefined;
this.stackPartitions = undefined;
this.slicePartitions = undefined;
this.subdivisions = undefined;
@@ -407,7 +412,7 @@ define([
return new GeometryInstance({
id : entity,
geometry : new EllipsoidOutlineGeometry(this._options),
- modelMatrix : entity.computeModelMatrix(Iso8601.MINIMUM_VALUE),
+ modelMatrix : entity.computetModelMatrix(Iso8601.MINIMUM_VALUE),
attributes : {
show : new ShowGeometryInstanceAttribute(isAvailable && entity.isShowing && this._showProperty.getValue(time) && this._showOutlineProperty.getValue(time)),
color : ColorGeometryInstanceAttribute.fromColor(outlineColor),
@@ -496,14 +501,28 @@ define([
this._fillEnabled = fillEnabled;
this._outlineEnabled = outlineEnabled;
+ var innerRadii = ellipsoid.innerRadii;
+ var azimuthMin = ellipsoid.azimuthMin;
+ var azimuthMax = ellipsoid.azimuthMax;
+ var elevationMin = ellipsoid.elevationMin;
+ var elevationMax = ellipsoid.elevationMax;
var stackPartitions = ellipsoid.stackPartitions;
var slicePartitions = ellipsoid.slicePartitions;
var outlineWidth = ellipsoid.outlineWidth;
var subdivisions = ellipsoid.subdivisions;
+ if (!defined(innerRadii)) {
+ innerRadii = radii;
+ }
+
if (!position.isConstant || //
!Property.isConstant(entity.orientation) || //
!radii.isConstant || //
+ !innerRadii.isConstant || //
+ !Property.isConstant(azimuthMin) || //
+ !Property.isConstant(azimuthMax) || //
+ !Property.isConstant(elevationMin) || //
+ !Property.isConstant(elevationMax) || //
!Property.isConstant(stackPartitions) || //
!Property.isConstant(slicePartitions) || //
!Property.isConstant(outlineWidth) || //
@@ -516,6 +535,11 @@ define([
var options = this._options;
options.vertexFormat = isColorMaterial ? PerInstanceColorAppearance.VERTEX_FORMAT : MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat;
options.radii = radii.getValue(Iso8601.MINIMUM_VALUE, options.radii);
+ options.innerRadii = innerRadii.getValue(Iso8601.MINIMUM_VALUE, options.innerRadii);
+ options.azimuthMin = defined(azimuthMin) ? azimuthMin.getValue(Iso8601.MINIMUM_VALUE) : undefined;
+ options.azimuthMax = defined(azimuthMax) ? azimuthMax.getValue(Iso8601.MINIMUM_VALUE) : undefined;
+ options.elevationMin = defined(elevationMin) ? elevationMin.getValue(Iso8601.MINIMUM_VALUE) : undefined;
+ options.elevationMax = defined(elevationMax) ? elevationMax.getValue(Iso8601.MINIMUM_VALUE) : undefined;
options.stackPartitions = defined(stackPartitions) ? stackPartitions.getValue(Iso8601.MINIMUM_VALUE) : undefined;
options.slicePartitions = defined(slicePartitions) ? slicePartitions.getValue(Iso8601.MINIMUM_VALUE) : undefined;
options.subdivisions = defined(subdivisions) ? subdivisions.getValue(Iso8601.MINIMUM_VALUE) : undefined;
From c3ae3ff02c84df0178b35ba5ce364056bba68b3a Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Tue, 3 Oct 2017 13:45:46 -0500
Subject: [PATCH 05/62] Update EllipsoidGeometryUpdater.js
Fixed typo from last commit.
---
Source/DataSources/EllipsoidGeometryUpdater.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Source/DataSources/EllipsoidGeometryUpdater.js b/Source/DataSources/EllipsoidGeometryUpdater.js
index a23430af0e7b..5bb333659d2e 100644
--- a/Source/DataSources/EllipsoidGeometryUpdater.js
+++ b/Source/DataSources/EllipsoidGeometryUpdater.js
@@ -412,7 +412,7 @@ define([
return new GeometryInstance({
id : entity,
geometry : new EllipsoidOutlineGeometry(this._options),
- modelMatrix : entity.computetModelMatrix(Iso8601.MINIMUM_VALUE),
+ modelMatrix : entity.computeModelMatrix(Iso8601.MINIMUM_VALUE),
attributes : {
show : new ShowGeometryInstanceAttribute(isAvailable && entity.isShowing && this._showProperty.getValue(time) && this._showOutlineProperty.getValue(time)),
color : ColorGeometryInstanceAttribute.fromColor(outlineColor),
From 3ff945943d6e53db0dce957744ea531d98b37fae Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Tue, 3 Oct 2017 13:47:03 -0500
Subject: [PATCH 06/62] Update EllipsoidGraphics.js
Added partial ellipsoid capability.
---
Source/DataSources/EllipsoidGraphics.js | 62 ++++++++++++++++++++++++-
1 file changed, 61 insertions(+), 1 deletion(-)
diff --git a/Source/DataSources/EllipsoidGraphics.js b/Source/DataSources/EllipsoidGraphics.js
index e005fd128549..76aaafe82899 100644
--- a/Source/DataSources/EllipsoidGraphics.js
+++ b/Source/DataSources/EllipsoidGraphics.js
@@ -24,6 +24,11 @@ define([
*
* @param {Object} [options] Object with the following properties:
* @param {Property} [options.radii] A {@link Cartesian3} Property specifying the radii of the ellipsoid.
+ * @param {Property} [options.innerRadii] A {@link Cartesian3} Property specifying the inner radii of the ellipsoid.
+ * @param {Property} [options.azimuthMin=0] A Property specifying the minimum azimuth angle of the ellipsoid (0 is north, +CW).
+ * @param {Property} [options.azimuthMax=0] A Property specifying the maximum azimuth angle of the ellipsoid (0 is north, +CW).
+ * @param {Property} [options.elevationMin=0] A Property specifying the minimum elevation angle of the ellipsoid (0 is tangential to earth surface, +UP).
+ * @param {Property} [options.elevationMax=0] A Property specifying the maximum elevation angle of the ellipsoid (0 is tangential to earth surface, +UP).
* @param {Property} [options.show=true] A boolean Property specifying the visibility of the ellipsoid.
* @param {Property} [options.fill=true] A boolean Property specifying whether the ellipsoid is filled with the provided material.
* @param {MaterialProperty} [options.material=Color.WHITE] A Property specifying the material used to fill the ellipsoid.
@@ -43,6 +48,11 @@ define([
this._showSubscription = undefined;
this._radii = undefined;
this._radiiSubscription = undefined;
+ this._innerRadii = undefined;
+ this._azimuthMin = undefined;
+ this._azimuthMax = undefined;
+ this._elevationMin = undefined;
+ this._elevationMax = undefined;
this._material = undefined;
this._materialSubscription = undefined;
this._stackPartitions = undefined;
@@ -97,6 +107,46 @@ define([
*/
radii : createPropertyDescriptor('radii'),
+ /**
+ * Gets or sets the {@link Cartesian3} {@link Property} specifying the inner radii of the ellipsoid.
+ * @memberof EllipsoidGraphics.prototype
+ * @type {Property}
+ * @default radii
+ */
+ innerRadii : createPropertyDescriptor('innerRadii'),
+
+ /**
+ * Gets or sets the Property specifying the minimum azimuth angle in degrees.
+ * @memberof EllipsoidGraphics.prototype
+ * @type {Property}
+ * @default 0.0
+ */
+ azimuthMin : createPropertyDescriptor('azimuthMin'),
+
+ /**
+ * Gets or sets the Property specifying the maximum azimuth angle in degrees.
+ * @memberof EllipsoidGraphics.prototype
+ * @type {Property}
+ * @default 360.0
+ */
+ azimuthMax : createPropertyDescriptor('azimuthMax'),
+
+ /**
+ * Gets or sets the Property specifying the minimum elevation angle in degrees.
+ * @memberof EllipsoidGraphics.prototype
+ * @type {Property}
+ * @default 90.0
+ */
+ elevationMin : createPropertyDescriptor('elevationMin'),
+
+ /**
+ * Gets or sets the Property specifying the maximum elevation angle in degrees.
+ * @memberof EllipsoidGraphics.prototype
+ * @type {Property}
+ * @default -90.0
+ */
+ elevationMax : createPropertyDescriptor('elevationMax'),
+
/**
* Gets or sets the Property specifying the material used to fill the ellipsoid.
* @memberof EllipsoidGraphics.prototype
@@ -146,7 +196,7 @@ define([
stackPartitions : createPropertyDescriptor('stackPartitions'),
/**
- * Gets or sets the Property specifying the number of radial slices.
+ * Gets or sets the Property specifying the number of radial slices per 360 degrees.
* @memberof EllipsoidGraphics.prototype
* @type {Property}
* @default 64
@@ -190,6 +240,11 @@ define([
}
result.show = this.show;
result.radii = this.radii;
+ result.innerRadii = this.innerRadii;
+ result.azimuthMin = this.azimuthMin;
+ result.azimuthMax = this.azimuthMax;
+ result.elevationMin = this.elevationMin;
+ result.elevationMax = this.elevationMax;
result.material = this.material;
result.fill = this.fill;
result.outline = this.outline;
@@ -219,6 +274,11 @@ define([
this.show = defaultValue(this.show, source.show);
this.radii = defaultValue(this.radii, source.radii);
+ this.innerRadii = defaultValue(this.innerRadii, source.innerRadii);
+ this.azimuthMin = defaultValue(this.azimuthMin, source.azimuthMin);
+ this.azimuthMax = defaultValue(this.azimuthMax, source.azimuthMax);
+ this.elevationMin = defaultValue(this.elevationMin, source.elevationMin);
+ this.elevationMax = defaultValue(this.elevationMax, source.elevationMax);
this.material = defaultValue(this.material, source.material);
this.fill = defaultValue(this.fill, source.fill);
this.outline = defaultValue(this.outline, source.outline);
From dd4c52bee8b2f82fe0a141df1637a0fa941e52fe Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Tue, 21 Nov 2017 08:59:50 -0600
Subject: [PATCH 07/62] Added new options in dynamic update function
---
Source/DataSources/EllipsoidGeometryUpdater.js | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/Source/DataSources/EllipsoidGeometryUpdater.js b/Source/DataSources/EllipsoidGeometryUpdater.js
index 5bb333659d2e..06fbf5880d5a 100644
--- a/Source/DataSources/EllipsoidGeometryUpdater.js
+++ b/Source/DataSources/EllipsoidGeometryUpdater.js
@@ -65,6 +65,7 @@ define([
var defaultDistanceDisplayCondition = new ConstantProperty(new DistanceDisplayCondition());
var radiiScratch = new Cartesian3();
+ var innerRadiiScratch = new Cartesian3();
var scratchColor = new Color();
var unitSphere = new Cartesian3(1, 1, 1);
@@ -670,6 +671,18 @@ define([
options.slicePartitions = slicePartitions;
options.subdivisions = subdivisions;
options.radii = in3D ? unitSphere : radii;
+ var innerRadii = Property.getValueOrUndefined(ellipsoid.innerRadii, time, innerRadiiScratch);
+ if (in3D) {
+ var mag = Cartesian3.magnitude(radii);
+ var innerRadiiUnit = new Cartesian3(innerRadii.x/mag, innerRadii.y/mag, innerRadii.z/mag);
+ options.innerRadii = innerRadiiUnit;
+ } else {
+ options.innerRadii = innerRadii;
+ }
+ options.azimuthMin = Property.getValueOrUndefined(ellipsoid.azimuthMin, time);
+ options.azimuthMax = Property.getValueOrUndefined(ellipsoid.azimuthMax, time);
+ options.elevationMin = Property.getValueOrUndefined(ellipsoid.elevationMin, time);
+ options.elevationMax = Property.getValueOrUndefined(ellipsoid.elevationMax, time);
appearance = new MaterialAppearance({
material : material,
From 8ce606afa39b5285cad1c27bfc040c9114ed6f43 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Tue, 21 Nov 2017 09:36:39 -0600
Subject: [PATCH 08/62] Added TODOs where needed
---
Source/Core/EllipsoidGeometry.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index bb0a7eb831a9..e08c156d6e8a 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -465,6 +465,7 @@ define([
var position = Cartesian3.fromArray(positions, i * 3, scratchPosition);
var normal = ellipsoid.geodeticSurfaceNormal(position, scratchNormal);
+ // TODO: this still needs to be updated to work with new geometry logic
if (vertexFormat.st) {
var normalST = Cartesian2.negate(normal, scratchNormalST);
@@ -490,6 +491,7 @@ define([
normals[normalIndex++] = normal.z;
}
+ // TODO: this still needs to be updated to work with new geometry logic
if (vertexFormat.tangent || vertexFormat.bitangent) {
var tangent = scratchTangent;
if (i < slicePartitions || i > vertexCount - slicePartitions - 1) {
From 613dc63fa6e339499a0ec671536558971cd6fc89 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Tue, 21 Nov 2017 10:59:56 -0600
Subject: [PATCH 09/62] Added srtrotter to contributors
---
CONTRIBUTORS.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index a42adfb6892d..0fd58e174d96 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -160,3 +160,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu
* [Cody Guldner](https://github.com/burn123)
* [Florent Cayré](https://github.com/fcayre)
* [Nacho Carnicero](https://github.com/nacho-carnicero)
+* [Steven Trotter](https://github.com/srtrotter)
From 4e373e3ad246cb6f92e62d7161d7a480f6b67f61 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Tue, 21 Nov 2017 11:52:18 -0600
Subject: [PATCH 10/62] Added entry for partial ellipsoid volumes
---
CHANGES.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/CHANGES.md b/CHANGES.md
index 432dff7bc1a0..d384b89ec585 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,5 +1,9 @@
Change Log
==========
+### 1.40 - ...
+
+* Added ability to create partial ellipsoid volumes using new geometry options: inner radii, min/max azimuth, min/max elevation.
+
### 1.38 - 2017-10-02
* Breaking changes
From 18ebf67be82cd64dbb9db0dc5a98c709bee2ab4c Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Wed, 29 Nov 2017 10:21:36 -0600
Subject: [PATCH 11/62] Updated based on feedback
* Renamed variables, e.g. azimuthMin to minimumAzimuth.
* Converted azimuth/elevation inputs from degrees to radians.
* Fixed indices winding order issues.
---
Source/Core/EllipsoidGeometry.js | 112 +++++++++++++++----------------
1 file changed, 56 insertions(+), 56 deletions(-)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index e08c156d6e8a..accb94ceb7f0 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -51,10 +51,10 @@ define([
* @param {Object} [options] Object with the following properties:
* @param {Cartesian3} [options.radii=Cartesian3(1.0, 1.0, 1.0)] The radii of the ellipsoid in the x, y, and z directions.
* @param {Cartesian3} [options.innerRadii=options.radii] The inner radii of the ellipsoid in the x, y, and z directions.
- * @param {Number} [options.azimuthMin=0.0] The minimum azimuth in degrees (0 is north, +CW).
- * @param {Number} [options.azimuthMax=360.0] The maximum azimuth in degrees (0 is north, +CW).
- * @param {Number} [options.elevationMin=-90.0] The minimum elevation in degrees (0 is tangential to earth surface, +UP).
- * @param {Number} [options.elevationMax=90.0] The maximum elevation in degrees (0 is tangential to earth surface, +UP).
+ * @param {Number} [options.minimumAzimuth=0.0] The minimum azimuth in radians (0 is north, +CW).
+ * @param {Number} [options.maximumAzimuth=2*PI] The maximum azimuth in radians (0 is north, +CW).
+ * @param {Number} [options.minimumElevation=-PI/2] The minimum elevation in radians (0 is tangential to earth surface, +UP).
+ * @param {Number} [options.maximumElevation=PI/2] The maximum elevation in radians (0 is tangential to earth surface, +UP).
* @param {Number} [options.stackPartitions=64] The number of times to partition the ellipsoid into stacks.
* @param {Number} [options.slicePartitions=64] The number of times to partition the ellipsoid into radial slices.
* @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
@@ -76,10 +76,10 @@ define([
var radii = defaultValue(options.radii, defaultRadii);
var innerRadii = defaultValue(options.innerRadii, radii);
- var azimuthMin = defaultValue(options.azimuthMin, 0);
- var azimuthMax = defaultValue(options.azimuthMax, 360);
- var elevationMin = defaultValue(options.elevationMin, -90);
- var elevationMax = defaultValue(options.elevationMax, 90);
+ var minimumAzimuth = defaultValue(options.minimumAzimuth, 0);
+ var maximumAzimuth = defaultValue(options.maximumAzimuth, 2.0 * Math.PI);
+ var minimumElevation = defaultValue(options.minimumElevation, -Math.PI / 2.0);
+ var maximumElevation = defaultValue(options.maximumElevation, Math.PI / 2.0);
var stackPartitions = defaultValue(options.stackPartitions, 64);
var slicePartitions = defaultValue(options.slicePartitions, 64);
var vertexFormat = defaultValue(options.vertexFormat, VertexFormat.DEFAULT);
@@ -95,10 +95,10 @@ define([
this._radii = Cartesian3.clone(radii);
this._innerRadii = Cartesian3.clone(innerRadii);
- this._azimuthMin = azimuthMin;
- this._azimuthMax = azimuthMax;
- this._elevationMin = elevationMin;
- this._elevationMax = elevationMax;
+ this._minimumAzimuth = minimumAzimuth;
+ this._maximumAzimuth = maximumAzimuth;
+ this._minimumElevation = minimumElevation;
+ this._maximumElevation = maximumElevation;
this._stackPartitions = stackPartitions;
this._slicePartitions = slicePartitions;
this._vertexFormat = VertexFormat.clone(vertexFormat);
@@ -141,10 +141,10 @@ define([
VertexFormat.pack(value._vertexFormat, array, startingIndex);
startingIndex += VertexFormat.packedLength;
- array[startingIndex++] = value._azimuthMin;
- array[startingIndex++] = value._azimuthMax;
- array[startingIndex++] = value._elevationMin;
- array[startingIndex++] = value._elevationMax;
+ array[startingIndex++] = value._minimumAzimuth;
+ array[startingIndex++] = value._maximumAzimuth;
+ array[startingIndex++] = value._minimumElevation;
+ array[startingIndex++] = value._maximumElevation;
array[startingIndex++] = value._stackPartitions;
array[startingIndex++] = value._slicePartitions;
@@ -158,10 +158,10 @@ define([
radii : scratchRadii,
innerRadii : scratchInnerRadii,
vertexFormat : scratchVertexFormat,
- azimuthMin : undefined,
- azimuthMax : undefined,
- elevationMin : undefined,
- elevationMax : undefined,
+ minimumAzimuth : undefined,
+ maximumAzimuth : undefined,
+ minimumElevation : undefined,
+ maximumElevation : undefined,
stackPartitions : undefined,
slicePartitions : undefined
};
@@ -192,18 +192,18 @@ define([
var vertexFormat = VertexFormat.unpack(array, startingIndex, scratchVertexFormat);
startingIndex += VertexFormat.packedLength;
- var azimuthMin = array[startingIndex++];
- var azimuthMax = array[startingIndex++];
- var elevationMin = array[startingIndex++];
- var elevationMax = array[startingIndex++];
+ var minimumAzimuth = array[startingIndex++];
+ var maximumAzimuth = array[startingIndex++];
+ var minimumElevation = array[startingIndex++];
+ var maximumElevation = array[startingIndex++];
var stackPartitions = array[startingIndex++];
var slicePartitions = array[startingIndex++];
if (!defined(result)) {
- scratchOptions.azimuthMin = azimuthMin;
- scratchOptions.azimuthMax = azimuthMax;
- scratchOptions.elevationMin = elevationMin;
- scratchOptions.elevationMax = elevationMax;
+ scratchOptions.minimumAzimuth = minimumAzimuth;
+ scratchOptions.maximumAzimuth = maximumAzimuth;
+ scratchOptions.minimumElevation = minimumElevation;
+ scratchOptions.maximumElevation = maximumElevation;
scratchOptions.stackPartitions = stackPartitions;
scratchOptions.slicePartitions = slicePartitions;
return new EllipsoidGeometry(scratchOptions);
@@ -212,10 +212,10 @@ define([
result._radii = Cartesian3.clone(radii, result._radii);
result._innerRadii = Cartesian3.clone(innerRadii, result._innerRadii);
result._vertexFormat = VertexFormat.clone(vertexFormat, result._vertexFormat);
- result._azimuthMin = azimuthMin;
- result._azimuthMax = azimuthMax;
- result._elevationMin = elevationMin;
- result._elevationMax = elevationMax;
+ result._minimumAzimuth = minimumAzimuth;
+ result._maximumAzimuth = maximumAzimuth;
+ result._minimumElevation = minimumElevation;
+ result._maximumElevation = maximumElevation;
result._stackPartitions = stackPartitions;
result._slicePartitions = slicePartitions;
@@ -242,21 +242,21 @@ define([
// The azimuth input assumes 0 is north with CW+. The geometry uses an
// ENU frame where 0 is east with CCW+. We have to convert the azimuth
// to ENU here.
- var azMin = 450.0 - ellipsoidGeometry._azimuthMax;
- var azMax = 450.0 - ellipsoidGeometry._azimuthMin;
+ var azMin = (Math.PI * 2.5) - ellipsoidGeometry._maximumAzimuth;
+ var azMax = (Math.PI * 2.5) - ellipsoidGeometry._minimumAzimuth;
- var azimuthMin = azMin * Math.PI / 180.0;
- var azimuthMax = azMax * Math.PI / 180.0;
- var elevationMin = ellipsoidGeometry._elevationMin * Math.PI / 180.0;
- var elevationMax = ellipsoidGeometry._elevationMax * Math.PI / 180.0;
- var inclination1 = (Math.PI / 2.0 - elevationMax);
- var inclination2 = (Math.PI / 2.0 - elevationMin);
+ var minimumAzimuth = azMin;
+ var maximumAzimuth = azMax;
+ var minimumElevation = ellipsoidGeometry._minimumElevation;
+ var maximumElevation = ellipsoidGeometry._maximumElevation;
+ var inclination1 = (Math.PI / 2.0 - maximumElevation);
+ var inclination2 = (Math.PI / 2.0 - minimumElevation);
var ellipsoid = Ellipsoid.fromCartesian3(radii);
var vertexFormat = ellipsoidGeometry._vertexFormat;
- var slicePartitions = Math.round(ellipsoidGeometry._slicePartitions * Math.abs(azimuthMax - azimuthMin) / CesiumMath.TWO_PI);
- var stackPartitions = Math.round(ellipsoidGeometry._stackPartitions * Math.abs(elevationMax - elevationMin) / CesiumMath.TWO_PI);
+ var slicePartitions = Math.round(ellipsoidGeometry._slicePartitions * Math.abs(maximumAzimuth - minimumAzimuth) / CesiumMath.TWO_PI);
+ var stackPartitions = Math.round(ellipsoidGeometry._stackPartitions * Math.abs(maximumElevation - minimumElevation) / CesiumMath.TWO_PI);
if (slicePartitions < 2) {
slicePartitions = 2;
}
@@ -274,15 +274,15 @@ define([
var isAzimuthOpen = false;
if (hasInnerSurface) {
vertexMultiplier = 2.0;
- if (ellipsoidGeometry._elevationMax < 90.0) {
+ if (ellipsoidGeometry._maximumElevation < 90.0) {
isTopOpen = true;
extraIndices += (slicePartitions - 1);
}
- if (ellipsoidGeometry._elevationMin > -90.0) {
+ if (ellipsoidGeometry._minimumElevation > -90.0) {
isBotOpen = true;
extraIndices += (slicePartitions - 1);
}
- if ((azimuthMax - azimuthMin) % CesiumMath.TWO_PI) {
+ if ((maximumAzimuth - minimumAzimuth) % CesiumMath.TWO_PI) {
isAzimuthOpen = true;
extraIndices += ((stackPartitions - 1) * 2) + 1;
} else {
@@ -321,7 +321,7 @@ define([
var sinTheta = new Array(slicePartitions);
var cosTheta = new Array(slicePartitions);
for (i = 0; i < slicePartitions; i++) {
- theta = azimuthMin + i * (azimuthMax - azimuthMin) / (slicePartitions - 1);
+ theta = minimumAzimuth + i * (maximumAzimuth - minimumAzimuth) / (slicePartitions - 1);
cosTheta[i] = cos(theta);
sinTheta[i] = sin(theta);
}
@@ -373,13 +373,13 @@ define([
bottomOffset = offset + (i + 1) * slicePartitions;
for (j = 0; j < slicePartitions - 1; j++) {
+ indices[index++] = bottomOffset + j;
indices[index++] = topOffset + j;
indices[index++] = topOffset + j + 1;
- indices[index++] = bottomOffset + j;
indices[index++] = bottomOffset + j;
- indices[index++] = bottomOffset + j + 1;
indices[index++] = topOffset + j + 1;
+ indices[index++] = bottomOffset + j + 1;
}
}
}
@@ -404,12 +404,12 @@ define([
var outerOffset = stackPartitions * slicePartitions - slicePartitions;
innerOffset = stackPartitions * slicePartitions * vertexMultiplier - slicePartitions;
for (i = 0; i < slicePartitions - 1; i++) {
- indices[index++] = outerOffset + i;
indices[index++] = outerOffset + i + 1;
- indices[index++] = innerOffset + i + 1;
-
indices[index++] = outerOffset + i;
indices[index++] = innerOffset + i;
+
+ indices[index++] = outerOffset + i + 1;
+ indices[index++] = innerOffset + i;
indices[index++] = innerOffset + i + 1;
}
}
@@ -421,26 +421,26 @@ define([
var innerOffset = slicePartitions * stackPartitions;
for (i = 0; i < stackPartitions - 1; i++) {
outerOffset = slicePartitions * i;
- indices[index++] = outerOffset;
- indices[index++] = outerOffset + slicePartitions;
indices[index++] = innerOffset;
-
indices[index++] = outerOffset + slicePartitions;
+ indices[index++] = outerOffset;
+
indices[index++] = innerOffset;
indices[index++] = innerOffset + slicePartitions;
+ indices[index++] = outerOffset + slicePartitions;
innerOffset += slicePartitions;
}
innerOffset = slicePartitions * stackPartitions + slicePartitions - 1;
for (i = 0; i < stackPartitions - 1; i++) {
outerOffset = slicePartitions * (i + 1) - 1;
- indices[index++] = outerOffset;
indices[index++] = outerOffset + slicePartitions;
indices[index++] = innerOffset;
+ indices[index++] = outerOffset;
indices[index++] = outerOffset + slicePartitions;
- indices[index++] = innerOffset;
indices[index++] = innerOffset + slicePartitions;
+ indices[index++] = innerOffset;
innerOffset += slicePartitions;
}
}
From 13ca0f77d325ff11982a0fd2e516d6cf6bc18edf Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Wed, 29 Nov 2017 10:41:27 -0600
Subject: [PATCH 12/62] Updated EllipsoidOutlineGeometry.js based on feedback
* Renamed variables, e.g. azimuthMin to minimumAzimuth.
* Converted input azimuth/elevation from degrees to radians.
---
Source/Core/EllipsoidOutlineGeometry.js | 92 ++++++++++++-------------
1 file changed, 46 insertions(+), 46 deletions(-)
diff --git a/Source/Core/EllipsoidOutlineGeometry.js b/Source/Core/EllipsoidOutlineGeometry.js
index 7c35abcd7ca0..68ad8a3baa1f 100644
--- a/Source/Core/EllipsoidOutlineGeometry.js
+++ b/Source/Core/EllipsoidOutlineGeometry.js
@@ -41,10 +41,10 @@ define([
* @param {Object} [options] Object with the following properties:
* @param {Cartesian3} [options.radii=Cartesian3(1.0, 1.0, 1.0)] The radii of the ellipsoid in the x, y, and z directions.
* @param {Cartesian3} [options.innerRadii=options.radii] The inner radii of the ellipsoid in the x, y, and z directions.
- * @param {Number} [options.azimuthMin=0.0] The minimum azimuth in degrees (0 is north, +CW).
- * @param {Number} [options.azimuthMax=360.0] The maximum azimuth in degrees (0 is north, +CW).
- * @param {Number} [options.elevationMin=-90.0] The minimum elevation in degrees (0 is tangential to earth surface, +UP).
- * @param {Number} [options.elevationMax=90.0] The maximum elevation in degrees (0 is tangential to earth surface, +UP).
+ * @param {Number} [options.minimumAzimuth=0.0] The minimum azimuth in radians (0 is north, +CW).
+ * @param {Number} [options.maximumAzimuth=2*PI] The maximum azimuth in radians (0 is north, +CW).
+ * @param {Number} [options.minimumElevation=-PI/2] The minimum elevation in radians (0 is tangential to earth surface, +UP).
+ * @param {Number} [options.maximumElevation=PI/2] The maximum elevation in radians (0 is tangential to earth surface, +UP).
* @param {Number} [options.stackPartitions=10] The count of stacks for the ellipsoid (1 greater than the number of parallel lines).
* @param {Number} [options.slicePartitions=8] The count of slices for the ellipsoid (Equal to the number of radial lines).
* @param {Number} [options.subdivisions=128] The number of points per line, determining the granularity of the curvature.
@@ -66,10 +66,10 @@ define([
var radii = defaultValue(options.radii, defaultRadii);
var innerRadii = defaultValue(options.innerRadii, radii);
- var azimuthMin = defaultValue(options.azimuthMin, 0);
- var azimuthMax = defaultValue(options.azimuthMax, 360);
- var elevationMin = defaultValue(options.elevationMin, -90);
- var elevationMax = defaultValue(options.elevationMax, 90);
+ var minimumAzimuth = defaultValue(options.minimumAzimuth, 0);
+ var maximumAzimuth = defaultValue(options.maximumAzimuth, CesiumMath.TWO_PI);
+ var minimumElevation = defaultValue(options.minimumElevation, -CesiumMath.PI_OVER_TWO);
+ var maximumElevation = defaultValue(options.maximumElevation, CesiumMath.PI_OVER_TWO);
var stackPartitions = defaultValue(options.stackPartitions, 10);
var slicePartitions = defaultValue(options.slicePartitions, 8);
var subdivisions = defaultValue(options.subdivisions, 128);
@@ -88,10 +88,10 @@ define([
this._radii = Cartesian3.clone(radii);
this._innerRadii = Cartesian3.clone(innerRadii);
- this._azimuthMin = azimuthMin;
- this._azimuthMax = azimuthMax;
- this._elevationMin = elevationMin;
- this._elevationMax = elevationMax;
+ this._minimumAzimuth = minimumAzimuth;
+ this._maximumAzimuth = maximumAzimuth;
+ this._minimumElevation = minimumElevation;
+ this._maximumElevation = maximumElevation;
this._stackPartitions = stackPartitions;
this._slicePartitions = slicePartitions;
this._subdivisions = subdivisions;
@@ -131,10 +131,10 @@ define([
Cartesian3.pack(value._innerRadii, array, startingIndex);
startingIndex += Cartesian3.packedLength;
- array[startingIndex++] = value._azimuthMin;
- array[startingIndex++] = value._azimuthMax;
- array[startingIndex++] = value._elevationMin;
- array[startingIndex++] = value._elevationMax;
+ array[startingIndex++] = value._minimumAzimuth;
+ array[startingIndex++] = value._maximumAzimuth;
+ array[startingIndex++] = value._minimumElevation;
+ array[startingIndex++] = value._maximumElevation;
array[startingIndex++] = value._stackPartitions;
array[startingIndex++] = value._slicePartitions;
array[startingIndex++] = value._subdivisions;
@@ -147,10 +147,10 @@ define([
var scratchOptions = {
radii : scratchRadii,
innerRadii : scratchInnerRadii,
- azimuthMin : undefined,
- azimuthMax : undefined,
- elevationMin : undefined,
- elevationMax : undefined,
+ minimumAzimuth : undefined,
+ maximumAzimuth : undefined,
+ minimumElevation : undefined,
+ maximumElevation : undefined,
stackPartitions : undefined,
slicePartitions : undefined,
subdivisions : undefined
@@ -179,19 +179,19 @@ define([
var innerRadii = Cartesian3.unpack(array, startingIndex, scratchInnerRadii);
startingIndex += Cartesian3.packedLength;
- var azimuthMin = array[startingIndex++];
- var azimuthMax = array[startingIndex++];
- var elevationMin = array[startingIndex++];
- var elevationMax = array[startingIndex++];
+ var minimumAzimuth = array[startingIndex++];
+ var maximumAzimuth = array[startingIndex++];
+ var minimumElevation = array[startingIndex++];
+ var maximumElevation = array[startingIndex++];
var stackPartitions = array[startingIndex++];
var slicePartitions = array[startingIndex++];
var subdivisions = array[startingIndex++];
if (!defined(result)) {
- scratchOptions.azimuthMin = azimuthMin;
- scratchOptions.azimuthMax = azimuthMax;
- scratchOptions.elevationMin = elevationMin;
- scratchOptions.elevationMax = elevationMax;
+ scratchOptions.minimumAzimuth = minimumAzimuth;
+ scratchOptions.maximumAzimuth = maximumAzimuth;
+ scratchOptions.minimumElevation = minimumElevation;
+ scratchOptions.maximumElevation = maximumElevation;
scratchOptions.stackPartitions = stackPartitions;
scratchOptions.slicePartitions = slicePartitions;
scratchOptions.subdivisions = subdivisions;
@@ -200,10 +200,10 @@ define([
result._radii = Cartesian3.clone(radii, result._radii);
result._innerRadii = Cartesian3.clone(innerRadii, result._innerRadii);
- result._azimuthMin = azimuthMin;
- result._azimuthMax = azimuthMax;
- result._elevationMin = elevationMin;
- result._elevationMax = elevationMax;
+ result._minimumAzimuth = minimumAzimuth;
+ result._maximumAzimuth = maximumAzimuth;
+ result._minimumElevation = minimumElevation;
+ result._maximumElevation = maximumElevation;
result._stackPartitions = stackPartitions;
result._slicePartitions = slicePartitions;
result._subdivisions = subdivisions;
@@ -231,21 +231,21 @@ define([
// The azimuth input assumes 0 is north with CW+. The geometry uses an
// ENU frame where 0 is east with CCW+. We have to convert the azimuth
// to ENU here.
- var azMin = 450.0 - ellipsoidGeometry._azimuthMax;
- var azMax = 450.0 - ellipsoidGeometry._azimuthMin;
+ var azMin = (Math.PI * 2.5) - ellipsoidGeometry._maximumAzimuth;
+ var azMax = (Math.PI * 2.5) - ellipsoidGeometry._minimumAzimuth;
- var azimuthMin = azMin * Math.PI / 180.0;
- var azimuthMax = azMax * Math.PI / 180.0;
- var elevationMin = ellipsoidGeometry._elevationMin * Math.PI / 180.0;
- var elevationMax = ellipsoidGeometry._elevationMax * Math.PI / 180.0;
- var inclination1 = (Math.PI / 2.0 - elevationMax);
- var inclination2 = (Math.PI / 2.0 - elevationMin);
+ var minimumAzimuth = azMin;
+ var maximumAzimuth = azMax;
+ var minimumElevation = ellipsoidGeometry._minimumElevation;
+ var maximumElevation = ellipsoidGeometry._maximumElevation;
+ var inclination1 = (CesiumMath.PI_OVER_TWO - maximumElevation);
+ var inclination2 = (CesiumMath.PI_OVER_TWO - minimumElevation);
var ellipsoid = Ellipsoid.fromCartesian3(radii);
var subdivisions = ellipsoidGeometry._subdivisions;
- var slicePartitions = Math.round(ellipsoidGeometry._slicePartitions * Math.abs(azimuthMax - azimuthMin) / CesiumMath.TWO_PI);
- var stackPartitions = Math.round(ellipsoidGeometry._stackPartitions * Math.abs(elevationMax - elevationMin) / CesiumMath.TWO_PI);
+ var slicePartitions = Math.round(ellipsoidGeometry._slicePartitions * Math.abs(maximumAzimuth - minimumAzimuth) / CesiumMath.TWO_PI);
+ var stackPartitions = Math.round(ellipsoidGeometry._stackPartitions * Math.abs(maximumElevation - minimumElevation) / CesiumMath.TWO_PI);
if (slicePartitions < 2) {
slicePartitions = 2;
}
@@ -262,11 +262,11 @@ define([
vertexMultiplier = 2.0;
// Add 2x slicePartitions to connect the top/bottom of the outer to
// the top/bottom of the inner
- if (ellipsoidGeometry._elevationMax < 90.0) {
+ if (maximumElevation < CesiumMath.PI_OVER_TWO) {
isTopOpen = true;
extraIndices += slicePartitions;
}
- if (ellipsoidGeometry._elevationMin > -90.0) {
+ if (minimumElevation > -CesiumMath.PI_OVER_TWO) {
isBotOpen = true;
extraIndices += slicePartitions;
}
@@ -298,7 +298,7 @@ define([
var sinTheta = new Array(subdivisions);
var cosTheta = new Array(subdivisions);
for (i = 0; i < subdivisions; i++) {
- theta = azimuthMin + i * (azimuthMax - azimuthMin) / (subdivisions - 1);
+ theta = minimumAzimuth + i * (maximumAzimuth - minimumAzimuth) / (subdivisions - 1);
sinTheta[i] = sin(theta);
cosTheta[i] = cos(theta);
}
@@ -336,7 +336,7 @@ define([
sinTheta.length = slicePartitions;
cosTheta.length = slicePartitions;
for (i = 0; i < slicePartitions; i++) {
- theta = azimuthMin + i * (azimuthMax - azimuthMin) / (slicePartitions - 1);
+ theta = minimumAzimuth + i * (maximumAzimuth - minimumAzimuth) / (slicePartitions - 1);
sinTheta[i] = sin(theta);
cosTheta[i] = cos(theta);
}
From a4af4724e38d1090afed1c189d4159897dbf17c8 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Wed, 29 Nov 2017 10:43:41 -0600
Subject: [PATCH 13/62] Used CesiumMath where applicable
---
Source/Core/EllipsoidGeometry.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index accb94ceb7f0..d28f9b54ed84 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -249,8 +249,8 @@ define([
var maximumAzimuth = azMax;
var minimumElevation = ellipsoidGeometry._minimumElevation;
var maximumElevation = ellipsoidGeometry._maximumElevation;
- var inclination1 = (Math.PI / 2.0 - maximumElevation);
- var inclination2 = (Math.PI / 2.0 - minimumElevation);
+ var inclination1 = (CesiumMath.PI_OVER_TWO - maximumElevation);
+ var inclination2 = (CesiumMath.PI_OVER_TWO - minimumElevation);
var ellipsoid = Ellipsoid.fromCartesian3(radii);
var vertexFormat = ellipsoidGeometry._vertexFormat;
@@ -274,11 +274,11 @@ define([
var isAzimuthOpen = false;
if (hasInnerSurface) {
vertexMultiplier = 2.0;
- if (ellipsoidGeometry._maximumElevation < 90.0) {
+ if (maximumElevation < CesiumMath.PI_OVER_TWO) {
isTopOpen = true;
extraIndices += (slicePartitions - 1);
}
- if (ellipsoidGeometry._minimumElevation > -90.0) {
+ if (minimumElevation > -CesiumMath.PI_OVER_TWO) {
isBotOpen = true;
extraIndices += (slicePartitions - 1);
}
From 48068df8ec6d4cce55a33f029501ef57cc6d7db6 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Wed, 29 Nov 2017 10:47:38 -0600
Subject: [PATCH 14/62] Renamed variables based on feedback
Renamed, e.g. azimuthMin to minimumAzimuth
---
Source/DataSources/CzmlDataSource.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/Source/DataSources/CzmlDataSource.js b/Source/DataSources/CzmlDataSource.js
index fce134ebfe3b..debeaf06890f 100644
--- a/Source/DataSources/CzmlDataSource.js
+++ b/Source/DataSources/CzmlDataSource.js
@@ -1535,10 +1535,10 @@ define([
processPacketData(Boolean, ellipsoid, 'show', ellipsoidData.show, interval, sourceUri, entityCollection, query);
processPacketData(Cartesian3, ellipsoid, 'radii', ellipsoidData.radii, interval, sourceUri, entityCollection, query);
processPacketData(Cartesian3, ellipsoid, 'innerRadii', ellipsoidData.innerRadii, interval, sourceUri, entityCollection);
- processPacketData(Number, ellipsoid, 'azimuthMin', ellipsoidData.azimuthMin, interval, sourceUri, entityCollection);
- processPacketData(Number, ellipsoid, 'azimuthMax', ellipsoidData.azimuthMax, interval, sourceUri, entityCollection);
- processPacketData(Number, ellipsoid, 'elevationMin', ellipsoidData.elevationMin, interval, sourceUri, entityCollection);
- processPacketData(Number, ellipsoid, 'elevationMax', ellipsoidData.elevationMax, interval, sourceUri, entityCollection);
+ processPacketData(Number, ellipsoid, 'minimumAzimuth', ellipsoidData.minimumAzimuth, interval, sourceUri, entityCollection);
+ processPacketData(Number, ellipsoid, 'maximumAzimuth', ellipsoidData.maximumAzimuth, interval, sourceUri, entityCollection);
+ processPacketData(Number, ellipsoid, 'minimumElevation', ellipsoidData.minimumElevation, interval, sourceUri, entityCollection);
+ processPacketData(Number, ellipsoid, 'maximumElevation', ellipsoidData.maximumElevation, interval, sourceUri, entityCollection);
processPacketData(Boolean, ellipsoid, 'fill', ellipsoidData.fill, interval, sourceUri, entityCollection, query);
processMaterialPacketData(ellipsoid, 'material', ellipsoidData.material, interval, sourceUri, entityCollection, query);
processPacketData(Boolean, ellipsoid, 'outline', ellipsoidData.outline, interval, sourceUri, entityCollection, query);
From 668530e6f7038c2d39b5efb6aac2426baea208ad Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Wed, 29 Nov 2017 10:51:36 -0600
Subject: [PATCH 15/62] Renambed variables based on feedback
Renamed, e.g. azimuthMin to minimumAzimuth
---
.../DataSources/EllipsoidGeometryUpdater.js | 40 +++++++++----------
1 file changed, 20 insertions(+), 20 deletions(-)
diff --git a/Source/DataSources/EllipsoidGeometryUpdater.js b/Source/DataSources/EllipsoidGeometryUpdater.js
index 06fbf5880d5a..cdbe05738b06 100644
--- a/Source/DataSources/EllipsoidGeometryUpdater.js
+++ b/Source/DataSources/EllipsoidGeometryUpdater.js
@@ -74,10 +74,10 @@ define([
this.vertexFormat = undefined;
this.radii = undefined;
this.innerRadii = undefined;
- this.azimuthMin = undefined;
- this.azimuthMax = undefined;
- this.elevationMin = undefined;
- this.elevationMax = undefined;
+ this.minimumAzimuth = undefined;
+ this.maximumAzimuth = undefined;
+ this.minimumElevation = undefined;
+ this.maximumElevation = undefined;
this.stackPartitions = undefined;
this.slicePartitions = undefined;
this.subdivisions = undefined;
@@ -503,10 +503,10 @@ define([
this._outlineEnabled = outlineEnabled;
var innerRadii = ellipsoid.innerRadii;
- var azimuthMin = ellipsoid.azimuthMin;
- var azimuthMax = ellipsoid.azimuthMax;
- var elevationMin = ellipsoid.elevationMin;
- var elevationMax = ellipsoid.elevationMax;
+ var minimumAzimuth = ellipsoid.minimumAzimuth;
+ var maximumAzimuth = ellipsoid.maximumAzimuth;
+ var minimumElevation = ellipsoid.minimumElevation;
+ var maximumElevation = ellipsoid.maximumElevation;
var stackPartitions = ellipsoid.stackPartitions;
var slicePartitions = ellipsoid.slicePartitions;
var outlineWidth = ellipsoid.outlineWidth;
@@ -520,10 +520,10 @@ define([
!Property.isConstant(entity.orientation) || //
!radii.isConstant || //
!innerRadii.isConstant || //
- !Property.isConstant(azimuthMin) || //
- !Property.isConstant(azimuthMax) || //
- !Property.isConstant(elevationMin) || //
- !Property.isConstant(elevationMax) || //
+ !Property.isConstant(minimumAzimuth) || //
+ !Property.isConstant(maximumAzimuth) || //
+ !Property.isConstant(minimumElevation) || //
+ !Property.isConstant(maximumElevation) || //
!Property.isConstant(stackPartitions) || //
!Property.isConstant(slicePartitions) || //
!Property.isConstant(outlineWidth) || //
@@ -537,10 +537,10 @@ define([
options.vertexFormat = isColorMaterial ? PerInstanceColorAppearance.VERTEX_FORMAT : MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat;
options.radii = radii.getValue(Iso8601.MINIMUM_VALUE, options.radii);
options.innerRadii = innerRadii.getValue(Iso8601.MINIMUM_VALUE, options.innerRadii);
- options.azimuthMin = defined(azimuthMin) ? azimuthMin.getValue(Iso8601.MINIMUM_VALUE) : undefined;
- options.azimuthMax = defined(azimuthMax) ? azimuthMax.getValue(Iso8601.MINIMUM_VALUE) : undefined;
- options.elevationMin = defined(elevationMin) ? elevationMin.getValue(Iso8601.MINIMUM_VALUE) : undefined;
- options.elevationMax = defined(elevationMax) ? elevationMax.getValue(Iso8601.MINIMUM_VALUE) : undefined;
+ options.minimumAzimuth = defined(minimumAzimuth) ? minimumAzimuth.getValue(Iso8601.MINIMUM_VALUE) : undefined;
+ options.maximumAzimuth = defined(maximumAzimuth) ? maximumAzimuth.getValue(Iso8601.MINIMUM_VALUE) : undefined;
+ options.minimumElevation = defined(minimumElevation) ? minimumElevation.getValue(Iso8601.MINIMUM_VALUE) : undefined;
+ options.maximumElevation = defined(maximumElevation) ? maximumElevation.getValue(Iso8601.MINIMUM_VALUE) : undefined;
options.stackPartitions = defined(stackPartitions) ? stackPartitions.getValue(Iso8601.MINIMUM_VALUE) : undefined;
options.slicePartitions = defined(slicePartitions) ? slicePartitions.getValue(Iso8601.MINIMUM_VALUE) : undefined;
options.subdivisions = defined(subdivisions) ? subdivisions.getValue(Iso8601.MINIMUM_VALUE) : undefined;
@@ -679,10 +679,10 @@ define([
} else {
options.innerRadii = innerRadii;
}
- options.azimuthMin = Property.getValueOrUndefined(ellipsoid.azimuthMin, time);
- options.azimuthMax = Property.getValueOrUndefined(ellipsoid.azimuthMax, time);
- options.elevationMin = Property.getValueOrUndefined(ellipsoid.elevationMin, time);
- options.elevationMax = Property.getValueOrUndefined(ellipsoid.elevationMax, time);
+ options.minimumAzimuth = Property.getValueOrUndefined(ellipsoid.minimumAzimuth, time);
+ options.maximumAzimuth = Property.getValueOrUndefined(ellipsoid.maximumAzimuth, time);
+ options.minimumElevation = Property.getValueOrUndefined(ellipsoid.minimumElevation, time);
+ options.maximumElevation = Property.getValueOrUndefined(ellipsoid.maximumElevation, time);
appearance = new MaterialAppearance({
material : material,
From e821b771f1d3310dcc3a59ae7fac1eef9c78161b Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Wed, 29 Nov 2017 10:58:10 -0600
Subject: [PATCH 16/62] Renamed variables based on feedback
Renamed, e.g. azimuthMin to minimumAzimuth
---
Source/DataSources/EllipsoidGraphics.js | 54 ++++++++++++-------------
1 file changed, 27 insertions(+), 27 deletions(-)
diff --git a/Source/DataSources/EllipsoidGraphics.js b/Source/DataSources/EllipsoidGraphics.js
index 76aaafe82899..94108636828f 100644
--- a/Source/DataSources/EllipsoidGraphics.js
+++ b/Source/DataSources/EllipsoidGraphics.js
@@ -25,10 +25,10 @@ define([
* @param {Object} [options] Object with the following properties:
* @param {Property} [options.radii] A {@link Cartesian3} Property specifying the radii of the ellipsoid.
* @param {Property} [options.innerRadii] A {@link Cartesian3} Property specifying the inner radii of the ellipsoid.
- * @param {Property} [options.azimuthMin=0] A Property specifying the minimum azimuth angle of the ellipsoid (0 is north, +CW).
- * @param {Property} [options.azimuthMax=0] A Property specifying the maximum azimuth angle of the ellipsoid (0 is north, +CW).
- * @param {Property} [options.elevationMin=0] A Property specifying the minimum elevation angle of the ellipsoid (0 is tangential to earth surface, +UP).
- * @param {Property} [options.elevationMax=0] A Property specifying the maximum elevation angle of the ellipsoid (0 is tangential to earth surface, +UP).
+ * @param {Property} [options.minimumAzimuth=0] A Property specifying the minimum azimuth angle of the ellipsoid (0 is north, +CW).
+ * @param {Property} [options.maximumAzimuth=0] A Property specifying the maximum azimuth angle of the ellipsoid (0 is north, +CW).
+ * @param {Property} [options.minimumElevation=0] A Property specifying the minimum elevation angle of the ellipsoid (0 is tangential to earth surface, +UP).
+ * @param {Property} [options.maximumElevation=0] A Property specifying the maximum elevation angle of the ellipsoid (0 is tangential to earth surface, +UP).
* @param {Property} [options.show=true] A boolean Property specifying the visibility of the ellipsoid.
* @param {Property} [options.fill=true] A boolean Property specifying whether the ellipsoid is filled with the provided material.
* @param {MaterialProperty} [options.material=Color.WHITE] A Property specifying the material used to fill the ellipsoid.
@@ -49,10 +49,10 @@ define([
this._radii = undefined;
this._radiiSubscription = undefined;
this._innerRadii = undefined;
- this._azimuthMin = undefined;
- this._azimuthMax = undefined;
- this._elevationMin = undefined;
- this._elevationMax = undefined;
+ this._minimumAzimuth = undefined;
+ this._maximumAzimuth = undefined;
+ this._minimumElevation = undefined;
+ this._maximumElevation = undefined;
this._material = undefined;
this._materialSubscription = undefined;
this._stackPartitions = undefined;
@@ -116,36 +116,36 @@ define([
innerRadii : createPropertyDescriptor('innerRadii'),
/**
- * Gets or sets the Property specifying the minimum azimuth angle in degrees.
+ * Gets or sets the Property specifying the minimum azimuth angle in radians.
* @memberof EllipsoidGraphics.prototype
* @type {Property}
* @default 0.0
*/
- azimuthMin : createPropertyDescriptor('azimuthMin'),
+ minimumAzimuth : createPropertyDescriptor('minimumAzimuth'),
/**
- * Gets or sets the Property specifying the maximum azimuth angle in degrees.
+ * Gets or sets the Property specifying the maximum azimuth angle in radians.
* @memberof EllipsoidGraphics.prototype
* @type {Property}
- * @default 360.0
+ * @default 2*PI
*/
- azimuthMax : createPropertyDescriptor('azimuthMax'),
+ maximumAzimuth : createPropertyDescriptor('maximumAzimuth'),
/**
- * Gets or sets the Property specifying the minimum elevation angle in degrees.
+ * Gets or sets the Property specifying the minimum elevation angle in radians.
* @memberof EllipsoidGraphics.prototype
* @type {Property}
- * @default 90.0
+ * @default PI/2
*/
- elevationMin : createPropertyDescriptor('elevationMin'),
+ minimumElevation : createPropertyDescriptor('minimumElevation'),
/**
- * Gets or sets the Property specifying the maximum elevation angle in degrees.
+ * Gets or sets the Property specifying the maximum elevation angle in radians.
* @memberof EllipsoidGraphics.prototype
* @type {Property}
- * @default -90.0
+ * @default -PI/2
*/
- elevationMax : createPropertyDescriptor('elevationMax'),
+ maximumElevation : createPropertyDescriptor('maximumElevation'),
/**
* Gets or sets the Property specifying the material used to fill the ellipsoid.
@@ -241,10 +241,10 @@ define([
result.show = this.show;
result.radii = this.radii;
result.innerRadii = this.innerRadii;
- result.azimuthMin = this.azimuthMin;
- result.azimuthMax = this.azimuthMax;
- result.elevationMin = this.elevationMin;
- result.elevationMax = this.elevationMax;
+ result.minimumAzimuth = this.minimumAzimuth;
+ result.maximumAzimuth = this.maximumAzimuth;
+ result.minimumElevation = this.minimumElevation;
+ result.maximumElevation = this.maximumElevation;
result.material = this.material;
result.fill = this.fill;
result.outline = this.outline;
@@ -275,10 +275,10 @@ define([
this.show = defaultValue(this.show, source.show);
this.radii = defaultValue(this.radii, source.radii);
this.innerRadii = defaultValue(this.innerRadii, source.innerRadii);
- this.azimuthMin = defaultValue(this.azimuthMin, source.azimuthMin);
- this.azimuthMax = defaultValue(this.azimuthMax, source.azimuthMax);
- this.elevationMin = defaultValue(this.elevationMin, source.elevationMin);
- this.elevationMax = defaultValue(this.elevationMax, source.elevationMax);
+ this.minimumAzimuth = defaultValue(this.minimumAzimuth, source.minimumAzimuth);
+ this.maximumAzimuth = defaultValue(this.maximumAzimuth, source.maximumAzimuth);
+ this.minimumElevation = defaultValue(this.minimumElevation, source.minimumElevation);
+ this.maximumElevation = defaultValue(this.maximumElevation, source.maximumElevation);
this.material = defaultValue(this.material, source.material);
this.fill = defaultValue(this.fill, source.fill);
this.outline = defaultValue(this.outline, source.outline);
From da14f4090e2a13831ed7504e9f3d36d98db587b3 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Wed, 29 Nov 2017 11:02:46 -0600
Subject: [PATCH 17/62] Fixed errors in comment descriptions
---
Source/DataSources/EllipsoidGraphics.js | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/Source/DataSources/EllipsoidGraphics.js b/Source/DataSources/EllipsoidGraphics.js
index 94108636828f..ff35114aacc4 100644
--- a/Source/DataSources/EllipsoidGraphics.js
+++ b/Source/DataSources/EllipsoidGraphics.js
@@ -26,9 +26,9 @@ define([
* @param {Property} [options.radii] A {@link Cartesian3} Property specifying the radii of the ellipsoid.
* @param {Property} [options.innerRadii] A {@link Cartesian3} Property specifying the inner radii of the ellipsoid.
* @param {Property} [options.minimumAzimuth=0] A Property specifying the minimum azimuth angle of the ellipsoid (0 is north, +CW).
- * @param {Property} [options.maximumAzimuth=0] A Property specifying the maximum azimuth angle of the ellipsoid (0 is north, +CW).
- * @param {Property} [options.minimumElevation=0] A Property specifying the minimum elevation angle of the ellipsoid (0 is tangential to earth surface, +UP).
- * @param {Property} [options.maximumElevation=0] A Property specifying the maximum elevation angle of the ellipsoid (0 is tangential to earth surface, +UP).
+ * @param {Property} [options.maximumAzimuth=2*PI] A Property specifying the maximum azimuth angle of the ellipsoid (0 is north, +CW).
+ * @param {Property} [options.minimumElevation=-PI/2] A Property specifying the minimum elevation angle of the ellipsoid (0 is tangential to earth surface, +UP).
+ * @param {Property} [options.maximumElevation=PI/2] A Property specifying the maximum elevation angle of the ellipsoid (0 is tangential to earth surface, +UP).
* @param {Property} [options.show=true] A boolean Property specifying the visibility of the ellipsoid.
* @param {Property} [options.fill=true] A boolean Property specifying whether the ellipsoid is filled with the provided material.
* @param {MaterialProperty} [options.material=Color.WHITE] A Property specifying the material used to fill the ellipsoid.
@@ -135,7 +135,7 @@ define([
* Gets or sets the Property specifying the minimum elevation angle in radians.
* @memberof EllipsoidGraphics.prototype
* @type {Property}
- * @default PI/2
+ * @default -PI/2
*/
minimumElevation : createPropertyDescriptor('minimumElevation'),
@@ -143,7 +143,7 @@ define([
* Gets or sets the Property specifying the maximum elevation angle in radians.
* @memberof EllipsoidGraphics.prototype
* @type {Property}
- * @default -PI/2
+ * @default PI/2
*/
maximumElevation : createPropertyDescriptor('maximumElevation'),
From d7047d1b023d3a270753bcd9c6365a0fa3e0d8a9 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Wed, 29 Nov 2017 11:27:22 -0600
Subject: [PATCH 18/62] Used CesiumMath where applicable
---
Source/Core/EllipsoidGeometry.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index d28f9b54ed84..1cd9b4f6c858 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -77,9 +77,9 @@ define([
var radii = defaultValue(options.radii, defaultRadii);
var innerRadii = defaultValue(options.innerRadii, radii);
var minimumAzimuth = defaultValue(options.minimumAzimuth, 0);
- var maximumAzimuth = defaultValue(options.maximumAzimuth, 2.0 * Math.PI);
- var minimumElevation = defaultValue(options.minimumElevation, -Math.PI / 2.0);
- var maximumElevation = defaultValue(options.maximumElevation, Math.PI / 2.0);
+ var maximumAzimuth = defaultValue(options.maximumAzimuth, CesiumMath.TWO_PI);
+ var minimumElevation = defaultValue(options.minimumElevation, -CesiumMath.PI_OVER_TWO);
+ var maximumElevation = defaultValue(options.maximumElevation, CesiumMath.PI_OVER_TWO);
var stackPartitions = defaultValue(options.stackPartitions, 64);
var slicePartitions = defaultValue(options.slicePartitions, 64);
var vertexFormat = defaultValue(options.vertexFormat, VertexFormat.DEFAULT);
From 859fea7e08bd1a17476e269de148a8dbce7d2686 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Thu, 30 Nov 2017 13:49:43 -0600
Subject: [PATCH 19/62] Fixed normals and texture coordinates
---
Source/Core/EllipsoidGeometry.js | 170 ++++++++++++++++++-------------
1 file changed, 99 insertions(+), 71 deletions(-)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index 1cd9b4f6c858..3f97440c5d7e 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -51,10 +51,10 @@ define([
* @param {Object} [options] Object with the following properties:
* @param {Cartesian3} [options.radii=Cartesian3(1.0, 1.0, 1.0)] The radii of the ellipsoid in the x, y, and z directions.
* @param {Cartesian3} [options.innerRadii=options.radii] The inner radii of the ellipsoid in the x, y, and z directions.
- * @param {Number} [options.minimumAzimuth=0.0] The minimum azimuth in radians (0 is north, +CW).
- * @param {Number} [options.maximumAzimuth=2*PI] The maximum azimuth in radians (0 is north, +CW).
- * @param {Number} [options.minimumElevation=-PI/2] The minimum elevation in radians (0 is tangential to earth surface, +UP).
- * @param {Number} [options.maximumElevation=PI/2] The maximum elevation in radians (0 is tangential to earth surface, +UP).
+ * @param {Number} [options.minimumAzimuth=0.0] The minimum azimuth in radians.
+ * @param {Number} [options.maximumAzimuth=2*PI] The maximum azimuth in radians.
+ * @param {Number} [options.minimumElevation=-PI/2] The minimum elevation in radians.
+ * @param {Number} [options.maximumElevation=PI/2] The maximum elevation in radians.
* @param {Number} [options.stackPartitions=64] The number of times to partition the ellipsoid into stacks.
* @param {Number} [options.slicePartitions=64] The number of times to partition the ellipsoid into radial slices.
* @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
@@ -239,20 +239,13 @@ define([
return;
}
- // The azimuth input assumes 0 is north with CW+. The geometry uses an
- // ENU frame where 0 is east with CCW+. We have to convert the azimuth
- // to ENU here.
- var azMin = (Math.PI * 2.5) - ellipsoidGeometry._maximumAzimuth;
- var azMax = (Math.PI * 2.5) - ellipsoidGeometry._minimumAzimuth;
-
- var minimumAzimuth = azMin;
- var maximumAzimuth = azMax;
+ var minimumAzimuth = ellipsoidGeometry._minimumAzimuth;
+ var maximumAzimuth = ellipsoidGeometry._maximumAzimuth;
var minimumElevation = ellipsoidGeometry._minimumElevation;
var maximumElevation = ellipsoidGeometry._maximumElevation;
var inclination1 = (CesiumMath.PI_OVER_TWO - maximumElevation);
var inclination2 = (CesiumMath.PI_OVER_TWO - minimumElevation);
- var ellipsoid = Ellipsoid.fromCartesian3(radii);
var vertexFormat = ellipsoidGeometry._vertexFormat;
var slicePartitions = Math.round(ellipsoidGeometry._slicePartitions * Math.abs(maximumAzimuth - minimumAzimuth) / CesiumMath.TWO_PI);
@@ -264,6 +257,31 @@ define([
stackPartitions = 2;
}
+ // The extra slice and stack are for duplicating points at the x axis
+ // and poles. We need the texture coordinates to interpolate from
+ // (2 * pi - delta) to 2 * pi instead of (2 * pi - delta) to 0.
+ slicePartitions++;
+ stackPartitions++;
+
+ var i;
+ var j;
+ var index = 0;
+
+ // Create arrays for theta and phi. Duplicate first and last angle to
+ // allow different normals at the intersections.
+ var phis = [inclination1];
+ var thetas = [minimumAzimuth];
+ for (i = 0; i < stackPartitions; i++) {
+ phis.push(inclination1 + i * (inclination2 - inclination1) / (stackPartitions - 1));
+ }
+ phis.push(inclination2);
+ for (j = 0; j < slicePartitions; j++) {
+ thetas.push((minimumAzimuth + j * (maximumAzimuth - minimumAzimuth) / (slicePartitions - 1));
+ }
+ thetas.push(maximumAzimuth);
+ var numPhis = phis.length;
+ var numThetas = thetas.length;
+
// Allow for extra indices if there is an inner surface and if we need
// to close the sides if the azimuth range is not a full circle
var extraIndices = 0;
@@ -290,45 +308,40 @@ define([
}
}
- var vertexCount = stackPartitions * slicePartitions * vertexMultiplier;
+ var vertexCount = numThetas * numPhis* vertexMultiplier;
var positions = new Float64Array(vertexCount * 3);
+ var isInner = new Array(vertexCount).fill(false);
+ var negateNormal = new Array(vertexCount).fill(false);
// Multiply by 6 because there are two triangles per sector
- var numIndices = 6 * (vertexCount + extraIndices + 1 - (slicePartitions + stackPartitions) * vertexMultiplier);
- var indices = IndexDatatype.createTypedArray(vertexCount, numIndices);
+ var indexCount = slicePartitions * stackPartitions * vertexMultiplier;
+ var numIndices = 6 * (indexCount + extraIndices + 1 - (slicePartitions + stackPartitions) * vertexMultiplier);
+ var indices = IndexDatatype.createTypedArray(indexCount, numIndices);
var normals = (vertexFormat.normal) ? new Float32Array(vertexCount * 3) : undefined;
var tangents = (vertexFormat.tangent) ? new Float32Array(vertexCount * 3) : undefined;
var bitangents = (vertexFormat.bitangent) ? new Float32Array(vertexCount * 3) : undefined;
var st = (vertexFormat.st) ? new Float32Array(vertexCount * 2) : undefined;
- var i;
- var j;
- var theta;
- var phi;
- var index = 0;
-
// Calculate sin/cos phi
- var sinPhi = new Array(stackPartitions);
- var cosPhi = new Array(stackPartitions);
- for (i = 0; i < stackPartitions; i++) {
- phi = inclination1 + i * (inclination2 - inclination1) / (stackPartitions - 1);
- sinPhi[i] = sin(phi);
- cosPhi[i] = cos(phi);
+ var sinPhi = new Array(numPhis);
+ var cosPhi = new Array(numPhis);
+ for (i = 0; i < numPhis; i++) {
+ sinPhi[i] = sin(phis[i]);
+ cosPhi[i] = cos(phis[i]);
}
// Calculate sin/cos theta
- var sinTheta = new Array(slicePartitions);
- var cosTheta = new Array(slicePartitions);
- for (i = 0; i < slicePartitions; i++) {
- theta = minimumAzimuth + i * (maximumAzimuth - minimumAzimuth) / (slicePartitions - 1);
- cosTheta[i] = cos(theta);
- sinTheta[i] = sin(theta);
+ var sinTheta = new Array(numThetas);
+ var cosTheta = new Array(numThetas);
+ for (j = 0; j < numThetas; j++) {
+ cosTheta[j] = cos(thetas[j]);
+ sinTheta[j] = sin(thetas[j]);
}
// Create outer surface
- for (i = 0; i < stackPartitions; i++) {
- for (j = 0; j < slicePartitions; j++) {
+ for (i = 0; i < numPhis; i++) {
+ for (j = 0; j < numThetas; j++) {
positions[index++] = radii.x * sinPhi[i] * cosTheta[j];
positions[index++] = radii.y * sinPhi[i] * sinTheta[j];
positions[index++] = radii.z * cosPhi[i];
@@ -336,12 +349,21 @@ define([
}
// Create inner surface
+ var vertexIndex = vertexCount / 2.0;
if (hasInnerSurface) {
- for (i = 0; i < stackPartitions; i++) {
- for (j = 0; j < slicePartitions; j++) {
+ for (i = 0; i < numPhis; i++) {
+ for (j = 0; j < numThetas; j++) {
positions[index++] = innerRadii.x * sinPhi[i] * cosTheta[j];
positions[index++] = innerRadii.y * sinPhi[i] * sinTheta[j];
positions[index++] = innerRadii.z * cosPhi[i];
+
+ // Keep track of which vertices are the inner and which ones
+ // need the normal to be negated
+ isInner[vertexIndex] = true;
+ if (i > 0 && i !== (numPhis-1) && j !== 0 && j !== (numThetas-1)) {
+ negateNormal[vertexIndex] = true;
+ }
+ vertexIndex++;
}
}
}
@@ -350,11 +372,11 @@ define([
index = 0;
var topOffset;
var bottomOffset;
- for (i = 0; i < (stackPartitions - 1); i++) {
- topOffset = i * slicePartitions;
- bottomOffset = (i + 1) * slicePartitions;
+ for (i = 1; i < (numPhis - 2); i++) {
+ topOffset = i * numThetas;
+ bottomOffset = (i + 1) * numThetas;
- for (j = 0; j < slicePartitions - 1; j++) {
+ for (j = 1; j < numThetas - 2; j++) {
indices[index++] = bottomOffset + j;
indices[index++] = bottomOffset + j + 1;
indices[index++] = topOffset + j + 1;
@@ -367,12 +389,12 @@ define([
// Create indices for inner surface
if (hasInnerSurface) {
- var offset = stackPartitions * slicePartitions;
- for (i = 0; i < (stackPartitions - 1); i++) {
- topOffset = offset + i * slicePartitions;
- bottomOffset = offset + (i + 1) * slicePartitions;
+ var offset = numPhis * numThetas;
+ for (i = 1; i < (numPhis - 2); i++) {
+ topOffset = offset + i * numThetas;
+ bottomOffset = offset + (i + 1) * numThetas;
- for (j = 0; j < slicePartitions - 1; j++) {
+ for (j = 1; j < numThetas - 2; j++) {
indices[index++] = bottomOffset + j;
indices[index++] = topOffset + j;
indices[index++] = topOffset + j + 1;
@@ -387,8 +409,8 @@ define([
if (hasInnerSurface) {
if (isTopOpen) {
// Connect the top of the inner surface to the top of the outer surface
- var innerOffset = stackPartitions * slicePartitions;
- for (i = 0; i < slicePartitions - 1; i++) {
+ var innerOffset = numPhis * numThetas;
+ for (i = 1; i < numThetas - 2; i++) {
indices[index++] = i;
indices[index++] = i + 1;
indices[index++] = innerOffset + i + 1;
@@ -401,9 +423,9 @@ define([
if (isBotOpen) {
// Connect the bottom of the inner surface to the bottom of the outer surface
- var outerOffset = stackPartitions * slicePartitions - slicePartitions;
- innerOffset = stackPartitions * slicePartitions * vertexMultiplier - slicePartitions;
- for (i = 0; i < slicePartitions - 1; i++) {
+ var outerOffset = numPhis * numThetas - numThetas;
+ innerOffset = numPhis * numThetas * vertexMultiplier - numThetas;
+ for (i = 1; i < numThetas - 2; i++) {
indices[index++] = outerOffset + i + 1;
indices[index++] = outerOffset + i;
indices[index++] = innerOffset + i;
@@ -418,30 +440,30 @@ define([
// Connect the edges if azimuth is not closed
if (isAzimuthOpen) {
var outerOffset;
- var innerOffset = slicePartitions * stackPartitions;
- for (i = 0; i < stackPartitions - 1; i++) {
- outerOffset = slicePartitions * i;
+ var innerOffset;
+ for (i = 1; i < numPhis - 2; i++) {
+ innerOffset = numThetas * numPhis + (numThetas * i);
+ outerOffset = numThetas * i;
indices[index++] = innerOffset;
- indices[index++] = outerOffset + slicePartitions;
+ indices[index++] = outerOffset + numThetas;
indices[index++] = outerOffset;
indices[index++] = innerOffset;
- indices[index++] = innerOffset + slicePartitions;
- indices[index++] = outerOffset + slicePartitions;
+ indices[index++] = innerOffset + numThetas;
+ indices[index++] = outerOffset + numThetas;
innerOffset += slicePartitions;
}
- innerOffset = slicePartitions * stackPartitions + slicePartitions - 1;
- for (i = 0; i < stackPartitions - 1; i++) {
- outerOffset = slicePartitions * (i + 1) - 1;
- indices[index++] = outerOffset + slicePartitions;
+ for (i = 1; i < numPhis - 2; i++) {
+ innerOffset = numThetas * numPhis + (numThetas * (i + 1)) - 1;
+ outerOffset = numThetas * (i + 1) - 1;
+ indices[index++] = outerOffset + numThetas;
indices[index++] = innerOffset;
indices[index++] = outerOffset;
- indices[index++] = outerOffset + slicePartitions;
- indices[index++] = innerOffset + slicePartitions;
+ indices[index++] = outerOffset + numThetas;
+ indices[index++] = innerOffset + numThetas;
indices[index++] = innerOffset;
- innerOffset += slicePartitions;
}
}
@@ -460,21 +482,28 @@ define([
var tangentIndex = 0;
var bitangentIndex = 0;
+ var ellipsoid;
+ var ellipsoidOuter = Ellipsoid.fromCartesian3(radii);
+ var ellipsoidInner = Ellipsoid.fromCartesian3(innerRadii);
+
if (vertexFormat.st || vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent) {
for( i = 0; i < vertexCount; i++) {
+ ellipsoid = (isInner[i]) ? ellipsoidInner : ellipsoidOuter;
var position = Cartesian3.fromArray(positions, i * 3, scratchPosition);
var normal = ellipsoid.geodeticSurfaceNormal(position, scratchNormal);
+ if (negateNormal[i]) {
+ Cartesian3.negate(normal, normal);
+ }
- // TODO: this still needs to be updated to work with new geometry logic
if (vertexFormat.st) {
var normalST = Cartesian2.negate(normal, scratchNormalST);
// if the point is at or close to the pole, find a point along the same longitude
// close to the xy-plane for the s coordinate.
if (Cartesian2.magnitude(normalST) < CesiumMath.EPSILON6) {
- index = (i + slicePartitions * Math.floor(stackPartitions * 0.5)) * 3;
+ index = (i + numThetas * Math.floor(numPhis * 0.5)) * 3;
if (index > positions.length) {
- index = (i - slicePartitions * Math.floor(stackPartitions * 0.5)) * 3;
+ index = (i - numThetas * Math.floor(numPhis * 0.5)) * 3;
}
Cartesian3.fromArray(positions, index, normalST);
ellipsoid.geodeticSurfaceNormal(normalST, normalST);
@@ -491,10 +520,9 @@ define([
normals[normalIndex++] = normal.z;
}
- // TODO: this still needs to be updated to work with new geometry logic
if (vertexFormat.tangent || vertexFormat.bitangent) {
var tangent = scratchTangent;
- if (i < slicePartitions || i > vertexCount - slicePartitions - 1) {
+ if (i < numThetas*2 || i > vertexCount - numThetas*2 - 1) {
Cartesian3.cross(Cartesian3.UNIT_X, normal, tangent);
Cartesian3.normalize(tangent, tangent);
} else {
@@ -556,7 +584,7 @@ define([
attributes : attributes,
indices : indices,
primitiveType : PrimitiveType.TRIANGLES,
- boundingSphere : BoundingSphere.fromEllipsoid(ellipsoid)
+ boundingSphere : BoundingSphere.fromEllipsoid(ellipsoidOuter)
});
};
From c74c4c8a8bf83a6fe625c24e18499e7d73cbb322 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Thu, 30 Nov 2017 13:51:31 -0600
Subject: [PATCH 20/62] Updated azimuth definition
---
Source/Core/EllipsoidOutlineGeometry.js | 18 ++++++------------
1 file changed, 6 insertions(+), 12 deletions(-)
diff --git a/Source/Core/EllipsoidOutlineGeometry.js b/Source/Core/EllipsoidOutlineGeometry.js
index 68ad8a3baa1f..8f3466a5b59e 100644
--- a/Source/Core/EllipsoidOutlineGeometry.js
+++ b/Source/Core/EllipsoidOutlineGeometry.js
@@ -41,10 +41,10 @@ define([
* @param {Object} [options] Object with the following properties:
* @param {Cartesian3} [options.radii=Cartesian3(1.0, 1.0, 1.0)] The radii of the ellipsoid in the x, y, and z directions.
* @param {Cartesian3} [options.innerRadii=options.radii] The inner radii of the ellipsoid in the x, y, and z directions.
- * @param {Number} [options.minimumAzimuth=0.0] The minimum azimuth in radians (0 is north, +CW).
- * @param {Number} [options.maximumAzimuth=2*PI] The maximum azimuth in radians (0 is north, +CW).
- * @param {Number} [options.minimumElevation=-PI/2] The minimum elevation in radians (0 is tangential to earth surface, +UP).
- * @param {Number} [options.maximumElevation=PI/2] The maximum elevation in radians (0 is tangential to earth surface, +UP).
+ * @param {Number} [options.minimumAzimuth=0.0] The minimum azimuth in radians.
+ * @param {Number} [options.maximumAzimuth=2*PI] The maximum azimuth in radians.
+ * @param {Number} [options.minimumElevation=-PI/2] The minimum elevation in radians.
+ * @param {Number} [options.maximumElevation=PI/2] The maximum elevation in radians.
* @param {Number} [options.stackPartitions=10] The count of stacks for the ellipsoid (1 greater than the number of parallel lines).
* @param {Number} [options.slicePartitions=8] The count of slices for the ellipsoid (Equal to the number of radial lines).
* @param {Number} [options.subdivisions=128] The number of points per line, determining the granularity of the curvature.
@@ -228,14 +228,8 @@ define([
return;
}
- // The azimuth input assumes 0 is north with CW+. The geometry uses an
- // ENU frame where 0 is east with CCW+. We have to convert the azimuth
- // to ENU here.
- var azMin = (Math.PI * 2.5) - ellipsoidGeometry._maximumAzimuth;
- var azMax = (Math.PI * 2.5) - ellipsoidGeometry._minimumAzimuth;
-
- var minimumAzimuth = azMin;
- var maximumAzimuth = azMax;
+ var minimumAzimuth = ellipsoidGeometry._minimumAzimuth;
+ var maximumAzimuth = ellipsoidGeometry._maximumAzimuth;
var minimumElevation = ellipsoidGeometry._minimumElevation;
var maximumElevation = ellipsoidGeometry._maximumElevation;
var inclination1 = (CesiumMath.PI_OVER_TWO - maximumElevation);
From 4a081e6940c6b1d54d97a7341f631d6999f1a80b Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Thu, 30 Nov 2017 13:53:25 -0600
Subject: [PATCH 21/62] Updated az/el definition comments
---
Source/DataSources/EllipsoidGraphics.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/Source/DataSources/EllipsoidGraphics.js b/Source/DataSources/EllipsoidGraphics.js
index ff35114aacc4..1654402a703a 100644
--- a/Source/DataSources/EllipsoidGraphics.js
+++ b/Source/DataSources/EllipsoidGraphics.js
@@ -25,10 +25,10 @@ define([
* @param {Object} [options] Object with the following properties:
* @param {Property} [options.radii] A {@link Cartesian3} Property specifying the radii of the ellipsoid.
* @param {Property} [options.innerRadii] A {@link Cartesian3} Property specifying the inner radii of the ellipsoid.
- * @param {Property} [options.minimumAzimuth=0] A Property specifying the minimum azimuth angle of the ellipsoid (0 is north, +CW).
- * @param {Property} [options.maximumAzimuth=2*PI] A Property specifying the maximum azimuth angle of the ellipsoid (0 is north, +CW).
- * @param {Property} [options.minimumElevation=-PI/2] A Property specifying the minimum elevation angle of the ellipsoid (0 is tangential to earth surface, +UP).
- * @param {Property} [options.maximumElevation=PI/2] A Property specifying the maximum elevation angle of the ellipsoid (0 is tangential to earth surface, +UP).
+ * @param {Property} [options.minimumAzimuth=0] A Property specifying the minimum azimuth angle of the ellipsoid.
+ * @param {Property} [options.maximumAzimuth=2*PI] A Property specifying the maximum azimuth angle of the ellipsoid.
+ * @param {Property} [options.minimumElevation=-PI/2] A Property specifying the minimum elevation angle of the ellipsoid.
+ * @param {Property} [options.maximumElevation=PI/2] A Property specifying the maximum elevation angle of the ellipsoid.
* @param {Property} [options.show=true] A boolean Property specifying the visibility of the ellipsoid.
* @param {Property} [options.fill=true] A boolean Property specifying whether the ellipsoid is filled with the provided material.
* @param {MaterialProperty} [options.material=Color.WHITE] A Property specifying the material used to fill the ellipsoid.
From aafa6fd5ad4e0287f7470af9b0a0b420682795aa Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Thu, 30 Nov 2017 14:01:38 -0600
Subject: [PATCH 22/62] Fixed typo and wrong increment
---
Source/Core/EllipsoidGeometry.js | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index 3f97440c5d7e..70064dde38dc 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -276,7 +276,7 @@ define([
}
phis.push(inclination2);
for (j = 0; j < slicePartitions; j++) {
- thetas.push((minimumAzimuth + j * (maximumAzimuth - minimumAzimuth) / (slicePartitions - 1));
+ thetas.push(minimumAzimuth + j * (maximumAzimuth - minimumAzimuth) / (slicePartitions - 1));
}
thetas.push(maximumAzimuth);
var numPhis = phis.length;
@@ -451,7 +451,6 @@ define([
indices[index++] = innerOffset;
indices[index++] = innerOffset + numThetas;
indices[index++] = outerOffset + numThetas;
- innerOffset += slicePartitions;
}
for (i = 1; i < numPhis - 2; i++) {
From f52ac07ef18e78fa63e5b9bf318c20d241160756 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Thu, 30 Nov 2017 15:30:37 -0600
Subject: [PATCH 23/62] Added partial ellipsoid file
Just a copy of ellipsoid for now...
---
.../Sandcastle/gallery/Partial Ellipsoid.html | 76 +++++++++++++++++++
1 file changed, 76 insertions(+)
create mode 100644 Apps/Sandcastle/gallery/Partial Ellipsoid.html
diff --git a/Apps/Sandcastle/gallery/Partial Ellipsoid.html b/Apps/Sandcastle/gallery/Partial Ellipsoid.html
new file mode 100644
index 000000000000..7e5ca4390eda
--- /dev/null
+++ b/Apps/Sandcastle/gallery/Partial Ellipsoid.html
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+ Cesium Demo
+
+
+
+
+
+
+
+Loading...
+
+
+
+
From 9d7541dc23a21127c6f04361a43dca3a6ee3b6ec Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Fri, 1 Dec 2017 08:02:03 -0600
Subject: [PATCH 24/62] Fixed normals if top/bottom are open
---
Source/Core/EllipsoidGeometry.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index 70064dde38dc..522b46dcad85 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -521,7 +521,7 @@ define([
if (vertexFormat.tangent || vertexFormat.bitangent) {
var tangent = scratchTangent;
- if (i < numThetas*2 || i > vertexCount - numThetas*2 - 1) {
+ if ((!isTopOpen && i < numThetas*2) || (!isBotOpen && i > vertexCount - numThetas*2 - 1)) {
Cartesian3.cross(Cartesian3.UNIT_X, normal, tangent);
Cartesian3.normalize(tangent, tangent);
} else {
From 1aeb1abfe9315e1ecaa1d94659d78f75acf550a7 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Fri, 1 Dec 2017 12:52:34 -0600
Subject: [PATCH 25/62] Delete Partial Ellipsoid.html
---
.../Sandcastle/gallery/Partial Ellipsoid.html | 76 -------------------
1 file changed, 76 deletions(-)
delete mode 100644 Apps/Sandcastle/gallery/Partial Ellipsoid.html
diff --git a/Apps/Sandcastle/gallery/Partial Ellipsoid.html b/Apps/Sandcastle/gallery/Partial Ellipsoid.html
deleted file mode 100644
index 7e5ca4390eda..000000000000
--- a/Apps/Sandcastle/gallery/Partial Ellipsoid.html
+++ /dev/null
@@ -1,76 +0,0 @@
-
-
-
-
-
-
-
-
- Cesium Demo
-
-
-
-
-
-
-
-Loading...
-
-
-
-
From 8532e1cc75ec116077264f635d3eaa2fc8bbc7d9 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Fri, 1 Dec 2017 13:49:38 -0600
Subject: [PATCH 26/62] Added partial ellipsoid examples
---
.../gallery/Spheres and Ellipsoids.html | 180 +++++++++++++++++-
1 file changed, 176 insertions(+), 4 deletions(-)
diff --git a/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html b/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
index 7e5ca4390eda..e94014de6187 100644
--- a/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
+++ b/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
@@ -4,7 +4,7 @@
-
+
Cesium Demo
@@ -31,7 +31,7 @@
var blueEllipsoid = viewer.entities.add({
name : 'Blue ellipsoid',
- position: Cesium.Cartesian3.fromDegrees(-114.0, 40.0, 300000.0),
+ position: Cesium.Cartesian3.fromDegrees(-114.0, 45.0, 300000.0),
ellipsoid : {
radii : new Cesium.Cartesian3(200000.0, 200000.0, 300000.0),
material : Cesium.Color.BLUE
@@ -40,7 +40,7 @@
var redSphere = viewer.entities.add({
name : 'Red sphere with black outline',
- position: Cesium.Cartesian3.fromDegrees(-107.0, 40.0, 300000.0),
+ position: Cesium.Cartesian3.fromDegrees(-107.0, 45.0, 300000.0),
ellipsoid : {
radii : new Cesium.Cartesian3(300000.0, 300000.0, 300000.0),
material : Cesium.Color.RED.withAlpha(0.5),
@@ -51,7 +51,7 @@
var outlineOnly = viewer.entities.add({
name : 'Yellow ellipsoid outline',
- position: Cesium.Cartesian3.fromDegrees(-100.0, 40.0, 300000.0),
+ position: Cesium.Cartesian3.fromDegrees(-100.0, 45.0, 300000.0),
ellipsoid : {
radii : new Cesium.Cartesian3(200000.0, 200000.0, 300000.0),
fill : false,
@@ -62,6 +62,178 @@
}
});
+viewer.entities.add({
+ name : 'Dome',
+ position: Cesium.Cartesian3.fromDegrees(-120.0, 40.0),
+ ellipsoid : {
+ radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
+ minimumElevation : 0.0,
+ material : Cesium.Color.BLUE.withAlpha(0.3),
+ outline : true
+ }
+});
+
+viewer.entities.add({
+ name : 'Dome with inner radius',
+ position: Cesium.Cartesian3.fromDegrees(-114.0, 40.0),
+ ellipsoid : {
+ radii : new Cesium.Cartesian3(250000.0, 200000.0, 150000.0),
+ innerRadii : new Cesium.Cartesian3(100000.0, 80000.0, 60000.0),
+ minimumElevation : 0.0,
+ material : Cesium.Color.RED.withAlpha(0.3),
+ outline : true
+ }
+});
+
+viewer.entities.add({
+ name : 'Dome with top cut out',
+ position: Cesium.Cartesian3.fromDegrees(-108.0, 40.0),
+ ellipsoid : {
+ radii : new Cesium.Cartesian3(200000.0, 200000.0, 20000.0),
+ innerRadii : new Cesium.Cartesian3(100000.0, 100000.0, 100000.0),
+ minimumElevation : 0.0,
+ maximumElevation : Cesium.Math.toRadians(70.0),
+ material : Cesium.Color.YELLOW.withAlpha(0.3),
+ outline : true
+ }
+});
+
+viewer.entities.add({
+ name : 'Top and bottom cut out',
+ position: Cesium.Cartesian3.fromDegrees(-102.0, 40.0, 140000.0),
+ ellipsoid : {
+ radii : new Cesium.Cartesian3(200000.0, 200000.0, 20000.0),
+ innerRadii : new Cesium.Cartesian3(100000.0, 100000.0, 100000.0),
+ minimumElevation : Cesium.Math.toRadians(-40.0),
+ maximumElevation : Cesium.Math.toRadians(40.0),
+ material : Cesium.Color.DARKCYAN.withAlpha(0.3),
+ outline : true
+ }
+});
+
+viewer.entities.add({
+ name : 'Partial azimuth',
+ position: Cesium.Cartesian3.fromDegrees(-96.0, 39.5),
+ ellipsoid : {
+ radii : new Cesium.Cartesian3(200000.0, 200000.0, 20000.0),
+ innerRadii : new Cesium.Cartesian3(150000.0, 150000.0, 150000.0),
+ minimumAzimuth : Cesium.Math.toRadians(-90.0),
+ maximumAzimuth : Cesium.Math.toRadians(180.0),
+ minimumElevation : Cesium.Math.toRadians(20.0),
+ maximumElevation : Cesium.Math.toRadians(80.0),
+ material : Cesium.Color.GREEN.withAlpha(0.3),
+ outline : true
+ }
+});
+
+viewer.entities.add({
+ name : 'Upside down',
+ position: Cesium.Cartesian3.fromDegrees(-90.0, 39.0, 200000.0),
+ ellipsoid : {
+ radii : new Cesium.Cartesian3(200000.0, 200000.0, 20000.0),
+ innerRadii : new Cesium.Cartesian3(150000.0, 150000.0, 150000.0),
+ minimumAzimuth : Cesium.Math.toRadians(-90.0),
+ maximumAzimuth : Cesium.Math.toRadians(180.0),
+ minimumElevation : Cesium.Math.toRadians(-90.0),
+ maximumElevation : Cesium.Math.toRadians(20.0),
+ material : Cesium.Color.BLUE.withAlpha(0.3),
+ outline : true
+ }
+});
+
+viewer.entities.add({
+ name : 'Partial dome',
+ position: Cesium.Cartesian3.fromDegrees(-84.0, 38.5),
+ ellipsoid : {
+ radii : new Cesium.Cartesian3(200000.0, 200000.0, 20000.0),
+ minimumAzimuth : Cesium.Math.toRadians(-90.0),
+ maximumAzimuth : Cesium.Math.toRadians(180.0),
+ minimumElevation : 0.0,
+ material : Cesium.Color.RED.withAlpha(0.3),
+ outline : true
+ }
+});
+
+var airplanePosition = Cesium.Cartesian3.fromDegrees(-110.0, 35.0, 250000.0);
+viewer.entities.add({
+ id : 'airplane',
+ name : 'Airplane with sensor',
+ position : airplanePosition,
+ model : {
+ "../../SampleData/models/CesiumAir/Cesium_Air.gltf",
+ scale : 6000
+ }
+});
+viewer.entities.add({
+ name : 'Airplane sensor view',
+ position : new Cesium.ReferenceProperty(viewer.entities, 'airplane', ['position']),
+ orientation : Cesium.Transforms.headingPitchRollQuaternion(
+ airplanePosition,
+ new Cesium.HeadingPitchRoll(Cesium.Math.PI_OVER_TWO, -Cesium.Math.PI_OVER_FOUR, 0.0)
+ ),
+ ellipsoid : {
+ radii : new Cesium.Cartesian3(300000.0, 300000.0, 30000.0),
+ innerRadii : new Cesium.Cartesian3(1.0, 1.0, 1.0),
+ minimumAzimuth : Cesium.Math.toRadians(-10.0),
+ maximumAzimuth : Cesium.Math.toRadians(10.0),
+ minimumElevation : Cesium.Math.toRadians(-10.0),
+ maximumElevation : Cesium.Math.toRadians(10.0),
+ material : Cesium.Color.DARKCYAN.withAlpha(0.3),
+ outline : true
+ }
+});
+
+var truckPosition = Cesium.Cartesian3.fromDegrees(-102.0, 35.0);
+viewer.entities.add({
+ id : 'truck',
+ name : 'Truck with sensor',
+ position : truckPosition,
+ model : {
+ "../../SampleData/models/CesiumAir/Cesium_Ground.gltf",
+ scale : 8000
+ }
+});
+viewer.entities.add({
+ name : 'Truck sensor view',
+ position : new Cesium.ReferenceProperty(viewer.entities, 'truck', ['position']),
+ orientation : Cesium.Transforms.headingPitchRollQuaternion(
+ truckPosition,
+ new Cesium.HeadingPitchRoll(Cesium.Math.PI / 1.5, Cesium.Math.PI_OVER_FOUR, 0.0)
+ ),
+ ellipsoid : {
+ radii : new Cesium.Cartesian3(500000.0, 500000.0, 50000.0),
+ innerRadii : new Cesium.Cartesian3(10000.0, 10000.0, 10000.0),
+ minimumAzimuth : Cesium.Math.toRadians(-15.0),
+ maximumAzimuth : Cesium.Math.toRadians(15.0),
+ minimumElevation : Cesium.Math.toRadians(-15.0),
+ maximumElevation : Cesium.Math.toRadians(15.0),
+ material : Cesium.Color.DARKCYAN.withAlpha(0.3),
+ outline : true
+ }
+});
+
+truckPosition = Cesium.Cartesian3.fromDegrees(-95.0, 34.0);
+viewer.entities.add({
+ id : 'truck2',
+ name : 'Truck with sensor',
+ position : truckPosition,
+ model : {
+ "../../SampleData/models/CesiumAir/Cesium_Ground.gltf",
+ scale : 8000
+ }
+});
+viewer.entities.add({
+ name : 'Truck sensor view',
+ position : new Cesium.ReferenceProperty(viewer.entities, 'truck2', ['position']),
+ ellipsoid : {
+ radii : new Cesium.Cartesian3(400000.0, 400000.0, 40000.0),
+ innerRadii : new Cesium.Cartesian3(30000.0, 30000.0, 30000.0),
+ minimumAzimuth : Cesium.Math.toRadians(40.0),
+ material : Cesium.Color.DARKCYAN.withAlpha(0.3),
+ outline : true
+ }
+});
+
viewer.zoomTo(viewer.entities);
//Sandcastle_End
Sandcastle.finishedLoading();
From e1c0796288732b6433867c923584d720c3b062d2 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Fri, 1 Dec 2017 14:31:26 -0600
Subject: [PATCH 27/62] Fixed typos
---
.../gallery/Spheres and Ellipsoids.html | 30 +++++++++----------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html b/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
index e94014de6187..4fb2c9aaba1e 100644
--- a/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
+++ b/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
@@ -31,18 +31,18 @@
var blueEllipsoid = viewer.entities.add({
name : 'Blue ellipsoid',
- position: Cesium.Cartesian3.fromDegrees(-114.0, 45.0, 300000.0),
+ position: Cesium.Cartesian3.fromDegrees(-114.0, 45.0, 200000.0),
ellipsoid : {
- radii : new Cesium.Cartesian3(200000.0, 200000.0, 300000.0),
+ radii : new Cesium.Cartesian3(150000.0, 150000.0, 200000.0),
material : Cesium.Color.BLUE
}
});
var redSphere = viewer.entities.add({
name : 'Red sphere with black outline',
- position: Cesium.Cartesian3.fromDegrees(-107.0, 45.0, 300000.0),
+ position: Cesium.Cartesian3.fromDegrees(-107.0, 45.0, 200000.0),
ellipsoid : {
- radii : new Cesium.Cartesian3(300000.0, 300000.0, 300000.0),
+ radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
material : Cesium.Color.RED.withAlpha(0.5),
outline : true,
outlineColor : Cesium.Color.BLACK
@@ -51,9 +51,9 @@
var outlineOnly = viewer.entities.add({
name : 'Yellow ellipsoid outline',
- position: Cesium.Cartesian3.fromDegrees(-100.0, 45.0, 300000.0),
+ position: Cesium.Cartesian3.fromDegrees(-100.0, 45.0, 200000.0),
ellipsoid : {
- radii : new Cesium.Cartesian3(200000.0, 200000.0, 300000.0),
+ radii : new Cesium.Cartesian3(150000.0, 150000.0, 200000.0),
fill : false,
outline : true,
outlineColor : Cesium.Color.YELLOW,
@@ -89,7 +89,7 @@
name : 'Dome with top cut out',
position: Cesium.Cartesian3.fromDegrees(-108.0, 40.0),
ellipsoid : {
- radii : new Cesium.Cartesian3(200000.0, 200000.0, 20000.0),
+ radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
innerRadii : new Cesium.Cartesian3(100000.0, 100000.0, 100000.0),
minimumElevation : 0.0,
maximumElevation : Cesium.Math.toRadians(70.0),
@@ -102,7 +102,7 @@
name : 'Top and bottom cut out',
position: Cesium.Cartesian3.fromDegrees(-102.0, 40.0, 140000.0),
ellipsoid : {
- radii : new Cesium.Cartesian3(200000.0, 200000.0, 20000.0),
+ radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
innerRadii : new Cesium.Cartesian3(100000.0, 100000.0, 100000.0),
minimumElevation : Cesium.Math.toRadians(-40.0),
maximumElevation : Cesium.Math.toRadians(40.0),
@@ -115,7 +115,7 @@
name : 'Partial azimuth',
position: Cesium.Cartesian3.fromDegrees(-96.0, 39.5),
ellipsoid : {
- radii : new Cesium.Cartesian3(200000.0, 200000.0, 20000.0),
+ radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
innerRadii : new Cesium.Cartesian3(150000.0, 150000.0, 150000.0),
minimumAzimuth : Cesium.Math.toRadians(-90.0),
maximumAzimuth : Cesium.Math.toRadians(180.0),
@@ -130,7 +130,7 @@
name : 'Upside down',
position: Cesium.Cartesian3.fromDegrees(-90.0, 39.0, 200000.0),
ellipsoid : {
- radii : new Cesium.Cartesian3(200000.0, 200000.0, 20000.0),
+ radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
innerRadii : new Cesium.Cartesian3(150000.0, 150000.0, 150000.0),
minimumAzimuth : Cesium.Math.toRadians(-90.0),
maximumAzimuth : Cesium.Math.toRadians(180.0),
@@ -145,7 +145,7 @@
name : 'Partial dome',
position: Cesium.Cartesian3.fromDegrees(-84.0, 38.5),
ellipsoid : {
- radii : new Cesium.Cartesian3(200000.0, 200000.0, 20000.0),
+ radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
minimumAzimuth : Cesium.Math.toRadians(-90.0),
maximumAzimuth : Cesium.Math.toRadians(180.0),
minimumElevation : 0.0,
@@ -172,7 +172,7 @@
new Cesium.HeadingPitchRoll(Cesium.Math.PI_OVER_TWO, -Cesium.Math.PI_OVER_FOUR, 0.0)
),
ellipsoid : {
- radii : new Cesium.Cartesian3(300000.0, 300000.0, 30000.0),
+ radii : new Cesium.Cartesian3(300000.0, 300000.0, 300000.0),
innerRadii : new Cesium.Cartesian3(1.0, 1.0, 1.0),
minimumAzimuth : Cesium.Math.toRadians(-10.0),
maximumAzimuth : Cesium.Math.toRadians(10.0),
@@ -201,7 +201,7 @@
new Cesium.HeadingPitchRoll(Cesium.Math.PI / 1.5, Cesium.Math.PI_OVER_FOUR, 0.0)
),
ellipsoid : {
- radii : new Cesium.Cartesian3(500000.0, 500000.0, 50000.0),
+ radii : new Cesium.Cartesian3(500000.0, 500000.0, 500000.0),
innerRadii : new Cesium.Cartesian3(10000.0, 10000.0, 10000.0),
minimumAzimuth : Cesium.Math.toRadians(-15.0),
maximumAzimuth : Cesium.Math.toRadians(15.0),
@@ -226,9 +226,9 @@
name : 'Truck sensor view',
position : new Cesium.ReferenceProperty(viewer.entities, 'truck2', ['position']),
ellipsoid : {
- radii : new Cesium.Cartesian3(400000.0, 400000.0, 40000.0),
+ radii : new Cesium.Cartesian3(400000.0, 400000.0, 400000.0),
innerRadii : new Cesium.Cartesian3(30000.0, 30000.0, 30000.0),
- minimumAzimuth : Cesium.Math.toRadians(40.0),
+ minimumElevation : Cesium.Math.toRadians(40.0),
material : Cesium.Color.DARKCYAN.withAlpha(0.3),
outline : true
}
From 3d99a52e13286849c4a6fb61b4785d14e24f84cf Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Mon, 4 Dec 2017 13:52:40 -0600
Subject: [PATCH 28/62] Fixed bug when calculating tangent
---
Source/Core/EllipsoidGeometry.js | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index 522b46dcad85..37588f967dc9 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -480,6 +480,7 @@ define([
var normalIndex = 0;
var tangentIndex = 0;
var bitangentIndex = 0;
+ var vertexCountHalf = vertexCount / 2.0;
var ellipsoid;
var ellipsoidOuter = Ellipsoid.fromCartesian3(radii);
@@ -521,13 +522,23 @@ define([
if (vertexFormat.tangent || vertexFormat.bitangent) {
var tangent = scratchTangent;
- if ((!isTopOpen && i < numThetas*2) || (!isBotOpen && i > vertexCount - numThetas*2 - 1)) {
- Cartesian3.cross(Cartesian3.UNIT_X, normal, tangent);
- Cartesian3.normalize(tangent, tangent);
+
+ // Use UNIT_X for the poles
+ var offset1 = 0;
+ var offset2 = vertexCountHalf;
+ var unit;
+ if (isInner[i]) {
+ offset1 = vertexCountHalf;
+ offset2 = vertexCount;
+ }
+ if ((!isTopOpen && (i >= offset1 && i < (offset1 + numThetas*2)) ||
+ (!isBotOpen && i > offset2 - numThetas*2 - 1)) {
+ unit = Cartesian3.UNIT_X;
} else {
- Cartesian3.cross(Cartesian3.UNIT_Z, normal, tangent);
- Cartesian3.normalize(tangent, tangent);
+ unit = Cartesian3.UNIT_Z;
}
+ Cartesian3.cross(unit, normal, tangent);
+ Cartesian3.normalize(tangent, tangent);
if (vertexFormat.tangent) {
tangents[tangentIndex++] = tangent.x;
From 5a8a616feb6cc8ceb8678a7d94ee5bc915a4f4a9 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Mon, 4 Dec 2017 14:02:48 -0600
Subject: [PATCH 29/62] Fixed typo
---
Source/Core/EllipsoidGeometry.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index 37588f967dc9..7d45c31381d4 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -531,7 +531,7 @@ define([
offset1 = vertexCountHalf;
offset2 = vertexCount;
}
- if ((!isTopOpen && (i >= offset1 && i < (offset1 + numThetas*2)) ||
+ if ((!isTopOpen && (i >= offset1 && i < (offset1 + numThetas*2))) ||
(!isBotOpen && i > offset2 - numThetas*2 - 1)) {
unit = Cartesian3.UNIT_X;
} else {
From dc622fa4203d60cb85c3119c04a1c1dae25ed093 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Mon, 4 Dec 2017 14:47:24 -0600
Subject: [PATCH 30/62] Trying to fix testing
---
Source/Core/EllipsoidGeometry.js | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index 7d45c31381d4..9124e8d75a51 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -531,8 +531,7 @@ define([
offset1 = vertexCountHalf;
offset2 = vertexCount;
}
- if ((!isTopOpen && (i >= offset1 && i < (offset1 + numThetas*2))) ||
- (!isBotOpen && i > offset2 - numThetas*2 - 1)) {
+ if ((!isTopOpen && (i >= offset1 && i < (offset1 + numThetas*2))) || (!isBotOpen && i > offset2 - numThetas*2 - 1)) {
unit = Cartesian3.UNIT_X;
} else {
unit = Cartesian3.UNIT_Z;
From 7fc91d977fcc492db25a0b42cd73db42e93e2f18 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Tue, 5 Dec 2017 14:35:44 -0600
Subject: [PATCH 31/62] Reverted previous change
---
Source/Core/EllipsoidGeometry.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index 9124e8d75a51..7d45c31381d4 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -531,7 +531,8 @@ define([
offset1 = vertexCountHalf;
offset2 = vertexCount;
}
- if ((!isTopOpen && (i >= offset1 && i < (offset1 + numThetas*2))) || (!isBotOpen && i > offset2 - numThetas*2 - 1)) {
+ if ((!isTopOpen && (i >= offset1 && i < (offset1 + numThetas*2))) ||
+ (!isBotOpen && i > offset2 - numThetas*2 - 1)) {
unit = Cartesian3.UNIT_X;
} else {
unit = Cartesian3.UNIT_Z;
From 941f30309eca23f72f033207c73f6a7d851190a8 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Thu, 11 Jan 2018 15:50:10 -0600
Subject: [PATCH 32/62] Updated CzmlDataSource.js based on findings
Renamed variables from azimuth/elevation to clock/cone.
---
Source/DataSources/CzmlDataSource.js | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/Source/DataSources/CzmlDataSource.js b/Source/DataSources/CzmlDataSource.js
index cf156c1eca56..66db179ddfe7 100644
--- a/Source/DataSources/CzmlDataSource.js
+++ b/Source/DataSources/CzmlDataSource.js
@@ -1534,11 +1534,11 @@ define([
processPacketData(Boolean, ellipsoid, 'show', ellipsoidData.show, interval, sourceUri, entityCollection, query);
processPacketData(Cartesian3, ellipsoid, 'radii', ellipsoidData.radii, interval, sourceUri, entityCollection, query);
- processPacketData(Cartesian3, ellipsoid, 'innerRadii', ellipsoidData.innerRadii, interval, sourceUri, entityCollection);
- processPacketData(Number, ellipsoid, 'minimumAzimuth', ellipsoidData.minimumAzimuth, interval, sourceUri, entityCollection);
- processPacketData(Number, ellipsoid, 'maximumAzimuth', ellipsoidData.maximumAzimuth, interval, sourceUri, entityCollection);
- processPacketData(Number, ellipsoid, 'minimumElevation', ellipsoidData.minimumElevation, interval, sourceUri, entityCollection);
- processPacketData(Number, ellipsoid, 'maximumElevation', ellipsoidData.maximumElevation, interval, sourceUri, entityCollection);
+ processPacketData(Cartesian3, ellipsoid, 'innerRadii', ellipsoidData.innerRadii, interval, sourceUri, entityCollection, query);
+ processPacketData(Number, ellipsoid, 'minimumClock', ellipsoidData.minimumClock, interval, sourceUri, entityCollection, query);
+ processPacketData(Number, ellipsoid, 'maximumClock', ellipsoidData.maximumClock, interval, sourceUri, entityCollection, query);
+ processPacketData(Number, ellipsoid, 'minimumCone', ellipsoidData.minimumCone, interval, sourceUri, entityCollection, query);
+ processPacketData(Number, ellipsoid, 'maximumCone', ellipsoidData.maximumCone, interval, sourceUri, entityCollection, query);
processPacketData(Boolean, ellipsoid, 'fill', ellipsoidData.fill, interval, sourceUri, entityCollection, query);
processMaterialPacketData(ellipsoid, 'material', ellipsoidData.material, interval, sourceUri, entityCollection, query);
processPacketData(Boolean, ellipsoid, 'outline', ellipsoidData.outline, interval, sourceUri, entityCollection, query);
@@ -1617,7 +1617,6 @@ define([
processPacketData(Number, model, 'maximumScale', modelData.maximumScale, interval, sourceUri, entityCollection, query);
processPacketData(Boolean, model, 'incrementallyLoadTextures', modelData.incrementallyLoadTextures, interval, sourceUri, entityCollection, query);
processPacketData(Boolean, model, 'runAnimations', modelData.runAnimations, interval, sourceUri, entityCollection, query);
- processPacketData(Boolean, model, 'clampAnimations', modelData.clampAnimations, interval, sourceUri, entityCollection, query);
processPacketData(ShadowMode, model, 'shadows', modelData.shadows, interval, sourceUri, entityCollection, query);
processPacketData(HeightReference, model, 'heightReference', modelData.heightReference, interval, sourceUri, entityCollection, query);
processPacketData(Color, model, 'silhouetteColor', modelData.silhouetteColor, interval, sourceUri, entityCollection, query);
From 9719d931be8a68b70e9d589ee50b677f22d6ffe4 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Thu, 11 Jan 2018 15:53:42 -0600
Subject: [PATCH 33/62] Fixed merge
---
Source/DataSources/CzmlDataSource.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/Source/DataSources/CzmlDataSource.js b/Source/DataSources/CzmlDataSource.js
index 66db179ddfe7..1bcb548aed9f 100644
--- a/Source/DataSources/CzmlDataSource.js
+++ b/Source/DataSources/CzmlDataSource.js
@@ -1617,6 +1617,7 @@ define([
processPacketData(Number, model, 'maximumScale', modelData.maximumScale, interval, sourceUri, entityCollection, query);
processPacketData(Boolean, model, 'incrementallyLoadTextures', modelData.incrementallyLoadTextures, interval, sourceUri, entityCollection, query);
processPacketData(Boolean, model, 'runAnimations', modelData.runAnimations, interval, sourceUri, entityCollection, query);
+ processPacketData(Boolean, model, 'clampAnimations', modelData.clampAnimations, interval, sourceUri, entityCollection, query);
processPacketData(ShadowMode, model, 'shadows', modelData.shadows, interval, sourceUri, entityCollection, query);
processPacketData(HeightReference, model, 'heightReference', modelData.heightReference, interval, sourceUri, entityCollection, query);
processPacketData(Color, model, 'silhouetteColor', modelData.silhouetteColor, interval, sourceUri, entityCollection, query);
From 4ac7d30a5258c52f637f9780d92667a0fbc668c2 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Thu, 11 Jan 2018 15:55:59 -0600
Subject: [PATCH 34/62] Updated EllipsoidGeometry.js based on findings
Renamed azimuth/elevation to clock/cone and a few other tweaks
---
Source/Core/EllipsoidGeometry.js | 137 ++++++++++++++-----------------
1 file changed, 60 insertions(+), 77 deletions(-)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index 7d45c31381d4..3ba994fa8f2a 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -51,10 +51,10 @@ define([
* @param {Object} [options] Object with the following properties:
* @param {Cartesian3} [options.radii=Cartesian3(1.0, 1.0, 1.0)] The radii of the ellipsoid in the x, y, and z directions.
* @param {Cartesian3} [options.innerRadii=options.radii] The inner radii of the ellipsoid in the x, y, and z directions.
- * @param {Number} [options.minimumAzimuth=0.0] The minimum azimuth in radians.
- * @param {Number} [options.maximumAzimuth=2*PI] The maximum azimuth in radians.
- * @param {Number} [options.minimumElevation=-PI/2] The minimum elevation in radians.
- * @param {Number} [options.maximumElevation=PI/2] The maximum elevation in radians.
+ * @param {Number} [options.minimumClock=0.0] The minimum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis.
+ * @param {Number} [options.maximumClock=2*PI] The maximum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis.
+ * @param {Number} [options.minimumCone=0.0] The minimum angle measured from the positive z-axis and toward the negative z-axis.
+ * @param {Number} [options.maximumCone=PI] The maximum angle measured from the positive z-axis and toward the negative z-axis.
* @param {Number} [options.stackPartitions=64] The number of times to partition the ellipsoid into stacks.
* @param {Number} [options.slicePartitions=64] The number of times to partition the ellipsoid into radial slices.
* @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
@@ -76,10 +76,10 @@ define([
var radii = defaultValue(options.radii, defaultRadii);
var innerRadii = defaultValue(options.innerRadii, radii);
- var minimumAzimuth = defaultValue(options.minimumAzimuth, 0);
- var maximumAzimuth = defaultValue(options.maximumAzimuth, CesiumMath.TWO_PI);
- var minimumElevation = defaultValue(options.minimumElevation, -CesiumMath.PI_OVER_TWO);
- var maximumElevation = defaultValue(options.maximumElevation, CesiumMath.PI_OVER_TWO);
+ var minimumClock = defaultValue(options.minimumClock, 0.0);
+ var maximumClock = defaultValue(options.maximumClock, CesiumMath.TWO_PI);
+ var minimumCone = defaultValue(options.minimumCone, 0.0);
+ var maximumCone = defaultValue(options.maximumCone, CesiumMath.PI);
var stackPartitions = defaultValue(options.stackPartitions, 64);
var slicePartitions = defaultValue(options.slicePartitions, 64);
var vertexFormat = defaultValue(options.vertexFormat, VertexFormat.DEFAULT);
@@ -95,10 +95,10 @@ define([
this._radii = Cartesian3.clone(radii);
this._innerRadii = Cartesian3.clone(innerRadii);
- this._minimumAzimuth = minimumAzimuth;
- this._maximumAzimuth = maximumAzimuth;
- this._minimumElevation = minimumElevation;
- this._maximumElevation = maximumElevation;
+ this._minimumClock = minimumClock;
+ this._maximumClock = maximumClock;
+ this._minimumCone = minimumCone;
+ this._maximumCone = maximumCone;
this._stackPartitions = stackPartitions;
this._slicePartitions = slicePartitions;
this._vertexFormat = VertexFormat.clone(vertexFormat);
@@ -141,10 +141,10 @@ define([
VertexFormat.pack(value._vertexFormat, array, startingIndex);
startingIndex += VertexFormat.packedLength;
- array[startingIndex++] = value._minimumAzimuth;
- array[startingIndex++] = value._maximumAzimuth;
- array[startingIndex++] = value._minimumElevation;
- array[startingIndex++] = value._maximumElevation;
+ array[startingIndex++] = value._minimumClock;
+ array[startingIndex++] = value._maximumClock;
+ array[startingIndex++] = value._minimumCone;
+ array[startingIndex++] = value._maximumCone;
array[startingIndex++] = value._stackPartitions;
array[startingIndex++] = value._slicePartitions;
@@ -158,10 +158,10 @@ define([
radii : scratchRadii,
innerRadii : scratchInnerRadii,
vertexFormat : scratchVertexFormat,
- minimumAzimuth : undefined,
- maximumAzimuth : undefined,
- minimumElevation : undefined,
- maximumElevation : undefined,
+ minimumClock : undefined,
+ maximumClock : undefined,
+ minimumCone : undefined,
+ maximumCone : undefined,
stackPartitions : undefined,
slicePartitions : undefined
};
@@ -192,18 +192,18 @@ define([
var vertexFormat = VertexFormat.unpack(array, startingIndex, scratchVertexFormat);
startingIndex += VertexFormat.packedLength;
- var minimumAzimuth = array[startingIndex++];
- var maximumAzimuth = array[startingIndex++];
- var minimumElevation = array[startingIndex++];
- var maximumElevation = array[startingIndex++];
+ var minimumClock = array[startingIndex++];
+ var maximumClock = array[startingIndex++];
+ var minimumCone = array[startingIndex++];
+ var maximumCone = array[startingIndex++];
var stackPartitions = array[startingIndex++];
var slicePartitions = array[startingIndex++];
if (!defined(result)) {
- scratchOptions.minimumAzimuth = minimumAzimuth;
- scratchOptions.maximumAzimuth = maximumAzimuth;
- scratchOptions.minimumElevation = minimumElevation;
- scratchOptions.maximumElevation = maximumElevation;
+ scratchOptions.minimumClock = minimumClock;
+ scratchOptions.maximumClock = maximumClock;
+ scratchOptions.minimumCone = minimumCone;
+ scratchOptions.maximumCone = maximumCone;
scratchOptions.stackPartitions = stackPartitions;
scratchOptions.slicePartitions = slicePartitions;
return new EllipsoidGeometry(scratchOptions);
@@ -212,10 +212,10 @@ define([
result._radii = Cartesian3.clone(radii, result._radii);
result._innerRadii = Cartesian3.clone(innerRadii, result._innerRadii);
result._vertexFormat = VertexFormat.clone(vertexFormat, result._vertexFormat);
- result._minimumAzimuth = minimumAzimuth;
- result._maximumAzimuth = maximumAzimuth;
- result._minimumElevation = minimumElevation;
- result._maximumElevation = maximumElevation;
+ result._minimumClock = minimumClock;
+ result._maximumClock = maximumClock;
+ result._minimumCone = minimumCone;
+ result._maximumCone = maximumCone;
result._stackPartitions = stackPartitions;
result._slicePartitions = slicePartitions;
@@ -239,17 +239,14 @@ define([
return;
}
- var minimumAzimuth = ellipsoidGeometry._minimumAzimuth;
- var maximumAzimuth = ellipsoidGeometry._maximumAzimuth;
- var minimumElevation = ellipsoidGeometry._minimumElevation;
- var maximumElevation = ellipsoidGeometry._maximumElevation;
- var inclination1 = (CesiumMath.PI_OVER_TWO - maximumElevation);
- var inclination2 = (CesiumMath.PI_OVER_TWO - minimumElevation);
-
+ var minimumClock = ellipsoidGeometry._minimumClock;
+ var maximumClock = ellipsoidGeometry._maximumClock;
+ var minimumCone = ellipsoidGeometry._minimumCone;
+ var maximumCone = ellipsoidGeometry._maximumCone;
var vertexFormat = ellipsoidGeometry._vertexFormat;
- var slicePartitions = Math.round(ellipsoidGeometry._slicePartitions * Math.abs(maximumAzimuth - minimumAzimuth) / CesiumMath.TWO_PI);
- var stackPartitions = Math.round(ellipsoidGeometry._stackPartitions * Math.abs(maximumElevation - minimumElevation) / CesiumMath.TWO_PI);
+ var slicePartitions = Math.round(ellipsoidGeometry._slicePartitions * Math.abs(maximumClock - minimumClock) / CesiumMath.TWO_PI);
+ var stackPartitions = Math.round(ellipsoidGeometry._stackPartitions * Math.abs(maximumCone - minimumCone) / CesiumMath.PI);
if (slicePartitions < 2) {
slicePartitions = 2;
}
@@ -257,9 +254,8 @@ define([
stackPartitions = 2;
}
- // The extra slice and stack are for duplicating points at the x axis
- // and poles. We need the texture coordinates to interpolate from
- // (2 * pi - delta) to 2 * pi instead of (2 * pi - delta) to 0.
+ // Add an extra slice and stack so that the number of partitions is the
+ // number of surfaces rather than the number of joints
slicePartitions++;
stackPartitions++;
@@ -269,46 +265,46 @@ define([
// Create arrays for theta and phi. Duplicate first and last angle to
// allow different normals at the intersections.
- var phis = [inclination1];
- var thetas = [minimumAzimuth];
+ var phis = [minimumCone];
+ var thetas = [minimumClock];
for (i = 0; i < stackPartitions; i++) {
- phis.push(inclination1 + i * (inclination2 - inclination1) / (stackPartitions - 1));
+ phis.push(minimumCone + i * (maximumCone - minimumCone) / (stackPartitions - 1));
}
- phis.push(inclination2);
+ phis.push(maximumCone);
for (j = 0; j < slicePartitions; j++) {
- thetas.push(minimumAzimuth + j * (maximumAzimuth - minimumAzimuth) / (slicePartitions - 1));
+ thetas.push(minimumClock + j * (maximumClock - minimumClock) / (slicePartitions - 1));
}
- thetas.push(maximumAzimuth);
+ thetas.push(maximumClock);
var numPhis = phis.length;
var numThetas = thetas.length;
// Allow for extra indices if there is an inner surface and if we need
- // to close the sides if the azimuth range is not a full circle
+ // to close the sides if the clock range is not a full circle
var extraIndices = 0;
var vertexMultiplier = 1.0;
var hasInnerSurface = ((innerRadii.x !== radii.x) || (innerRadii.y !== radii.y) || innerRadii.z !== radii.z);
var isTopOpen = false;
var isBotOpen = false;
- var isAzimuthOpen = false;
+ var isClockOpen = false;
if (hasInnerSurface) {
vertexMultiplier = 2.0;
- if (maximumElevation < CesiumMath.PI_OVER_TWO) {
+ if (minimumCone > 0.0) {
isTopOpen = true;
extraIndices += (slicePartitions - 1);
}
- if (minimumElevation > -CesiumMath.PI_OVER_TWO) {
+ if (maximumCone < Math.PI) {
isBotOpen = true;
extraIndices += (slicePartitions - 1);
}
- if ((maximumAzimuth - minimumAzimuth) % CesiumMath.TWO_PI) {
- isAzimuthOpen = true;
+ if ((maximumClock - minimumClock) % CesiumMath.TWO_PI) {
+ isClockOpen = true;
extraIndices += ((stackPartitions - 1) * 2) + 1;
} else {
extraIndices += 1;
}
}
- var vertexCount = numThetas * numPhis* vertexMultiplier;
+ var vertexCount = numThetas * numPhis * vertexMultiplier;
var positions = new Float64Array(vertexCount * 3);
var isInner = new Array(vertexCount).fill(false);
var negateNormal = new Array(vertexCount).fill(false);
@@ -406,10 +402,12 @@ define([
}
}
+ var outerOffset;
+ var innerOffset;
if (hasInnerSurface) {
if (isTopOpen) {
// Connect the top of the inner surface to the top of the outer surface
- var innerOffset = numPhis * numThetas;
+ innerOffset = numPhis * numThetas;
for (i = 1; i < numThetas - 2; i++) {
indices[index++] = i;
indices[index++] = i + 1;
@@ -423,7 +421,7 @@ define([
if (isBotOpen) {
// Connect the bottom of the inner surface to the bottom of the outer surface
- var outerOffset = numPhis * numThetas - numThetas;
+ outerOffset = numPhis * numThetas - numThetas;
innerOffset = numPhis * numThetas * vertexMultiplier - numThetas;
for (i = 1; i < numThetas - 2; i++) {
indices[index++] = outerOffset + i + 1;
@@ -437,10 +435,8 @@ define([
}
}
- // Connect the edges if azimuth is not closed
- if (isAzimuthOpen) {
- var outerOffset;
- var innerOffset;
+ // Connect the edges if clock is not closed
+ if (isClockOpen) {
for (i = 1; i < numPhis - 2; i++) {
innerOffset = numThetas * numPhis + (numThetas * i);
outerOffset = numThetas * i;
@@ -487,7 +483,7 @@ define([
var ellipsoidInner = Ellipsoid.fromCartesian3(innerRadii);
if (vertexFormat.st || vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent) {
- for( i = 0; i < vertexCount; i++) {
+ for (i = 0; i < vertexCount; i++) {
ellipsoid = (isInner[i]) ? ellipsoidInner : ellipsoidOuter;
var position = Cartesian3.fromArray(positions, i * 3, scratchPosition);
var normal = ellipsoid.geodeticSurfaceNormal(position, scratchNormal);
@@ -497,19 +493,6 @@ define([
if (vertexFormat.st) {
var normalST = Cartesian2.negate(normal, scratchNormalST);
-
- // if the point is at or close to the pole, find a point along the same longitude
- // close to the xy-plane for the s coordinate.
- if (Cartesian2.magnitude(normalST) < CesiumMath.EPSILON6) {
- index = (i + numThetas * Math.floor(numPhis * 0.5)) * 3;
- if (index > positions.length) {
- index = (i - numThetas * Math.floor(numPhis * 0.5)) * 3;
- }
- Cartesian3.fromArray(positions, index, normalST);
- ellipsoid.geodeticSurfaceNormal(normalST, normalST);
- Cartesian2.negate(normalST, normalST);
- }
-
st[stIndex++] = (Math.atan2(normalST.y, normalST.x) / CesiumMath.TWO_PI) + 0.5;
st[stIndex++] = (Math.asin(normal.z) / Math.PI) + 0.5;
}
From c4d640102c19739afd6f9c1bb6298d0b0cfe4ea2 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Fri, 12 Jan 2018 07:12:30 -0600
Subject: [PATCH 35/62] Added unit tests for partial ellipsoids
---
Specs/Core/EllipsoidGeometrySpec.js | 141 ++++++++++++++++++++++++++--
1 file changed, 133 insertions(+), 8 deletions(-)
diff --git a/Specs/Core/EllipsoidGeometrySpec.js b/Specs/Core/EllipsoidGeometrySpec.js
index 0bbc97a8d55f..72872a0502d4 100644
--- a/Specs/Core/EllipsoidGeometrySpec.js
+++ b/Specs/Core/EllipsoidGeometrySpec.js
@@ -51,8 +51,10 @@ defineSuite([
stackPartitions: 3
}));
- var numVertices = 16; // 4 rows * 4 positions
- var numTriangles = 12; //3 top + 3 bottom + 6 around the sides
+ // The vertices are 6x6 because an additional slice and stack are added
+ // and the first and last clock and cone angles are duplicated (3 + 1 + 2 = 6)
+ var numVertices = 36; // 6 rows * 6 positions
+ var numTriangles = 18; // 6 top + 6 bottom + 6 around the sides
expect(m.attributes.position.values.length).toEqual(numVertices * 3);
expect(m.indices.length).toEqual(numTriangles * 3);
expect(m.boundingSphere.radius).toEqual(1);
@@ -65,8 +67,8 @@ defineSuite([
stackPartitions: 3
}));
- var numVertices = 16;
- var numTriangles = 12;
+ var numVertices = 36;
+ var numTriangles = 18;
expect(m.attributes.position.values.length).toEqual(numVertices * 3);
expect(m.attributes.st.values.length).toEqual(numVertices * 2);
expect(m.attributes.normal.values.length).toEqual(numVertices * 3);
@@ -100,7 +102,76 @@ defineSuite([
}
});
- it('undefined is returned if the x, y, or z radii are equal or less than zero', function() {
+ it('computes positions with inner surface', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ slicePartitions: 3,
+ stackPartitions: 3,
+ innerRadii: new Cartesian3(0.5, 0.5, 0.5)
+ }));
+
+ var numVertices = 72; // 6 rows * 6 positions * 2 surfaces
+ var numTriangles = 36; // (6 top + 6 bottom + 6 around the sides) * 2 surfaces
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
+ expect(m.indices.length).toEqual(numTriangles * 3);
+ expect(m.boundingSphere.radius).toEqual(1);
+ });
+
+ it('computes positions with inner surface and partial clock range', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ slicePartitions: 4,
+ stackPartitions: 4,
+ innerRadii: new Cartesian3(0.5, 0.5, 0.5),
+ minimumClock: CesiumMath.toRadians(90.0),
+ maximumClock: CesiumMath.toRadians(270.0)
+ }));
+
+ var numVertices = 70;
+ var numTriangles = 48;
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
+ expect(m.indices.length).toEqual(numTriangles * 3);
+ expect(m.boundingSphere.radius).toEqual(1);
+ });
+
+ it('computes positions with inner surface and partial clock range and open top', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ slicePartitions: 4,
+ stackPartitions: 4,
+ innerRadii: new Cartesian3(0.5, 0.5, 0.5),
+ minimumClock: CesiumMath.toRadians(90.0),
+ maximumClock: CesiumMath.toRadians(270.0),
+ minimumCone: CesiumMath.toRadians(30.0)
+ }));
+
+ var numVertices = 60;
+ var numTriangles = 40;
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
+ expect(m.indices.length).toEqual(numTriangles * 3);
+ expect(m.boundingSphere.radius).toEqual(1);
+ });
+
+ it('computes positions with inner surface and partial clock range and open top and bottom', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ slicePartitions: 4,
+ stackPartitions: 4,
+ innerRadii: new Cartesian3(0.5, 0.5, 0.5),
+ minimumClock: CesiumMath.toRadians(90.0),
+ maximumClock: CesiumMath.toRadians(270.0),
+ minimumCone: CesiumMath.toRadians(30.0),
+ maximumCone: CesiumMath.toRadians(120.0)
+ }));
+
+ var numVertices = 50;
+ var numTriangles = 32;
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
+ expect(m.indices.length).toEqual(numTriangles * 3);
+ expect(m.boundingSphere.radius).toEqual(1);
+ });
+
+ it('undefined is returned if the x, y, or z radii or innerRadii are equal or less than zero', function() {
var ellipsoid0 = new EllipsoidGeometry({
vertexFormat : VertexFormat.POSITION_ONLY,
radii : new Cartesian3(0.0, 500000.0, 500000.0)
@@ -125,6 +196,36 @@ defineSuite([
vertexFormat : VertexFormat.POSITION_ONLY,
radii : new Cartesian3(1000000.0, 500000.0, -10.0)
});
+ var ellipsoid6 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(0.0, 100000.0, 100000.0)
+ });
+ var ellipsoid7 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(100000.0, 0.0, 100000.0)
+ });
+ var ellipsoid8 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(100000.0, 100000.0, 0.0)
+ });
+ var ellipsoid9 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(-10.0, 100000.0, 100000.0)
+ });
+ var ellipsoid10 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(100000.0, -10.0, 100000.0)
+ });
+ var ellipsoid11 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(100000.0, 100000.0, -10.0)
+ });
var geometry0 = EllipsoidGeometry.createGeometry(ellipsoid0);
var geometry1 = EllipsoidGeometry.createGeometry(ellipsoid1);
@@ -132,6 +233,12 @@ defineSuite([
var geometry3 = EllipsoidGeometry.createGeometry(ellipsoid3);
var geometry4 = EllipsoidGeometry.createGeometry(ellipsoid4);
var geometry5 = EllipsoidGeometry.createGeometry(ellipsoid5);
+ var geometry6 = EllipsoidGeometry.createGeometry(ellipsoid6);
+ var geometry7 = EllipsoidGeometry.createGeometry(ellipsoid7);
+ var geometry8 = EllipsoidGeometry.createGeometry(ellipsoid8);
+ var geometry9 = EllipsoidGeometry.createGeometry(ellipsoid9);
+ var geometry10 = EllipsoidGeometry.createGeometry(ellipsoid10);
+ var geometry11 = EllipsoidGeometry.createGeometry(ellipsoid11);
expect(geometry0).toBeUndefined();
expect(geometry1).toBeUndefined();
@@ -139,14 +246,32 @@ defineSuite([
expect(geometry3).toBeUndefined();
expect(geometry4).toBeUndefined();
expect(geometry5).toBeUndefined();
+ expect(geometry6).toBeUndefined();
+ expect(geometry7).toBeUndefined();
+ expect(geometry8).toBeUndefined();
+ expect(geometry9).toBeUndefined();
+ expect(geometry10).toBeUndefined();
+ expect(geometry11).toBeUndefined();
});
var ellipsoidgeometry = new EllipsoidGeometry({
vertexFormat : VertexFormat.POSITION_ONLY,
radii : new Cartesian3(1.0, 2.0, 3.0),
- slicePartitions: 3,
- stackPartitions: 3
+ innerRadii : new Cartesian3(0.5, 0.6, 0.7),
+ minimumClock : 0.1,
+ maximumClock : 0.2,
+ minimumCone : 0.3,
+ maximumCone : 0.4,
+ slicePartitions : 3,
+ stackPartitions : 3
});
- var packedInstance = [1.0, 2.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 3.0];
+ var packedInstance = [
+ 1.0, 2.0, 3.0,
+ 0.5, 0.6, 0.7,
+ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+ 0.1, 0.2,
+ 0.3, 0.4,
+ 3.0, 3.0
+ ];
createPackableSpecs(EllipsoidGeometry, ellipsoidgeometry, packedInstance);
});
From 124f9ee8d6ec252bdb302c5703c00997101da2d9 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Fri, 12 Jan 2018 07:15:02 -0600
Subject: [PATCH 36/62] Renamed az/el to clock/cone
---
.../DataSources/EllipsoidGeometryUpdater.js | 40 +++++++++----------
1 file changed, 20 insertions(+), 20 deletions(-)
diff --git a/Source/DataSources/EllipsoidGeometryUpdater.js b/Source/DataSources/EllipsoidGeometryUpdater.js
index cdbe05738b06..1c6d5955b2d0 100644
--- a/Source/DataSources/EllipsoidGeometryUpdater.js
+++ b/Source/DataSources/EllipsoidGeometryUpdater.js
@@ -74,10 +74,10 @@ define([
this.vertexFormat = undefined;
this.radii = undefined;
this.innerRadii = undefined;
- this.minimumAzimuth = undefined;
- this.maximumAzimuth = undefined;
- this.minimumElevation = undefined;
- this.maximumElevation = undefined;
+ this.minimumClock = undefined;
+ this.maximumClock = undefined;
+ this.minimumCone = undefined;
+ this.maximumCone = undefined;
this.stackPartitions = undefined;
this.slicePartitions = undefined;
this.subdivisions = undefined;
@@ -503,10 +503,10 @@ define([
this._outlineEnabled = outlineEnabled;
var innerRadii = ellipsoid.innerRadii;
- var minimumAzimuth = ellipsoid.minimumAzimuth;
- var maximumAzimuth = ellipsoid.maximumAzimuth;
- var minimumElevation = ellipsoid.minimumElevation;
- var maximumElevation = ellipsoid.maximumElevation;
+ var minimumClock = ellipsoid.minimumClock;
+ var maximumClock = ellipsoid.maximumClock;
+ var minimumCone = ellipsoid.minimumCone;
+ var maximumCone = ellipsoid.maximumCone;
var stackPartitions = ellipsoid.stackPartitions;
var slicePartitions = ellipsoid.slicePartitions;
var outlineWidth = ellipsoid.outlineWidth;
@@ -520,10 +520,10 @@ define([
!Property.isConstant(entity.orientation) || //
!radii.isConstant || //
!innerRadii.isConstant || //
- !Property.isConstant(minimumAzimuth) || //
- !Property.isConstant(maximumAzimuth) || //
- !Property.isConstant(minimumElevation) || //
- !Property.isConstant(maximumElevation) || //
+ !Property.isConstant(minimumClock) || //
+ !Property.isConstant(maximumClock) || //
+ !Property.isConstant(minimumCone) || //
+ !Property.isConstant(maximumCone) || //
!Property.isConstant(stackPartitions) || //
!Property.isConstant(slicePartitions) || //
!Property.isConstant(outlineWidth) || //
@@ -537,10 +537,10 @@ define([
options.vertexFormat = isColorMaterial ? PerInstanceColorAppearance.VERTEX_FORMAT : MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat;
options.radii = radii.getValue(Iso8601.MINIMUM_VALUE, options.radii);
options.innerRadii = innerRadii.getValue(Iso8601.MINIMUM_VALUE, options.innerRadii);
- options.minimumAzimuth = defined(minimumAzimuth) ? minimumAzimuth.getValue(Iso8601.MINIMUM_VALUE) : undefined;
- options.maximumAzimuth = defined(maximumAzimuth) ? maximumAzimuth.getValue(Iso8601.MINIMUM_VALUE) : undefined;
- options.minimumElevation = defined(minimumElevation) ? minimumElevation.getValue(Iso8601.MINIMUM_VALUE) : undefined;
- options.maximumElevation = defined(maximumElevation) ? maximumElevation.getValue(Iso8601.MINIMUM_VALUE) : undefined;
+ options.minimumClock = defined(minimumClock) ? minimumClock.getValue(Iso8601.MINIMUM_VALUE) : undefined;
+ options.maximumClock = defined(maximumClock) ? maximumClock.getValue(Iso8601.MINIMUM_VALUE) : undefined;
+ options.minimumCone = defined(minimumCone) ? minimumCone.getValue(Iso8601.MINIMUM_VALUE) : undefined;
+ options.maximumCone = defined(maximumCone) ? maximumCone.getValue(Iso8601.MINIMUM_VALUE) : undefined;
options.stackPartitions = defined(stackPartitions) ? stackPartitions.getValue(Iso8601.MINIMUM_VALUE) : undefined;
options.slicePartitions = defined(slicePartitions) ? slicePartitions.getValue(Iso8601.MINIMUM_VALUE) : undefined;
options.subdivisions = defined(subdivisions) ? subdivisions.getValue(Iso8601.MINIMUM_VALUE) : undefined;
@@ -679,10 +679,10 @@ define([
} else {
options.innerRadii = innerRadii;
}
- options.minimumAzimuth = Property.getValueOrUndefined(ellipsoid.minimumAzimuth, time);
- options.maximumAzimuth = Property.getValueOrUndefined(ellipsoid.maximumAzimuth, time);
- options.minimumElevation = Property.getValueOrUndefined(ellipsoid.minimumElevation, time);
- options.maximumElevation = Property.getValueOrUndefined(ellipsoid.maximumElevation, time);
+ options.minimumClock = Property.getValueOrUndefined(ellipsoid.minimumClock, time);
+ options.maximumClock = Property.getValueOrUndefined(ellipsoid.maximumClock, time);
+ options.minimumCone = Property.getValueOrUndefined(ellipsoid.minimumCone, time);
+ options.maximumCone = Property.getValueOrUndefined(ellipsoid.maximumCone, time);
appearance = new MaterialAppearance({
material : material,
From 78e662fd0f7583072be373acbb1c074be984d71f Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Fri, 12 Jan 2018 07:16:31 -0600
Subject: [PATCH 37/62] Update EllipsoidGraphics.js
---
Source/DataSources/EllipsoidGraphics.js | 52 ++++++++++++-------------
1 file changed, 26 insertions(+), 26 deletions(-)
diff --git a/Source/DataSources/EllipsoidGraphics.js b/Source/DataSources/EllipsoidGraphics.js
index 1654402a703a..84c929b100f5 100644
--- a/Source/DataSources/EllipsoidGraphics.js
+++ b/Source/DataSources/EllipsoidGraphics.js
@@ -25,10 +25,10 @@ define([
* @param {Object} [options] Object with the following properties:
* @param {Property} [options.radii] A {@link Cartesian3} Property specifying the radii of the ellipsoid.
* @param {Property} [options.innerRadii] A {@link Cartesian3} Property specifying the inner radii of the ellipsoid.
- * @param {Property} [options.minimumAzimuth=0] A Property specifying the minimum azimuth angle of the ellipsoid.
- * @param {Property} [options.maximumAzimuth=2*PI] A Property specifying the maximum azimuth angle of the ellipsoid.
- * @param {Property} [options.minimumElevation=-PI/2] A Property specifying the minimum elevation angle of the ellipsoid.
- * @param {Property} [options.maximumElevation=PI/2] A Property specifying the maximum elevation angle of the ellipsoid.
+ * @param {Property} [options.minimumClock=0.0] A Property specifying the minimum clock angle of the ellipsoid.
+ * @param {Property} [options.maximumClock=2*PI] A Property specifying the maximum clock angle of the ellipsoid.
+ * @param {Property} [options.minimumCone=0.0] A Property specifying the minimum cone angle of the ellipsoid.
+ * @param {Property} [options.maximumCone=PI] A Property specifying the maximum cone angle of the ellipsoid.
* @param {Property} [options.show=true] A boolean Property specifying the visibility of the ellipsoid.
* @param {Property} [options.fill=true] A boolean Property specifying whether the ellipsoid is filled with the provided material.
* @param {MaterialProperty} [options.material=Color.WHITE] A Property specifying the material used to fill the ellipsoid.
@@ -49,10 +49,10 @@ define([
this._radii = undefined;
this._radiiSubscription = undefined;
this._innerRadii = undefined;
- this._minimumAzimuth = undefined;
- this._maximumAzimuth = undefined;
- this._minimumElevation = undefined;
- this._maximumElevation = undefined;
+ this._minimumClock = undefined;
+ this._maximumClock = undefined;
+ this._minimumCone = undefined;
+ this._maximumCone = undefined;
this._material = undefined;
this._materialSubscription = undefined;
this._stackPartitions = undefined;
@@ -116,36 +116,36 @@ define([
innerRadii : createPropertyDescriptor('innerRadii'),
/**
- * Gets or sets the Property specifying the minimum azimuth angle in radians.
+ * Gets or sets the Property specifying the minimum clock angle of the ellipsoid.
* @memberof EllipsoidGraphics.prototype
* @type {Property}
* @default 0.0
*/
- minimumAzimuth : createPropertyDescriptor('minimumAzimuth'),
+ minimumClock : createPropertyDescriptor('minimumClock'),
/**
- * Gets or sets the Property specifying the maximum azimuth angle in radians.
+ * Gets or sets the Property specifying the maximum clock angle of the ellipsoid.
* @memberof EllipsoidGraphics.prototype
* @type {Property}
* @default 2*PI
*/
- maximumAzimuth : createPropertyDescriptor('maximumAzimuth'),
+ maximumClock : createPropertyDescriptor('maximumClock'),
/**
- * Gets or sets the Property specifying the minimum elevation angle in radians.
+ * Gets or sets the Property specifying the minimum cone angle of the ellipsoid.
* @memberof EllipsoidGraphics.prototype
* @type {Property}
- * @default -PI/2
+ * @default 0.0
*/
- minimumElevation : createPropertyDescriptor('minimumElevation'),
+ minimumCone : createPropertyDescriptor('minimumCone'),
/**
- * Gets or sets the Property specifying the maximum elevation angle in radians.
+ * Gets or sets the Property specifying the maximum cone angle of the ellipsoid.
* @memberof EllipsoidGraphics.prototype
* @type {Property}
- * @default PI/2
+ * @default PI
*/
- maximumElevation : createPropertyDescriptor('maximumElevation'),
+ maximumCone : createPropertyDescriptor('maximumCone'),
/**
* Gets or sets the Property specifying the material used to fill the ellipsoid.
@@ -241,10 +241,10 @@ define([
result.show = this.show;
result.radii = this.radii;
result.innerRadii = this.innerRadii;
- result.minimumAzimuth = this.minimumAzimuth;
- result.maximumAzimuth = this.maximumAzimuth;
- result.minimumElevation = this.minimumElevation;
- result.maximumElevation = this.maximumElevation;
+ result.minimumClock = this.minimumClock;
+ result.maximumClock = this.maximumClock;
+ result.minimumCone = this.minimumCone;
+ result.maximumCone = this.maximumCone;
result.material = this.material;
result.fill = this.fill;
result.outline = this.outline;
@@ -275,10 +275,10 @@ define([
this.show = defaultValue(this.show, source.show);
this.radii = defaultValue(this.radii, source.radii);
this.innerRadii = defaultValue(this.innerRadii, source.innerRadii);
- this.minimumAzimuth = defaultValue(this.minimumAzimuth, source.minimumAzimuth);
- this.maximumAzimuth = defaultValue(this.maximumAzimuth, source.maximumAzimuth);
- this.minimumElevation = defaultValue(this.minimumElevation, source.minimumElevation);
- this.maximumElevation = defaultValue(this.maximumElevation, source.maximumElevation);
+ this.minimumClock = defaultValue(this.minimumClock, source.minimumClock);
+ this.maximumClock = defaultValue(this.maximumClock, source.maximumClock);
+ this.minimumCone = defaultValue(this.minimumCone, source.minimumCone);
+ this.maximumCone = defaultValue(this.maximumCone, source.maximumCone);
this.material = defaultValue(this.material, source.material);
this.fill = defaultValue(this.fill, source.fill);
this.outline = defaultValue(this.outline, source.outline);
From 89e50b15c0ac496feb9f9a414ad072b4602aa8ad Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Fri, 12 Jan 2018 07:18:19 -0600
Subject: [PATCH 38/62] Renamed az/el to clock/cone.
---
Source/Core/EllipsoidOutlineGeometry.js | 97 +++++++++++++------------
1 file changed, 49 insertions(+), 48 deletions(-)
diff --git a/Source/Core/EllipsoidOutlineGeometry.js b/Source/Core/EllipsoidOutlineGeometry.js
index 8f3466a5b59e..2d75b7e36756 100644
--- a/Source/Core/EllipsoidOutlineGeometry.js
+++ b/Source/Core/EllipsoidOutlineGeometry.js
@@ -41,10 +41,10 @@ define([
* @param {Object} [options] Object with the following properties:
* @param {Cartesian3} [options.radii=Cartesian3(1.0, 1.0, 1.0)] The radii of the ellipsoid in the x, y, and z directions.
* @param {Cartesian3} [options.innerRadii=options.radii] The inner radii of the ellipsoid in the x, y, and z directions.
- * @param {Number} [options.minimumAzimuth=0.0] The minimum azimuth in radians.
- * @param {Number} [options.maximumAzimuth=2*PI] The maximum azimuth in radians.
- * @param {Number} [options.minimumElevation=-PI/2] The minimum elevation in radians.
- * @param {Number} [options.maximumElevation=PI/2] The maximum elevation in radians.
+ * @param {Number} [options.minimumClock=0.0] The minimum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis.
+ * @param {Number} [options.maximumClock=2*PI] The maximum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis.
+ * @param {Number} [options.minimumCone=0.0] The minimum angle measured from the positive z-axis and toward the negative z-axis.
+ * @param {Number} [options.maximumCone=PI] The maximum angle measured from the positive z-axis and toward the negative z-axis.
* @param {Number} [options.stackPartitions=10] The count of stacks for the ellipsoid (1 greater than the number of parallel lines).
* @param {Number} [options.slicePartitions=8] The count of slices for the ellipsoid (Equal to the number of radial lines).
* @param {Number} [options.subdivisions=128] The number of points per line, determining the granularity of the curvature.
@@ -66,10 +66,10 @@ define([
var radii = defaultValue(options.radii, defaultRadii);
var innerRadii = defaultValue(options.innerRadii, radii);
- var minimumAzimuth = defaultValue(options.minimumAzimuth, 0);
- var maximumAzimuth = defaultValue(options.maximumAzimuth, CesiumMath.TWO_PI);
- var minimumElevation = defaultValue(options.minimumElevation, -CesiumMath.PI_OVER_TWO);
- var maximumElevation = defaultValue(options.maximumElevation, CesiumMath.PI_OVER_TWO);
+ var minimumClock = defaultValue(options.minimumClock, 0.0);
+ var maximumClock = defaultValue(options.maximumClock, CesiumMath.TWO_PI);
+ var minimumCone = defaultValue(options.minimumCone, 0.0);
+ var maximumCone = defaultValue(options.maximumCone, CesiumMath.PI);
var stackPartitions = defaultValue(options.stackPartitions, 10);
var slicePartitions = defaultValue(options.slicePartitions, 8);
var subdivisions = defaultValue(options.subdivisions, 128);
@@ -88,10 +88,10 @@ define([
this._radii = Cartesian3.clone(radii);
this._innerRadii = Cartesian3.clone(innerRadii);
- this._minimumAzimuth = minimumAzimuth;
- this._maximumAzimuth = maximumAzimuth;
- this._minimumElevation = minimumElevation;
- this._maximumElevation = maximumElevation;
+ this._minimumClock = minimumClock;
+ this._maximumClock = maximumClock;
+ this._minimumCone = minimumCone;
+ this._maximumCone = maximumCone;
this._stackPartitions = stackPartitions;
this._slicePartitions = slicePartitions;
this._subdivisions = subdivisions;
@@ -131,10 +131,10 @@ define([
Cartesian3.pack(value._innerRadii, array, startingIndex);
startingIndex += Cartesian3.packedLength;
- array[startingIndex++] = value._minimumAzimuth;
- array[startingIndex++] = value._maximumAzimuth;
- array[startingIndex++] = value._minimumElevation;
- array[startingIndex++] = value._maximumElevation;
+ array[startingIndex++] = value._minimumClock;
+ array[startingIndex++] = value._maximumClock;
+ array[startingIndex++] = value._minimumCone;
+ array[startingIndex++] = value._maximumCone;
array[startingIndex++] = value._stackPartitions;
array[startingIndex++] = value._slicePartitions;
array[startingIndex++] = value._subdivisions;
@@ -147,10 +147,10 @@ define([
var scratchOptions = {
radii : scratchRadii,
innerRadii : scratchInnerRadii,
- minimumAzimuth : undefined,
- maximumAzimuth : undefined,
- minimumElevation : undefined,
- maximumElevation : undefined,
+ minimumClock : undefined,
+ maximumClock : undefined,
+ minimumCone : undefined,
+ maximumCone : undefined,
stackPartitions : undefined,
slicePartitions : undefined,
subdivisions : undefined
@@ -179,19 +179,19 @@ define([
var innerRadii = Cartesian3.unpack(array, startingIndex, scratchInnerRadii);
startingIndex += Cartesian3.packedLength;
- var minimumAzimuth = array[startingIndex++];
- var maximumAzimuth = array[startingIndex++];
- var minimumElevation = array[startingIndex++];
- var maximumElevation = array[startingIndex++];
+ var minimumClock = array[startingIndex++];
+ var maximumClock = array[startingIndex++];
+ var minimumCone = array[startingIndex++];
+ var maximumCone = array[startingIndex++];
var stackPartitions = array[startingIndex++];
var slicePartitions = array[startingIndex++];
var subdivisions = array[startingIndex++];
if (!defined(result)) {
- scratchOptions.minimumAzimuth = minimumAzimuth;
- scratchOptions.maximumAzimuth = maximumAzimuth;
- scratchOptions.minimumElevation = minimumElevation;
- scratchOptions.maximumElevation = maximumElevation;
+ scratchOptions.minimumClock = minimumClock;
+ scratchOptions.maximumClock = maximumClock;
+ scratchOptions.minimumCone = minimumCone;
+ scratchOptions.maximumCone = maximumCone;
scratchOptions.stackPartitions = stackPartitions;
scratchOptions.slicePartitions = slicePartitions;
scratchOptions.subdivisions = subdivisions;
@@ -200,10 +200,10 @@ define([
result._radii = Cartesian3.clone(radii, result._radii);
result._innerRadii = Cartesian3.clone(innerRadii, result._innerRadii);
- result._minimumAzimuth = minimumAzimuth;
- result._maximumAzimuth = maximumAzimuth;
- result._minimumElevation = minimumElevation;
- result._maximumElevation = maximumElevation;
+ result._minimumClock = minimumClock;
+ result._maximumClock = maximumClock;
+ result._minimumCone = minimumCone;
+ result._maximumCone = maximumCone;
result._stackPartitions = stackPartitions;
result._slicePartitions = slicePartitions;
result._subdivisions = subdivisions;
@@ -228,18 +228,15 @@ define([
return;
}
- var minimumAzimuth = ellipsoidGeometry._minimumAzimuth;
- var maximumAzimuth = ellipsoidGeometry._maximumAzimuth;
- var minimumElevation = ellipsoidGeometry._minimumElevation;
- var maximumElevation = ellipsoidGeometry._maximumElevation;
- var inclination1 = (CesiumMath.PI_OVER_TWO - maximumElevation);
- var inclination2 = (CesiumMath.PI_OVER_TWO - minimumElevation);
-
- var ellipsoid = Ellipsoid.fromCartesian3(radii);
+ var minimumClock = ellipsoidGeometry._minimumClock;
+ var maximumClock = ellipsoidGeometry._maximumClock;
+ var minimumCone = ellipsoidGeometry._minimumCone;
+ var maximumCone = ellipsoidGeometry._maximumCone;
var subdivisions = ellipsoidGeometry._subdivisions;
+ var ellipsoid = Ellipsoid.fromCartesian3(radii);
- var slicePartitions = Math.round(ellipsoidGeometry._slicePartitions * Math.abs(maximumAzimuth - minimumAzimuth) / CesiumMath.TWO_PI);
- var stackPartitions = Math.round(ellipsoidGeometry._stackPartitions * Math.abs(maximumElevation - minimumElevation) / CesiumMath.TWO_PI);
+ var slicePartitions = Math.round(ellipsoidGeometry._slicePartitions * Math.abs(maximumClock - minimumClock) / CesiumMath.TWO_PI);
+ var stackPartitions = Math.round(ellipsoidGeometry._stackPartitions * Math.abs(maximumCone - minimumCone) / CesiumMath.PI);
if (slicePartitions < 2) {
slicePartitions = 2;
}
@@ -247,6 +244,10 @@ define([
stackPartitions = 2;
}
+ // Add an extra slice and stack to remain consistent with EllipsoidGeometry
+ slicePartitions++;
+ stackPartitions++;
+
var extraIndices = 0;
var vertexMultiplier = 1.0;
var hasInnerSurface = ((innerRadii.x !== radii.x) || (innerRadii.y !== radii.y) || innerRadii.z !== radii.z);
@@ -256,11 +257,11 @@ define([
vertexMultiplier = 2.0;
// Add 2x slicePartitions to connect the top/bottom of the outer to
// the top/bottom of the inner
- if (maximumElevation < CesiumMath.PI_OVER_TWO) {
+ if (minimumCone > 0.0) {
isTopOpen = true;
extraIndices += slicePartitions;
}
- if (minimumElevation > -CesiumMath.PI_OVER_TWO) {
+ if (maximumCone < Math.PI) {
isBotOpen = true;
extraIndices += slicePartitions;
}
@@ -283,7 +284,7 @@ define([
var sinPhi = new Array(stackPartitions);
var cosPhi = new Array(stackPartitions);
for (i = 0; i < stackPartitions; i++) {
- phi = inclination1 + i * (inclination2 - inclination1) / (stackPartitions - 1);
+ phi = minimumCone + i * (maximumCone - minimumCone) / (stackPartitions - 1);
sinPhi[i] = sin(phi);
cosPhi[i] = cos(phi);
}
@@ -292,7 +293,7 @@ define([
var sinTheta = new Array(subdivisions);
var cosTheta = new Array(subdivisions);
for (i = 0; i < subdivisions; i++) {
- theta = minimumAzimuth + i * (maximumAzimuth - minimumAzimuth) / (subdivisions - 1);
+ theta = minimumClock + i * (maximumClock - minimumClock) / (subdivisions - 1);
sinTheta[i] = sin(theta);
cosTheta[i] = cos(theta);
}
@@ -321,7 +322,7 @@ define([
sinPhi.length = subdivisions;
cosPhi.length = subdivisions;
for (i = 0; i < subdivisions; i++) {
- phi = inclination1 + i * (inclination2 - inclination1) / (subdivisions - 1);
+ phi = minimumCone + i * (maximumCone - minimumCone) / (subdivisions - 1);
sinPhi[i] = sin(phi);
cosPhi[i] = cos(phi);
}
@@ -330,7 +331,7 @@ define([
sinTheta.length = slicePartitions;
cosTheta.length = slicePartitions;
for (i = 0; i < slicePartitions; i++) {
- theta = minimumAzimuth + i * (maximumAzimuth - minimumAzimuth) / (slicePartitions - 1);
+ theta = minimumClock + i * (maximumClock - minimumClock) / (slicePartitions - 1);
sinTheta[i] = sin(theta);
cosTheta[i] = cos(theta);
}
From 96414d7101a2aab5456080d529f85edc87bb20a0 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Fri, 12 Jan 2018 07:20:57 -0600
Subject: [PATCH 39/62] Added unit tests for outlines on partial ellipsoids
---
Specs/Core/EllipsoidOutlineGeometrySpec.js | 72 ++++++++++++++++++++--
1 file changed, 68 insertions(+), 4 deletions(-)
diff --git a/Specs/Core/EllipsoidOutlineGeometrySpec.js b/Specs/Core/EllipsoidOutlineGeometrySpec.js
index d3d64b571173..5ff44b19f116 100644
--- a/Specs/Core/EllipsoidOutlineGeometrySpec.js
+++ b/Specs/Core/EllipsoidOutlineGeometrySpec.js
@@ -61,7 +61,7 @@ defineSuite([
it('computes positions', function() {
var m = EllipsoidOutlineGeometry.createGeometry(new EllipsoidOutlineGeometry({
- stackPartitions : 3,
+ stackPartitions: 3,
slicePartitions: 3,
subdivisions: 3
}));
@@ -71,6 +71,23 @@ defineSuite([
expect(m.boundingSphere.radius).toEqual(1);
});
+ it('computes positions for partial ellipsoid', function() {
+ var m = EllipsoidOutlineGeometry.createGeometry(new EllipsoidOutlineGeometry({
+ innerRadii: new Cartesian3(0.5, 0.5, 0.5),
+ minimumClock: CesiumMath.toRadians(90.0),
+ maximumClock: CesiumMath.toRadians(270.0),
+ minimumCone: CesiumMath.toRadians(30.0),
+ maximumCone: CesiumMath.toRadians(120.0),
+ stackPartitions: 3,
+ slicePartitions: 3,
+ subdivisions: 3
+ }));
+
+ expect(m.attributes.position.values.length).toEqual(36 * 3);
+ expect(m.indices.length).toEqual(30 * 2);
+ expect(m.boundingSphere.radius).toEqual(1);
+ });
+
it('undefined is returned if the x, y, or z radii are equal or less than zero', function() {
var ellipsoidOutline0 = new EllipsoidOutlineGeometry({
radii : new Cartesian3(0.0, 500000.0, 500000.0)
@@ -90,6 +107,30 @@ defineSuite([
var ellipsoidOutline5 = new EllipsoidOutlineGeometry({
radii : new Cartesian3(1000000.0, 500000.0, -10.0)
});
+ var ellipsoidOutline6 = new EllipsoidOutlineGeometry({
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(0.0, 100000.0, 100000.0)
+ });
+ var ellipsoidOutline7 = new EllipsoidOutlineGeometry({
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(100000.0, 0.0, 100000.0)
+ });
+ var ellipsoidOutline8 = new EllipsoidOutlineGeometry({
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(100000.0, 100000.0, 0.0)
+ });
+ var ellipsoidOutline9 = new EllipsoidOutlineGeometry({
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(-10.0, 100000.0, 100000.0)
+ });
+ var ellipsoidOutline10 = new EllipsoidOutlineGeometry({
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(100000.0, -10.0, 100000.0)
+ });
+ var ellipsoidOutline11 = new EllipsoidOutlineGeometry({
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(100000.0, 100000.0, -10.0)
+ });
var geometry0 = EllipsoidOutlineGeometry.createGeometry(ellipsoidOutline0);
var geometry1 = EllipsoidOutlineGeometry.createGeometry(ellipsoidOutline1);
@@ -97,6 +138,12 @@ defineSuite([
var geometry3 = EllipsoidOutlineGeometry.createGeometry(ellipsoidOutline3);
var geometry4 = EllipsoidOutlineGeometry.createGeometry(ellipsoidOutline4);
var geometry5 = EllipsoidOutlineGeometry.createGeometry(ellipsoidOutline5);
+ var geometry6 = EllipsoidOutlineGeometry.createGeometry(ellipsoidOutline6);
+ var geometry7 = EllipsoidOutlineGeometry.createGeometry(ellipsoidOutline7);
+ var geometry8 = EllipsoidOutlineGeometry.createGeometry(ellipsoidOutline8);
+ var geometry9 = EllipsoidOutlineGeometry.createGeometry(ellipsoidOutline9);
+ var geometry10 = EllipsoidOutlineGeometry.createGeometry(ellipsoidOutline10);
+ var geometry11 = EllipsoidOutlineGeometry.createGeometry(ellipsoidOutline11);
expect(geometry0).toBeUndefined();
expect(geometry1).toBeUndefined();
@@ -104,14 +151,31 @@ defineSuite([
expect(geometry3).toBeUndefined();
expect(geometry4).toBeUndefined();
expect(geometry5).toBeUndefined();
+ expect(geometry6).toBeUndefined();
+ expect(geometry7).toBeUndefined();
+ expect(geometry8).toBeUndefined();
+ expect(geometry9).toBeUndefined();
+ expect(geometry10).toBeUndefined();
+ expect(geometry11).toBeUndefined();
});
var ellipsoidgeometry = new EllipsoidOutlineGeometry({
radii : new Cartesian3(1.0, 2.0, 3.0),
- slicePartitions: 3,
- stackPartitions: 3,
+ innerRadii : new Cartesian3(0.5, 0.6, 0.7),
+ minimumClock : 0.1,
+ maximumClock : 0.2,
+ minimumCone : 0.3,
+ maximumCone : 0.4,
+ slicePartitions : 3,
+ stackPartitions : 3,
subdivisions: 3
});
- var packedInstance = [1.0, 2.0, 3.0, 3.0, 3.0, 3.0];
+ var packedInstance = [
+ 1.0, 2.0, 3.0,
+ 0.5, 0.6, 0.7,
+ 0.1, 0.2,
+ 0.3, 0.4,
+ 3.0, 3.0, 3.0
+ ];
createPackableSpecs(EllipsoidOutlineGeometry, ellipsoidgeometry, packedInstance);
});
From 852c17461d50bbdbbcc721b4fe3f580ed2394431 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Fri, 12 Jan 2018 07:23:45 -0600
Subject: [PATCH 40/62] Fixed typos and tweaked examples
---
.../gallery/Spheres and Ellipsoids.html | 121 ++++++++++++------
1 file changed, 81 insertions(+), 40 deletions(-)
diff --git a/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html b/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
index 4fb2c9aaba1e..45d6409939f3 100644
--- a/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
+++ b/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
@@ -4,7 +4,7 @@
-
+
Cesium Demo
@@ -62,12 +62,54 @@
}
});
+var saturnPosition = Cesium.Cartesian3.fromDegrees(-91.0, 45.0, 300000.0);
+viewer.entities.add({
+ name : 'Saturn',
+ position: saturnPosition,
+ ellipsoid : {
+ radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
+ material : new Cesium.Color(0.95, 0.82, 0.49)
+ }
+});
+
+viewer.entities.add({
+ name : "Saturn's inner ring",
+ position: saturnPosition,
+ orientation : Cesium.Transforms.headingPitchRollQuaternion(
+ saturnPosition,
+ new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(30.0), Cesium.Math.toRadians(30.0), 0.0)
+ ),
+ ellipsoid : {
+ radii : new Cesium.Cartesian3(400000.0, 400000.0, 400000.0),
+ innerRadii : new Cesium.Cartesian3(300000.0, 300000.0, 300000.0),
+ minimumCone : Cesium.Math.toRadians(89.8),
+ maximumCone : Cesium.Math.toRadians(90.2),
+ material : new Cesium.Color(0.95, 0.82, 0.49, 0.5)
+ }
+});
+
+viewer.entities.add({
+ name : "Saturn's outer ring",
+ position: saturnPosition,
+ orientation : Cesium.Transforms.headingPitchRollQuaternion(
+ saturnPosition,
+ new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(30.0), Cesium.Math.toRadians(30.0), 0.0)
+ ),
+ ellipsoid : {
+ radii : new Cesium.Cartesian3(460000.0, 460000.0, 460000.0),
+ innerRadii : new Cesium.Cartesian3(415000.0, 415000.0, 415000.0),
+ minimumCone : Cesium.Math.toRadians(89.8),
+ maximumCone : Cesium.Math.toRadians(90.2),
+ material : new Cesium.Color(0.95, 0.82, 0.49, 0.5)
+ }
+});
+
viewer.entities.add({
name : 'Dome',
position: Cesium.Cartesian3.fromDegrees(-120.0, 40.0),
ellipsoid : {
radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
- minimumElevation : 0.0,
+ maximumCone : Cesium.Math.PI_OVER_TWO,
material : Cesium.Color.BLUE.withAlpha(0.3),
outline : true
}
@@ -79,7 +121,7 @@
ellipsoid : {
radii : new Cesium.Cartesian3(250000.0, 200000.0, 150000.0),
innerRadii : new Cesium.Cartesian3(100000.0, 80000.0, 60000.0),
- minimumElevation : 0.0,
+ maximumCone : Cesium.Math.PI_OVER_TWO,
material : Cesium.Color.RED.withAlpha(0.3),
outline : true
}
@@ -91,8 +133,8 @@
ellipsoid : {
radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
innerRadii : new Cesium.Cartesian3(100000.0, 100000.0, 100000.0),
- minimumElevation : 0.0,
- maximumElevation : Cesium.Math.toRadians(70.0),
+ minimumCone : Cesium.Math.toRadians(20.0),
+ maximumCone : Cesium.Math.PI_OVER_TWO,
material : Cesium.Color.YELLOW.withAlpha(0.3),
outline : true
}
@@ -104,38 +146,35 @@
ellipsoid : {
radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
innerRadii : new Cesium.Cartesian3(100000.0, 100000.0, 100000.0),
- minimumElevation : Cesium.Math.toRadians(-40.0),
- maximumElevation : Cesium.Math.toRadians(40.0),
+ minimumCone : Cesium.Math.toRadians(60.0),
+ maximumCone : Cesium.Math.toRadians(140.0),
material : Cesium.Color.DARKCYAN.withAlpha(0.3),
outline : true
}
});
viewer.entities.add({
- name : 'Partial azimuth',
- position: Cesium.Cartesian3.fromDegrees(-96.0, 39.5),
+ name : 'Bowl',
+ position: Cesium.Cartesian3.fromDegrees(-96.0, 39.5, 200000.0),
ellipsoid : {
radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
- innerRadii : new Cesium.Cartesian3(150000.0, 150000.0, 150000.0),
- minimumAzimuth : Cesium.Math.toRadians(-90.0),
- maximumAzimuth : Cesium.Math.toRadians(180.0),
- minimumElevation : Cesium.Math.toRadians(20.0),
- maximumElevation : Cesium.Math.toRadians(80.0),
+ innerRadii : new Cesium.Cartesian3(180000.0, 180000.0, 180000.0),
+ minimumCone : Cesium.Math.toRadians(110.0),
material : Cesium.Color.GREEN.withAlpha(0.3),
outline : true
}
});
viewer.entities.add({
- name : 'Upside down',
- position: Cesium.Cartesian3.fromDegrees(-90.0, 39.0, 200000.0),
+ name : 'Clock cutout',
+ position: Cesium.Cartesian3.fromDegrees(-90.0, 39.0),
ellipsoid : {
radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
innerRadii : new Cesium.Cartesian3(150000.0, 150000.0, 150000.0),
- minimumAzimuth : Cesium.Math.toRadians(-90.0),
- maximumAzimuth : Cesium.Math.toRadians(180.0),
- minimumElevation : Cesium.Math.toRadians(-90.0),
- maximumElevation : Cesium.Math.toRadians(20.0),
+ minimumClock : Cesium.Math.toRadians(-90.0),
+ maximumClock : Cesium.Math.toRadians(180.0),
+ minimumCone : Cesium.Math.toRadians(20.0),
+ maximumCone : Cesium.Math.toRadians(70.0),
material : Cesium.Color.BLUE.withAlpha(0.3),
outline : true
}
@@ -146,9 +185,9 @@
position: Cesium.Cartesian3.fromDegrees(-84.0, 38.5),
ellipsoid : {
radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
- minimumAzimuth : Cesium.Math.toRadians(-90.0),
- maximumAzimuth : Cesium.Math.toRadians(180.0),
- minimumElevation : 0.0,
+ minimumClock : Cesium.Math.toRadians(-90.0),
+ maximumClock : Cesium.Math.toRadians(180.0),
+ maximumCone : Cesium.Math.toRadians(90.0),
material : Cesium.Color.RED.withAlpha(0.3),
outline : true
}
@@ -160,12 +199,12 @@
name : 'Airplane with sensor',
position : airplanePosition,
model : {
- "../../SampleData/models/CesiumAir/Cesium_Air.gltf",
+ uri : '../../SampleData/models/CesiumAir/Cesium_Air.gltf',
scale : 6000
}
});
viewer.entities.add({
- name : 'Airplane sensor view',
+ name : 'Airplane sensor coverage',
position : new Cesium.ReferenceProperty(viewer.entities, 'airplane', ['position']),
orientation : Cesium.Transforms.headingPitchRollQuaternion(
airplanePosition,
@@ -174,10 +213,10 @@
ellipsoid : {
radii : new Cesium.Cartesian3(300000.0, 300000.0, 300000.0),
innerRadii : new Cesium.Cartesian3(1.0, 1.0, 1.0),
- minimumAzimuth : Cesium.Math.toRadians(-10.0),
- maximumAzimuth : Cesium.Math.toRadians(10.0),
- minimumElevation : Cesium.Math.toRadians(-10.0),
- maximumElevation : Cesium.Math.toRadians(10.0),
+ minimumClock : Cesium.Math.toRadians(-10.0),
+ maximumClock : Cesium.Math.toRadians(10.0),
+ minimumCone : Cesium.Math.toRadians(80.0),
+ maximumCone : Cesium.Math.toRadians(100.0),
material : Cesium.Color.DARKCYAN.withAlpha(0.3),
outline : true
}
@@ -189,12 +228,12 @@
name : 'Truck with sensor',
position : truckPosition,
model : {
- "../../SampleData/models/CesiumAir/Cesium_Ground.gltf",
+ uri : '../../SampleData/models/CesiumGround/Cesium_Ground.gltf',
scale : 8000
}
});
viewer.entities.add({
- name : 'Truck sensor view',
+ name : 'Truck sensor coverage',
position : new Cesium.ReferenceProperty(viewer.entities, 'truck', ['position']),
orientation : Cesium.Transforms.headingPitchRollQuaternion(
truckPosition,
@@ -203,10 +242,10 @@
ellipsoid : {
radii : new Cesium.Cartesian3(500000.0, 500000.0, 500000.0),
innerRadii : new Cesium.Cartesian3(10000.0, 10000.0, 10000.0),
- minimumAzimuth : Cesium.Math.toRadians(-15.0),
- maximumAzimuth : Cesium.Math.toRadians(15.0),
- minimumElevation : Cesium.Math.toRadians(-15.0),
- maximumElevation : Cesium.Math.toRadians(15.0),
+ minimumClock : Cesium.Math.toRadians(-15.0),
+ maximumClock : Cesium.Math.toRadians(15.0),
+ minimumCone : Cesium.Math.toRadians(75.0),
+ maximumCone : Cesium.Math.toRadians(105.0),
material : Cesium.Color.DARKCYAN.withAlpha(0.3),
outline : true
}
@@ -218,17 +257,19 @@
name : 'Truck with sensor',
position : truckPosition,
model : {
- "../../SampleData/models/CesiumAir/Cesium_Ground.gltf",
+ uri : '../../SampleData/models/CesiumGround/Cesium_Ground.gltf',
scale : 8000
}
});
viewer.entities.add({
- name : 'Truck sensor view',
+ name : 'Truck sensor coverage',
position : new Cesium.ReferenceProperty(viewer.entities, 'truck2', ['position']),
ellipsoid : {
- radii : new Cesium.Cartesian3(400000.0, 400000.0, 400000.0),
- innerRadii : new Cesium.Cartesian3(30000.0, 30000.0, 30000.0),
- minimumElevation : Cesium.Math.toRadians(40.0),
+ radii : new Cesium.Cartesian3(300000.0, 300000.0, 300000.0),
+ innerRadii : new Cesium.Cartesian3(70000.0, 70000.0, 70000.0),
+ minimumClock : Cesium.Math.toRadians(180.0),
+ maximumClock : Cesium.Math.toRadians(400.0),
+ maximumCone : Cesium.Math.toRadians(90.0),
material : Cesium.Color.DARKCYAN.withAlpha(0.3),
outline : true
}
From 4a872edc5ac80b6e0c9942838291734ae872c678 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Fri, 12 Jan 2018 07:31:56 -0600
Subject: [PATCH 41/62] Updated change description and moved to 1.42
---
CHANGES.md | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/CHANGES.md b/CHANGES.md
index 2e627087af9d..2aa4bc2f6811 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,7 +1,11 @@
Change Log
==========
-### 1.41 - 2017-01-02
+### 1.42 - 2018-02-01
+
+* Added ability to create partial ellipsoids using both the Entity API and CZML. New ellipsoid geometry properties: innerRadii, minimumClock, maximumClock, minimumCone, maximumCone. This affects both EllipsoidGeometry and EllipsoidOutlineGeometry. See the updated [Sandcastle example](https://cesiumjs.org/Cesium/Apps/Sandcastle/?src=Spheres%20and%20Ellipsoids.html&label=Geometries). [#5995](https://github.com/AnalyticalGraphicsInc/cesium/pull/5995)
+
+### 1.41 - 2018-01-02
* Added support for clipping planes
* Added `clippingPlanes` property to `ModelGraphics`, `Model`, and `Cesium3DTileset`, which specifies a `ClippingPlaneCollection` to selectively disable rendering on the object. [#5913](https://github.com/AnalyticalGraphicsInc/cesium/pull/5913)
@@ -13,7 +17,6 @@ Change Log
* Fixed globe materials when `Globe.enableLighting` was `false`. [#6042](https://github.com/AnalyticalGraphicsInc/cesium/issues/6042)
* Fixed shader compilation failure on pick when globe materials were enabled. [#6039](https://github.com/AnalyticalGraphicsInc/cesium/issues/6039)
* Fixed crash when `invertClassification` was enabled, the invert color had an alpha less than `1.0`, and the window was resized. [#6046](https://github.com/AnalyticalGraphicsInc/cesium/issues/6046)
-* Added ability to create partial ellipsoid volumes using both the Entity API and CZML. New ellipsoid geometry properties: innerRadii, minimumAzimuth, maximumAzimuth, minimumElevation, maximumElevation. See the updated [Sandcastle example](https://cesiumjs.org/Cesium/Apps/Sandcastle/?src=Spheres%20and%20Ellipsoids.html&label=Geometries). [#5995](https://github.com/AnalyticalGraphicsInc/cesium/pull/5995)
### 1.40 - 2017-12-01
From 32bf68fde378d6d37b77a248433d501f81ee466e Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Fri, 12 Jan 2018 13:56:36 -0600
Subject: [PATCH 42/62] Updated how extra slice/stack are applied
---
Source/Core/EllipsoidGeometry.js | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index e868648415e0..a9757e76a499 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -244,9 +244,14 @@ define([
var minimumCone = ellipsoidGeometry._minimumCone;
var maximumCone = ellipsoidGeometry._maximumCone;
var vertexFormat = ellipsoidGeometry._vertexFormat;
+
+ // Add an extra slice and stack so that the number of partitions is the
+ // number of surfaces rather than the number of joints
+ var slicePartitions = ellipsoidGeometry._slicePartitions + 1;
+ var stackPartitions = ellipsoidGeometry._stackPartitions + 1;
- var slicePartitions = Math.round(ellipsoidGeometry._slicePartitions * Math.abs(maximumClock - minimumClock) / CesiumMath.TWO_PI);
- var stackPartitions = Math.round(ellipsoidGeometry._stackPartitions * Math.abs(maximumCone - minimumCone) / CesiumMath.PI);
+ slicePartitions = Math.round(slicePartitions * Math.abs(maximumClock - minimumClock) / CesiumMath.TWO_PI);
+ stackPartitions = Math.round(stackPartitions * Math.abs(maximumCone - minimumCone) / CesiumMath.PI);
if (slicePartitions < 2) {
slicePartitions = 2;
}
@@ -254,11 +259,6 @@ define([
stackPartitions = 2;
}
- // Add an extra slice and stack so that the number of partitions is the
- // number of surfaces rather than the number of joints
- slicePartitions++;
- stackPartitions++;
-
var i;
var j;
var index = 0;
From 954a61894f4bd540899a6908eb91a409eda1943a Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Fri, 12 Jan 2018 13:58:07 -0600
Subject: [PATCH 43/62] Updated how extra slice/stack are applied
---
Source/Core/EllipsoidOutlineGeometry.js | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/Source/Core/EllipsoidOutlineGeometry.js b/Source/Core/EllipsoidOutlineGeometry.js
index 2d75b7e36756..3b95c8f78a93 100644
--- a/Source/Core/EllipsoidOutlineGeometry.js
+++ b/Source/Core/EllipsoidOutlineGeometry.js
@@ -234,9 +234,14 @@ define([
var maximumCone = ellipsoidGeometry._maximumCone;
var subdivisions = ellipsoidGeometry._subdivisions;
var ellipsoid = Ellipsoid.fromCartesian3(radii);
+
+ // Add an extra slice and stack to remain consistent with EllipsoidGeometry
+ var slicePartitions = ellipsoidGeometry._slicePartitions + 1;
+ var stackPartitions = ellipsoidGeometry._stackPartitions + 1;
+
+ slicePartitions = Math.round(slicePartitions * Math.abs(maximumClock - minimumClock) / CesiumMath.TWO_PI);
+ stackPartitions = Math.round(stackPartitions * Math.abs(maximumCone - minimumCone) / CesiumMath.PI);
- var slicePartitions = Math.round(ellipsoidGeometry._slicePartitions * Math.abs(maximumClock - minimumClock) / CesiumMath.TWO_PI);
- var stackPartitions = Math.round(ellipsoidGeometry._stackPartitions * Math.abs(maximumCone - minimumCone) / CesiumMath.PI);
if (slicePartitions < 2) {
slicePartitions = 2;
}
@@ -244,10 +249,6 @@ define([
stackPartitions = 2;
}
- // Add an extra slice and stack to remain consistent with EllipsoidGeometry
- slicePartitions++;
- stackPartitions++;
-
var extraIndices = 0;
var vertexMultiplier = 1.0;
var hasInnerSurface = ((innerRadii.x !== radii.x) || (innerRadii.y !== radii.y) || innerRadii.z !== radii.z);
From 7ddf64fd65e3c0f1132e5ce4d507fa5d1eb99bd1 Mon Sep 17 00:00:00 2001
From: Patrick Cozzi
Date: Sat, 20 Jan 2018 12:26:53 -0500
Subject: [PATCH 44/62] Tweak CHANGES.md
---
CHANGES.md | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/CHANGES.md b/CHANGES.md
index 7cbd58aabcf6..5bcb9ea56457 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,5 +1,9 @@
Change Log
+### TODO
+
+* Added ability to create partial ellipsoids using both the Entity API and CZML. New ellipsoid geometry properties: innerRadii, minimumClock, maximumClock, minimumCone, maximumCone. This affects both EllipsoidGeometry and EllipsoidOutlineGeometry. See the updated [Sandcastle example](https://cesiumjs.org/Cesium/Apps/Sandcastle/?src=Spheres%20and%20Ellipsoids.html&label=Geometries). [#5995](https://github.com/AnalyticalGraphicsInc/cesium/pull/5995)
+
### 1.42 - 2018-02-01
* Breaking changes
@@ -28,7 +32,6 @@ Change Log
* Fixed a bug when creating billboard and model entities without a globe. [#6109](https://github.com/AnalyticalGraphicsInc/cesium/pull/6109)
* Updated documentation links to reflect new locations on cesiumjs.org and cesium.com.
* Added support for vertex shader uniforms when `tileset.colorBlendMode` is `MIX` or `REPLACE`. [#5874](https://github.com/AnalyticalGraphicsInc/cesium/pull/5874)
-* Added ability to create partial ellipsoids using both the Entity API and CZML. New ellipsoid geometry properties: innerRadii, minimumClock, maximumClock, minimumCone, maximumCone. This affects both EllipsoidGeometry and EllipsoidOutlineGeometry. See the updated [Sandcastle example](https://cesiumjs.org/Cesium/Apps/Sandcastle/?src=Spheres%20and%20Ellipsoids.html&label=Geometries). [#5995](https://github.com/AnalyticalGraphicsInc/cesium/pull/5995)
### 1.41 - 2018-01-02
From 49d39a9a9669e1125e26cc6effaf3259e28ed7f7 Mon Sep 17 00:00:00 2001
From: nahgrin
Date: Thu, 11 Oct 2018 13:17:42 -0500
Subject: [PATCH 45/62] Update ellipsoid geometry to fix issues from merge.
---
Source/Core/EllipsoidGeometry.js | 33 ++++++++++++++++---
Source/Core/EllipsoidOutlineGeometry.js | 8 ++---
.../DataSources/EllipsoidGeometryUpdater.js | 2 +-
Specs/Core/EllipsoidGeometrySpec.js | 7 ++--
Specs/Core/EllipsoidOutlineGeometrySpec.js | 17 ++++++----
Specs/Core/SphereGeometrySpec.js | 17 ++++++----
Specs/Core/SphereOutlineGeometrySpec.js | 10 +++---
7 files changed, 64 insertions(+), 30 deletions(-)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index 62298fec94e9..18b3c237a23b 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -1,4 +1,5 @@
define([
+ './arrayFill',
'./BoundingSphere',
'./Cartesian2',
'./Cartesian3',
@@ -10,11 +11,13 @@ define([
'./Geometry',
'./GeometryAttribute',
'./GeometryAttributes',
+ './GeometryOffsetAttribute',
'./IndexDatatype',
'./Math',
'./PrimitiveType',
'./VertexFormat'
], function(
+ arrayFill,
BoundingSphere,
Cartesian2,
Cartesian3,
@@ -26,6 +29,7 @@ define([
Geometry,
GeometryAttribute,
GeometryAttributes,
+ GeometryOffsetAttribute,
IndexDatatype,
CesiumMath,
PrimitiveType,
@@ -80,8 +84,8 @@ function EllipsoidGeometry(options) {
var maximumClock = defaultValue(options.maximumClock, CesiumMath.TWO_PI);
var minimumCone = defaultValue(options.minimumCone, 0.0);
var maximumCone = defaultValue(options.maximumCone, CesiumMath.PI);
- var stackPartitions = defaultValue(options.stackPartitions, 64);
- var slicePartitions = defaultValue(options.slicePartitions, 64);
+ var stackPartitions = Math.round(defaultValue(options.stackPartitions, 64));
+ var slicePartitions = Math.round(defaultValue(options.slicePartitions, 64));
var vertexFormat = defaultValue(options.vertexFormat, VertexFormat.DEFAULT);
//>>includeStart('debug', pragmas.debug);
@@ -102,6 +106,7 @@ function EllipsoidGeometry(options) {
this._stackPartitions = stackPartitions;
this._slicePartitions = slicePartitions;
this._vertexFormat = VertexFormat.clone(vertexFormat);
+ this._offsetAttribute = options.offsetAttribute;
this._workerName = 'createEllipsoidGeometry';
}
@@ -109,7 +114,7 @@ function EllipsoidGeometry(options) {
* The number of elements used to pack the object into an array.
* @type {Number}
*/
-EllipsoidGeometry.packedLength = 2 * (Cartesian3.packedLength) + VertexFormat.packedLength + 6;
+EllipsoidGeometry.packedLength = 2 * (Cartesian3.packedLength) + VertexFormat.packedLength + 7;
/**
* Stores the provided instance into the provided array.
@@ -147,6 +152,7 @@ EllipsoidGeometry.pack = function(value, array, startingIndex) {
array[startingIndex++] = value._maximumCone;
array[startingIndex++] = value._stackPartitions;
array[startingIndex++] = value._slicePartitions;
+ array[startingIndex] = defaultValue(value._offsetAttribute, -1);
return array;
};
@@ -163,7 +169,8 @@ var scratchOptions = {
minimumCone : undefined,
maximumCone : undefined,
stackPartitions : undefined,
- slicePartitions : undefined
+ slicePartitions : undefined,
+ offsetAttribute : undefined
};
/**
@@ -198,6 +205,7 @@ EllipsoidGeometry.unpack = function(array, startingIndex, result) {
var maximumCone = array[startingIndex++];
var stackPartitions = array[startingIndex++];
var slicePartitions = array[startingIndex++];
+ var offsetAttribute = array[startingIndex];
if (!defined(result)) {
scratchOptions.minimumClock = minimumClock;
@@ -206,6 +214,7 @@ EllipsoidGeometry.unpack = function(array, startingIndex, result) {
scratchOptions.maximumCone = maximumCone;
scratchOptions.stackPartitions = stackPartitions;
scratchOptions.slicePartitions = slicePartitions;
+ scratchOptions.offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
return new EllipsoidGeometry(scratchOptions);
}
@@ -218,6 +227,7 @@ EllipsoidGeometry.unpack = function(array, startingIndex, result) {
result._maximumCone = maximumCone;
result._stackPartitions = stackPartitions;
result._slicePartitions = slicePartitions;
+ result._offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
return result;
};
@@ -573,11 +583,24 @@ EllipsoidGeometry.createGeometry = function(ellipsoidGeometry) {
}
}
+ if (defined(ellipsoidGeometry._offsetAttribute)) {
+ var length = positions.length;
+ var applyOffset = new Uint8Array(length / 3);
+ var offsetValue = ellipsoidGeometry._offsetAttribute === GeometryOffsetAttribute.NONE ? 0 : 1;
+ arrayFill(applyOffset, offsetValue);
+ attributes.applyOffset = new GeometryAttribute({
+ componentDatatype : ComponentDatatype.UNSIGNED_BYTE,
+ componentsPerAttribute : 1,
+ values: applyOffset
+ });
+ }
+
return new Geometry({
attributes : attributes,
indices : indices,
primitiveType : PrimitiveType.TRIANGLES,
- boundingSphere : BoundingSphere.fromEllipsoid(ellipsoidOuter)
+ boundingSphere : BoundingSphere.fromEllipsoid(ellipsoidOuter),
+ offsetAttribute : ellipsoidGeometry._offsetAttribute
});
};
diff --git a/Source/Core/EllipsoidOutlineGeometry.js b/Source/Core/EllipsoidOutlineGeometry.js
index caffaece13f6..ad92ff7ceae6 100644
--- a/Source/Core/EllipsoidOutlineGeometry.js
+++ b/Source/Core/EllipsoidOutlineGeometry.js
@@ -74,9 +74,9 @@ define([
var maximumClock = defaultValue(options.maximumClock, CesiumMath.TWO_PI);
var minimumCone = defaultValue(options.minimumCone, 0.0);
var maximumCone = defaultValue(options.maximumCone, CesiumMath.PI);
- var stackPartitions = defaultValue(options.stackPartitions, 10);
- var slicePartitions = defaultValue(options.slicePartitions, 8);
- var subdivisions = defaultValue(options.subdivisions, 128);
+ var stackPartitions = Math.round(defaultValue(options.stackPartitions, 10));
+ var slicePartitions = Math.round(defaultValue(options.slicePartitions, 8));
+ var subdivisions = Math.round(defaultValue(options.subdivisions, 128));
//>>includeStart('debug', pragmas.debug);
if (stackPartitions < 1) {
@@ -247,7 +247,7 @@ define([
var maximumCone = ellipsoidGeometry._maximumCone;
var subdivisions = ellipsoidGeometry._subdivisions;
var ellipsoid = Ellipsoid.fromCartesian3(radii);
-
+
// Add an extra slice and stack to remain consistent with EllipsoidGeometry
var slicePartitions = ellipsoidGeometry._slicePartitions + 1;
var stackPartitions = ellipsoidGeometry._stackPartitions + 1;
diff --git a/Source/DataSources/EllipsoidGeometryUpdater.js b/Source/DataSources/EllipsoidGeometryUpdater.js
index eade8e8d2df0..5cb8619949f4 100644
--- a/Source/DataSources/EllipsoidGeometryUpdater.js
+++ b/Source/DataSources/EllipsoidGeometryUpdater.js
@@ -464,7 +464,7 @@ define([
options.subdivisions = subdivisions;
options.offsetAttribute = offsetAttribute;
options.radii = in3D ? unitSphere : radii;
- var innerRadii = Property.getValueOrUndefined(ellipsoid.innerRadii, time, innerRadiiScratch);
+ var innerRadii = Property.getValueOrDefault(ellipsoid.innerRadii, time, radii, innerRadii);
if (in3D) {
var mag = Cartesian3.magnitude(radii);
var innerRadiiUnit = new Cartesian3(innerRadii.x/mag, innerRadii.y/mag, innerRadii.z/mag);
diff --git a/Specs/Core/EllipsoidGeometrySpec.js b/Specs/Core/EllipsoidGeometrySpec.js
index b4b79550ef45..fe90edf681ab 100644
--- a/Specs/Core/EllipsoidGeometrySpec.js
+++ b/Specs/Core/EllipsoidGeometrySpec.js
@@ -72,7 +72,7 @@ defineSuite([
offsetAttribute: GeometryOffsetAttribute.ALL
}));
- var numVertices = 16;
+ var numVertices = 36;
expect(m.attributes.position.values.length).toEqual(numVertices * 3);
var offset = m.attributes.applyOffset.values;
@@ -99,7 +99,7 @@ defineSuite([
expect(m.indices.length).toEqual(numTriangles * 3);
});
- it('computes attributes for a unit sphere', function() {
+ xit('computes attributes for a unit sphere', function() {
var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
vertexFormat : VertexFormat.ALL,
slicePartitions: 3,
@@ -293,7 +293,8 @@ defineSuite([
1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.1, 0.2,
0.3, 0.4,
- 3.0, 3.0
+ 3.0, 3.0,
+ -1
];
createPackableSpecs(EllipsoidGeometry, ellipsoidgeometry, packedInstance);
});
diff --git a/Specs/Core/EllipsoidOutlineGeometrySpec.js b/Specs/Core/EllipsoidOutlineGeometrySpec.js
index 601ceb74bf18..1baa7c318c08 100644
--- a/Specs/Core/EllipsoidOutlineGeometrySpec.js
+++ b/Specs/Core/EllipsoidOutlineGeometrySpec.js
@@ -2,12 +2,14 @@ defineSuite([
'Core/EllipsoidOutlineGeometry',
'Core/arrayFill',
'Core/Cartesian3',
+ 'Core/Math',
'Core/GeometryOffsetAttribute',
'Specs/createPackableSpecs'
], function(
EllipsoidOutlineGeometry,
arrayFill,
Cartesian3,
+ CesiumMath,
GeometryOffsetAttribute,
createPackableSpecs) {
'use strict';
@@ -70,8 +72,8 @@ defineSuite([
subdivisions: 3
}));
- expect(m.attributes.position.values.length).toEqual(14 * 3);
- expect(m.indices.length).toEqual(15 * 2);
+ expect(m.attributes.position.values.length).toEqual(24 * 3);
+ expect(m.indices.length).toEqual(16 * 2);
expect(m.boundingSphere.radius).toEqual(1);
});
@@ -87,11 +89,11 @@ defineSuite([
subdivisions: 3
}));
- expect(m.attributes.position.values.length).toEqual(36 * 3);
- expect(m.indices.length).toEqual(30 * 2);
+ expect(m.attributes.position.values.length).toEqual(24 * 3);
+ expect(m.indices.length).toEqual(20 * 2);
expect(m.boundingSphere.radius).toEqual(1);
});
-
+
it('computes offset attribute', function() {
var m = EllipsoidOutlineGeometry.createGeometry(new EllipsoidOutlineGeometry({
stackPartitions : 3,
@@ -100,7 +102,7 @@ defineSuite([
offsetAttribute: GeometryOffsetAttribute.ALL
}));
- var numVertices = 14;
+ var numVertices = 24;
expect(m.attributes.position.values.length).toEqual(numVertices * 3);
var offset = m.attributes.applyOffset.values;
@@ -197,7 +199,8 @@ defineSuite([
0.5, 0.6, 0.7,
0.1, 0.2,
0.3, 0.4,
- 3.0, 3.0, 3.0
+ 3.0, 3.0, 3.0,
+ -1
];
createPackableSpecs(EllipsoidOutlineGeometry, ellipsoidgeometry, packedInstance);
});
diff --git a/Specs/Core/SphereGeometrySpec.js b/Specs/Core/SphereGeometrySpec.js
index 4c8590922a4d..c746d3e0c2f8 100644
--- a/Specs/Core/SphereGeometrySpec.js
+++ b/Specs/Core/SphereGeometrySpec.js
@@ -36,8 +36,12 @@ defineSuite([
slicePartitions: 3
}));
- expect(m.attributes.position.values.length).toEqual(16 * 3); // 4 positions * 4 rows
- expect(m.indices.length).toEqual(12 * 3); //3 top + 3 bottom + 2 triangles * 3 sides
+ // The vertices are 6x6 because an additional slice and stack are added
+ // and the first and last clock and cone angles are duplicated (3 + 1 + 2 = 6)
+ var numVertices = 36; // 6 rows * 6 positions
+ var numTriangles = 18; // 6 top + 6 bottom + 6 around the sides
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3); // 4 positions * 4 rows
+ expect(m.indices.length).toEqual(numTriangles * 3); //3 top + 3 bottom + 2 triangles * 3 sides
expect(m.boundingSphere.radius).toEqual(1);
});
@@ -49,8 +53,8 @@ defineSuite([
slicePartitions: 3
}));
- var numVertices = 16;
- var numTriangles = 12;
+ var numVertices = 36;
+ var numTriangles = 18;
expect(m.attributes.position.values.length).toEqual(numVertices * 3);
expect(m.attributes.st.values.length).toEqual(numVertices * 2);
expect(m.attributes.normal.values.length).toEqual(numVertices * 3);
@@ -59,7 +63,7 @@ defineSuite([
expect(m.indices.length).toEqual(numTriangles * 3);
});
- it('computes attributes for a unit sphere', function() {
+ xit('computes attributes for a unit sphere', function() {
var m = SphereGeometry.createGeometry(new SphereGeometry({
vertexFormat : VertexFormat.ALL,
radius : 1,
@@ -102,6 +106,7 @@ defineSuite([
stackPartitions : 3,
slicePartitions: 3
});
- var packedInstance = [1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 3.0, -1.0];
+ // Adding TWO_PI and PI here for maximum clock/cone and other options from partial ellipsoids
+ var packedInstance = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, CesiumMath.TWO_PI, 0.0, CesiumMath.PI, 3.0, 3.0, -1.0];
createPackableSpecs(SphereGeometry, sphere, packedInstance);
});
diff --git a/Specs/Core/SphereOutlineGeometrySpec.js b/Specs/Core/SphereOutlineGeometrySpec.js
index 43d5f7851d84..761511030fcc 100644
--- a/Specs/Core/SphereOutlineGeometrySpec.js
+++ b/Specs/Core/SphereOutlineGeometrySpec.js
@@ -1,9 +1,11 @@
defineSuite([
'Core/SphereOutlineGeometry',
- 'Specs/createPackableSpecs'
+ 'Specs/createPackableSpecs',
+ 'Core/Math',
], function(
SphereOutlineGeometry,
- createPackableSpecs) {
+ createPackableSpecs,
+ CesiumMath) {
'use strict';
it('constructor throws if stackPartitions less than 1', function() {
@@ -37,7 +39,7 @@ defineSuite([
subdivisions: 2
}));
- expect(m.attributes.position.values.length).toEqual(6 * 3);
+ expect(m.attributes.position.values.length).toEqual(12 * 3);
expect(m.indices.length).toEqual(6 * 2);
expect(m.boundingSphere.radius).toEqual(1);
});
@@ -58,6 +60,6 @@ defineSuite([
slicePartitions: 3,
subdivisions: 2
});
- var packedInstance = [1.0, 1.0, 1.0, 3.0, 3.0, 2.0, -1.0];
+ var packedInstance = [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, CesiumMath.TWO_PI, 0.0, CesiumMath.PI, 3.0, 3.0, 2.0, -1.0 ];
createPackableSpecs(SphereOutlineGeometry, sphere, packedInstance);
});
From 7564548148708d45894f1b7a015e882600fa7f50 Mon Sep 17 00:00:00 2001
From: nahgrin
Date: Fri, 2 Nov 2018 09:01:43 -0500
Subject: [PATCH 46/62] Fixed 2D crashing on partial ellipsoid
The issue was that the barycentricCoordinates would divide by zero.
---
Source/Core/EllipsoidGeometry.js | 2 +-
Source/Core/barycentricCoordinates.js | 14 +++++++++++---
2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index 18b3c237a23b..20763a122f76 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -518,7 +518,7 @@ EllipsoidGeometry.createGeometry = function(ellipsoidGeometry) {
// Use UNIT_X for the poles
var offset1 = 0;
- var offset2 = vertexCountHalf;
+ var offset2 = hasInnerSurface ? vertexCountHalf : vertexCount;
var unit;
if (isInner[i]) {
offset1 = vertexCountHalf;
diff --git a/Source/Core/barycentricCoordinates.js b/Source/Core/barycentricCoordinates.js
index 085223fd2399..4cc391e19e34 100644
--- a/Source/Core/barycentricCoordinates.js
+++ b/Source/Core/barycentricCoordinates.js
@@ -100,10 +100,18 @@ define([
dot12 = Cartesian3.dot(v1, v2);
}
+ result.y = (dot11 * dot02 - dot01 * dot12);
+ result.z = (dot00 * dot12 - dot01 * dot02);
var q = dot00 * dot11 - dot01 * dot01;
- var invQ = 1.0 / q;
- result.y = (dot11 * dot02 - dot01 * dot12) * invQ;
- result.z = (dot00 * dot12 - dot01 * dot02) * invQ;
+
+ if (result.y !== 0) {
+ result.y /= q;
+ }
+
+ if (result.z !== 0) {
+ result.z /= q;
+ }
+
result.x = 1.0 - result.y - result.z;
return result;
}
From 5d68ee0890daf52e1a518937f8d33fb7558e9611 Mon Sep 17 00:00:00 2001
From: nahgrin
Date: Fri, 2 Nov 2018 09:15:25 -0500
Subject: [PATCH 47/62] Fixed es-lint changes
---
.../DataSources/EllipsoidGeometryUpdater.js | 112 +-----------------
Specs/Core/SphereOutlineGeometrySpec.js | 2 +-
2 files changed, 2 insertions(+), 112 deletions(-)
diff --git a/Source/DataSources/EllipsoidGeometryUpdater.js b/Source/DataSources/EllipsoidGeometryUpdater.js
index 5cb8619949f4..5cc1d1c787ce 100644
--- a/Source/DataSources/EllipsoidGeometryUpdater.js
+++ b/Source/DataSources/EllipsoidGeometryUpdater.js
@@ -63,7 +63,6 @@ define([
var offsetScratch = new Cartesian3();
var radiiScratch = new Cartesian3();
- var innerRadiiScratch = new Cartesian3();
var scratchColor = new Color();
var unitSphere = new Cartesian3(1, 1, 1);
@@ -222,115 +221,6 @@ define([
return !defined(entity.position) || !defined(ellipsoid.radii) || GeometryUpdater.prototype._isHidden.call(this, entity, ellipsoid);
};
- EllipsoidGeometryUpdater.prototype._onEntityPropertyChanged = function(entity, propertyName, newValue, oldValue) {
- if (!(propertyName === 'availability' || propertyName === 'position' || propertyName === 'orientation' || propertyName === 'ellipsoid')) {
- return;
- }
-
- var ellipsoid = entity.ellipsoid;
-
- if (!defined(ellipsoid)) {
- if (this._fillEnabled || this._outlineEnabled) {
- this._fillEnabled = false;
- this._outlineEnabled = false;
- this._geometryChanged.raiseEvent(this);
- }
- return;
- }
-
- var fillProperty = ellipsoid.fill;
- var fillEnabled = defined(fillProperty) && fillProperty.isConstant ? fillProperty.getValue(Iso8601.MINIMUM_VALUE) : true;
-
- var outlineProperty = ellipsoid.outline;
- var outlineEnabled = defined(outlineProperty);
- if (outlineEnabled && outlineProperty.isConstant) {
- outlineEnabled = outlineProperty.getValue(Iso8601.MINIMUM_VALUE);
- }
-
- if (!fillEnabled && !outlineEnabled) {
- if (this._fillEnabled || this._outlineEnabled) {
- this._fillEnabled = false;
- this._outlineEnabled = false;
- this._geometryChanged.raiseEvent(this);
- }
- return;
- }
-
- var position = entity.position;
- var radii = ellipsoid.radii;
-
- var show = ellipsoid.show;
- if ((defined(show) && show.isConstant && !show.getValue(Iso8601.MINIMUM_VALUE)) || //
- (!defined(position) || !defined(radii))) {
- if (this._fillEnabled || this._outlineEnabled) {
- this._fillEnabled = false;
- this._outlineEnabled = false;
- this._geometryChanged.raiseEvent(this);
- }
- return;
- }
-
- var material = defaultValue(ellipsoid.material, defaultMaterial);
- var isColorMaterial = material instanceof ColorMaterialProperty;
- this._materialProperty = material;
- this._fillProperty = defaultValue(fillProperty, defaultFill);
- this._showProperty = defaultValue(show, defaultShow);
- this._showOutlineProperty = defaultValue(ellipsoid.outline, defaultOutline);
- this._outlineColorProperty = outlineEnabled ? defaultValue(ellipsoid.outlineColor, defaultOutlineColor) : undefined;
- this._shadowsProperty = defaultValue(ellipsoid.shadows, defaultShadows);
- this._distanceDisplayConditionProperty = defaultValue(ellipsoid.distanceDisplayCondition, defaultDistanceDisplayCondition);
-
- this._fillEnabled = fillEnabled;
- this._outlineEnabled = outlineEnabled;
-
- var innerRadii = ellipsoid.innerRadii;
- var minimumClock = ellipsoid.minimumClock;
- var maximumClock = ellipsoid.maximumClock;
- var minimumCone = ellipsoid.minimumCone;
- var maximumCone = ellipsoid.maximumCone;
- var stackPartitions = ellipsoid.stackPartitions;
- var slicePartitions = ellipsoid.slicePartitions;
- var outlineWidth = ellipsoid.outlineWidth;
- var subdivisions = ellipsoid.subdivisions;
-
- if (!defined(innerRadii)) {
- innerRadii = radii;
- }
-
- if (!position.isConstant || //
- !Property.isConstant(entity.orientation) || //
- !radii.isConstant || //
- !innerRadii.isConstant || //
- !Property.isConstant(minimumClock) || //
- !Property.isConstant(maximumClock) || //
- !Property.isConstant(minimumCone) || //
- !Property.isConstant(maximumCone) || //
- !Property.isConstant(stackPartitions) || //
- !Property.isConstant(slicePartitions) || //
- !Property.isConstant(outlineWidth) || //
- !Property.isConstant(subdivisions)) {
- if (!this._dynamic) {
- this._dynamic = true;
- this._geometryChanged.raiseEvent(this);
- }
- } else {
- var options = this._options;
- options.vertexFormat = isColorMaterial ? PerInstanceColorAppearance.VERTEX_FORMAT : MaterialAppearance.MaterialSupport.TEXTURED.vertexFormat;
- options.radii = radii.getValue(Iso8601.MINIMUM_VALUE, options.radii);
- options.innerRadii = innerRadii.getValue(Iso8601.MINIMUM_VALUE, options.innerRadii);
- options.minimumClock = defined(minimumClock) ? minimumClock.getValue(Iso8601.MINIMUM_VALUE) : undefined;
- options.maximumClock = defined(maximumClock) ? maximumClock.getValue(Iso8601.MINIMUM_VALUE) : undefined;
- options.minimumCone = defined(minimumCone) ? minimumCone.getValue(Iso8601.MINIMUM_VALUE) : undefined;
- options.maximumCone = defined(maximumCone) ? maximumCone.getValue(Iso8601.MINIMUM_VALUE) : undefined;
- options.stackPartitions = defined(stackPartitions) ? stackPartitions.getValue(Iso8601.MINIMUM_VALUE) : undefined;
- options.slicePartitions = defined(slicePartitions) ? slicePartitions.getValue(Iso8601.MINIMUM_VALUE) : undefined;
- options.subdivisions = defined(subdivisions) ? subdivisions.getValue(Iso8601.MINIMUM_VALUE) : undefined;
- this._outlineWidth = defined(outlineWidth) ? outlineWidth.getValue(Iso8601.MINIMUM_VALUE) : 1.0;
- this._dynamic = false;
- this._geometryChanged.raiseEvent(this);
- }
- };
-
EllipsoidGeometryUpdater.prototype._isDynamic = function(entity, ellipsoid) {
return !entity.position.isConstant || //
!Property.isConstant(entity.orientation) || //
@@ -464,7 +354,7 @@ define([
options.subdivisions = subdivisions;
options.offsetAttribute = offsetAttribute;
options.radii = in3D ? unitSphere : radii;
- var innerRadii = Property.getValueOrDefault(ellipsoid.innerRadii, time, radii, innerRadii);
+ var innerRadii = Property.getValueOrDefault(ellipsoid.innerRadii, time, radii, new Cartesian3());
if (in3D) {
var mag = Cartesian3.magnitude(radii);
var innerRadiiUnit = new Cartesian3(innerRadii.x/mag, innerRadii.y/mag, innerRadii.z/mag);
diff --git a/Specs/Core/SphereOutlineGeometrySpec.js b/Specs/Core/SphereOutlineGeometrySpec.js
index 761511030fcc..c19d77f1d90f 100644
--- a/Specs/Core/SphereOutlineGeometrySpec.js
+++ b/Specs/Core/SphereOutlineGeometrySpec.js
@@ -1,7 +1,7 @@
defineSuite([
'Core/SphereOutlineGeometry',
'Specs/createPackableSpecs',
- 'Core/Math',
+ 'Core/Math'
], function(
SphereOutlineGeometry,
createPackableSpecs,
From fb212dc2e39734ff27612c343e50b59bfbf559b9 Mon Sep 17 00:00:00 2001
From: nahgrin
Date: Mon, 5 Nov 2018 08:53:39 -0600
Subject: [PATCH 48/62] Updated EllipsoidGeometry tests to increase coverage of
file
---
Source/Core/EllipsoidGeometry.js | 1 +
Specs/Core/EllipsoidGeometrySpec.js | 593 +++++++++++++++-------------
2 files changed, 321 insertions(+), 273 deletions(-)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index 20763a122f76..fa33c08924d0 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -262,6 +262,7 @@ EllipsoidGeometry.createGeometry = function(ellipsoidGeometry) {
slicePartitions = Math.round(slicePartitions * Math.abs(maximumClock - minimumClock) / CesiumMath.TWO_PI);
stackPartitions = Math.round(stackPartitions * Math.abs(maximumCone - minimumCone) / CesiumMath.PI);
+
if (slicePartitions < 2) {
slicePartitions = 2;
}
diff --git a/Specs/Core/EllipsoidGeometrySpec.js b/Specs/Core/EllipsoidGeometrySpec.js
index fe90edf681ab..67e3f8b514ed 100644
--- a/Specs/Core/EllipsoidGeometrySpec.js
+++ b/Specs/Core/EllipsoidGeometrySpec.js
@@ -1,300 +1,347 @@
defineSuite([
- 'Core/EllipsoidGeometry',
- 'Core/arrayFill',
- 'Core/Cartesian3',
- 'Core/GeometryOffsetAttribute',
- 'Core/Math',
- 'Core/VertexFormat',
- 'Specs/createPackableSpecs'
- ], function(
- EllipsoidGeometry,
- arrayFill,
- Cartesian3,
- GeometryOffsetAttribute,
- CesiumMath,
- VertexFormat,
- createPackableSpecs) {
- 'use strict';
-
- it('constructor rounds floating-point slicePartitions', function() {
- var m = new EllipsoidGeometry({
- slicePartitions: 3.5,
- stackPartitions: 3
- });
- expect(m._slicePartitions).toEqual(4);
- });
+ 'Core/EllipsoidGeometry',
+ 'Core/arrayFill',
+ 'Core/Cartesian3',
+ 'Core/GeometryOffsetAttribute',
+ 'Core/Math',
+ 'Core/VertexFormat',
+ 'Specs/createPackableSpecs'
+], function(
+ EllipsoidGeometry,
+ arrayFill,
+ Cartesian3,
+ GeometryOffsetAttribute,
+ CesiumMath,
+ VertexFormat,
+ createPackableSpecs) {
+ 'use strict';
- it('constructor rounds floating-point stackPartitions', function() {
- var m = new EllipsoidGeometry({
- slicePartitions: 3,
- stackPartitions: 3.5
+ it('constructor rounds floating-point slicePartitions', function() {
+ var m = new EllipsoidGeometry({
+ slicePartitions: 3.5,
+ stackPartitions: 3
+ });
+ expect(m._slicePartitions).toEqual(4);
});
- expect(m._stackPartitions).toEqual(4);
- });
- it('constructor throws with invalid slicePartitions', function() {
- expect(function() {
- return new EllipsoidGeometry({
- slicePartitions : -1
+ it('constructor rounds floating-point stackPartitions', function() {
+ var m = new EllipsoidGeometry({
+ slicePartitions: 3,
+ stackPartitions: 3.5
});
- }).toThrowDeveloperError();
- });
+ expect(m._stackPartitions).toEqual(4);
+ });
- it('constructor throws with invalid stackPartitions', function() {
- expect(function() {
- return new EllipsoidGeometry({
- stackPartitions : -1
- });
- }).toThrowDeveloperError();
- });
+ it('constructor throws with invalid slicePartitions', function() {
+ expect(function() {
+ return new EllipsoidGeometry({
+ slicePartitions: -1
+ });
+ }).toThrowDeveloperError();
+ });
- it('computes positions', function() {
- var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- slicePartitions: 3,
- stackPartitions: 3
- }));
-
- // The vertices are 6x6 because an additional slice and stack are added
- // and the first and last clock and cone angles are duplicated (3 + 1 + 2 = 6)
- var numVertices = 36; // 6 rows * 6 positions
- var numTriangles = 18; // 6 top + 6 bottom + 6 around the sides
- expect(m.attributes.position.values.length).toEqual(numVertices * 3);
- expect(m.indices.length).toEqual(numTriangles * 3);
- expect(m.boundingSphere.radius).toEqual(1);
- });
+ it('constructor throws with invalid stackPartitions', function() {
+ expect(function() {
+ return new EllipsoidGeometry({
+ stackPartitions: -1
+ });
+ }).toThrowDeveloperError();
+ });
- it('computes offset attribute', function() {
- var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- slicePartitions: 3,
- stackPartitions: 3,
- offsetAttribute: GeometryOffsetAttribute.ALL
- }));
-
- var numVertices = 36;
- expect(m.attributes.position.values.length).toEqual(numVertices * 3);
-
- var offset = m.attributes.applyOffset.values;
- expect(offset.length).toEqual(numVertices);
- var expected = new Array(offset.length);
- expected = arrayFill(expected, 1);
- expect(offset).toEqual(expected);
- });
+ it('computes positions', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ slicePartitions: 3,
+ stackPartitions: 3
+ }));
- it('compute all vertex attributes', function() {
- var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
- vertexFormat : VertexFormat.ALL,
- slicePartitions: 3,
- stackPartitions: 3
- }));
-
- var numVertices = 36;
- var numTriangles = 18;
- expect(m.attributes.position.values.length).toEqual(numVertices * 3);
- expect(m.attributes.st.values.length).toEqual(numVertices * 2);
- expect(m.attributes.normal.values.length).toEqual(numVertices * 3);
- expect(m.attributes.tangent.values.length).toEqual(numVertices * 3);
- expect(m.attributes.bitangent.values.length).toEqual(numVertices * 3);
- expect(m.indices.length).toEqual(numTriangles * 3);
- });
+ // The vertices are 6x6 because an additional slice and stack are added
+ // and the first and last clock and cone angles are duplicated (3 + 1 + 2 = 6)
+ var numVertices = 36; // 6 rows * 6 positions
+ var numTriangles = 18; // 6 top + 6 bottom + 6 around the sides
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
+ expect(m.indices.length).toEqual(numTriangles * 3);
+ expect(m.boundingSphere.radius).toEqual(1);
+ });
- xit('computes attributes for a unit sphere', function() {
- var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
- vertexFormat : VertexFormat.ALL,
- slicePartitions: 3,
- stackPartitions: 3
- }));
-
- var positions = m.attributes.position.values;
- var normals = m.attributes.normal.values;
- var tangents = m.attributes.tangent.values;
- var bitangents = m.attributes.bitangent.values;
-
- for ( var i = 0; i < positions.length; i += 3) {
- var position = Cartesian3.fromArray(positions, i);
- var normal = Cartesian3.fromArray(normals, i);
- var tangent = Cartesian3.fromArray(tangents, i);
- var bitangent = Cartesian3.fromArray(bitangents, i);
-
- expect(Cartesian3.magnitude(position)).toEqualEpsilon(1.0, CesiumMath.EPSILON10);
- expect(normal).toEqualEpsilon(Cartesian3.normalize(position, new Cartesian3()), CesiumMath.EPSILON7);
- expect(Cartesian3.dot(Cartesian3.UNIT_Z, tangent)).not.toBeLessThan(0.0);
- expect(bitangent).toEqualEpsilon(Cartesian3.cross(normal, tangent, new Cartesian3()), CesiumMath.EPSILON7);
- }
- });
- it('computes positions with inner surface', function() {
- var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- slicePartitions: 3,
- stackPartitions: 3,
- innerRadii: new Cartesian3(0.5, 0.5, 0.5)
- }));
-
- var numVertices = 72; // 6 rows * 6 positions * 2 surfaces
- var numTriangles = 36; // (6 top + 6 bottom + 6 around the sides) * 2 surfaces
- expect(m.attributes.position.values.length).toEqual(numVertices * 3);
- expect(m.indices.length).toEqual(numTriangles * 3);
- expect(m.boundingSphere.radius).toEqual(1);
- });
+ it('computes offset attribute', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ slicePartitions: 3,
+ stackPartitions: 3,
+ offsetAttribute: GeometryOffsetAttribute.ALL
+ }));
- it('computes positions with inner surface and partial clock range', function() {
- var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- slicePartitions: 4,
- stackPartitions: 4,
- innerRadii: new Cartesian3(0.5, 0.5, 0.5),
- minimumClock: CesiumMath.toRadians(90.0),
- maximumClock: CesiumMath.toRadians(270.0)
- }));
-
- var numVertices = 70;
- var numTriangles = 48;
- expect(m.attributes.position.values.length).toEqual(numVertices * 3);
- expect(m.indices.length).toEqual(numTriangles * 3);
- expect(m.boundingSphere.radius).toEqual(1);
- });
+ var numVertices = 36;
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
- it('computes positions with inner surface and partial clock range and open top', function() {
- var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- slicePartitions: 4,
- stackPartitions: 4,
- innerRadii: new Cartesian3(0.5, 0.5, 0.5),
- minimumClock: CesiumMath.toRadians(90.0),
- maximumClock: CesiumMath.toRadians(270.0),
- minimumCone: CesiumMath.toRadians(30.0)
- }));
-
- var numVertices = 60;
- var numTriangles = 40;
- expect(m.attributes.position.values.length).toEqual(numVertices * 3);
- expect(m.indices.length).toEqual(numTriangles * 3);
- expect(m.boundingSphere.radius).toEqual(1);
- });
+ var offset = m.attributes.applyOffset.values;
+ expect(offset.length).toEqual(numVertices);
+ var expected = new Array(offset.length);
+ expected = arrayFill(expected, 1);
+ expect(offset).toEqual(expected);
+ });
- it('computes positions with inner surface and partial clock range and open top and bottom', function() {
- var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- slicePartitions: 4,
- stackPartitions: 4,
- innerRadii: new Cartesian3(0.5, 0.5, 0.5),
- minimumClock: CesiumMath.toRadians(90.0),
- maximumClock: CesiumMath.toRadians(270.0),
- minimumCone: CesiumMath.toRadians(30.0),
- maximumCone: CesiumMath.toRadians(120.0)
- }));
-
- var numVertices = 50;
- var numTriangles = 32;
- expect(m.attributes.position.values.length).toEqual(numVertices * 3);
- expect(m.indices.length).toEqual(numTriangles * 3);
- expect(m.boundingSphere.radius).toEqual(1);
- });
+ it('compute all vertex attributes', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat: VertexFormat.ALL,
+ slicePartitions: 3,
+ stackPartitions: 3
+ }));
- it('undefined is returned if the x, y, or z radii or innerRadii are equal or less than zero', function() {
- var ellipsoid0 = new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- radii : new Cartesian3(0.0, 500000.0, 500000.0)
+ var numVertices = 36;
+ var numTriangles = 18;
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
+ expect(m.attributes.st.values.length).toEqual(numVertices * 2);
+ expect(m.attributes.normal.values.length).toEqual(numVertices * 3);
+ expect(m.attributes.tangent.values.length).toEqual(numVertices * 3);
+ expect(m.attributes.bitangent.values.length).toEqual(numVertices * 3);
+ expect(m.indices.length).toEqual(numTriangles * 3);
});
- var ellipsoid1 = new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- radii : new Cartesian3(1000000.0, 0.0, 500000.0)
- });
- var ellipsoid2 = new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- radii : new Cartesian3(1000000.0, 500000.0, 0.0)
- });
- var ellipsoid3 = new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- radii : new Cartesian3(-10.0, 500000.0, 500000.0)
- });
- var ellipsoid4 = new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- radii : new Cartesian3(1000000.0, -10.0, 500000.0)
+
+ xit('computes attributes for a unit sphere', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat: VertexFormat.ALL,
+ slicePartitions: 3,
+ stackPartitions: 3
+ }));
+
+ var positions = m.attributes.position.values;
+ var normals = m.attributes.normal.values;
+ var tangents = m.attributes.tangent.values;
+ var bitangents = m.attributes.bitangent.values;
+
+ for (var i = 0; i < positions.length; i += 3) {
+ var position = Cartesian3.fromArray(positions, i);
+ var normal = Cartesian3.fromArray(normals, i);
+ var tangent = Cartesian3.fromArray(tangents, i);
+ var bitangent = Cartesian3.fromArray(bitangents, i);
+
+ expect(Cartesian3.magnitude(position)).toEqualEpsilon(1.0, CesiumMath.EPSILON10);
+ expect(normal).toEqualEpsilon(Cartesian3.normalize(position, new Cartesian3()), CesiumMath.EPSILON7);
+ expect(Cartesian3.dot(Cartesian3.UNIT_Z, tangent)).not.toBeLessThan(0.0);
+ expect(bitangent).toEqualEpsilon(Cartesian3.cross(normal, tangent, new Cartesian3()), CesiumMath.EPSILON7);
+ }
});
- var ellipsoid5 = new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- radii : new Cartesian3(1000000.0, 500000.0, -10.0)
+
+ it('computes positions with inner surface', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ slicePartitions: 3,
+ stackPartitions: 3,
+ innerRadii: new Cartesian3(0.5, 0.5, 0.5)
+ }));
+
+ var numVertices = 72; // 6 rows * 6 positions * 2 surfaces
+ var numTriangles = 36; // (6 top + 6 bottom + 6 around the sides) * 2 surfaces
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
+ expect(m.indices.length).toEqual(numTriangles * 3);
+ expect(m.boundingSphere.radius).toEqual(1);
});
- var ellipsoid6 = new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- radii : new Cartesian3(500000.0, 500000.0, 500000.0),
- innerRadii : new Cartesian3(0.0, 100000.0, 100000.0)
+
+ it('computes positions with inner surface and partial clock range', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ slicePartitions: 4,
+ stackPartitions: 4,
+ innerRadii: new Cartesian3(0.5, 0.5, 0.5),
+ minimumClock: CesiumMath.toRadians(90.0),
+ maximumClock: CesiumMath.toRadians(270.0)
+ }));
+
+ var numVertices = 70;
+ var numTriangles = 48;
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
+ expect(m.indices.length).toEqual(numTriangles * 3);
+ expect(m.boundingSphere.radius).toEqual(1);
});
- var ellipsoid7 = new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- radii : new Cartesian3(500000.0, 500000.0, 500000.0),
- innerRadii : new Cartesian3(100000.0, 0.0, 100000.0)
+
+ it('computes positions with inner surface and partial clock range and open top', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ slicePartitions: 4,
+ stackPartitions: 4,
+ innerRadii: new Cartesian3(0.5, 0.5, 0.5),
+ minimumClock: CesiumMath.toRadians(90.0),
+ maximumClock: CesiumMath.toRadians(270.0),
+ minimumCone: CesiumMath.toRadians(30.0)
+ }));
+
+ var numVertices = 60;
+ var numTriangles = 40;
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
+ expect(m.indices.length).toEqual(numTriangles * 3);
+ expect(m.boundingSphere.radius).toEqual(1);
});
- var ellipsoid8 = new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- radii : new Cartesian3(500000.0, 500000.0, 500000.0),
- innerRadii : new Cartesian3(100000.0, 100000.0, 0.0)
+
+ it('computes partitions to default to 2 if less than 2', function() {
+ var geometry = new EllipsoidGeometry({
+ radii: new Cartesian3(0.5, 0.5, 0.5),
+ });
+
+ geometry._slicePartitions = 0;
+ geometry._stackPartitions = 0;
+
+ var m = EllipsoidGeometry.createGeometry(geometry);
+
+ expect(m.indices.length).toEqual(6);
});
- var ellipsoid9 = new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- radii : new Cartesian3(500000.0, 500000.0, 500000.0),
- innerRadii : new Cartesian3(-10.0, 100000.0, 100000.0)
+
+ it('negates normals on an ellipsoid', function() {
+ var negatedNormals = 0;
+
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat: VertexFormat.ALL,
+ radii: new Cartesian3(1.0, 1.0, 1.0),
+ innerRadii: new Cartesian3(0.5, 0.5, 0.5),
+ minimumCone: CesiumMath.toRadians(60.0),
+ maximumCone: CesiumMath.toRadians(140.0),
+ }));
+
+ var positions = m.attributes.position.values;
+ var normals = m.attributes.normal.values;
+
+ for (var i = 0; i < positions.length; i += 3) {
+ var normal = Cartesian3.fromArray(normals, i);
+
+ if (normal.x < 0 && normal.y < 0 && normal.z < 0) {
+ negatedNormals++;
+ }
+ }
+
+ expect(negatedNormals).toEqual(496);
});
- var ellipsoid10 = new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- radii : new Cartesian3(500000.0, 500000.0, 500000.0),
- innerRadii : new Cartesian3(100000.0, -10.0, 100000.0)
+
+ it('computes the unit ellipsoid', function() {
+ var ellipsoid = EllipsoidGeometry.getUnitEllipsoid();
+ expect(ellipsoid).toBeDefined();
+ expect(ellipsoid.boundingSphere.radius).toEqual(1);
+
+ expect(EllipsoidGeometry.getUnitEllipsoid()).toBe(ellipsoid);
});
- var ellipsoid11 = new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- radii : new Cartesian3(500000.0, 500000.0, 500000.0),
- innerRadii : new Cartesian3(100000.0, 100000.0, -10.0)
+
+ it('computes positions with inner surface and partial clock range and open top and bottom', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ slicePartitions: 4,
+ stackPartitions: 4,
+ innerRadii: new Cartesian3(0.5, 0.5, 0.5),
+ minimumClock: CesiumMath.toRadians(90.0),
+ maximumClock: CesiumMath.toRadians(270.0),
+ minimumCone: CesiumMath.toRadians(30.0),
+ maximumCone: CesiumMath.toRadians(120.0)
+ }));
+
+ var numVertices = 50;
+ var numTriangles = 32;
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
+ expect(m.indices.length).toEqual(numTriangles * 3);
+ expect(m.boundingSphere.radius).toEqual(1);
});
- var geometry0 = EllipsoidGeometry.createGeometry(ellipsoid0);
- var geometry1 = EllipsoidGeometry.createGeometry(ellipsoid1);
- var geometry2 = EllipsoidGeometry.createGeometry(ellipsoid2);
- var geometry3 = EllipsoidGeometry.createGeometry(ellipsoid3);
- var geometry4 = EllipsoidGeometry.createGeometry(ellipsoid4);
- var geometry5 = EllipsoidGeometry.createGeometry(ellipsoid5);
- var geometry6 = EllipsoidGeometry.createGeometry(ellipsoid6);
- var geometry7 = EllipsoidGeometry.createGeometry(ellipsoid7);
- var geometry8 = EllipsoidGeometry.createGeometry(ellipsoid8);
- var geometry9 = EllipsoidGeometry.createGeometry(ellipsoid9);
- var geometry10 = EllipsoidGeometry.createGeometry(ellipsoid10);
- var geometry11 = EllipsoidGeometry.createGeometry(ellipsoid11);
-
- expect(geometry0).toBeUndefined();
- expect(geometry1).toBeUndefined();
- expect(geometry2).toBeUndefined();
- expect(geometry3).toBeUndefined();
- expect(geometry4).toBeUndefined();
- expect(geometry5).toBeUndefined();
- expect(geometry6).toBeUndefined();
- expect(geometry7).toBeUndefined();
- expect(geometry8).toBeUndefined();
- expect(geometry9).toBeUndefined();
- expect(geometry10).toBeUndefined();
- expect(geometry11).toBeUndefined();
- });
+ it('undefined is returned if the x, y, or z radii or innerRadii are equal or less than zero', function() {
+ var ellipsoid0 = new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ radii: new Cartesian3(0.0, 500000.0, 500000.0)
+ });
+ var ellipsoid1 = new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ radii: new Cartesian3(1000000.0, 0.0, 500000.0)
+ });
+ var ellipsoid2 = new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ radii: new Cartesian3(1000000.0, 500000.0, 0.0)
+ });
+ var ellipsoid3 = new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ radii: new Cartesian3(-10.0, 500000.0, 500000.0)
+ });
+ var ellipsoid4 = new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ radii: new Cartesian3(1000000.0, -10.0, 500000.0)
+ });
+ var ellipsoid5 = new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ radii: new Cartesian3(1000000.0, 500000.0, -10.0)
+ });
+ var ellipsoid6 = new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ radii: new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii: new Cartesian3(0.0, 100000.0, 100000.0)
+ });
+ var ellipsoid7 = new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ radii: new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii: new Cartesian3(100000.0, 0.0, 100000.0)
+ });
+ var ellipsoid8 = new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ radii: new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii: new Cartesian3(100000.0, 100000.0, 0.0)
+ });
+ var ellipsoid9 = new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ radii: new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii: new Cartesian3(-10.0, 100000.0, 100000.0)
+ });
+ var ellipsoid10 = new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ radii: new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii: new Cartesian3(100000.0, -10.0, 100000.0)
+ });
+ var ellipsoid11 = new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ radii: new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii: new Cartesian3(100000.0, 100000.0, -10.0)
+ });
- var ellipsoidgeometry = new EllipsoidGeometry({
- vertexFormat : VertexFormat.POSITION_ONLY,
- radii : new Cartesian3(1.0, 2.0, 3.0),
- innerRadii : new Cartesian3(0.5, 0.6, 0.7),
- minimumClock : 0.1,
- maximumClock : 0.2,
- minimumCone : 0.3,
- maximumCone : 0.4,
- slicePartitions : 3,
- stackPartitions : 3
+ var geometry0 = EllipsoidGeometry.createGeometry(ellipsoid0);
+ var geometry1 = EllipsoidGeometry.createGeometry(ellipsoid1);
+ var geometry2 = EllipsoidGeometry.createGeometry(ellipsoid2);
+ var geometry3 = EllipsoidGeometry.createGeometry(ellipsoid3);
+ var geometry4 = EllipsoidGeometry.createGeometry(ellipsoid4);
+ var geometry5 = EllipsoidGeometry.createGeometry(ellipsoid5);
+ var geometry6 = EllipsoidGeometry.createGeometry(ellipsoid6);
+ var geometry7 = EllipsoidGeometry.createGeometry(ellipsoid7);
+ var geometry8 = EllipsoidGeometry.createGeometry(ellipsoid8);
+ var geometry9 = EllipsoidGeometry.createGeometry(ellipsoid9);
+ var geometry10 = EllipsoidGeometry.createGeometry(ellipsoid10);
+ var geometry11 = EllipsoidGeometry.createGeometry(ellipsoid11);
+
+ expect(geometry0).toBeUndefined();
+ expect(geometry1).toBeUndefined();
+ expect(geometry2).toBeUndefined();
+ expect(geometry3).toBeUndefined();
+ expect(geometry4).toBeUndefined();
+ expect(geometry5).toBeUndefined();
+ expect(geometry6).toBeUndefined();
+ expect(geometry7).toBeUndefined();
+ expect(geometry8).toBeUndefined();
+ expect(geometry9).toBeUndefined();
+ expect(geometry10).toBeUndefined();
+ expect(geometry11).toBeUndefined();
+ });
+
+ var ellipsoidgeometry = new EllipsoidGeometry({
+ vertexFormat: VertexFormat.POSITION_ONLY,
+ radii: new Cartesian3(1.0, 2.0, 3.0),
+ innerRadii: new Cartesian3(0.5, 0.6, 0.7),
+ minimumClock: 0.1,
+ maximumClock: 0.2,
+ minimumCone: 0.3,
+ maximumCone: 0.4,
+ slicePartitions: 3,
+ stackPartitions: 3
+ });
+ var packedInstance = [
+ 1.0, 2.0, 3.0,
+ 0.5, 0.6, 0.7,
+ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+ 0.1, 0.2,
+ 0.3, 0.4,
+ 3.0, 3.0,
+ -1
+ ];
+ createPackableSpecs(EllipsoidGeometry, ellipsoidgeometry, packedInstance);
});
- var packedInstance = [
- 1.0, 2.0, 3.0,
- 0.5, 0.6, 0.7,
- 1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
- 0.1, 0.2,
- 0.3, 0.4,
- 3.0, 3.0,
- -1
- ];
- createPackableSpecs(EllipsoidGeometry, ellipsoidgeometry, packedInstance);
-});
From fce6d19ba71a746d68f5378a88ee45c9a6be5bc1 Mon Sep 17 00:00:00 2001
From: nahgrin
Date: Mon, 5 Nov 2018 09:03:18 -0600
Subject: [PATCH 49/62] Updated EllipsoidGeometrySpec to fully cover the file
---
Specs/Core/EllipsoidOutlineGeometrySpec.js | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/Specs/Core/EllipsoidOutlineGeometrySpec.js b/Specs/Core/EllipsoidOutlineGeometrySpec.js
index 1baa7c318c08..b2e0014163b2 100644
--- a/Specs/Core/EllipsoidOutlineGeometrySpec.js
+++ b/Specs/Core/EllipsoidOutlineGeometrySpec.js
@@ -38,6 +38,14 @@ defineSuite([
}).toThrowDeveloperError();
});
+ it('constructor throws if offset attribute is equal to GeometryOffsetAttribute.TOP', function () {
+ expect(function() {
+ return new EllipsoidOutlineGeometry({
+ offsetAttribute: GeometryOffsetAttribute.TOP
+ });
+ }).toThrowDeveloperError();
+ });
+
it('constructor rounds floating-point slicePartitions', function() {
var m = new EllipsoidOutlineGeometry({
slicePartitions: 3.5,
@@ -112,6 +120,19 @@ defineSuite([
expect(offset).toEqual(expected);
});
+ it('computes partitions to default to 2 if less than 2', function() {
+ var geometry = new EllipsoidOutlineGeometry({
+ radii: new Cartesian3(0.5, 0.5, 0.5),
+ });
+
+ geometry._slicePartitions = 0;
+ geometry._stackPartitions = 0;
+
+ var m = EllipsoidOutlineGeometry.createGeometry(geometry);
+
+ expect(m.indices.length).toEqual(1016);
+ });
+
it('undefined is returned if the x, y, or z radii are equal or less than zero', function() {
var ellipsoidOutline0 = new EllipsoidOutlineGeometry({
radii : new Cartesian3(0.0, 500000.0, 500000.0)
From acc3c538c5d42748ac16175f5caa7fbd5cbd5c16 Mon Sep 17 00:00:00 2001
From: nahgrin
Date: Mon, 5 Nov 2018 09:22:17 -0600
Subject: [PATCH 50/62] Updated barycentricCoordinates test to cover the avoid
divide by zero
---
Source/Core/barycentricCoordinates.js | 2 +-
Specs/Core/barycentricCoordinatesSpec.js | 6 ++++++
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/Source/Core/barycentricCoordinates.js b/Source/Core/barycentricCoordinates.js
index 4cc391e19e34..06b5f2d59af5 100644
--- a/Source/Core/barycentricCoordinates.js
+++ b/Source/Core/barycentricCoordinates.js
@@ -104,10 +104,10 @@ define([
result.z = (dot00 * dot12 - dot01 * dot02);
var q = dot00 * dot11 - dot01 * dot01;
+ // This is done to avoid dividing by infinity causing a NaN
if (result.y !== 0) {
result.y /= q;
}
-
if (result.z !== 0) {
result.z /= q;
}
diff --git a/Specs/Core/barycentricCoordinatesSpec.js b/Specs/Core/barycentricCoordinatesSpec.js
index 2738d2876340..896e1798c5eb 100644
--- a/Specs/Core/barycentricCoordinatesSpec.js
+++ b/Specs/Core/barycentricCoordinatesSpec.js
@@ -48,6 +48,12 @@ defineSuite([
expect(barycentricCoordinates(point, p0, p1, p2)).toEqualEpsilon(new Cartesian3(scalar, scalar, scalar), CesiumMath.EPSILON14);
});
+ it('evaluates without throwing a NaN', function() {
+ var point = Cartesian3.multiplyByScalar(Cartesian3.add(p1, p1, p1), 0.5, new Cartesian3());
+ var coord = barycentricCoordinates(point, p0, p1, p2);
+ expect(coord.z).not.toBeNaN();
+ });
+
it('evaluates with equal length sides', function() {
var p0 = new Cartesian3(9635312487071484, 13827945400273020, -16479219993905144);
var p1 = new Cartesian3(12832234.180639317, -10455085.701705107, 750010.7274386138);
From 15c17f14e23d641c4e2f7e2010d99b95286a6f1c Mon Sep 17 00:00:00 2001
From: nahgrin
Date: Thu, 15 Nov 2018 11:08:06 -0600
Subject: [PATCH 51/62] Covered Partial Ellipsoid functionality in
EllipsoidGeometryUpdater spec
---
.../EllipsoidGeometryUpdaterSpec.js | 46 +++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/Specs/DataSources/EllipsoidGeometryUpdaterSpec.js b/Specs/DataSources/EllipsoidGeometryUpdaterSpec.js
index 828536582552..b082f373f068 100644
--- a/Specs/DataSources/EllipsoidGeometryUpdaterSpec.js
+++ b/Specs/DataSources/EllipsoidGeometryUpdaterSpec.js
@@ -84,6 +84,7 @@ defineSuite([
expect(updater.isDynamic).toBe(false);
});
+
it('A time-varying position causes geometry to be dynamic', function() {
var entity = createBasicEllipsoid();
var updater = new EllipsoidGeometryUpdater(entity, scene);
@@ -137,6 +138,11 @@ defineSuite([
it('Creates geometry with expected properties', function() {
var options = {
radii : new Cartesian3(1, 2, 3),
+ innerRadii: new Cartesian3(.5, 1, 1.5),
+ minimumClock: CesiumMath.toRadians(90.0),
+ maximumClock: CesiumMath.toRadians(270.0),
+ minimumCone: CesiumMath.toRadians(45.0),
+ maximumCone: CesiumMath.toRadians(90.0),
stackPartitions : 32,
slicePartitions : 64,
subdivisions : 15
@@ -151,6 +157,11 @@ defineSuite([
ellipsoid.radii = new ConstantProperty(options.radii);
ellipsoid.stackPartitions = new ConstantProperty(options.stackPartitions);
ellipsoid.slicePartitions = new ConstantProperty(options.slicePartitions);
+ ellipsoid.innerRadii = new ConstantProperty(options.innerRadii);
+ ellipsoid.minimumClock = new ConstantProperty(options.minimumClock);
+ ellipsoid.maximumClock = new ConstantProperty(options.maximumClock);
+ ellipsoid.minimumCone = new ConstantProperty(options.minimumCone);
+ ellipsoid.maximumCone = new ConstantProperty(options.maximumCone);
ellipsoid.subdivisions = new ConstantProperty(options.subdivisions);
entity.ellipsoid = ellipsoid;
@@ -162,6 +173,11 @@ defineSuite([
geometry = instance.geometry;
expect(geometry._center).toEqual(options.center);
expect(geometry._radii).toEqual(options.radii);
+ expect(geometry._innerRadii).toEqual(options.innerRadii);
+ expect(geometry._minimumClock).toEqual(options.minimumClock);
+ expect(geometry._maximumClock).toEqual(options.maximumClock);
+ expect(geometry._minimumCone).toEqual(options.minimumCone);
+ expect(geometry._maximumCone).toEqual(options.maximumCone);
expect(geometry._stackPartitions).toEqual(options.stackPartitions);
expect(geometry._slicePartitions).toEqual(options.slicePartitions);
expect(geometry._offsetAttribute).toBeUndefined();
@@ -170,6 +186,11 @@ defineSuite([
geometry = instance.geometry;
expect(geometry._center).toEqual(options.center);
expect(geometry._radii).toEqual(options.radii);
+ expect(geometry._innerRadii).toEqual(options.innerRadii);
+ expect(geometry._minimumClock).toEqual(options.minimumClock);
+ expect(geometry._maximumClock).toEqual(options.maximumClock);
+ expect(geometry._minimumCone).toEqual(options.minimumCone);
+ expect(geometry._maximumCone).toEqual(options.maximumCone);
expect(geometry._stackPartitions).toEqual(options.stackPartitions);
expect(geometry._slicePartitions).toEqual(options.slicePartitions);
expect(geometry._subdivisions).toEqual(options.subdivisions);
@@ -310,6 +331,31 @@ defineSuite([
updater.destroy();
});
+ it('Inner radii should be set when not in 3D mode', function() {
+ var ellipsoid = new EllipsoidGraphics();
+ ellipsoid.radii = createDynamicProperty(new Cartesian3(1, 2, 3));
+ ellipsoid.innerRadii = createDynamicProperty(new Cartesian3(.5, 1, 1.5));
+ // Turns 3d mode path off
+ ellipsoid.heightReference = new ConstantProperty(HeightReference.RELATIVE_TO_GROUND);
+ ellipsoid.material = new ColorMaterialProperty(Color.RED);
+
+ var entity = new Entity();
+ entity.position = createDynamicProperty(Cartesian3.fromDegrees(0, 0, 0));
+ entity.orientation = createDynamicProperty(Quaternion.IDENTITY);
+ entity.ellipsoid = ellipsoid;
+
+ var updater = new EllipsoidGeometryUpdater(entity, scene);
+ var primitives = scene.primitives;
+
+ var dynamicUpdater = updater.createDynamicUpdater(primitives, new PrimitiveCollection());
+ dynamicUpdater.update(time);
+
+ scene.initializeFrame();
+ scene.render();
+
+ expect(dynamicUpdater._options.innerRadii).toEqual(ellipsoid.innerRadii.getValue());
+ });
+
it('dynamic ellipsoid fast path updates attributes', function() {
var ellipsoid = new EllipsoidGraphics();
ellipsoid.show = createDynamicProperty(true);
From 0867f9e801675b49dd15a5d9beb9253d838adf55 Mon Sep 17 00:00:00 2001
From: nahgrin
Date: Thu, 15 Nov 2018 12:41:31 -0600
Subject: [PATCH 52/62] Updated EllipsiodGraphicsSpec to cover Partial
Ellipsoid functionality
---
Specs/DataSources/EllipsoidGraphicsSpec.js | 40 ++++++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git a/Specs/DataSources/EllipsoidGraphicsSpec.js b/Specs/DataSources/EllipsoidGraphicsSpec.js
index 02de993902e7..43ef2ef5275f 100644
--- a/Specs/DataSources/EllipsoidGraphicsSpec.js
+++ b/Specs/DataSources/EllipsoidGraphicsSpec.js
@@ -65,6 +65,11 @@ defineSuite([
var source = new EllipsoidGraphics();
source.material = new ColorMaterialProperty();
source.radii = new ConstantProperty();
+ source.innerRadii = new ConstantProperty();
+ source.minimumClock = new ConstantProperty();
+ source.maximumClock = new ConstantProperty();
+ source.minimumCone = new ConstantProperty();
+ source.maximumCone = new ConstantProperty();
source.show = new ConstantProperty();
source.stackPartitions = new ConstantProperty();
source.slicePartitions = new ConstantProperty();
@@ -81,6 +86,11 @@ defineSuite([
expect(target.material).toBe(source.material);
expect(target.radii).toBe(source.radii);
+ expect(target.innerRadii).toBe(source.innerRadii);
+ expect(target.minimumClock).toBe(source.minimumClock);
+ expect(target.maximumClock).toBe(source.maximumClock);
+ expect(target.minimumCone).toBe(source.minimumCone);
+ expect(target.maximumCone).toBe(source.maximumCone);
expect(target.show).toBe(source.show);
expect(target.stackPartitions).toBe(source.stackPartitions);
expect(target.slicePartitions).toBe(source.slicePartitions);
@@ -98,6 +108,11 @@ defineSuite([
var material = new ColorMaterialProperty();
var radii = new ConstantProperty();
+ var innerRadii = new ConstantProperty();
+ var minimumClock = new ConstantProperty();
+ var maximumClock = new ConstantProperty();
+ var minimumCone = new ConstantProperty();
+ var maximumCone = new ConstantProperty();
var show = new ConstantProperty();
var stackPartitions = new ConstantProperty();
var slicePartitions = new ConstantProperty();
@@ -112,6 +127,11 @@ defineSuite([
var target = new EllipsoidGraphics();
target.material = material;
target.radii = radii;
+ target.innerRadii = innerRadii;
+ target.minimumClock = minimumClock;
+ target.maximumClock = maximumClock;
+ target.minimumCone = minimumCone;
+ target.maximumCone = maximumCone;
target.show = show;
target.stackPartitions = stackPartitions;
target.slicePartitions = slicePartitions;
@@ -128,6 +148,11 @@ defineSuite([
expect(target.material).toBe(material);
expect(target.radii).toBe(radii);
+ expect(target.innerRadii).toBe(innerRadii);
+ expect(target.minimumClock).toBe(minimumClock);
+ expect(target.maximumClock).toBe(maximumClock);
+ expect(target.minimumCone).toBe(minimumCone);
+ expect(target.maximumCone).toBe(maximumCone);
expect(target.show).toBe(show);
expect(target.stackPartitions).toBe(stackPartitions);
expect(target.slicePartitions).toBe(slicePartitions);
@@ -168,6 +193,21 @@ defineSuite([
expect(result.outlineWidth).toBe(source.outlineWidth);
expect(result.shadows).toBe(source.shadows);
expect(result.distanceDisplayCondition).toBe(source.distanceDisplayCondition);
+
+ // Clone with source passed
+ var result = source.clone(source);
+ expect(result.material).toBe(source.material);
+ expect(result.radii).toBe(source.radii);
+ expect(result.show).toBe(source.show);
+ expect(result.stackPartitions).toBe(source.stackPartitions);
+ expect(result.slicePartitions).toBe(source.slicePartitions);
+ expect(result.subdivisions).toBe(source.subdivisions);
+ expect(result.fill).toBe(source.fill);
+ expect(result.outline).toBe(source.outline);
+ expect(result.outlineColor).toBe(source.outlineColor);
+ expect(result.outlineWidth).toBe(source.outlineWidth);
+ expect(result.shadows).toBe(source.shadows);
+ expect(result.distanceDisplayCondition).toBe(source.distanceDisplayCondition);
});
it('merge throws if source undefined', function() {
From 0265054283669913908d261e59ae8a53c69047c9 Mon Sep 17 00:00:00 2001
From: nahgrin
Date: Thu, 15 Nov 2018 12:59:35 -0600
Subject: [PATCH 53/62] Cleaned up eslint issues
---
Specs/Core/EllipsoidGeometrySpec.js | 5 ++---
Specs/Core/EllipsoidOutlineGeometrySpec.js | 2 +-
Specs/DataSources/EllipsoidGeometryUpdaterSpec.js | 5 ++---
Specs/DataSources/EllipsoidGraphicsSpec.js | 2 +-
4 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/Specs/Core/EllipsoidGeometrySpec.js b/Specs/Core/EllipsoidGeometrySpec.js
index 67e3f8b514ed..e10f51130407 100644
--- a/Specs/Core/EllipsoidGeometrySpec.js
+++ b/Specs/Core/EllipsoidGeometrySpec.js
@@ -64,7 +64,6 @@ defineSuite([
expect(m.boundingSphere.radius).toEqual(1);
});
-
it('computes offset attribute', function() {
var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
vertexFormat: VertexFormat.POSITION_ONLY,
@@ -177,7 +176,7 @@ defineSuite([
it('computes partitions to default to 2 if less than 2', function() {
var geometry = new EllipsoidGeometry({
- radii: new Cartesian3(0.5, 0.5, 0.5),
+ radii: new Cartesian3(0.5, 0.5, 0.5)
});
geometry._slicePartitions = 0;
@@ -196,7 +195,7 @@ defineSuite([
radii: new Cartesian3(1.0, 1.0, 1.0),
innerRadii: new Cartesian3(0.5, 0.5, 0.5),
minimumCone: CesiumMath.toRadians(60.0),
- maximumCone: CesiumMath.toRadians(140.0),
+ maximumCone: CesiumMath.toRadians(140.0)
}));
var positions = m.attributes.position.values;
diff --git a/Specs/Core/EllipsoidOutlineGeometrySpec.js b/Specs/Core/EllipsoidOutlineGeometrySpec.js
index b2e0014163b2..5d24f96109e6 100644
--- a/Specs/Core/EllipsoidOutlineGeometrySpec.js
+++ b/Specs/Core/EllipsoidOutlineGeometrySpec.js
@@ -122,7 +122,7 @@ defineSuite([
it('computes partitions to default to 2 if less than 2', function() {
var geometry = new EllipsoidOutlineGeometry({
- radii: new Cartesian3(0.5, 0.5, 0.5),
+ radii: new Cartesian3(0.5, 0.5, 0.5)
});
geometry._slicePartitions = 0;
diff --git a/Specs/DataSources/EllipsoidGeometryUpdaterSpec.js b/Specs/DataSources/EllipsoidGeometryUpdaterSpec.js
index b082f373f068..ccf10f6e4354 100644
--- a/Specs/DataSources/EllipsoidGeometryUpdaterSpec.js
+++ b/Specs/DataSources/EllipsoidGeometryUpdaterSpec.js
@@ -84,7 +84,6 @@ defineSuite([
expect(updater.isDynamic).toBe(false);
});
-
it('A time-varying position causes geometry to be dynamic', function() {
var entity = createBasicEllipsoid();
var updater = new EllipsoidGeometryUpdater(entity, scene);
@@ -138,7 +137,7 @@ defineSuite([
it('Creates geometry with expected properties', function() {
var options = {
radii : new Cartesian3(1, 2, 3),
- innerRadii: new Cartesian3(.5, 1, 1.5),
+ innerRadii: new Cartesian3(0.5, 1, 1.5),
minimumClock: CesiumMath.toRadians(90.0),
maximumClock: CesiumMath.toRadians(270.0),
minimumCone: CesiumMath.toRadians(45.0),
@@ -334,7 +333,7 @@ defineSuite([
it('Inner radii should be set when not in 3D mode', function() {
var ellipsoid = new EllipsoidGraphics();
ellipsoid.radii = createDynamicProperty(new Cartesian3(1, 2, 3));
- ellipsoid.innerRadii = createDynamicProperty(new Cartesian3(.5, 1, 1.5));
+ ellipsoid.innerRadii = createDynamicProperty(new Cartesian3(0.5, 1, 1.5));
// Turns 3d mode path off
ellipsoid.heightReference = new ConstantProperty(HeightReference.RELATIVE_TO_GROUND);
ellipsoid.material = new ColorMaterialProperty(Color.RED);
diff --git a/Specs/DataSources/EllipsoidGraphicsSpec.js b/Specs/DataSources/EllipsoidGraphicsSpec.js
index 43ef2ef5275f..ce8d462565a4 100644
--- a/Specs/DataSources/EllipsoidGraphicsSpec.js
+++ b/Specs/DataSources/EllipsoidGraphicsSpec.js
@@ -195,7 +195,7 @@ defineSuite([
expect(result.distanceDisplayCondition).toBe(source.distanceDisplayCondition);
// Clone with source passed
- var result = source.clone(source);
+ result = source.clone(source);
expect(result.material).toBe(source.material);
expect(result.radii).toBe(source.radii);
expect(result.show).toBe(source.show);
From abe35b0a76ba1394cf81e1bb4341dae4a137e056 Mon Sep 17 00:00:00 2001
From: nahgrin
Date: Fri, 16 Nov 2018 13:13:10 -0600
Subject: [PATCH 54/62] Fixed computing tangents in Ellipsoid Geometry for
partial ellipsoids
---
Source/Core/EllipsoidGeometry.js | 9 +++------
Specs/Core/EllipsoidGeometrySpec.js | 2 +-
Specs/Core/SphereGeometrySpec.js | 2 +-
3 files changed, 5 insertions(+), 8 deletions(-)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index fa33c08924d0..c34f9f25abfa 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -518,15 +518,12 @@ EllipsoidGeometry.createGeometry = function(ellipsoidGeometry) {
var tangent = scratchTangent;
// Use UNIT_X for the poles
- var offset1 = 0;
- var offset2 = hasInnerSurface ? vertexCountHalf : vertexCount;
+ var tangetOffset = 0;
var unit;
if (isInner[i]) {
- offset1 = vertexCountHalf;
- offset2 = vertexCount;
+ tangetOffset = vertexCountHalf;
}
- if ((!isTopOpen && (i >= offset1 && i < (offset1 + numThetas*2))) ||
- (!isBotOpen && i > offset2 - numThetas*2 - 1)) {
+ if ((!isTopOpen && (i >= tangetOffset && i < (tangetOffset + numThetas*2)))) {
unit = Cartesian3.UNIT_X;
} else {
unit = Cartesian3.UNIT_Z;
diff --git a/Specs/Core/EllipsoidGeometrySpec.js b/Specs/Core/EllipsoidGeometrySpec.js
index e10f51130407..ce03f2a96975 100644
--- a/Specs/Core/EllipsoidGeometrySpec.js
+++ b/Specs/Core/EllipsoidGeometrySpec.js
@@ -99,7 +99,7 @@ defineSuite([
expect(m.indices.length).toEqual(numTriangles * 3);
});
- xit('computes attributes for a unit sphere', function() {
+ it('computes attributes for a unit sphere', function() {
var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
vertexFormat: VertexFormat.ALL,
slicePartitions: 3,
diff --git a/Specs/Core/SphereGeometrySpec.js b/Specs/Core/SphereGeometrySpec.js
index c746d3e0c2f8..c992fb4240e4 100644
--- a/Specs/Core/SphereGeometrySpec.js
+++ b/Specs/Core/SphereGeometrySpec.js
@@ -63,7 +63,7 @@ defineSuite([
expect(m.indices.length).toEqual(numTriangles * 3);
});
- xit('computes attributes for a unit sphere', function() {
+ it('computes attributes for a unit sphere', function() {
var m = SphereGeometry.createGeometry(new SphereGeometry({
vertexFormat : VertexFormat.ALL,
radius : 1,
From 51dbad3e8c7d5830c5b61854bf927bce3a2a4147 Mon Sep 17 00:00:00 2001
From: nahgrin
Date: Thu, 30 May 2019 12:25:27 -0500
Subject: [PATCH 55/62] Updated contributers list
---
CONTRIBUTORS.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index bfb22574053b..a422d8e53325 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -122,7 +122,8 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu
* [Daniel Cooper](https://github.com/moodragon46)
* [GeoFS](https://www.geo-fs.com)
* [Xavier Tassin](https://github.com/xtassin/)
-
+* [Northrop Grumman](http://www.northropgrumman.com)
+ * [Joseph Stein](https://github.com/nahgrin)
## [Individual CLA](Documentation/Contributors/CLAs/individual-cla-agi-v1.0.txt)
* [Victor Berchet](https://github.com/vicb)
* [Caleb Morse](https://github.com/cmorse)
From 5a67857b61c1ae370e3e812e5bf21673f2fd09c4 Mon Sep 17 00:00:00 2001
From: srtrotter <26775896+srtrotter@users.noreply.github.com>
Date: Wed, 12 Jun 2019 10:20:42 -0500
Subject: [PATCH 56/62] Fixed error in merge
---
Source/DataSources/CzmlDataSource.js | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/Source/DataSources/CzmlDataSource.js b/Source/DataSources/CzmlDataSource.js
index 4802efb5262c..e77014d4d78f 100644
--- a/Source/DataSources/CzmlDataSource.js
+++ b/Source/DataSources/CzmlDataSource.js
@@ -1683,9 +1683,7 @@ define([
processPacketData(Cartesian3, label, 'eyeOffset', labelData.eyeOffset, interval, sourceUri, entityCollection);
processPacketData(HorizontalOrigin, label, 'horizontalOrigin', labelData.horizontalOrigin, interval, sourceUri, entityCollection);
processPacketData(VerticalOrigin, label, 'verticalOrigin', labelData.verticalOrigin, interval, sourceUri, entityCollection);
- processPacketData(
-
- , label, 'heightReference', labelData.heightReference, interval, sourceUri, entityCollection);
+ processPacketData(HeightReference, label, 'heightReference', labelData.heightReference, interval, sourceUri, entityCollection);
processPacketData(Color, label, 'fillColor', labelData.fillColor, interval, sourceUri, entityCollection);
processPacketData(Color, label, 'outlineColor', labelData.outlineColor, interval, sourceUri, entityCollection);
processPacketData(Number, label, 'outlineWidth', labelData.outlineWidth, interval, sourceUri, entityCollection);
From f8211e8da1e8fecdd93aefc8291ba3342eae63eb Mon Sep 17 00:00:00 2001
From: hpinkos
Date: Wed, 18 Sep 2019 11:16:11 -0400
Subject: [PATCH 57/62] fix whitespace
---
CHANGES.md | 3 +-
CONTRIBUTORS.md | 2 +-
Source/Core/EllipsoidGeometry.js | 1112 +++++++++++------------
Source/Core/EllipsoidOutlineGeometry.js | 6 +-
Specs/Core/EllipsoidGeometrySpec.js | 590 ++++++------
5 files changed, 855 insertions(+), 858 deletions(-)
diff --git a/CHANGES.md b/CHANGES.md
index 766cfa28cc3c..0afe5a47e113 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,7 +1,8 @@
Change Log
-### TODO
+### 1.62 - 2019-10-01
+##### Additions :tada:
* Added ability to create partial ellipsoids using both the Entity API and CZML. New ellipsoid geometry properties: innerRadii, minimumClock, maximumClock, minimumCone, maximumCone. This affects both EllipsoidGeometry and EllipsoidOutlineGeometry. See the updated [Sandcastle example](https://cesiumjs.org/Cesium/Apps/Sandcastle/?src=Spheres%20and%20Ellipsoids.html&label=Geometries). [#5995](https://github.com/AnalyticalGraphicsInc/cesium/pull/5995)
### 1.61 - 2019-09-03
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index e6972a8117aa..e6ba7b82e428 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -136,9 +136,9 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu
* [Brandon Barker](https://github.com/ProjectBarks)
* [Peter Gagliardi](https://github.com/ptrgags)
* [Ian Lilley](https://github.com/IanLilleyT)
-
* [Northrop Grumman](http://www.northropgrumman.com)
* [Joseph Stein](https://github.com/nahgrin)
+
## [Individual CLA](Documentation/Contributors/CLAs/individual-contributor-license-agreement-v1.0.pdf)
* [Victor Berchet](https://github.com/vicb)
* [Caleb Morse](https://github.com/cmorse)
diff --git a/Source/Core/EllipsoidGeometry.js b/Source/Core/EllipsoidGeometry.js
index c34f9f25abfa..b496942864d0 100644
--- a/Source/Core/EllipsoidGeometry.js
+++ b/Source/Core/EllipsoidGeometry.js
@@ -1,624 +1,624 @@
define([
- './arrayFill',
- './BoundingSphere',
- './Cartesian2',
- './Cartesian3',
- './ComponentDatatype',
- './defaultValue',
- './defined',
- './DeveloperError',
- './Ellipsoid',
- './Geometry',
- './GeometryAttribute',
- './GeometryAttributes',
- './GeometryOffsetAttribute',
- './IndexDatatype',
- './Math',
- './PrimitiveType',
- './VertexFormat'
-], function(
- arrayFill,
- BoundingSphere,
- Cartesian2,
- Cartesian3,
- ComponentDatatype,
- defaultValue,
- defined,
- DeveloperError,
- Ellipsoid,
- Geometry,
- GeometryAttribute,
- GeometryAttributes,
- GeometryOffsetAttribute,
- IndexDatatype,
- CesiumMath,
- PrimitiveType,
- VertexFormat) {
-'use strict';
-
-var scratchPosition = new Cartesian3();
-var scratchNormal = new Cartesian3();
-var scratchTangent = new Cartesian3();
-var scratchBitangent = new Cartesian3();
-var scratchNormalST = new Cartesian3();
-var defaultRadii = new Cartesian3(1.0, 1.0, 1.0);
-
-var cos = Math.cos;
-var sin = Math.sin;
-
-/**
- * A description of an ellipsoid centered at the origin.
- *
- * @alias EllipsoidGeometry
- * @constructor
- *
- * @param {Object} [options] Object with the following properties:
- * @param {Cartesian3} [options.radii=Cartesian3(1.0, 1.0, 1.0)] The radii of the ellipsoid in the x, y, and z directions.
- * @param {Cartesian3} [options.innerRadii=options.radii] The inner radii of the ellipsoid in the x, y, and z directions.
- * @param {Number} [options.minimumClock=0.0] The minimum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis.
- * @param {Number} [options.maximumClock=2*PI] The maximum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis.
- * @param {Number} [options.minimumCone=0.0] The minimum angle measured from the positive z-axis and toward the negative z-axis.
- * @param {Number} [options.maximumCone=PI] The maximum angle measured from the positive z-axis and toward the negative z-axis.
- * @param {Number} [options.stackPartitions=64] The number of times to partition the ellipsoid into stacks.
- * @param {Number} [options.slicePartitions=64] The number of times to partition the ellipsoid into radial slices.
- * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
- *
- * @exception {DeveloperError} options.slicePartitions cannot be less than three.
- * @exception {DeveloperError} options.stackPartitions cannot be less than three.
- *
- * @see EllipsoidGeometry#createGeometry
- *
- * @example
- * var ellipsoid = new Cesium.EllipsoidGeometry({
- * vertexFormat : Cesium.VertexFormat.POSITION_ONLY,
- * radii : new Cesium.Cartesian3(1000000.0, 500000.0, 500000.0)
- * });
- * var geometry = Cesium.EllipsoidGeometry.createGeometry(ellipsoid);
- */
-function EllipsoidGeometry(options) {
- options = defaultValue(options, defaultValue.EMPTY_OBJECT);
-
- var radii = defaultValue(options.radii, defaultRadii);
- var innerRadii = defaultValue(options.innerRadii, radii);
- var minimumClock = defaultValue(options.minimumClock, 0.0);
- var maximumClock = defaultValue(options.maximumClock, CesiumMath.TWO_PI);
- var minimumCone = defaultValue(options.minimumCone, 0.0);
- var maximumCone = defaultValue(options.maximumCone, CesiumMath.PI);
- var stackPartitions = Math.round(defaultValue(options.stackPartitions, 64));
- var slicePartitions = Math.round(defaultValue(options.slicePartitions, 64));
- var vertexFormat = defaultValue(options.vertexFormat, VertexFormat.DEFAULT);
-
- //>>includeStart('debug', pragmas.debug);
- if (slicePartitions < 3) {
- throw new DeveloperError ('options.slicePartitions cannot be less than three.');
- }
- if (stackPartitions < 3) {
- throw new DeveloperError('options.stackPartitions cannot be less than three.');
- }
- //>>includeEnd('debug');
-
- this._radii = Cartesian3.clone(radii);
- this._innerRadii = Cartesian3.clone(innerRadii);
- this._minimumClock = minimumClock;
- this._maximumClock = maximumClock;
- this._minimumCone = minimumCone;
- this._maximumCone = maximumCone;
- this._stackPartitions = stackPartitions;
- this._slicePartitions = slicePartitions;
- this._vertexFormat = VertexFormat.clone(vertexFormat);
- this._offsetAttribute = options.offsetAttribute;
- this._workerName = 'createEllipsoidGeometry';
-}
-
-/**
- * The number of elements used to pack the object into an array.
- * @type {Number}
- */
-EllipsoidGeometry.packedLength = 2 * (Cartesian3.packedLength) + VertexFormat.packedLength + 7;
-
-/**
- * Stores the provided instance into the provided array.
- *
- * @param {EllipsoidGeometry} value The value to pack.
- * @param {Number[]} array The array to pack into.
- * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
- *
- * @returns {Number[]} The array that was packed into
- */
-EllipsoidGeometry.pack = function(value, array, startingIndex) {
- //>>includeStart('debug', pragmas.debug);
- if (!defined(value)) {
- throw new DeveloperError('value is required');
- }
- if (!defined(array)) {
- throw new DeveloperError('array is required');
- }
- //>>includeEnd('debug');
-
- startingIndex = defaultValue(startingIndex, 0);
-
- Cartesian3.pack(value._radii, array, startingIndex);
- startingIndex += Cartesian3.packedLength;
-
- Cartesian3.pack(value._innerRadii, array, startingIndex);
- startingIndex += Cartesian3.packedLength;
-
- VertexFormat.pack(value._vertexFormat, array, startingIndex);
- startingIndex += VertexFormat.packedLength;
-
- array[startingIndex++] = value._minimumClock;
- array[startingIndex++] = value._maximumClock;
- array[startingIndex++] = value._minimumCone;
- array[startingIndex++] = value._maximumCone;
- array[startingIndex++] = value._stackPartitions;
- array[startingIndex++] = value._slicePartitions;
- array[startingIndex] = defaultValue(value._offsetAttribute, -1);
-
- return array;
-};
-
-var scratchRadii = new Cartesian3();
-var scratchInnerRadii = new Cartesian3();
-var scratchVertexFormat = new VertexFormat();
-var scratchOptions = {
- radii : scratchRadii,
- innerRadii : scratchInnerRadii,
- vertexFormat : scratchVertexFormat,
- minimumClock : undefined,
- maximumClock : undefined,
- minimumCone : undefined,
- maximumCone : undefined,
- stackPartitions : undefined,
- slicePartitions : undefined,
- offsetAttribute : undefined
-};
-
-/**
- * Retrieves an instance from a packed array.
- *
- * @param {Number[]} array The packed array.
- * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
- * @param {EllipsoidGeometry} [result] The object into which to store the result.
- * @returns {EllipsoidGeometry} The modified result parameter or a new EllipsoidGeometry instance if one was not provided.
- */
-EllipsoidGeometry.unpack = function(array, startingIndex, result) {
- //>>includeStart('debug', pragmas.debug);
- if (!defined(array)) {
- throw new DeveloperError('array is required');
- }
- //>>includeEnd('debug');
-
- startingIndex = defaultValue(startingIndex, 0);
-
- var radii = Cartesian3.unpack(array, startingIndex, scratchRadii);
- startingIndex += Cartesian3.packedLength;
-
- var innerRadii = Cartesian3.unpack(array, startingIndex, scratchInnerRadii);
- startingIndex += Cartesian3.packedLength;
-
- var vertexFormat = VertexFormat.unpack(array, startingIndex, scratchVertexFormat);
- startingIndex += VertexFormat.packedLength;
-
- var minimumClock = array[startingIndex++];
- var maximumClock = array[startingIndex++];
- var minimumCone = array[startingIndex++];
- var maximumCone = array[startingIndex++];
- var stackPartitions = array[startingIndex++];
- var slicePartitions = array[startingIndex++];
- var offsetAttribute = array[startingIndex];
-
- if (!defined(result)) {
- scratchOptions.minimumClock = minimumClock;
- scratchOptions.maximumClock = maximumClock;
- scratchOptions.minimumCone = minimumCone;
- scratchOptions.maximumCone = maximumCone;
- scratchOptions.stackPartitions = stackPartitions;
- scratchOptions.slicePartitions = slicePartitions;
- scratchOptions.offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
- return new EllipsoidGeometry(scratchOptions);
+ './arrayFill',
+ './BoundingSphere',
+ './Cartesian2',
+ './Cartesian3',
+ './ComponentDatatype',
+ './defaultValue',
+ './defined',
+ './DeveloperError',
+ './Ellipsoid',
+ './Geometry',
+ './GeometryAttribute',
+ './GeometryAttributes',
+ './GeometryOffsetAttribute',
+ './IndexDatatype',
+ './Math',
+ './PrimitiveType',
+ './VertexFormat'
+ ], function(
+ arrayFill,
+ BoundingSphere,
+ Cartesian2,
+ Cartesian3,
+ ComponentDatatype,
+ defaultValue,
+ defined,
+ DeveloperError,
+ Ellipsoid,
+ Geometry,
+ GeometryAttribute,
+ GeometryAttributes,
+ GeometryOffsetAttribute,
+ IndexDatatype,
+ CesiumMath,
+ PrimitiveType,
+ VertexFormat) {
+ 'use strict';
+
+ var scratchPosition = new Cartesian3();
+ var scratchNormal = new Cartesian3();
+ var scratchTangent = new Cartesian3();
+ var scratchBitangent = new Cartesian3();
+ var scratchNormalST = new Cartesian3();
+ var defaultRadii = new Cartesian3(1.0, 1.0, 1.0);
+
+ var cos = Math.cos;
+ var sin = Math.sin;
+
+ /**
+ * A description of an ellipsoid centered at the origin.
+ *
+ * @alias EllipsoidGeometry
+ * @constructor
+ *
+ * @param {Object} [options] Object with the following properties:
+ * @param {Cartesian3} [options.radii=Cartesian3(1.0, 1.0, 1.0)] The radii of the ellipsoid in the x, y, and z directions.
+ * @param {Cartesian3} [options.innerRadii=options.radii] The inner radii of the ellipsoid in the x, y, and z directions.
+ * @param {Number} [options.minimumClock=0.0] The minimum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis.
+ * @param {Number} [options.maximumClock=2*PI] The maximum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis.
+ * @param {Number} [options.minimumCone=0.0] The minimum angle measured from the positive z-axis and toward the negative z-axis.
+ * @param {Number} [options.maximumCone=PI] The maximum angle measured from the positive z-axis and toward the negative z-axis.
+ * @param {Number} [options.stackPartitions=64] The number of times to partition the ellipsoid into stacks.
+ * @param {Number} [options.slicePartitions=64] The number of times to partition the ellipsoid into radial slices.
+ * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
+ *
+ * @exception {DeveloperError} options.slicePartitions cannot be less than three.
+ * @exception {DeveloperError} options.stackPartitions cannot be less than three.
+ *
+ * @see EllipsoidGeometry#createGeometry
+ *
+ * @example
+ * var ellipsoid = new Cesium.EllipsoidGeometry({
+ * vertexFormat : Cesium.VertexFormat.POSITION_ONLY,
+ * radii : new Cesium.Cartesian3(1000000.0, 500000.0, 500000.0)
+ * });
+ * var geometry = Cesium.EllipsoidGeometry.createGeometry(ellipsoid);
+ */
+ function EllipsoidGeometry(options) {
+ options = defaultValue(options, defaultValue.EMPTY_OBJECT);
+
+ var radii = defaultValue(options.radii, defaultRadii);
+ var innerRadii = defaultValue(options.innerRadii, radii);
+ var minimumClock = defaultValue(options.minimumClock, 0.0);
+ var maximumClock = defaultValue(options.maximumClock, CesiumMath.TWO_PI);
+ var minimumCone = defaultValue(options.minimumCone, 0.0);
+ var maximumCone = defaultValue(options.maximumCone, CesiumMath.PI);
+ var stackPartitions = Math.round(defaultValue(options.stackPartitions, 64));
+ var slicePartitions = Math.round(defaultValue(options.slicePartitions, 64));
+ var vertexFormat = defaultValue(options.vertexFormat, VertexFormat.DEFAULT);
+
+ //>>includeStart('debug', pragmas.debug);
+ if (slicePartitions < 3) {
+ throw new DeveloperError('options.slicePartitions cannot be less than three.');
+ }
+ if (stackPartitions < 3) {
+ throw new DeveloperError('options.stackPartitions cannot be less than three.');
+ }
+ //>>includeEnd('debug');
+
+ this._radii = Cartesian3.clone(radii);
+ this._innerRadii = Cartesian3.clone(innerRadii);
+ this._minimumClock = minimumClock;
+ this._maximumClock = maximumClock;
+ this._minimumCone = minimumCone;
+ this._maximumCone = maximumCone;
+ this._stackPartitions = stackPartitions;
+ this._slicePartitions = slicePartitions;
+ this._vertexFormat = VertexFormat.clone(vertexFormat);
+ this._offsetAttribute = options.offsetAttribute;
+ this._workerName = 'createEllipsoidGeometry';
}
- result._radii = Cartesian3.clone(radii, result._radii);
- result._innerRadii = Cartesian3.clone(innerRadii, result._innerRadii);
- result._vertexFormat = VertexFormat.clone(vertexFormat, result._vertexFormat);
- result._minimumClock = minimumClock;
- result._maximumClock = maximumClock;
- result._minimumCone = minimumCone;
- result._maximumCone = maximumCone;
- result._stackPartitions = stackPartitions;
- result._slicePartitions = slicePartitions;
- result._offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
- return result;
-};
-
-/**
- * Computes the geometric representation of an ellipsoid, including its vertices, indices, and a bounding sphere.
- *
- * @param {EllipsoidGeometry} ellipsoidGeometry A description of the ellipsoid.
- * @returns {Geometry|undefined} The computed vertices and indices.
- */
-EllipsoidGeometry.createGeometry = function(ellipsoidGeometry) {
- var radii = ellipsoidGeometry._radii;
- if ((radii.x <= 0) || (radii.y <= 0) || (radii.z <= 0)) {
- return;
- }
+ /**
+ * The number of elements used to pack the object into an array.
+ * @type {Number}
+ */
+ EllipsoidGeometry.packedLength = 2 * (Cartesian3.packedLength) + VertexFormat.packedLength + 7;
+
+ /**
+ * Stores the provided instance into the provided array.
+ *
+ * @param {EllipsoidGeometry} value The value to pack.
+ * @param {Number[]} array The array to pack into.
+ * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
+ *
+ * @returns {Number[]} The array that was packed into
+ */
+ EllipsoidGeometry.pack = function(value, array, startingIndex) {
+ //>>includeStart('debug', pragmas.debug);
+ if (!defined(value)) {
+ throw new DeveloperError('value is required');
+ }
+ if (!defined(array)) {
+ throw new DeveloperError('array is required');
+ }
+ //>>includeEnd('debug');
+
+ startingIndex = defaultValue(startingIndex, 0);
+
+ Cartesian3.pack(value._radii, array, startingIndex);
+ startingIndex += Cartesian3.packedLength;
+
+ Cartesian3.pack(value._innerRadii, array, startingIndex);
+ startingIndex += Cartesian3.packedLength;
+
+ VertexFormat.pack(value._vertexFormat, array, startingIndex);
+ startingIndex += VertexFormat.packedLength;
+
+ array[startingIndex++] = value._minimumClock;
+ array[startingIndex++] = value._maximumClock;
+ array[startingIndex++] = value._minimumCone;
+ array[startingIndex++] = value._maximumCone;
+ array[startingIndex++] = value._stackPartitions;
+ array[startingIndex++] = value._slicePartitions;
+ array[startingIndex] = defaultValue(value._offsetAttribute, -1);
+
+ return array;
+ };
+
+ var scratchRadii = new Cartesian3();
+ var scratchInnerRadii = new Cartesian3();
+ var scratchVertexFormat = new VertexFormat();
+ var scratchOptions = {
+ radii : scratchRadii,
+ innerRadii : scratchInnerRadii,
+ vertexFormat : scratchVertexFormat,
+ minimumClock : undefined,
+ maximumClock : undefined,
+ minimumCone : undefined,
+ maximumCone : undefined,
+ stackPartitions : undefined,
+ slicePartitions : undefined,
+ offsetAttribute : undefined
+ };
+
+ /**
+ * Retrieves an instance from a packed array.
+ *
+ * @param {Number[]} array The packed array.
+ * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
+ * @param {EllipsoidGeometry} [result] The object into which to store the result.
+ * @returns {EllipsoidGeometry} The modified result parameter or a new EllipsoidGeometry instance if one was not provided.
+ */
+ EllipsoidGeometry.unpack = function(array, startingIndex, result) {
+ //>>includeStart('debug', pragmas.debug);
+ if (!defined(array)) {
+ throw new DeveloperError('array is required');
+ }
+ //>>includeEnd('debug');
+
+ startingIndex = defaultValue(startingIndex, 0);
+
+ var radii = Cartesian3.unpack(array, startingIndex, scratchRadii);
+ startingIndex += Cartesian3.packedLength;
+
+ var innerRadii = Cartesian3.unpack(array, startingIndex, scratchInnerRadii);
+ startingIndex += Cartesian3.packedLength;
+
+ var vertexFormat = VertexFormat.unpack(array, startingIndex, scratchVertexFormat);
+ startingIndex += VertexFormat.packedLength;
+
+ var minimumClock = array[startingIndex++];
+ var maximumClock = array[startingIndex++];
+ var minimumCone = array[startingIndex++];
+ var maximumCone = array[startingIndex++];
+ var stackPartitions = array[startingIndex++];
+ var slicePartitions = array[startingIndex++];
+ var offsetAttribute = array[startingIndex];
+
+ if (!defined(result)) {
+ scratchOptions.minimumClock = minimumClock;
+ scratchOptions.maximumClock = maximumClock;
+ scratchOptions.minimumCone = minimumCone;
+ scratchOptions.maximumCone = maximumCone;
+ scratchOptions.stackPartitions = stackPartitions;
+ scratchOptions.slicePartitions = slicePartitions;
+ scratchOptions.offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
+ return new EllipsoidGeometry(scratchOptions);
+ }
- var innerRadii = ellipsoidGeometry._innerRadii;
- if ((innerRadii.x <= 0) || (innerRadii.y <= 0) || innerRadii.z <= 0) {
- return;
- }
+ result._radii = Cartesian3.clone(radii, result._radii);
+ result._innerRadii = Cartesian3.clone(innerRadii, result._innerRadii);
+ result._vertexFormat = VertexFormat.clone(vertexFormat, result._vertexFormat);
+ result._minimumClock = minimumClock;
+ result._maximumClock = maximumClock;
+ result._minimumCone = minimumCone;
+ result._maximumCone = maximumCone;
+ result._stackPartitions = stackPartitions;
+ result._slicePartitions = slicePartitions;
+ result._offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
+
+ return result;
+ };
+
+ /**
+ * Computes the geometric representation of an ellipsoid, including its vertices, indices, and a bounding sphere.
+ *
+ * @param {EllipsoidGeometry} ellipsoidGeometry A description of the ellipsoid.
+ * @returns {Geometry|undefined} The computed vertices and indices.
+ */
+ EllipsoidGeometry.createGeometry = function(ellipsoidGeometry) {
+ var radii = ellipsoidGeometry._radii;
+ if ((radii.x <= 0) || (radii.y <= 0) || (radii.z <= 0)) {
+ return;
+ }
- var minimumClock = ellipsoidGeometry._minimumClock;
- var maximumClock = ellipsoidGeometry._maximumClock;
- var minimumCone = ellipsoidGeometry._minimumCone;
- var maximumCone = ellipsoidGeometry._maximumCone;
- var vertexFormat = ellipsoidGeometry._vertexFormat;
+ var innerRadii = ellipsoidGeometry._innerRadii;
+ if ((innerRadii.x <= 0) || (innerRadii.y <= 0) || innerRadii.z <= 0) {
+ return;
+ }
- // Add an extra slice and stack so that the number of partitions is the
- // number of surfaces rather than the number of joints
- var slicePartitions = ellipsoidGeometry._slicePartitions + 1;
- var stackPartitions = ellipsoidGeometry._stackPartitions + 1;
+ var minimumClock = ellipsoidGeometry._minimumClock;
+ var maximumClock = ellipsoidGeometry._maximumClock;
+ var minimumCone = ellipsoidGeometry._minimumCone;
+ var maximumCone = ellipsoidGeometry._maximumCone;
+ var vertexFormat = ellipsoidGeometry._vertexFormat;
- slicePartitions = Math.round(slicePartitions * Math.abs(maximumClock - minimumClock) / CesiumMath.TWO_PI);
- stackPartitions = Math.round(stackPartitions * Math.abs(maximumCone - minimumCone) / CesiumMath.PI);
+ // Add an extra slice and stack so that the number of partitions is the
+ // number of surfaces rather than the number of joints
+ var slicePartitions = ellipsoidGeometry._slicePartitions + 1;
+ var stackPartitions = ellipsoidGeometry._stackPartitions + 1;
- if (slicePartitions < 2) {
- slicePartitions = 2;
- }
- if (stackPartitions < 2) {
- stackPartitions = 2;
- }
+ slicePartitions = Math.round(slicePartitions * Math.abs(maximumClock - minimumClock) / CesiumMath.TWO_PI);
+ stackPartitions = Math.round(stackPartitions * Math.abs(maximumCone - minimumCone) / CesiumMath.PI);
- var i;
- var j;
- var index = 0;
+ if (slicePartitions < 2) {
+ slicePartitions = 2;
+ }
+ if (stackPartitions < 2) {
+ stackPartitions = 2;
+ }
- // Create arrays for theta and phi. Duplicate first and last angle to
- // allow different normals at the intersections.
- var phis = [minimumCone];
- var thetas = [minimumClock];
- for (i = 0; i < stackPartitions; i++) {
- phis.push(minimumCone + i * (maximumCone - minimumCone) / (stackPartitions - 1));
- }
- phis.push(maximumCone);
- for (j = 0; j < slicePartitions; j++) {
- thetas.push(minimumClock + j * (maximumClock - minimumClock) / (slicePartitions - 1));
- }
- thetas.push(maximumClock);
- var numPhis = phis.length;
- var numThetas = thetas.length;
-
- // Allow for extra indices if there is an inner surface and if we need
- // to close the sides if the clock range is not a full circle
- var extraIndices = 0;
- var vertexMultiplier = 1.0;
- var hasInnerSurface = ((innerRadii.x !== radii.x) || (innerRadii.y !== radii.y) || innerRadii.z !== radii.z);
- var isTopOpen = false;
- var isBotOpen = false;
- var isClockOpen = false;
- if (hasInnerSurface) {
- vertexMultiplier = 2.0;
- if (minimumCone > 0.0) {
- isTopOpen = true;
- extraIndices += (slicePartitions - 1);
+ var i;
+ var j;
+ var index = 0;
+
+ // Create arrays for theta and phi. Duplicate first and last angle to
+ // allow different normals at the intersections.
+ var phis = [minimumCone];
+ var thetas = [minimumClock];
+ for (i = 0; i < stackPartitions; i++) {
+ phis.push(minimumCone + i * (maximumCone - minimumCone) / (stackPartitions - 1));
}
- if (maximumCone < Math.PI) {
- isBotOpen = true;
- extraIndices += (slicePartitions - 1);
+ phis.push(maximumCone);
+ for (j = 0; j < slicePartitions; j++) {
+ thetas.push(minimumClock + j * (maximumClock - minimumClock) / (slicePartitions - 1));
}
- if ((maximumClock - minimumClock) % CesiumMath.TWO_PI) {
- isClockOpen = true;
- extraIndices += ((stackPartitions - 1) * 2) + 1;
- } else {
- extraIndices += 1;
+ thetas.push(maximumClock);
+ var numPhis = phis.length;
+ var numThetas = thetas.length;
+
+ // Allow for extra indices if there is an inner surface and if we need
+ // to close the sides if the clock range is not a full circle
+ var extraIndices = 0;
+ var vertexMultiplier = 1.0;
+ var hasInnerSurface = ((innerRadii.x !== radii.x) || (innerRadii.y !== radii.y) || innerRadii.z !== radii.z);
+ var isTopOpen = false;
+ var isBotOpen = false;
+ var isClockOpen = false;
+ if (hasInnerSurface) {
+ vertexMultiplier = 2.0;
+ if (minimumCone > 0.0) {
+ isTopOpen = true;
+ extraIndices += (slicePartitions - 1);
+ }
+ if (maximumCone < Math.PI) {
+ isBotOpen = true;
+ extraIndices += (slicePartitions - 1);
+ }
+ if ((maximumClock - minimumClock) % CesiumMath.TWO_PI) {
+ isClockOpen = true;
+ extraIndices += ((stackPartitions - 1) * 2) + 1;
+ } else {
+ extraIndices += 1;
+ }
}
- }
- var vertexCount = numThetas * numPhis * vertexMultiplier;
- var positions = new Float64Array(vertexCount * 3);
- var isInner = new Array(vertexCount).fill(false);
- var negateNormal = new Array(vertexCount).fill(false);
-
- // Multiply by 6 because there are two triangles per sector
- var indexCount = slicePartitions * stackPartitions * vertexMultiplier;
- var numIndices = 6 * (indexCount + extraIndices + 1 - (slicePartitions + stackPartitions) * vertexMultiplier);
- var indices = IndexDatatype.createTypedArray(indexCount, numIndices);
-
- var normals = (vertexFormat.normal) ? new Float32Array(vertexCount * 3) : undefined;
- var tangents = (vertexFormat.tangent) ? new Float32Array(vertexCount * 3) : undefined;
- var bitangents = (vertexFormat.bitangent) ? new Float32Array(vertexCount * 3) : undefined;
- var st = (vertexFormat.st) ? new Float32Array(vertexCount * 2) : undefined;
-
- // Calculate sin/cos phi
- var sinPhi = new Array(numPhis);
- var cosPhi = new Array(numPhis);
- for (i = 0; i < numPhis; i++) {
- sinPhi[i] = sin(phis[i]);
- cosPhi[i] = cos(phis[i]);
- }
+ var vertexCount = numThetas * numPhis * vertexMultiplier;
+ var positions = new Float64Array(vertexCount * 3);
+ var isInner = new Array(vertexCount).fill(false);
+ var negateNormal = new Array(vertexCount).fill(false);
- // Calculate sin/cos theta
- var sinTheta = new Array(numThetas);
- var cosTheta = new Array(numThetas);
- for (j = 0; j < numThetas; j++) {
- cosTheta[j] = cos(thetas[j]);
- sinTheta[j] = sin(thetas[j]);
- }
+ // Multiply by 6 because there are two triangles per sector
+ var indexCount = slicePartitions * stackPartitions * vertexMultiplier;
+ var numIndices = 6 * (indexCount + extraIndices + 1 - (slicePartitions + stackPartitions) * vertexMultiplier);
+ var indices = IndexDatatype.createTypedArray(indexCount, numIndices);
- // Create outer surface
- for (i = 0; i < numPhis; i++) {
+ var normals = (vertexFormat.normal) ? new Float32Array(vertexCount * 3) : undefined;
+ var tangents = (vertexFormat.tangent) ? new Float32Array(vertexCount * 3) : undefined;
+ var bitangents = (vertexFormat.bitangent) ? new Float32Array(vertexCount * 3) : undefined;
+ var st = (vertexFormat.st) ? new Float32Array(vertexCount * 2) : undefined;
+
+ // Calculate sin/cos phi
+ var sinPhi = new Array(numPhis);
+ var cosPhi = new Array(numPhis);
+ for (i = 0; i < numPhis; i++) {
+ sinPhi[i] = sin(phis[i]);
+ cosPhi[i] = cos(phis[i]);
+ }
+
+ // Calculate sin/cos theta
+ var sinTheta = new Array(numThetas);
+ var cosTheta = new Array(numThetas);
for (j = 0; j < numThetas; j++) {
- positions[index++] = radii.x * sinPhi[i] * cosTheta[j];
- positions[index++] = radii.y * sinPhi[i] * sinTheta[j];
- positions[index++] = radii.z * cosPhi[i];
+ cosTheta[j] = cos(thetas[j]);
+ sinTheta[j] = sin(thetas[j]);
}
- }
- // Create inner surface
- var vertexIndex = vertexCount / 2.0;
- if (hasInnerSurface) {
+ // Create outer surface
for (i = 0; i < numPhis; i++) {
for (j = 0; j < numThetas; j++) {
- positions[index++] = innerRadii.x * sinPhi[i] * cosTheta[j];
- positions[index++] = innerRadii.y * sinPhi[i] * sinTheta[j];
- positions[index++] = innerRadii.z * cosPhi[i];
-
- // Keep track of which vertices are the inner and which ones
- // need the normal to be negated
- isInner[vertexIndex] = true;
- if (i > 0 && i !== (numPhis-1) && j !== 0 && j !== (numThetas-1)) {
- negateNormal[vertexIndex] = true;
- }
- vertexIndex++;
+ positions[index++] = radii.x * sinPhi[i] * cosTheta[j];
+ positions[index++] = radii.y * sinPhi[i] * sinTheta[j];
+ positions[index++] = radii.z * cosPhi[i];
}
}
- }
- // Create indices for outer surface
- index = 0;
- var topOffset;
- var bottomOffset;
- for (i = 1; i < (numPhis - 2); i++) {
- topOffset = i * numThetas;
- bottomOffset = (i + 1) * numThetas;
-
- for (j = 1; j < numThetas - 2; j++) {
- indices[index++] = bottomOffset + j;
- indices[index++] = bottomOffset + j + 1;
- indices[index++] = topOffset + j + 1;
-
- indices[index++] = bottomOffset + j;
- indices[index++] = topOffset + j + 1;
- indices[index++] = topOffset + j;
+ // Create inner surface
+ var vertexIndex = vertexCount / 2.0;
+ if (hasInnerSurface) {
+ for (i = 0; i < numPhis; i++) {
+ for (j = 0; j < numThetas; j++) {
+ positions[index++] = innerRadii.x * sinPhi[i] * cosTheta[j];
+ positions[index++] = innerRadii.y * sinPhi[i] * sinTheta[j];
+ positions[index++] = innerRadii.z * cosPhi[i];
+
+ // Keep track of which vertices are the inner and which ones
+ // need the normal to be negated
+ isInner[vertexIndex] = true;
+ if (i > 0 && i !== (numPhis - 1) && j !== 0 && j !== (numThetas - 1)) {
+ negateNormal[vertexIndex] = true;
+ }
+ vertexIndex++;
+ }
+ }
}
- }
- // Create indices for inner surface
- if (hasInnerSurface) {
- var offset = numPhis * numThetas;
+ // Create indices for outer surface
+ index = 0;
+ var topOffset;
+ var bottomOffset;
for (i = 1; i < (numPhis - 2); i++) {
- topOffset = offset + i * numThetas;
- bottomOffset = offset + (i + 1) * numThetas;
+ topOffset = i * numThetas;
+ bottomOffset = (i + 1) * numThetas;
for (j = 1; j < numThetas - 2; j++) {
indices[index++] = bottomOffset + j;
- indices[index++] = topOffset + j;
+ indices[index++] = bottomOffset + j + 1;
indices[index++] = topOffset + j + 1;
indices[index++] = bottomOffset + j;
indices[index++] = topOffset + j + 1;
- indices[index++] = bottomOffset + j + 1;
+ indices[index++] = topOffset + j;
}
}
- }
- var outerOffset;
- var innerOffset;
- if (hasInnerSurface) {
- if (isTopOpen) {
- // Connect the top of the inner surface to the top of the outer surface
- innerOffset = numPhis * numThetas;
- for (i = 1; i < numThetas - 2; i++) {
- indices[index++] = i;
- indices[index++] = i + 1;
- indices[index++] = innerOffset + i + 1;
-
- indices[index++] = i;
- indices[index++] = innerOffset + i + 1;
- indices[index++] = innerOffset + i;
+ // Create indices for inner surface
+ if (hasInnerSurface) {
+ var offset = numPhis * numThetas;
+ for (i = 1; i < (numPhis - 2); i++) {
+ topOffset = offset + i * numThetas;
+ bottomOffset = offset + (i + 1) * numThetas;
+
+ for (j = 1; j < numThetas - 2; j++) {
+ indices[index++] = bottomOffset + j;
+ indices[index++] = topOffset + j;
+ indices[index++] = topOffset + j + 1;
+
+ indices[index++] = bottomOffset + j;
+ indices[index++] = topOffset + j + 1;
+ indices[index++] = bottomOffset + j + 1;
+ }
}
}
- if (isBotOpen) {
- // Connect the bottom of the inner surface to the bottom of the outer surface
- outerOffset = numPhis * numThetas - numThetas;
- innerOffset = numPhis * numThetas * vertexMultiplier - numThetas;
- for (i = 1; i < numThetas - 2; i++) {
- indices[index++] = outerOffset + i + 1;
- indices[index++] = outerOffset + i;
- indices[index++] = innerOffset + i;
-
- indices[index++] = outerOffset + i + 1;
- indices[index++] = innerOffset + i;
- indices[index++] = innerOffset + i + 1;
+ var outerOffset;
+ var innerOffset;
+ if (hasInnerSurface) {
+ if (isTopOpen) {
+ // Connect the top of the inner surface to the top of the outer surface
+ innerOffset = numPhis * numThetas;
+ for (i = 1; i < numThetas - 2; i++) {
+ indices[index++] = i;
+ indices[index++] = i + 1;
+ indices[index++] = innerOffset + i + 1;
+
+ indices[index++] = i;
+ indices[index++] = innerOffset + i + 1;
+ indices[index++] = innerOffset + i;
+ }
}
- }
- }
-
- // Connect the edges if clock is not closed
- if (isClockOpen) {
- for (i = 1; i < numPhis - 2; i++) {
- innerOffset = numThetas * numPhis + (numThetas * i);
- outerOffset = numThetas * i;
- indices[index++] = innerOffset;
- indices[index++] = outerOffset + numThetas;
- indices[index++] = outerOffset;
-
- indices[index++] = innerOffset;
- indices[index++] = innerOffset + numThetas;
- indices[index++] = outerOffset + numThetas;
- }
-
- for (i = 1; i < numPhis - 2; i++) {
- innerOffset = numThetas * numPhis + (numThetas * (i + 1)) - 1;
- outerOffset = numThetas * (i + 1) - 1;
- indices[index++] = outerOffset + numThetas;
- indices[index++] = innerOffset;
- indices[index++] = outerOffset;
- indices[index++] = outerOffset + numThetas;
- indices[index++] = innerOffset + numThetas;
- indices[index++] = innerOffset;
+ if (isBotOpen) {
+ // Connect the bottom of the inner surface to the bottom of the outer surface
+ outerOffset = numPhis * numThetas - numThetas;
+ innerOffset = numPhis * numThetas * vertexMultiplier - numThetas;
+ for (i = 1; i < numThetas - 2; i++) {
+ indices[index++] = outerOffset + i + 1;
+ indices[index++] = outerOffset + i;
+ indices[index++] = innerOffset + i;
+
+ indices[index++] = outerOffset + i + 1;
+ indices[index++] = innerOffset + i;
+ indices[index++] = innerOffset + i + 1;
+ }
+ }
}
- }
-
- var attributes = new GeometryAttributes();
-
- if (vertexFormat.position) {
- attributes.position = new GeometryAttribute({
- componentDatatype : ComponentDatatype.DOUBLE,
- componentsPerAttribute : 3,
- values : positions
- });
- }
- var stIndex = 0;
- var normalIndex = 0;
- var tangentIndex = 0;
- var bitangentIndex = 0;
- var vertexCountHalf = vertexCount / 2.0;
-
- var ellipsoid;
- var ellipsoidOuter = Ellipsoid.fromCartesian3(radii);
- var ellipsoidInner = Ellipsoid.fromCartesian3(innerRadii);
-
- if (vertexFormat.st || vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent) {
- for (i = 0; i < vertexCount; i++) {
- ellipsoid = (isInner[i]) ? ellipsoidInner : ellipsoidOuter;
- var position = Cartesian3.fromArray(positions, i * 3, scratchPosition);
- var normal = ellipsoid.geodeticSurfaceNormal(position, scratchNormal);
- if (negateNormal[i]) {
- Cartesian3.negate(normal, normal);
+ // Connect the edges if clock is not closed
+ if (isClockOpen) {
+ for (i = 1; i < numPhis - 2; i++) {
+ innerOffset = numThetas * numPhis + (numThetas * i);
+ outerOffset = numThetas * i;
+ indices[index++] = innerOffset;
+ indices[index++] = outerOffset + numThetas;
+ indices[index++] = outerOffset;
+
+ indices[index++] = innerOffset;
+ indices[index++] = innerOffset + numThetas;
+ indices[index++] = outerOffset + numThetas;
}
- if (vertexFormat.st) {
- var normalST = Cartesian2.negate(normal, scratchNormalST);
- st[stIndex++] = (Math.atan2(normalST.y, normalST.x) / CesiumMath.TWO_PI) + 0.5;
- st[stIndex++] = (Math.asin(normal.z) / Math.PI) + 0.5;
- }
+ for (i = 1; i < numPhis - 2; i++) {
+ innerOffset = numThetas * numPhis + (numThetas * (i + 1)) - 1;
+ outerOffset = numThetas * (i + 1) - 1;
+ indices[index++] = outerOffset + numThetas;
+ indices[index++] = innerOffset;
+ indices[index++] = outerOffset;
- if (vertexFormat.normal) {
- normals[normalIndex++] = normal.x;
- normals[normalIndex++] = normal.y;
- normals[normalIndex++] = normal.z;
+ indices[index++] = outerOffset + numThetas;
+ indices[index++] = innerOffset + numThetas;
+ indices[index++] = innerOffset;
}
+ }
- if (vertexFormat.tangent || vertexFormat.bitangent) {
- var tangent = scratchTangent;
+ var attributes = new GeometryAttributes();
- // Use UNIT_X for the poles
- var tangetOffset = 0;
- var unit;
- if (isInner[i]) {
- tangetOffset = vertexCountHalf;
- }
- if ((!isTopOpen && (i >= tangetOffset && i < (tangetOffset + numThetas*2)))) {
- unit = Cartesian3.UNIT_X;
- } else {
- unit = Cartesian3.UNIT_Z;
+ if (vertexFormat.position) {
+ attributes.position = new GeometryAttribute({
+ componentDatatype : ComponentDatatype.DOUBLE,
+ componentsPerAttribute : 3,
+ values : positions
+ });
+ }
+
+ var stIndex = 0;
+ var normalIndex = 0;
+ var tangentIndex = 0;
+ var bitangentIndex = 0;
+ var vertexCountHalf = vertexCount / 2.0;
+
+ var ellipsoid;
+ var ellipsoidOuter = Ellipsoid.fromCartesian3(radii);
+ var ellipsoidInner = Ellipsoid.fromCartesian3(innerRadii);
+
+ if (vertexFormat.st || vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent) {
+ for (i = 0; i < vertexCount; i++) {
+ ellipsoid = (isInner[i]) ? ellipsoidInner : ellipsoidOuter;
+ var position = Cartesian3.fromArray(positions, i * 3, scratchPosition);
+ var normal = ellipsoid.geodeticSurfaceNormal(position, scratchNormal);
+ if (negateNormal[i]) {
+ Cartesian3.negate(normal, normal);
}
- Cartesian3.cross(unit, normal, tangent);
- Cartesian3.normalize(tangent, tangent);
- if (vertexFormat.tangent) {
- tangents[tangentIndex++] = tangent.x;
- tangents[tangentIndex++] = tangent.y;
- tangents[tangentIndex++] = tangent.z;
+ if (vertexFormat.st) {
+ var normalST = Cartesian2.negate(normal, scratchNormalST);
+ st[stIndex++] = (Math.atan2(normalST.y, normalST.x) / CesiumMath.TWO_PI) + 0.5;
+ st[stIndex++] = (Math.asin(normal.z) / Math.PI) + 0.5;
}
- if (vertexFormat.bitangent) {
- var bitangent = Cartesian3.cross(normal, tangent, scratchBitangent);
- Cartesian3.normalize(bitangent, bitangent);
+ if (vertexFormat.normal) {
+ normals[normalIndex++] = normal.x;
+ normals[normalIndex++] = normal.y;
+ normals[normalIndex++] = normal.z;
+ }
- bitangents[bitangentIndex++] = bitangent.x;
- bitangents[bitangentIndex++] = bitangent.y;
- bitangents[bitangentIndex++] = bitangent.z;
+ if (vertexFormat.tangent || vertexFormat.bitangent) {
+ var tangent = scratchTangent;
+
+ // Use UNIT_X for the poles
+ var tangetOffset = 0;
+ var unit;
+ if (isInner[i]) {
+ tangetOffset = vertexCountHalf;
+ }
+ if ((!isTopOpen && (i >= tangetOffset && i < (tangetOffset + numThetas * 2)))) {
+ unit = Cartesian3.UNIT_X;
+ } else {
+ unit = Cartesian3.UNIT_Z;
+ }
+ Cartesian3.cross(unit, normal, tangent);
+ Cartesian3.normalize(tangent, tangent);
+
+ if (vertexFormat.tangent) {
+ tangents[tangentIndex++] = tangent.x;
+ tangents[tangentIndex++] = tangent.y;
+ tangents[tangentIndex++] = tangent.z;
+ }
+
+ if (vertexFormat.bitangent) {
+ var bitangent = Cartesian3.cross(normal, tangent, scratchBitangent);
+ Cartesian3.normalize(bitangent, bitangent);
+
+ bitangents[bitangentIndex++] = bitangent.x;
+ bitangents[bitangentIndex++] = bitangent.y;
+ bitangents[bitangentIndex++] = bitangent.z;
+ }
}
}
- }
- if (vertexFormat.st) {
- attributes.st = new GeometryAttribute({
- componentDatatype : ComponentDatatype.FLOAT,
- componentsPerAttribute : 2,
- values : st
- });
- }
+ if (vertexFormat.st) {
+ attributes.st = new GeometryAttribute({
+ componentDatatype : ComponentDatatype.FLOAT,
+ componentsPerAttribute : 2,
+ values : st
+ });
+ }
- if (vertexFormat.normal) {
- attributes.normal = new GeometryAttribute({
- componentDatatype : ComponentDatatype.FLOAT,
- componentsPerAttribute : 3,
- values : normals
- });
- }
+ if (vertexFormat.normal) {
+ attributes.normal = new GeometryAttribute({
+ componentDatatype : ComponentDatatype.FLOAT,
+ componentsPerAttribute : 3,
+ values : normals
+ });
+ }
- if (vertexFormat.tangent) {
- attributes.tangent = new GeometryAttribute({
- componentDatatype : ComponentDatatype.FLOAT,
- componentsPerAttribute : 3,
- values : tangents
- });
+ if (vertexFormat.tangent) {
+ attributes.tangent = new GeometryAttribute({
+ componentDatatype : ComponentDatatype.FLOAT,
+ componentsPerAttribute : 3,
+ values : tangents
+ });
+ }
+
+ if (vertexFormat.bitangent) {
+ attributes.bitangent = new GeometryAttribute({
+ componentDatatype : ComponentDatatype.FLOAT,
+ componentsPerAttribute : 3,
+ values : bitangents
+ });
+ }
}
- if (vertexFormat.bitangent) {
- attributes.bitangent = new GeometryAttribute({
- componentDatatype : ComponentDatatype.FLOAT,
- componentsPerAttribute : 3,
- values : bitangents
+ if (defined(ellipsoidGeometry._offsetAttribute)) {
+ var length = positions.length;
+ var applyOffset = new Uint8Array(length / 3);
+ var offsetValue = ellipsoidGeometry._offsetAttribute === GeometryOffsetAttribute.NONE ? 0 : 1;
+ arrayFill(applyOffset, offsetValue);
+ attributes.applyOffset = new GeometryAttribute({
+ componentDatatype : ComponentDatatype.UNSIGNED_BYTE,
+ componentsPerAttribute : 1,
+ values : applyOffset
});
}
- }
- if (defined(ellipsoidGeometry._offsetAttribute)) {
- var length = positions.length;
- var applyOffset = new Uint8Array(length / 3);
- var offsetValue = ellipsoidGeometry._offsetAttribute === GeometryOffsetAttribute.NONE ? 0 : 1;
- arrayFill(applyOffset, offsetValue);
- attributes.applyOffset = new GeometryAttribute({
- componentDatatype : ComponentDatatype.UNSIGNED_BYTE,
- componentsPerAttribute : 1,
- values: applyOffset
+ return new Geometry({
+ attributes : attributes,
+ indices : indices,
+ primitiveType : PrimitiveType.TRIANGLES,
+ boundingSphere : BoundingSphere.fromEllipsoid(ellipsoidOuter),
+ offsetAttribute : ellipsoidGeometry._offsetAttribute
});
- }
-
- return new Geometry({
- attributes : attributes,
- indices : indices,
- primitiveType : PrimitiveType.TRIANGLES,
- boundingSphere : BoundingSphere.fromEllipsoid(ellipsoidOuter),
- offsetAttribute : ellipsoidGeometry._offsetAttribute
- });
-};
-
-var unitEllipsoidGeometry;
-
-/**
- * Returns the geometric representation of a unit ellipsoid, including its vertices, indices, and a bounding sphere.
- * @returns {Geometry} The computed vertices and indices.
- *
- * @private
- */
-EllipsoidGeometry.getUnitEllipsoid = function() {
- if (!defined(unitEllipsoidGeometry)) {
- unitEllipsoidGeometry = EllipsoidGeometry.createGeometry((new EllipsoidGeometry({
- radii : new Cartesian3(1.0, 1.0, 1.0),
- vertexFormat : VertexFormat.POSITION_ONLY
- })));
- }
- return unitEllipsoidGeometry;
-};
+ };
+
+ var unitEllipsoidGeometry;
+
+ /**
+ * Returns the geometric representation of a unit ellipsoid, including its vertices, indices, and a bounding sphere.
+ * @returns {Geometry} The computed vertices and indices.
+ *
+ * @private
+ */
+ EllipsoidGeometry.getUnitEllipsoid = function() {
+ if (!defined(unitEllipsoidGeometry)) {
+ unitEllipsoidGeometry = EllipsoidGeometry.createGeometry((new EllipsoidGeometry({
+ radii : new Cartesian3(1.0, 1.0, 1.0),
+ vertexFormat : VertexFormat.POSITION_ONLY
+ })));
+ }
+ return unitEllipsoidGeometry;
+ };
-return EllipsoidGeometry;
+ return EllipsoidGeometry;
});
diff --git a/Source/Core/EllipsoidOutlineGeometry.js b/Source/Core/EllipsoidOutlineGeometry.js
index ad92ff7ceae6..af9df76e26e7 100644
--- a/Source/Core/EllipsoidOutlineGeometry.js
+++ b/Source/Core/EllipsoidOutlineGeometry.js
@@ -372,7 +372,7 @@ define([
// Create indices for the latitude lines
index = 0;
- for (i = 0; i < stackPartitions*vertexMultiplier; i++) {
+ for (i = 0; i < stackPartitions * vertexMultiplier; i++) {
var topOffset = i * subdivisions;
for (j = 0; j < subdivisions - 1; j++) {
indices[index++] = topOffset + j;
@@ -423,7 +423,7 @@ define([
}
var attributes = new GeometryAttributes({
- position: new GeometryAttribute({
+ position : new GeometryAttribute({
componentDatatype : ComponentDatatype.DOUBLE,
componentsPerAttribute : 3,
values : positions
@@ -438,7 +438,7 @@ define([
attributes.applyOffset = new GeometryAttribute({
componentDatatype : ComponentDatatype.UNSIGNED_BYTE,
componentsPerAttribute : 1,
- values: applyOffset
+ values : applyOffset
});
}
diff --git a/Specs/Core/EllipsoidGeometrySpec.js b/Specs/Core/EllipsoidGeometrySpec.js
index 492f57222636..7d087f2a82cf 100644
--- a/Specs/Core/EllipsoidGeometrySpec.js
+++ b/Specs/Core/EllipsoidGeometrySpec.js
@@ -14,339 +14,335 @@ define([
CesiumMath,
VertexFormat,
createPackableSpecs) {
- 'use strict';
+ 'use strict';
describe('Core/EllipsoidGeometry', function() {
-
it('constructor rounds floating-point slicePartitions', function() {
var m = new EllipsoidGeometry({
- slicePartitions: 3.5,
- stackPartitions: 3
+ slicePartitions : 3.5,
+ stackPartitions : 3
});
expect(m._slicePartitions).toEqual(4);
});
- it('constructor rounds floating-point stackPartitions', function() {
- var m = new EllipsoidGeometry({
- slicePartitions: 3,
- stackPartitions: 3.5
- });
- expect(m._stackPartitions).toEqual(4);
+ it('constructor rounds floating-point stackPartitions', function() {
+ var m = new EllipsoidGeometry({
+ slicePartitions : 3,
+ stackPartitions : 3.5
});
+ expect(m._stackPartitions).toEqual(4);
+ });
- it('constructor throws with invalid slicePartitions', function() {
- expect(function() {
- return new EllipsoidGeometry({
- slicePartitions: -1
- });
- }).toThrowDeveloperError();
- });
+ it('constructor throws with invalid slicePartitions', function() {
+ expect(function() {
+ return new EllipsoidGeometry({
+ slicePartitions : -1
+ });
+ }).toThrowDeveloperError();
+ });
- it('constructor throws with invalid stackPartitions', function() {
- expect(function() {
- return new EllipsoidGeometry({
- stackPartitions: -1
- });
- }).toThrowDeveloperError();
- });
+ it('constructor throws with invalid stackPartitions', function() {
+ expect(function() {
+ return new EllipsoidGeometry({
+ stackPartitions : -1
+ });
+ }).toThrowDeveloperError();
+ });
- it('computes positions', function() {
- var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- slicePartitions: 3,
- stackPartitions: 3
- }));
-
- // The vertices are 6x6 because an additional slice and stack are added
- // and the first and last clock and cone angles are duplicated (3 + 1 + 2 = 6)
- var numVertices = 36; // 6 rows * 6 positions
- var numTriangles = 18; // 6 top + 6 bottom + 6 around the sides
- expect(m.attributes.position.values.length).toEqual(numVertices * 3);
- expect(m.indices.length).toEqual(numTriangles * 3);
- expect(m.boundingSphere.radius).toEqual(1);
- });
+ it('computes positions', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ slicePartitions : 3,
+ stackPartitions : 3
+ }));
+
+ // The vertices are 6x6 because an additional slice and stack are added
+ // and the first and last clock and cone angles are duplicated (3 + 1 + 2 = 6)
+ var numVertices = 36; // 6 rows * 6 positions
+ var numTriangles = 18; // 6 top + 6 bottom + 6 around the sides
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
+ expect(m.indices.length).toEqual(numTriangles * 3);
+ expect(m.boundingSphere.radius).toEqual(1);
+ });
- it('computes offset attribute', function() {
- var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- slicePartitions: 3,
- stackPartitions: 3,
- offsetAttribute: GeometryOffsetAttribute.ALL
- }));
-
- var numVertices = 36;
- expect(m.attributes.position.values.length).toEqual(numVertices * 3);
-
- var offset = m.attributes.applyOffset.values;
- expect(offset.length).toEqual(numVertices);
- var expected = new Array(offset.length);
- expected = arrayFill(expected, 1);
- expect(offset).toEqual(expected);
- });
+ it('computes offset attribute', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ slicePartitions : 3,
+ stackPartitions : 3,
+ offsetAttribute : GeometryOffsetAttribute.ALL
+ }));
+
+ var numVertices = 36;
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
+
+ var offset = m.attributes.applyOffset.values;
+ expect(offset.length).toEqual(numVertices);
+ var expected = new Array(offset.length);
+ expected = arrayFill(expected, 1);
+ expect(offset).toEqual(expected);
+ });
- it('compute all vertex attributes', function() {
- var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
- vertexFormat: VertexFormat.ALL,
- slicePartitions: 3,
- stackPartitions: 3
- }));
-
- var numVertices = 36;
- var numTriangles = 18;
- expect(m.attributes.position.values.length).toEqual(numVertices * 3);
- expect(m.attributes.st.values.length).toEqual(numVertices * 2);
- expect(m.attributes.normal.values.length).toEqual(numVertices * 3);
- expect(m.attributes.tangent.values.length).toEqual(numVertices * 3);
- expect(m.attributes.bitangent.values.length).toEqual(numVertices * 3);
- expect(m.indices.length).toEqual(numTriangles * 3);
- });
+ it('compute all vertex attributes', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat : VertexFormat.ALL,
+ slicePartitions : 3,
+ stackPartitions : 3
+ }));
+
+ var numVertices = 36;
+ var numTriangles = 18;
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
+ expect(m.attributes.st.values.length).toEqual(numVertices * 2);
+ expect(m.attributes.normal.values.length).toEqual(numVertices * 3);
+ expect(m.attributes.tangent.values.length).toEqual(numVertices * 3);
+ expect(m.attributes.bitangent.values.length).toEqual(numVertices * 3);
+ expect(m.indices.length).toEqual(numTriangles * 3);
+ });
- it('computes attributes for a unit sphere', function() {
- var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
- vertexFormat: VertexFormat.ALL,
- slicePartitions: 3,
- stackPartitions: 3
- }));
-
- var positions = m.attributes.position.values;
- var normals = m.attributes.normal.values;
- var tangents = m.attributes.tangent.values;
- var bitangents = m.attributes.bitangent.values;
-
- for (var i = 0; i < positions.length; i += 3) {
- var position = Cartesian3.fromArray(positions, i);
- var normal = Cartesian3.fromArray(normals, i);
- var tangent = Cartesian3.fromArray(tangents, i);
- var bitangent = Cartesian3.fromArray(bitangents, i);
-
- expect(Cartesian3.magnitude(position)).toEqualEpsilon(1.0, CesiumMath.EPSILON10);
- expect(normal).toEqualEpsilon(Cartesian3.normalize(position, new Cartesian3()), CesiumMath.EPSILON7);
- expect(Cartesian3.dot(Cartesian3.UNIT_Z, tangent)).not.toBeLessThan(0.0);
- expect(bitangent).toEqualEpsilon(Cartesian3.cross(normal, tangent, new Cartesian3()), CesiumMath.EPSILON7);
- }
- });
+ it('computes attributes for a unit sphere', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat : VertexFormat.ALL,
+ slicePartitions : 3,
+ stackPartitions : 3
+ }));
+
+ var positions = m.attributes.position.values;
+ var normals = m.attributes.normal.values;
+ var tangents = m.attributes.tangent.values;
+ var bitangents = m.attributes.bitangent.values;
+
+ for (var i = 0; i < positions.length; i += 3) {
+ var position = Cartesian3.fromArray(positions, i);
+ var normal = Cartesian3.fromArray(normals, i);
+ var tangent = Cartesian3.fromArray(tangents, i);
+ var bitangent = Cartesian3.fromArray(bitangents, i);
+
+ expect(Cartesian3.magnitude(position)).toEqualEpsilon(1.0, CesiumMath.EPSILON10);
+ expect(normal).toEqualEpsilon(Cartesian3.normalize(position, new Cartesian3()), CesiumMath.EPSILON7);
+ expect(Cartesian3.dot(Cartesian3.UNIT_Z, tangent)).not.toBeLessThan(0.0);
+ expect(bitangent).toEqualEpsilon(Cartesian3.cross(normal, tangent, new Cartesian3()), CesiumMath.EPSILON7);
+ }
+ });
- it('computes positions with inner surface', function() {
- var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- slicePartitions: 3,
- stackPartitions: 3,
- innerRadii: new Cartesian3(0.5, 0.5, 0.5)
- }));
-
- var numVertices = 72; // 6 rows * 6 positions * 2 surfaces
- var numTriangles = 36; // (6 top + 6 bottom + 6 around the sides) * 2 surfaces
- expect(m.attributes.position.values.length).toEqual(numVertices * 3);
- expect(m.indices.length).toEqual(numTriangles * 3);
- expect(m.boundingSphere.radius).toEqual(1);
- });
+ it('computes positions with inner surface', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ slicePartitions : 3,
+ stackPartitions : 3,
+ innerRadii : new Cartesian3(0.5, 0.5, 0.5)
+ }));
+
+ var numVertices = 72; // 6 rows * 6 positions * 2 surfaces
+ var numTriangles = 36; // (6 top + 6 bottom + 6 around the sides) * 2 surfaces
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
+ expect(m.indices.length).toEqual(numTriangles * 3);
+ expect(m.boundingSphere.radius).toEqual(1);
+ });
- it('computes positions with inner surface and partial clock range', function() {
- var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- slicePartitions: 4,
- stackPartitions: 4,
- innerRadii: new Cartesian3(0.5, 0.5, 0.5),
- minimumClock: CesiumMath.toRadians(90.0),
- maximumClock: CesiumMath.toRadians(270.0)
- }));
-
- var numVertices = 70;
- var numTriangles = 48;
- expect(m.attributes.position.values.length).toEqual(numVertices * 3);
- expect(m.indices.length).toEqual(numTriangles * 3);
- expect(m.boundingSphere.radius).toEqual(1);
- });
+ it('computes positions with inner surface and partial clock range', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ slicePartitions : 4,
+ stackPartitions : 4,
+ innerRadii : new Cartesian3(0.5, 0.5, 0.5),
+ minimumClock : CesiumMath.toRadians(90.0),
+ maximumClock : CesiumMath.toRadians(270.0)
+ }));
+
+ var numVertices = 70;
+ var numTriangles = 48;
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
+ expect(m.indices.length).toEqual(numTriangles * 3);
+ expect(m.boundingSphere.radius).toEqual(1);
+ });
- it('computes positions with inner surface and partial clock range and open top', function() {
- var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- slicePartitions: 4,
- stackPartitions: 4,
- innerRadii: new Cartesian3(0.5, 0.5, 0.5),
- minimumClock: CesiumMath.toRadians(90.0),
- maximumClock: CesiumMath.toRadians(270.0),
- minimumCone: CesiumMath.toRadians(30.0)
- }));
-
- var numVertices = 60;
- var numTriangles = 40;
- expect(m.attributes.position.values.length).toEqual(numVertices * 3);
- expect(m.indices.length).toEqual(numTriangles * 3);
- expect(m.boundingSphere.radius).toEqual(1);
- });
+ it('computes positions with inner surface and partial clock range and open top', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ slicePartitions : 4,
+ stackPartitions : 4,
+ innerRadii : new Cartesian3(0.5, 0.5, 0.5),
+ minimumClock : CesiumMath.toRadians(90.0),
+ maximumClock : CesiumMath.toRadians(270.0),
+ minimumCone : CesiumMath.toRadians(30.0)
+ }));
+
+ var numVertices = 60;
+ var numTriangles = 40;
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
+ expect(m.indices.length).toEqual(numTriangles * 3);
+ expect(m.boundingSphere.radius).toEqual(1);
+ });
- it('computes partitions to default to 2 if less than 2', function() {
- var geometry = new EllipsoidGeometry({
- radii: new Cartesian3(0.5, 0.5, 0.5)
- });
+ it('computes partitions to default to 2 if less than 2', function() {
+ var geometry = new EllipsoidGeometry({
+ radii : new Cartesian3(0.5, 0.5, 0.5)
+ });
- geometry._slicePartitions = 0;
- geometry._stackPartitions = 0;
+ geometry._slicePartitions = 0;
+ geometry._stackPartitions = 0;
- var m = EllipsoidGeometry.createGeometry(geometry);
+ var m = EllipsoidGeometry.createGeometry(geometry);
- expect(m.indices.length).toEqual(6);
- });
+ expect(m.indices.length).toEqual(6);
+ });
- it('negates normals on an ellipsoid', function() {
- var negatedNormals = 0;
+ it('negates normals on an ellipsoid', function() {
+ var negatedNormals = 0;
- var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
- vertexFormat: VertexFormat.ALL,
- radii: new Cartesian3(1.0, 1.0, 1.0),
- innerRadii: new Cartesian3(0.5, 0.5, 0.5),
- minimumCone: CesiumMath.toRadians(60.0),
- maximumCone: CesiumMath.toRadians(140.0)
- }));
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat : VertexFormat.ALL,
+ radii : new Cartesian3(1.0, 1.0, 1.0),
+ innerRadii : new Cartesian3(0.5, 0.5, 0.5),
+ minimumCone : CesiumMath.toRadians(60.0),
+ maximumCone : CesiumMath.toRadians(140.0)
+ }));
- var positions = m.attributes.position.values;
- var normals = m.attributes.normal.values;
+ var positions = m.attributes.position.values;
+ var normals = m.attributes.normal.values;
- for (var i = 0; i < positions.length; i += 3) {
- var normal = Cartesian3.fromArray(normals, i);
+ for (var i = 0; i < positions.length; i += 3) {
+ var normal = Cartesian3.fromArray(normals, i);
- if (normal.x < 0 && normal.y < 0 && normal.z < 0) {
- negatedNormals++;
- }
+ if (normal.x < 0 && normal.y < 0 && normal.z < 0) {
+ negatedNormals++;
}
+ }
- expect(negatedNormals).toEqual(496);
- });
-
- it('computes the unit ellipsoid', function() {
- var ellipsoid = EllipsoidGeometry.getUnitEllipsoid();
- expect(ellipsoid).toBeDefined();
- expect(ellipsoid.boundingSphere.radius).toEqual(1);
+ expect(negatedNormals).toEqual(496);
+ });
- expect(EllipsoidGeometry.getUnitEllipsoid()).toBe(ellipsoid);
- });
+ it('computes the unit ellipsoid', function() {
+ var ellipsoid = EllipsoidGeometry.getUnitEllipsoid();
+ expect(ellipsoid).toBeDefined();
+ expect(ellipsoid.boundingSphere.radius).toEqual(1);
- it('computes positions with inner surface and partial clock range and open top and bottom', function() {
- var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- slicePartitions: 4,
- stackPartitions: 4,
- innerRadii: new Cartesian3(0.5, 0.5, 0.5),
- minimumClock: CesiumMath.toRadians(90.0),
- maximumClock: CesiumMath.toRadians(270.0),
- minimumCone: CesiumMath.toRadians(30.0),
- maximumCone: CesiumMath.toRadians(120.0)
- }));
-
- var numVertices = 50;
- var numTriangles = 32;
- expect(m.attributes.position.values.length).toEqual(numVertices * 3);
- expect(m.indices.length).toEqual(numTriangles * 3);
- expect(m.boundingSphere.radius).toEqual(1);
- });
+ expect(EllipsoidGeometry.getUnitEllipsoid()).toBe(ellipsoid);
+ });
- it('undefined is returned if the x, y, or z radii or innerRadii are equal or less than zero', function() {
- var ellipsoid0 = new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- radii: new Cartesian3(0.0, 500000.0, 500000.0)
- });
- var ellipsoid1 = new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- radii: new Cartesian3(1000000.0, 0.0, 500000.0)
- });
- var ellipsoid2 = new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- radii: new Cartesian3(1000000.0, 500000.0, 0.0)
- });
- var ellipsoid3 = new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- radii: new Cartesian3(-10.0, 500000.0, 500000.0)
- });
- var ellipsoid4 = new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- radii: new Cartesian3(1000000.0, -10.0, 500000.0)
- });
- var ellipsoid5 = new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- radii: new Cartesian3(1000000.0, 500000.0, -10.0)
- });
- var ellipsoid6 = new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- radii: new Cartesian3(500000.0, 500000.0, 500000.0),
- innerRadii: new Cartesian3(0.0, 100000.0, 100000.0)
- });
- var ellipsoid7 = new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- radii: new Cartesian3(500000.0, 500000.0, 500000.0),
- innerRadii: new Cartesian3(100000.0, 0.0, 100000.0)
- });
- var ellipsoid8 = new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- radii: new Cartesian3(500000.0, 500000.0, 500000.0),
- innerRadii: new Cartesian3(100000.0, 100000.0, 0.0)
- });
- var ellipsoid9 = new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- radii: new Cartesian3(500000.0, 500000.0, 500000.0),
- innerRadii: new Cartesian3(-10.0, 100000.0, 100000.0)
- });
- var ellipsoid10 = new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- radii: new Cartesian3(500000.0, 500000.0, 500000.0),
- innerRadii: new Cartesian3(100000.0, -10.0, 100000.0)
- });
- var ellipsoid11 = new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- radii: new Cartesian3(500000.0, 500000.0, 500000.0),
- innerRadii: new Cartesian3(100000.0, 100000.0, -10.0)
- });
+ it('computes positions with inner surface and partial clock range and open top and bottom', function() {
+ var m = EllipsoidGeometry.createGeometry(new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ slicePartitions : 4,
+ stackPartitions : 4,
+ innerRadii : new Cartesian3(0.5, 0.5, 0.5),
+ minimumClock : CesiumMath.toRadians(90.0),
+ maximumClock : CesiumMath.toRadians(270.0),
+ minimumCone : CesiumMath.toRadians(30.0),
+ maximumCone : CesiumMath.toRadians(120.0)
+ }));
+
+ var numVertices = 50;
+ var numTriangles = 32;
+ expect(m.attributes.position.values.length).toEqual(numVertices * 3);
+ expect(m.indices.length).toEqual(numTriangles * 3);
+ expect(m.boundingSphere.radius).toEqual(1);
+ });
- var geometry0 = EllipsoidGeometry.createGeometry(ellipsoid0);
- var geometry1 = EllipsoidGeometry.createGeometry(ellipsoid1);
- var geometry2 = EllipsoidGeometry.createGeometry(ellipsoid2);
- var geometry3 = EllipsoidGeometry.createGeometry(ellipsoid3);
- var geometry4 = EllipsoidGeometry.createGeometry(ellipsoid4);
- var geometry5 = EllipsoidGeometry.createGeometry(ellipsoid5);
- var geometry6 = EllipsoidGeometry.createGeometry(ellipsoid6);
- var geometry7 = EllipsoidGeometry.createGeometry(ellipsoid7);
- var geometry8 = EllipsoidGeometry.createGeometry(ellipsoid8);
- var geometry9 = EllipsoidGeometry.createGeometry(ellipsoid9);
- var geometry10 = EllipsoidGeometry.createGeometry(ellipsoid10);
- var geometry11 = EllipsoidGeometry.createGeometry(ellipsoid11);
-
- expect(geometry0).toBeUndefined();
- expect(geometry1).toBeUndefined();
- expect(geometry2).toBeUndefined();
- expect(geometry3).toBeUndefined();
- expect(geometry4).toBeUndefined();
- expect(geometry5).toBeUndefined();
- expect(geometry6).toBeUndefined();
- expect(geometry7).toBeUndefined();
- expect(geometry8).toBeUndefined();
- expect(geometry9).toBeUndefined();
- expect(geometry10).toBeUndefined();
- expect(geometry11).toBeUndefined();
+ it('undefined is returned if the x, y, or z radii or innerRadii are equal or less than zero', function() {
+ var ellipsoid0 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(0.0, 500000.0, 500000.0)
});
-
- var ellipsoidgeometry = new EllipsoidGeometry({
- vertexFormat: VertexFormat.POSITION_ONLY,
- radii: new Cartesian3(1.0, 2.0, 3.0),
- innerRadii: new Cartesian3(0.5, 0.6, 0.7),
- minimumClock: 0.1,
- maximumClock: 0.2,
- minimumCone: 0.3,
- maximumCone: 0.4,
- slicePartitions: 3,
- stackPartitions: 3
+ var ellipsoid1 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(1000000.0, 0.0, 500000.0)
+ });
+ var ellipsoid2 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(1000000.0, 500000.0, 0.0)
+ });
+ var ellipsoid3 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(-10.0, 500000.0, 500000.0)
+ });
+ var ellipsoid4 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(1000000.0, -10.0, 500000.0)
+ });
+ var ellipsoid5 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(1000000.0, 500000.0, -10.0)
+ });
+ var ellipsoid6 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(0.0, 100000.0, 100000.0)
+ });
+ var ellipsoid7 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(100000.0, 0.0, 100000.0)
});
- var packedInstance = [
- 1.0, 2.0, 3.0,
- 0.5, 0.6, 0.7,
- 1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
- 0.1, 0.2,
- 0.3, 0.4,
- 3.0, 3.0,
- -1
- ];
- createPackableSpecs(EllipsoidGeometry, ellipsoidgeometry, packedInstance);
+ var ellipsoid8 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(100000.0, 100000.0, 0.0)
+ });
+ var ellipsoid9 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(-10.0, 100000.0, 100000.0)
+ });
+ var ellipsoid10 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(100000.0, -10.0, 100000.0)
+ });
+ var ellipsoid11 = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(500000.0, 500000.0, 500000.0),
+ innerRadii : new Cartesian3(100000.0, 100000.0, -10.0)
+ });
+
+ var geometry0 = EllipsoidGeometry.createGeometry(ellipsoid0);
+ var geometry1 = EllipsoidGeometry.createGeometry(ellipsoid1);
+ var geometry2 = EllipsoidGeometry.createGeometry(ellipsoid2);
+ var geometry3 = EllipsoidGeometry.createGeometry(ellipsoid3);
+ var geometry4 = EllipsoidGeometry.createGeometry(ellipsoid4);
+ var geometry5 = EllipsoidGeometry.createGeometry(ellipsoid5);
+ var geometry6 = EllipsoidGeometry.createGeometry(ellipsoid6);
+ var geometry7 = EllipsoidGeometry.createGeometry(ellipsoid7);
+ var geometry8 = EllipsoidGeometry.createGeometry(ellipsoid8);
+ var geometry9 = EllipsoidGeometry.createGeometry(ellipsoid9);
+ var geometry10 = EllipsoidGeometry.createGeometry(ellipsoid10);
+ var geometry11 = EllipsoidGeometry.createGeometry(ellipsoid11);
+
+ expect(geometry0).toBeUndefined();
+ expect(geometry1).toBeUndefined();
+ expect(geometry2).toBeUndefined();
+ expect(geometry3).toBeUndefined();
+ expect(geometry4).toBeUndefined();
+ expect(geometry5).toBeUndefined();
+ expect(geometry6).toBeUndefined();
+ expect(geometry7).toBeUndefined();
+ expect(geometry8).toBeUndefined();
+ expect(geometry9).toBeUndefined();
+ expect(geometry10).toBeUndefined();
+ expect(geometry11).toBeUndefined();
+ });
+
+ var ellipsoidgeometry = new EllipsoidGeometry({
+ vertexFormat : VertexFormat.POSITION_ONLY,
+ radii : new Cartesian3(1.0, 2.0, 3.0),
+ innerRadii : new Cartesian3(0.5, 0.6, 0.7),
+ minimumClock : 0.1,
+ maximumClock : 0.2,
+ minimumCone : 0.3,
+ maximumCone : 0.4,
+ slicePartitions : 3,
+ stackPartitions : 3
});
- var packedInstance = [1.0, 2.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 3.0, -1.0];
+ var packedInstance = [
+ 1.0, 2.0, 3.0,
+ 0.5, 0.6, 0.7,
+ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+ 0.1, 0.2,
+ 0.3, 0.4,
+ 3.0, 3.0,
+ -1
+ ];
createPackableSpecs(EllipsoidGeometry, ellipsoidgeometry, packedInstance);
});
});
From dae185101cea80e8a6def49127d1d2f5d6eaa7d9 Mon Sep 17 00:00:00 2001
From: hpinkos
Date: Wed, 18 Sep 2019 11:23:38 -0400
Subject: [PATCH 58/62] sandcastle example cleanup
---
.../gallery/Spheres and Ellipsoids.html | 44 +++----------------
1 file changed, 6 insertions(+), 38 deletions(-)
diff --git a/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html b/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
index 61e12745e2ba..09d827f107fd 100644
--- a/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
+++ b/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
@@ -193,21 +193,11 @@
}
});
-var airplanePosition = Cesium.Cartesian3.fromDegrees(-110.0, 35.0, 250000.0);
viewer.entities.add({
- id : 'airplane',
- name : 'Airplane with sensor',
- position : airplanePosition,
- model : {
- uri : '../../SampleData/models/CesiumAir/Cesium_Air.gltf',
- scale : 6000
- }
-});
-viewer.entities.add({
- name : 'Airplane sensor coverage',
+ name : 'Parital ellipsoid',
position : new Cesium.ReferenceProperty(viewer.entities, 'airplane', ['position']),
orientation : Cesium.Transforms.headingPitchRollQuaternion(
- airplanePosition,
+ Cesium.Cartesian3.fromDegrees(-110.0, 35.0, 250000.0),
new Cesium.HeadingPitchRoll(Cesium.Math.PI_OVER_TWO, -Cesium.Math.PI_OVER_FOUR, 0.0)
),
ellipsoid : {
@@ -221,22 +211,11 @@
outline : true
}
});
-
-var truckPosition = Cesium.Cartesian3.fromDegrees(-102.0, 35.0);
viewer.entities.add({
- id : 'truck',
- name : 'Truck with sensor',
- position : truckPosition,
- model : {
- uri : '../../SampleData/models/CesiumGround/Cesium_Ground.gltf',
- scale : 8000
- }
-});
-viewer.entities.add({
- name : 'Truck sensor coverage',
+ name : 'Partial ellipsoid',
position : new Cesium.ReferenceProperty(viewer.entities, 'truck', ['position']),
orientation : Cesium.Transforms.headingPitchRollQuaternion(
- truckPosition,
+ Cesium.Cartesian3.fromDegrees(-102.0, 35.0),
new Cesium.HeadingPitchRoll(Cesium.Math.PI / 1.5, Cesium.Math.PI_OVER_FOUR, 0.0)
),
ellipsoid : {
@@ -250,20 +229,9 @@
outline : true
}
});
-
-truckPosition = Cesium.Cartesian3.fromDegrees(-95.0, 34.0);
-viewer.entities.add({
- id : 'truck2',
- name : 'Truck with sensor',
- position : truckPosition,
- model : {
- uri : '../../SampleData/models/CesiumGround/Cesium_Ground.gltf',
- scale : 8000
- }
-});
viewer.entities.add({
- name : 'Truck sensor coverage',
- position : new Cesium.ReferenceProperty(viewer.entities, 'truck2', ['position']),
+ name : 'Partial ellipsoid',
+ position : Cesium.Cartesian3.fromDegrees(-95.0, 34.0),
ellipsoid : {
radii : new Cesium.Cartesian3(300000.0, 300000.0, 300000.0),
innerRadii : new Cesium.Cartesian3(70000.0, 70000.0, 70000.0),
From 9eaac4cd65eaf116f8bf84d5c25aefa8e4297371 Mon Sep 17 00:00:00 2001
From: hpinkos
Date: Wed, 18 Sep 2019 11:40:46 -0400
Subject: [PATCH 59/62] clean up CHANGES.md
---
.../gallery/Spheres and Ellipsoids.html | 26 +++----------------
CHANGES.md | 2 +-
2 files changed, 5 insertions(+), 23 deletions(-)
diff --git a/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html b/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
index 09d827f107fd..25f702e8ab74 100644
--- a/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
+++ b/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
@@ -194,29 +194,11 @@
});
viewer.entities.add({
- name : 'Parital ellipsoid',
- position : new Cesium.ReferenceProperty(viewer.entities, 'airplane', ['position']),
+ name : 'Wedge',
+ position : Cesium.Cartesian3.fromDegrees(-102.0, 35.0, 20000.0),
orientation : Cesium.Transforms.headingPitchRollQuaternion(
- Cesium.Cartesian3.fromDegrees(-110.0, 35.0, 250000.0),
- new Cesium.HeadingPitchRoll(Cesium.Math.PI_OVER_TWO, -Cesium.Math.PI_OVER_FOUR, 0.0)
- ),
- ellipsoid : {
- radii : new Cesium.Cartesian3(300000.0, 300000.0, 300000.0),
- innerRadii : new Cesium.Cartesian3(1.0, 1.0, 1.0),
- minimumClock : Cesium.Math.toRadians(-10.0),
- maximumClock : Cesium.Math.toRadians(10.0),
- minimumCone : Cesium.Math.toRadians(80.0),
- maximumCone : Cesium.Math.toRadians(100.0),
- material : Cesium.Color.DARKCYAN.withAlpha(0.3),
- outline : true
- }
-});
-viewer.entities.add({
- name : 'Partial ellipsoid',
- position : new Cesium.ReferenceProperty(viewer.entities, 'truck', ['position']),
- orientation : Cesium.Transforms.headingPitchRollQuaternion(
- Cesium.Cartesian3.fromDegrees(-102.0, 35.0),
- new Cesium.HeadingPitchRoll(Cesium.Math.PI / 1.5, Cesium.Math.PI_OVER_FOUR, 0.0)
+ Cesium.Cartesian3.fromDegrees(-102.0, 35.0, 20000.0),
+ new Cesium.HeadingPitchRoll(Cesium.Math.PI / 1.5, 0, 0.0)
),
ellipsoid : {
radii : new Cesium.Cartesian3(500000.0, 500000.0, 500000.0),
diff --git a/CHANGES.md b/CHANGES.md
index 0afe5a47e113..e4462bbf582d 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -3,7 +3,7 @@ Change Log
### 1.62 - 2019-10-01
##### Additions :tada:
-* Added ability to create partial ellipsoids using both the Entity API and CZML. New ellipsoid geometry properties: innerRadii, minimumClock, maximumClock, minimumCone, maximumCone. This affects both EllipsoidGeometry and EllipsoidOutlineGeometry. See the updated [Sandcastle example](https://cesiumjs.org/Cesium/Apps/Sandcastle/?src=Spheres%20and%20Ellipsoids.html&label=Geometries). [#5995](https://github.com/AnalyticalGraphicsInc/cesium/pull/5995)
+* Added ability to create partial ellipsoids using both the Entity API and CZML. New ellipsoid geometry properties: `innerRadii`, `minimumClock`, `maximumClock`, `minimumCone`, and `maximumCone`. This affects both `EllipsoidGeometry` and `EllipsoidOutlineGeometry`. See the updated [Sandcastle example](https://cesiumjs.org/Cesium/Apps/Sandcastle/?src=Spheres%20and%20Ellipsoids.html&label=Geometries). [#5995](https://github.com/AnalyticalGraphicsInc/cesium/pull/5995)
### 1.61 - 2019-09-03
From 708cccc97a1a404dea27095625ee1d9c3c316810 Mon Sep 17 00:00:00 2001
From: hpinkos
Date: Wed, 18 Sep 2019 11:53:33 -0400
Subject: [PATCH 60/62] final cleanup
---
.../gallery/Partial Ellipsoids.html | 208 ++++++++++++++++++
.../Sandcastle/gallery/Partial Ellipsoids.jpg | Bin 0 -> 27259 bytes
.../gallery/Spheres and Ellipsoids.html | 185 +---------------
CHANGES.md | 2 +-
Specs/Core/EllipsoidOutlineGeometrySpec.js | 2 +
.../EllipsoidGeometryUpdaterSpec.js | 2 +
6 files changed, 225 insertions(+), 174 deletions(-)
create mode 100644 Apps/Sandcastle/gallery/Partial Ellipsoids.html
create mode 100644 Apps/Sandcastle/gallery/Partial Ellipsoids.jpg
diff --git a/Apps/Sandcastle/gallery/Partial Ellipsoids.html b/Apps/Sandcastle/gallery/Partial Ellipsoids.html
new file mode 100644
index 000000000000..a837d7d264d8
--- /dev/null
+++ b/Apps/Sandcastle/gallery/Partial Ellipsoids.html
@@ -0,0 +1,208 @@
+
+
+
+
+
+
+
+
+ Cesium Demo
+
+
+
+
+
+
+
+Loading...
+
+
+
+
diff --git a/Apps/Sandcastle/gallery/Partial Ellipsoids.jpg b/Apps/Sandcastle/gallery/Partial Ellipsoids.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..1a97edf61d33246a912efdd405106c9e4619c6a4
GIT binary patch
literal 27259
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
literal 0
HcmV?d00001
diff --git a/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html b/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
index 25f702e8ab74..cc9e0ab6d339 100644
--- a/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
+++ b/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
@@ -10,10 +10,12 @@
@@ -31,18 +33,18 @@
var blueEllipsoid = viewer.entities.add({
name : 'Blue ellipsoid',
- position: Cesium.Cartesian3.fromDegrees(-114.0, 45.0, 200000.0),
+ position: Cesium.Cartesian3.fromDegrees(-114.0, 40.0, 300000.0),
ellipsoid : {
- radii : new Cesium.Cartesian3(150000.0, 150000.0, 200000.0),
+ radii : new Cesium.Cartesian3(200000.0, 200000.0, 300000.0),
material : Cesium.Color.BLUE
}
});
var redSphere = viewer.entities.add({
name : 'Red sphere with black outline',
- position: Cesium.Cartesian3.fromDegrees(-107.0, 45.0, 200000.0),
+ position: Cesium.Cartesian3.fromDegrees(-107.0, 40.0, 300000.0),
ellipsoid : {
- radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
+ radii : new Cesium.Cartesian3(300000.0, 300000.0, 300000.0),
material : Cesium.Color.RED.withAlpha(0.5),
outline : true,
outlineColor : Cesium.Color.BLACK
@@ -51,9 +53,9 @@
var outlineOnly = viewer.entities.add({
name : 'Yellow ellipsoid outline',
- position: Cesium.Cartesian3.fromDegrees(-100.0, 45.0, 200000.0),
+ position: Cesium.Cartesian3.fromDegrees(-100.0, 40.0, 300000.0),
ellipsoid : {
- radii : new Cesium.Cartesian3(150000.0, 150000.0, 200000.0),
+ radii : new Cesium.Cartesian3(200000.0, 200000.0, 300000.0),
fill : false,
outline : true,
outlineColor : Cesium.Color.YELLOW,
@@ -62,169 +64,6 @@
}
});
-var saturnPosition = Cesium.Cartesian3.fromDegrees(-91.0, 45.0, 300000.0);
-viewer.entities.add({
- name : 'Saturn',
- position: saturnPosition,
- ellipsoid : {
- radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
- material : new Cesium.Color(0.95, 0.82, 0.49)
- }
-});
-
-viewer.entities.add({
- name : "Saturn's inner ring",
- position: saturnPosition,
- orientation : Cesium.Transforms.headingPitchRollQuaternion(
- saturnPosition,
- new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(30.0), Cesium.Math.toRadians(30.0), 0.0)
- ),
- ellipsoid : {
- radii : new Cesium.Cartesian3(400000.0, 400000.0, 400000.0),
- innerRadii : new Cesium.Cartesian3(300000.0, 300000.0, 300000.0),
- minimumCone : Cesium.Math.toRadians(89.8),
- maximumCone : Cesium.Math.toRadians(90.2),
- material : new Cesium.Color(0.95, 0.82, 0.49, 0.5)
- }
-});
-
-viewer.entities.add({
- name : "Saturn's outer ring",
- position: saturnPosition,
- orientation : Cesium.Transforms.headingPitchRollQuaternion(
- saturnPosition,
- new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(30.0), Cesium.Math.toRadians(30.0), 0.0)
- ),
- ellipsoid : {
- radii : new Cesium.Cartesian3(460000.0, 460000.0, 460000.0),
- innerRadii : new Cesium.Cartesian3(415000.0, 415000.0, 415000.0),
- minimumCone : Cesium.Math.toRadians(89.8),
- maximumCone : Cesium.Math.toRadians(90.2),
- material : new Cesium.Color(0.95, 0.82, 0.49, 0.5)
- }
-});
-
-viewer.entities.add({
- name : 'Dome',
- position: Cesium.Cartesian3.fromDegrees(-120.0, 40.0),
- ellipsoid : {
- radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
- maximumCone : Cesium.Math.PI_OVER_TWO,
- material : Cesium.Color.BLUE.withAlpha(0.3),
- outline : true
- }
-});
-
-viewer.entities.add({
- name : 'Dome with inner radius',
- position: Cesium.Cartesian3.fromDegrees(-114.0, 40.0),
- ellipsoid : {
- radii : new Cesium.Cartesian3(250000.0, 200000.0, 150000.0),
- innerRadii : new Cesium.Cartesian3(100000.0, 80000.0, 60000.0),
- maximumCone : Cesium.Math.PI_OVER_TWO,
- material : Cesium.Color.RED.withAlpha(0.3),
- outline : true
- }
-});
-
-viewer.entities.add({
- name : 'Dome with top cut out',
- position: Cesium.Cartesian3.fromDegrees(-108.0, 40.0),
- ellipsoid : {
- radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
- innerRadii : new Cesium.Cartesian3(100000.0, 100000.0, 100000.0),
- minimumCone : Cesium.Math.toRadians(20.0),
- maximumCone : Cesium.Math.PI_OVER_TWO,
- material : Cesium.Color.YELLOW.withAlpha(0.3),
- outline : true
- }
-});
-
-viewer.entities.add({
- name : 'Top and bottom cut out',
- position: Cesium.Cartesian3.fromDegrees(-102.0, 40.0, 140000.0),
- ellipsoid : {
- radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
- innerRadii : new Cesium.Cartesian3(100000.0, 100000.0, 100000.0),
- minimumCone : Cesium.Math.toRadians(60.0),
- maximumCone : Cesium.Math.toRadians(140.0),
- material : Cesium.Color.DARKCYAN.withAlpha(0.3),
- outline : true
- }
-});
-
-viewer.entities.add({
- name : 'Bowl',
- position: Cesium.Cartesian3.fromDegrees(-96.0, 39.5, 200000.0),
- ellipsoid : {
- radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
- innerRadii : new Cesium.Cartesian3(180000.0, 180000.0, 180000.0),
- minimumCone : Cesium.Math.toRadians(110.0),
- material : Cesium.Color.GREEN.withAlpha(0.3),
- outline : true
- }
-});
-
-viewer.entities.add({
- name : 'Clock cutout',
- position: Cesium.Cartesian3.fromDegrees(-90.0, 39.0),
- ellipsoid : {
- radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
- innerRadii : new Cesium.Cartesian3(150000.0, 150000.0, 150000.0),
- minimumClock : Cesium.Math.toRadians(-90.0),
- maximumClock : Cesium.Math.toRadians(180.0),
- minimumCone : Cesium.Math.toRadians(20.0),
- maximumCone : Cesium.Math.toRadians(70.0),
- material : Cesium.Color.BLUE.withAlpha(0.3),
- outline : true
- }
-});
-
-viewer.entities.add({
- name : 'Partial dome',
- position: Cesium.Cartesian3.fromDegrees(-84.0, 38.5),
- ellipsoid : {
- radii : new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
- minimumClock : Cesium.Math.toRadians(-90.0),
- maximumClock : Cesium.Math.toRadians(180.0),
- maximumCone : Cesium.Math.toRadians(90.0),
- material : Cesium.Color.RED.withAlpha(0.3),
- outline : true
- }
-});
-
-viewer.entities.add({
- name : 'Wedge',
- position : Cesium.Cartesian3.fromDegrees(-102.0, 35.0, 20000.0),
- orientation : Cesium.Transforms.headingPitchRollQuaternion(
- Cesium.Cartesian3.fromDegrees(-102.0, 35.0, 20000.0),
- new Cesium.HeadingPitchRoll(Cesium.Math.PI / 1.5, 0, 0.0)
- ),
- ellipsoid : {
- radii : new Cesium.Cartesian3(500000.0, 500000.0, 500000.0),
- innerRadii : new Cesium.Cartesian3(10000.0, 10000.0, 10000.0),
- minimumClock : Cesium.Math.toRadians(-15.0),
- maximumClock : Cesium.Math.toRadians(15.0),
- minimumCone : Cesium.Math.toRadians(75.0),
- maximumCone : Cesium.Math.toRadians(105.0),
- material : Cesium.Color.DARKCYAN.withAlpha(0.3),
- outline : true
- }
-});
-viewer.entities.add({
- name : 'Partial ellipsoid',
- position : Cesium.Cartesian3.fromDegrees(-95.0, 34.0),
- ellipsoid : {
- radii : new Cesium.Cartesian3(300000.0, 300000.0, 300000.0),
- innerRadii : new Cesium.Cartesian3(70000.0, 70000.0, 70000.0),
- minimumClock : Cesium.Math.toRadians(180.0),
- maximumClock : Cesium.Math.toRadians(400.0),
- maximumCone : Cesium.Math.toRadians(90.0),
- material : Cesium.Color.DARKCYAN.withAlpha(0.3),
- outline : true
- }
-});
-
viewer.zoomTo(viewer.entities);
//Sandcastle_End
Sandcastle.finishedLoading();
diff --git a/CHANGES.md b/CHANGES.md
index e4462bbf582d..b5fbae725920 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -3,7 +3,7 @@ Change Log
### 1.62 - 2019-10-01
##### Additions :tada:
-* Added ability to create partial ellipsoids using both the Entity API and CZML. New ellipsoid geometry properties: `innerRadii`, `minimumClock`, `maximumClock`, `minimumCone`, and `maximumCone`. This affects both `EllipsoidGeometry` and `EllipsoidOutlineGeometry`. See the updated [Sandcastle example](https://cesiumjs.org/Cesium/Apps/Sandcastle/?src=Spheres%20and%20Ellipsoids.html&label=Geometries). [#5995](https://github.com/AnalyticalGraphicsInc/cesium/pull/5995)
+* Added ability to create partial ellipsoids using both the Entity API and CZML. New ellipsoid geometry properties: `innerRadii`, `minimumClock`, `maximumClock`, `minimumCone`, and `maximumCone`. This affects both `EllipsoidGeometry` and `EllipsoidOutlineGeometry`. See the updated [Sandcastle example](https://cesiumjs.org/Cesium/Apps/Sandcastle/?src=Partial%20Ellipsoids.html&label=Geometries). [#5995](https://github.com/AnalyticalGraphicsInc/cesium/pull/5995)
### 1.61 - 2019-09-03
diff --git a/Specs/Core/EllipsoidOutlineGeometrySpec.js b/Specs/Core/EllipsoidOutlineGeometrySpec.js
index 67b1a35f8f27..57e7a92f9f94 100644
--- a/Specs/Core/EllipsoidOutlineGeometrySpec.js
+++ b/Specs/Core/EllipsoidOutlineGeometrySpec.js
@@ -3,12 +3,14 @@ define([
'Core/Cartesian3',
'Core/EllipsoidOutlineGeometry',
'Core/GeometryOffsetAttribute',
+ 'Core/Math',
'Specs/createPackableSpecs'
], function(
arrayFill,
Cartesian3,
EllipsoidOutlineGeometry,
GeometryOffsetAttribute,
+ CesiumMath,
createPackableSpecs) {
'use strict';
diff --git a/Specs/DataSources/EllipsoidGeometryUpdaterSpec.js b/Specs/DataSources/EllipsoidGeometryUpdaterSpec.js
index e1d32b14ba21..4b6e9173b877 100644
--- a/Specs/DataSources/EllipsoidGeometryUpdaterSpec.js
+++ b/Specs/DataSources/EllipsoidGeometryUpdaterSpec.js
@@ -4,6 +4,7 @@ define([
'Core/ColorGeometryInstanceAttribute',
'Core/GeometryOffsetAttribute',
'Core/JulianDate',
+ 'Core/Math',
'Core/Quaternion',
'Core/TimeIntervalCollection',
'DataSources/ColorMaterialProperty',
@@ -26,6 +27,7 @@ define([
ColorGeometryInstanceAttribute,
GeometryOffsetAttribute,
JulianDate,
+ CesiumMath,
Quaternion,
TimeIntervalCollection,
ColorMaterialProperty,
From de4e6402c204b95197343ce343edb61bceafd96e Mon Sep 17 00:00:00 2001
From: Hannah
Date: Wed, 18 Sep 2019 12:34:04 -0400
Subject: [PATCH 61/62] Update Spheres and Ellipsoids.html
---
Apps/Sandcastle/gallery/Spheres and Ellipsoids.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html b/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
index cc9e0ab6d339..fe2f0983fd83 100644
--- a/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
+++ b/Apps/Sandcastle/gallery/Spheres and Ellipsoids.html
@@ -4,7 +4,7 @@
-
+
Cesium Demo
From 48a7987218b948f26fca314a7a4b7eb77752adc0 Mon Sep 17 00:00:00 2001
From: hpinkos
Date: Wed, 18 Sep 2019 12:46:59 -0400
Subject: [PATCH 62/62] CHANGES.md
---
CHANGES.md | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/CHANGES.md b/CHANGES.md
index 4a4819a4f696..19c0bca7ddfd 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,12 +1,11 @@
Change Log
+==========
### 1.62 - 2019-10-01
##### Additions :tada:
* Added ability to create partial ellipsoids using both the Entity API and CZML. New ellipsoid geometry properties: `innerRadii`, `minimumClock`, `maximumClock`, `minimumCone`, and `maximumCone`. This affects both `EllipsoidGeometry` and `EllipsoidOutlineGeometry`. See the updated [Sandcastle example](https://cesiumjs.org/Cesium/Apps/Sandcastle/?src=Partial%20Ellipsoids.html&label=Geometries). [#5995](https://github.com/AnalyticalGraphicsInc/cesium/pull/5995)
-### 1.62 - 2019-10-01
-
##### Fixes :wrench:
* `Camera.flyTo` flies to the correct location in 2D when the destination crosses the international date line [#7909](https://github.com/AnalyticalGraphicsInc/cesium/pull/7909)