Skip to content

Commit

Permalink
Merge pull request #11838 from CesiumGS/voxel-cleanup
Browse files Browse the repository at this point in the history
Simplify voxel shaders
  • Loading branch information
ggetz committed Feb 22, 2024
2 parents a6b291f + e59578b commit 8ed89db
Show file tree
Hide file tree
Showing 8 changed files with 290 additions and 462 deletions.
76 changes: 33 additions & 43 deletions packages/engine/Source/Scene/VoxelCylinderShape.js
Original file line number Diff line number Diff line change
Expand Up @@ -120,15 +120,11 @@ function VoxelCylinderShape() {
CYLINDER_HAS_RENDER_BOUNDS_ANGLE: undefined,
CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO: undefined,
CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF: undefined,
CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_HALF: undefined,
CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF: undefined,

CYLINDER_HAS_SHAPE_BOUNDS_RADIUS: undefined,
CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT: undefined,
CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT: undefined,
CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT: undefined,
CYLINDER_HAS_SHAPE_BOUNDS_ANGLE: undefined,
CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO: undefined,
CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY: undefined,
CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY: undefined,
CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED: undefined,
Expand Down Expand Up @@ -324,17 +320,12 @@ VoxelCylinderShape.prototype.update = function (
shapeAngleRange > defaultAngleRangeHalf + epsilonAngle &&
shapeAngleRange < defaultAngleRange - epsilonAngle;
const shapeIsAngleFlipped =
shapeAngleRange > epsilonAngle &&
shapeAngleRange < defaultAngleRangeHalf - epsilonAngle;
const shapeIsAngleRangeHalf =
shapeAngleRange >= defaultAngleRangeHalf - epsilonAngle &&
shapeAngleRange <= defaultAngleRangeHalf + epsilonAngle;
const shapeIsAngleRangeZero = shapeAngleRange <= epsilonAngle;
const shapeHasAngle =
shapeIsAngleRegular ||
shapeIsAngleFlipped ||
shapeIsAngleRangeHalf ||
shapeIsAngleRangeZero;
shapeIsAngleRegular || shapeIsAngleFlipped || shapeIsAngleRangeHalf;
const shapeIsMinAngleDiscontinuity = CesiumMath.equalsEpsilon(
shapeMinAngle,
defaultMinAngle,
Expand All @@ -357,23 +348,16 @@ VoxelCylinderShape.prototype.update = function (
const renderAngleRange =
renderMaxAngle - renderMinAngle + renderIsAngleReversed * defaultAngleRange;
const renderIsAngleRegular =
renderAngleRange > defaultAngleRangeHalf + epsilonAngle &&
renderAngleRange >= defaultAngleRangeHalf - epsilonAngle &&
renderAngleRange < defaultAngleRange - epsilonAngle;
const renderIsAngleFlipped =
renderAngleRange > epsilonAngle &&
renderAngleRange < defaultAngleRangeHalf - epsilonAngle;
const renderIsAngleRangeHalf =
renderAngleRange >= defaultAngleRangeHalf - epsilonAngle &&
renderAngleRange <= defaultAngleRangeHalf + epsilonAngle;
const renderIsAngleRangeZero = renderAngleRange <= epsilonAngle;
const renderHasAngle =
renderIsAngleRegular ||
renderIsAngleFlipped ||
renderIsAngleRangeHalf ||
renderIsAngleRangeZero;
renderIsAngleRegular || renderIsAngleFlipped || renderIsAngleRangeZero;

const shaderUniforms = this.shaderUniforms;
const shaderDefines = this.shaderDefines;
const { shaderUniforms, shaderDefines } = this;

// To keep things simple, clear the defines every time
for (const key in shaderDefines) {
Expand Down Expand Up @@ -408,12 +392,6 @@ VoxelCylinderShape.prototype.update = function (
if (renderMinHeight === renderMaxHeight) {
shaderDefines["CYLINDER_HAS_RENDER_BOUNDS_HEIGHT_FLAT"] = true;
}
if (shapeMinHeight === shapeMaxHeight) {
shaderDefines["CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT_FLAT"] = true;
}
if (shapeMinRadius === shapeMaxRadius) {
shaderDefines["CYLINDER_HAS_SHAPE_BOUNDS_RADIUS_FLAT"] = true;
}
if (!shapeIsDefaultRadius) {
shaderDefines["CYLINDER_HAS_SHAPE_BOUNDS_RADIUS"] = true;

Expand All @@ -423,8 +401,13 @@ VoxelCylinderShape.prototype.update = function (
// scale = 1.0 / (maxRadius - minRadius)
// offset = -minRadius / (maxRadius - minRadius)
// offset = minRadius / (minRadius - maxRadius)
const scale = 1.0 / (shapeMaxRadius - shapeMinRadius);
const offset = shapeMinRadius / (shapeMinRadius - shapeMaxRadius);
const radiusRange = shapeMaxRadius - shapeMinRadius;
let scale = 0.0;
let offset = 1.0;
if (radiusRange !== 0.0) {
scale = 1.0 / radiusRange;
offset = -shapeMinRadius / radiusRange;
}
shaderUniforms.cylinderUvToShapeUvRadius = Cartesian2.fromElements(
scale,
offset,
Expand All @@ -446,8 +429,13 @@ VoxelCylinderShape.prototype.update = function (
// offset = -2.0 * (minHeight * 0.5 + 0.5) / (maxHeight - minHeight)
// offset = -(minHeight + 1.0) / (maxHeight - minHeight)
// offset = (minHeight + 1.0) / (minHeight - maxHeight)
const scale = 2.0 / (shapeMaxHeight - shapeMinHeight);
const offset = (shapeMinHeight + 1.0) / (shapeMinHeight - shapeMaxHeight);
const heightRange = shapeMaxHeight - shapeMinHeight;
let scale = 0.0;
let offset = 1.0;
if (heightRange !== 0.0) {
scale = 2.0 / heightRange;
offset = -(shapeMinHeight + 1.0) / heightRange;
}
shaderUniforms.cylinderUvToShapeUvHeight = Cartesian2.fromElements(
scale,
offset,
Expand Down Expand Up @@ -505,9 +493,6 @@ VoxelCylinderShape.prototype.update = function (
} else if (renderIsAngleFlipped) {
shaderDefines["CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF"] = true;
intersectionCount += 2;
} else if (renderIsAngleRangeHalf) {
shaderDefines["CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_HALF"] = true;
intersectionCount += 1;
} else if (renderIsAngleRangeZero) {
shaderDefines["CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO"] = true;
intersectionCount += 2;
Expand All @@ -522,9 +507,6 @@ VoxelCylinderShape.prototype.update = function (

if (shapeHasAngle) {
shaderDefines["CYLINDER_HAS_SHAPE_BOUNDS_ANGLE"] = true;
if (shapeIsAngleRangeZero) {
shaderDefines["CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_RANGE_EQUAL_ZERO"] = true;
}
if (shapeIsMinAngleDiscontinuity) {
shaderDefines["CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY"] = true;
}
Expand Down Expand Up @@ -553,13 +535,21 @@ VoxelCylinderShape.prototype.update = function (
// offset = -uvMinAngle / (uvMaxAngle - uvMinAngle)
// offset = -((minAngle - pi) / (2.0 * pi)) / (((maxAngle - pi) / (2.0 * pi)) - ((minAngle - pi) / (2.0 * pi)))
// offset = -(minAngle - pi) / (maxAngle - minAngle)
const scale = defaultAngleRange / shapeAngleRange;
const offset = -(shapeMinAngle - defaultMinAngle) / shapeAngleRange;
shaderUniforms.cylinderUvToShapeUvAngle = Cartesian2.fromElements(
scale,
offset,
shaderUniforms.cylinderUvToShapeUvAngle
);
if (shapeAngleRange <= epsilonAngle) {
shaderUniforms.cylinderUvToShapeUvAngle = Cartesian2.fromElements(
0.0,
1.0,
shaderUniforms.cylinderUvToShapeUvAngle
);
} else {
const scale = defaultAngleRange / shapeAngleRange;
const offset = -(shapeMinAngle - defaultMinAngle) / shapeAngleRange;
shaderUniforms.cylinderUvToShapeUvAngle = Cartesian2.fromElements(
scale,
offset,
shaderUniforms.cylinderUvToShapeUvAngle
);
}
}

this.shaderMaximumIntersectionsLength = intersectionCount;
Expand Down

0 comments on commit 8ed89db

Please sign in to comment.