Skip to content

Commit 6c6562d

Browse files
authored
Merge pull request #5040 from glee2244/3d-tiles
First commit with distance
2 parents 4c45604 + 38dc3e3 commit 6c6562d

File tree

2 files changed

+178
-7
lines changed

2 files changed

+178
-7
lines changed

Source/Scene/Expression.js

+56-5
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,10 @@ define([
8282
atan2 : Math.atan2,
8383
pow : Math.pow,
8484
min : Math.min,
85-
max : Math.max
85+
max : Math.max,
86+
distance : distance,
87+
dot: dot,
88+
cross: cross
8689
};
8790

8891
var unaryFunctions = {
@@ -125,6 +128,48 @@ define([
125128
return CesiumMath.logBase(number, 2.0);
126129
}
127130

131+
function distance(x, y) {
132+
if (typeof x === 'number' && typeof y === 'number') {
133+
return Math.abs(x - y);
134+
} else if (x instanceof Cartesian2 && y instanceof Cartesian2) {
135+
return Cartesian2.distance(x, y);
136+
} else if (x instanceof Cartesian3 && y instanceof Cartesian3) {
137+
return Cartesian3.distance(x, y);
138+
} else if (x instanceof Cartesian4 && y instanceof Cartesian4) {
139+
return Cartesian4.distance(x, y);
140+
} else {
141+
//>>includeStart('debug', pragmas.debug);
142+
throw new DeveloperError('Function distance requires matching types of inputs. Arguments are ' + x + ' and ' + y + '.');
143+
//>>includeEnd('debug');
144+
}
145+
}
146+
147+
function dot(x, y) {
148+
if (typeof x === 'number' && typeof y === 'number') {
149+
return x * y;
150+
} else if (x instanceof Cartesian2 && y instanceof Cartesian2) {
151+
return Cartesian2.dot(x, y);
152+
} else if (x instanceof Cartesian3 && y instanceof Cartesian3) {
153+
return Cartesian3.dot(x, y);
154+
} else if (x instanceof Cartesian4 && y instanceof Cartesian4) {
155+
return Cartesian4.dot(x, y);
156+
} else {
157+
//>>includeStart('debug', pragmas.debug);
158+
throw new DeveloperError('Function dot requires matching types of inputs. Arguments are ' + x + ' and ' + y + '.');
159+
//>>includeEnd('debug');
160+
}
161+
}
162+
163+
function cross(x, y) {
164+
if (x instanceof Cartesian3 && y instanceof Cartesian3) {
165+
return Cartesian3.cross(x, y, ScratchStorage.getCartesian3());
166+
} else {
167+
//>>includeStart('debug', pragmas.debug);
168+
throw new DeveloperError('Invalid argument type for cross() function, must be vec3');
169+
//>>includeEnd('debug');
170+
}
171+
}
172+
128173
/**
129174
* Evaluates an expression defined using the
130175
* {@link https://github.com/AnalyticalGraphicsInc/3d-tiles/tree/master/Styling|3D Tiles Styling language}.
@@ -247,9 +292,9 @@ define([
247292
}
248293

249294
shaderExpression = returnType + ' ' + functionName + '() \n' +
250-
'{ \n' +
251-
' return ' + shaderExpression + '; \n' +
252-
'} \n';
295+
'{ \n' +
296+
' return ' + shaderExpression + '; \n' +
297+
'} \n';
253298

254299
return shaderExpression;
255300
};
@@ -400,7 +445,7 @@ define([
400445
createRuntimeAst(expression, args[1]),
401446
createRuntimeAst(expression, args[2])
402447
];
403-
return new Node(ExpressionNodeType.LITERAL_COLOR, call, val);
448+
return new Node(ExpressionNodeType.LITERAL_COLOR, call, val);
404449
} else if (call === 'rgba' || call === 'hsla') {
405450
//>>includeStart('debug', pragmas.debug);
406451
if (argsLength < 4) {
@@ -808,6 +853,12 @@ define([
808853
function getEvaluateBinaryFunction(call) {
809854
var evaluate = binaryFunctions[call];
810855
return function(feature) {
856+
var left = this._left.evaluate(feature);
857+
var right = this._right.evaluate(feature);
858+
859+
if (call === 'distance' || call === 'dot' || call === 'cross') {
860+
return evaluate(left, right);
861+
}
811862
return evaluate(this._left.evaluate(feature), this._right.evaluate(feature));
812863
};
813864
}

Specs/Scene/ExpressionSpec.js

+122-2
Original file line numberDiff line numberDiff line change
@@ -2143,6 +2143,105 @@ defineSuite([
21432143
}).toThrowDeveloperError();
21442144
});
21452145

2146+
it('evaluates the distance function', function() {
2147+
var expression = new Expression('distance(0, 1)');
2148+
expect(expression.evaluate(frameState, undefined)).toEqual(1.0);
2149+
2150+
expression = new Expression('distance(vec2(1.0, 0.0), vec2(0.0, 0.0))');
2151+
expect(expression.evaluate(frameState, undefined)).toEqual(1.0);
2152+
2153+
expression = new Expression('distance(vec3(3.0, 2.0, 1.0), vec3(1.0, 0.0, 0.0))');
2154+
expect(expression.evaluate(frameState, undefined)).toEqual(3.0);
2155+
2156+
expression = new Expression('distance(vec4(5.0, 5.0, 5.0, 5.0), vec4(0.0, 0.0, 0.0, 0.0))');
2157+
expect(expression.evaluate(frameState, undefined)).toEqual(10.0);
2158+
});
2159+
2160+
it('throws if distance function takes an invalid number of arguments', function() {
2161+
expect(function() {
2162+
return new Expression('distance(0.0)');
2163+
}) .toThrowDeveloperError();
2164+
2165+
expect(function() {
2166+
return new Expression('distance(1, 3, 0)');
2167+
}).toThrowDeveloperError();
2168+
});
2169+
2170+
it('throws if distance function takes mismatching types of arguments', function() {
2171+
expect(function() {
2172+
return new Expression('distance(1, vec2(3.0, 2.0)').evaluate(frameState, undefined);
2173+
}).toThrowDeveloperError();
2174+
2175+
expect(function() {
2176+
return new Expression('distance(vec4(5.0, 2.0, 3.0, 1.0), vec3(4.0, 4.0, 4.0))').evaluate(frameState, undefined);
2177+
}).toThrowDeveloperError();
2178+
});
2179+
2180+
it('evaluates the dot function', function() {
2181+
var expression = new Expression('dot(1, 2)');
2182+
expect(expression.evaluate(frameState, undefined)).toEqual(2.0);
2183+
2184+
expression = new Expression('dot(vec2(1.0, 1.0), vec2(2.0, 2.0))');
2185+
expect(expression.evaluate(frameState, undefined)).toEqual(4.0);
2186+
2187+
expression = new Expression('dot(vec3(1.0, 2.0, 3.0), vec3(2.0, 2.0, 1.0))');
2188+
expect(expression.evaluate(frameState, undefined)).toEqual(9.0);
2189+
2190+
expression = new Expression('dot(vec4(5.0, 5.0, 2.0, 3.0), vec4(1.0, 2.0, 1.0, 1.0))');
2191+
expect(expression.evaluate(frameState, undefined)).toEqual(20.0);
2192+
});
2193+
2194+
it('throws if dot function takes an invalid number of arguments', function() {
2195+
expect(function() {
2196+
return new Expression('dot(0.0)');
2197+
}).toThrowDeveloperError();
2198+
2199+
expect(function() {
2200+
return new Expression('dot(1, 3, 0)');
2201+
}).toThrowDeveloperError();
2202+
});
2203+
2204+
it('throws if dot function takes mismatching types of arguments', function() {
2205+
expect(function() {
2206+
return new Expression('dot(1, vec2(3.0, 2.0)').evaluate(frameState, undefined);
2207+
}).toThrowDeveloperError();
2208+
2209+
expect(function() {
2210+
return new Expression('dot(vec4(5.0, 2.0, 3.0, 1.0), vec3(4.0, 4.0, 4.0))').evaluate(frameState, undefined);
2211+
}).toThrowDeveloperError();
2212+
});
2213+
2214+
it('evaluates the cross function', function() {
2215+
var expression = new Expression('cross(vec3(1.0, 1.0, 1.0), vec3(2.0, 2.0, 2.0))');
2216+
expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(0.0, 0.0, 0.0));
2217+
2218+
expression = new Expression('cross(vec3(-1.0, -1.0, -1.0), vec3(0.0, -2.0, -5.0))');
2219+
expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(3.0, -5.0, 2.0));
2220+
2221+
expression = new Expression('cross(vec3(5.0, -2.0, 1.0), vec3(-2.0, -6.0, -8.0))');
2222+
expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(22.0, 38.0, -34.0));
2223+
});
2224+
2225+
it('throws if cross function takes an invalid number of arguments', function() {
2226+
expect(function() {
2227+
return new Expression('cross(vec3(0.0, 0.0, 0.0))');
2228+
}) .toThrowDeveloperError();
2229+
2230+
expect(function() {
2231+
return new Expression('cross(vec3(0.0, 0.0, 0.0), vec3(1.0, 1.0, 1.0), vec3(2.0, 2.0, 2.0))');
2232+
}).toThrowDeveloperError();
2233+
});
2234+
2235+
it('throws if cross function does not take vec3 arguments', function() {
2236+
expect(function() {
2237+
return new Expression('cross(vec2(1.0, 2.0), vec2(3.0, 2.0)').evaluate(frameState, undefined);
2238+
}).toThrowDeveloperError();
2239+
2240+
expect(function() {
2241+
return new Expression('cross(vec4(5.0, 2.0, 3.0, 1.0), vec3(4.0, 4.0, 4.0))').evaluate(frameState, undefined);
2242+
}).toThrowDeveloperError();
2243+
});
2244+
21462245
it('evaluates length function', function() {
21472246
var expression = new Expression('length(-3.0)');
21482247
expect(expression.evaluate(frameState, undefined)).toEqual(3.0);
@@ -2587,7 +2686,7 @@ defineSuite([
25872686
feature.addProperty('complicatedArray', [{
25882687
'subproperty' : Cartesian4.UNIT_X,
25892688
'anotherproperty' : Cartesian4.UNIT_Y
2590-
}, {
2689+
}, {
25912690
'subproperty' : Cartesian4.UNIT_Z,
25922691
'anotherproperty' : Cartesian4.UNIT_W
25932692
}]);
@@ -3016,7 +3115,7 @@ defineSuite([
30163115
expect(shaderExpression).toEqual(expected);
30173116
});
30183117

3019-
it('gets shader expression for sin', function() {
3118+
it('gets shader expression for sin', function() {
30203119
var expression = new Expression('sin(0.0)');
30213120
var shaderExpression = expression.getShaderExpression('', {});
30223121
var expected = 'sin(0.0)';
@@ -3163,6 +3262,27 @@ defineSuite([
31633262
expect(shaderExpression).toEqual(expected);
31643263
});
31653264

3265+
it('gets shader expression for distance', function() {
3266+
var expression = new Expression('distance(0.0, 1.0)');
3267+
var shaderExpression = expression.getShaderExpression('', {});
3268+
var expected = 'distance(0.0, 1.0)';
3269+
expect(shaderExpression).toEqual(expected);
3270+
});
3271+
3272+
it('gets shader expression for dot', function() {
3273+
var expression = new Expression('dot(1.0, 2.0)');
3274+
var shaderExpression = expression.getShaderExpression('', {});
3275+
var expected = 'dot(1.0, 2.0)';
3276+
expect(shaderExpression).toEqual(expected);
3277+
});
3278+
3279+
it('gets shader expression for cross', function() {
3280+
var expression = new Expression('cross(vec3(1.0, 1.0, 1.0), vec3(2.0, 2.0, 2.0))');
3281+
var shaderExpression = expression.getShaderExpression('', {});
3282+
var expected = 'cross(vec3(1.0, 1.0, 1.0), vec3(2.0, 2.0, 2.0))';
3283+
expect(shaderExpression).toEqual(expected);
3284+
});
3285+
31663286
it('throws when getting shader expression for regex', function() {
31673287
var expression = new Expression('regExp("a").test("abc")');
31683288
expect(function() {

0 commit comments

Comments
 (0)