@@ -65,6 +65,11 @@ define([
65
65
degrees : CesiumMath . toDegrees
66
66
} ;
67
67
68
+ var ternaryFunctions = {
69
+ clamp : CesiumMath . clamp ,
70
+ mix : CesiumMath . lerp
71
+ } ;
72
+
68
73
/**
69
74
* Evaluates an expression defined using the
70
75
* {@link https://github.com/AnalyticalGraphicsInc/3d-tiles/tree/master/Styling|3D Tiles Styling language}.
@@ -379,21 +384,31 @@ define([
379
384
return new Node ( ExpressionNodeType . UNARY , call ) ;
380
385
} else if ( defined ( unaryFunctions [ call ] ) ) {
381
386
//>>includeStart('debug', pragmas.debug);
382
- if ( args . length < 1 || args . length > 1 ) {
387
+ if ( args . length !== 1 ) {
383
388
throw new DeveloperError ( 'Error: ' + call + ' requires exactly one argument.' ) ;
384
389
}
385
390
//>>includeEnd('debug');
386
391
val = createRuntimeAst ( expression , args [ 0 ] ) ;
387
392
return new Node ( ExpressionNodeType . UNARY , call , val ) ;
388
393
} else if ( defined ( binaryFunctions [ call ] ) ) {
389
394
//>>includeStart('debug', pragmas.debug);
390
- if ( args . length < 2 || args . length > 2 ) {
395
+ if ( args . length !== 2 ) {
391
396
throw new DeveloperError ( 'Error: ' + call + ' requires exactly two arguments.' ) ;
392
397
}
393
398
//>>includeEnd('debug');
394
399
left = createRuntimeAst ( expression , args [ 0 ] ) ;
395
400
right = createRuntimeAst ( expression , args [ 1 ] ) ;
396
401
return new Node ( ExpressionNodeType . BINARY , call , left , right ) ;
402
+ } else if ( defined ( ternaryFunctions [ call ] ) ) {
403
+ //>>includeStart('debug', pragmas.debug);
404
+ if ( args . length !== 3 ) {
405
+ throw new DeveloperError ( 'Error: ' + call + ' requires exactly three arguments.' ) ;
406
+ }
407
+ //>>includeEnd('debug');
408
+ left = createRuntimeAst ( expression , args [ 0 ] ) ;
409
+ right = createRuntimeAst ( expression , args [ 1 ] ) ;
410
+ var test = createRuntimeAst ( expression , args [ 2 ] ) ;
411
+ return new Node ( ExpressionNodeType . TERNARY , call , left , right , test ) ;
397
412
} else if ( call === 'Boolean' ) {
398
413
if ( args . length === 0 ) {
399
414
return new Node ( ExpressionNodeType . LITERAL_BOOLEAN , false ) ;
@@ -582,6 +597,32 @@ define([
582
597
} else if ( node . _value === 'toString' ) {
583
598
node . evaluate = node . _evaluateToString ;
584
599
}
600
+ } else if ( node . _type === ExpressionNodeType . UNARY ) {
601
+ if ( node . _value === '!' ) {
602
+ node . evaluate = node . _evaluateNot ;
603
+ } else if ( node . _value === '-' ) {
604
+ node . evaluate = node . _evaluateNegative ;
605
+ } else if ( node . _value === '+' ) {
606
+ node . evaluate = node . _evaluatePositive ;
607
+ } else if ( node . _value === 'isNaN' ) {
608
+ node . evaluate = node . _evaluateNaN ;
609
+ } else if ( node . _value === 'isFinite' ) {
610
+ node . evaluate = node . _evaluateIsFinite ;
611
+ } else if ( node . _value === 'isExactClass' ) {
612
+ node . evaluate = node . _evaluateIsExactClass ;
613
+ } else if ( node . _value === 'isClass' ) {
614
+ node . evaluate = node . _evaluateIsClass ;
615
+ } else if ( node . _value === 'getExactClassName' ) {
616
+ node . evaluate = node . _evaluategetExactClassName ;
617
+ } else if ( node . _value === 'Boolean' ) {
618
+ node . evaluate = node . _evaluateBooleanConversion ;
619
+ } else if ( node . _value === 'Number' ) {
620
+ node . evaluate = node . _evaluateNumberConversion ;
621
+ } else if ( node . _value === 'String' ) {
622
+ node . evaluate = node . _evaluateStringConversion ;
623
+ } else if ( defined ( unaryFunctions [ node . _value ] ) ) {
624
+ node . evaluate = getEvaluateUnaryFunction ( node . _value ) ;
625
+ }
585
626
} else if ( node . _type === ExpressionNodeType . BINARY ) {
586
627
if ( node . _value === '+' ) {
587
628
node . evaluate = node . _evaluatePlus ;
@@ -620,32 +661,8 @@ define([
620
661
} else if ( defined ( binaryFunctions [ node . _value ] ) ) {
621
662
node . evaluate = getEvaluateBinaryFunction ( node . _value ) ;
622
663
}
623
- } else if ( node . _type === ExpressionNodeType . UNARY ) {
624
- if ( node . _value === '!' ) {
625
- node . evaluate = node . _evaluateNot ;
626
- } else if ( node . _value === '-' ) {
627
- node . evaluate = node . _evaluateNegative ;
628
- } else if ( node . _value === '+' ) {
629
- node . evaluate = node . _evaluatePositive ;
630
- } else if ( node . _value === 'isNaN' ) {
631
- node . evaluate = node . _evaluateNaN ;
632
- } else if ( node . _value === 'isFinite' ) {
633
- node . evaluate = node . _evaluateIsFinite ;
634
- } else if ( node . _value === 'isExactClass' ) {
635
- node . evaluate = node . _evaluateIsExactClass ;
636
- } else if ( node . _value === 'isClass' ) {
637
- node . evaluate = node . _evaluateIsClass ;
638
- } else if ( node . _value === 'getExactClassName' ) {
639
- node . evaluate = node . _evaluategetExactClassName ;
640
- } else if ( defined ( unaryFunctions [ node . _value ] ) ) {
641
- node . evaluate = getEvaluateUnaryFunction ( node . _value ) ;
642
- } else if ( node . _value === 'Boolean' ) {
643
- node . evaluate = node . _evaluateBooleanConversion ;
644
- } else if ( node . _value === 'Number' ) {
645
- node . evaluate = node . _evaluateNumberConversion ;
646
- } else if ( node . _value === 'String' ) {
647
- node . evaluate = node . _evaluateStringConversion ;
648
- }
664
+ } else if ( node . _type === ExpressionNodeType . TERNARY ) {
665
+ node . evaluate = getEvaluateTernaryFunction ( node . _value ) ;
649
666
} else if ( node . _type === ExpressionNodeType . MEMBER ) {
650
667
if ( node . _value === 'brackets' ) {
651
668
node . evaluate = node . _evaluateMemberBrackets ;
@@ -677,17 +694,24 @@ define([
677
694
return feature . _content . _tileset . timeSinceLoad ;
678
695
}
679
696
697
+ function getEvaluateUnaryFunction ( call ) {
698
+ var evaluate = unaryFunctions [ call ] ;
699
+ return function ( feature ) {
700
+ return evaluate ( this . _left . evaluate ( feature ) ) ;
701
+ } ;
702
+ }
703
+
680
704
function getEvaluateBinaryFunction ( call ) {
681
705
var evaluate = binaryFunctions [ call ] ;
682
706
return function ( feature ) {
683
707
return evaluate ( this . _left . evaluate ( feature ) , this . _right . evaluate ( feature ) ) ;
684
708
} ;
685
709
}
686
710
687
- function getEvaluateUnaryFunction ( call ) {
688
- var evaluate = unaryFunctions [ call ] ;
711
+ function getEvaluateTernaryFunction ( call ) {
712
+ var evaluate = ternaryFunctions [ call ] ;
689
713
return function ( feature ) {
690
- return evaluate ( this . _left . evaluate ( feature ) ) ;
714
+ return evaluate ( this . _left . evaluate ( feature ) , this . _right . evaluate ( feature ) , this . _test . evaluate ( feature ) ) ;
691
715
} ;
692
716
}
693
717
@@ -1217,14 +1241,14 @@ define([
1217
1241
return 'bool(' + left + ')' ;
1218
1242
} else if ( value === 'Number' ) {
1219
1243
return 'float(' + left + ')' ;
1220
- } else if ( defined ( unaryFunctions [ value ] ) ) {
1221
- return value + '(' + left + ')' ;
1222
1244
} else if ( value === 'abs' ) {
1223
1245
return 'abs(' + left + ')' ;
1224
1246
} else if ( value === 'cos' ) {
1225
1247
return 'cos(' + left + ')' ;
1226
1248
} else if ( value === 'sqrt' ) {
1227
1249
return 'sqrt(' + left + ')' ;
1250
+ } else if ( defined ( unaryFunctions [ value ] ) ) {
1251
+ return value + '(' + left + ')' ;
1228
1252
}
1229
1253
//>>includeStart('debug', pragmas.debug);
1230
1254
else if ( ( value === 'isNaN' ) || ( value === 'isFinite' ) || ( value === 'String' ) || ( value === 'isExactClass' ) || ( value === 'isClass' ) || ( value === 'getExactClassName' ) ) {
@@ -1246,6 +1270,11 @@ define([
1246
1270
return value + '(' + left + ', ' + right + ')' ;
1247
1271
}
1248
1272
return '(' + left + ' ' + value + ' ' + right + ')' ;
1273
+ case ExpressionNodeType . TERNARY :
1274
+ if ( defined ( ternaryFunctions [ value ] ) ) {
1275
+ return value + '(' + left + ', ' + right + ', ' + test + ')' ;
1276
+ }
1277
+ break ;
1249
1278
case ExpressionNodeType . CONDITIONAL :
1250
1279
return '(' + test + ' ? ' + left + ' : ' + right + ')' ;
1251
1280
case ExpressionNodeType . MEMBER :
0 commit comments