@@ -84,8 +84,9 @@ define([
84
84
var SCALE_BY_DISTANCE_INDEX = Billboard . SCALE_BY_DISTANCE_INDEX ;
85
85
var TRANSLUCENCY_BY_DISTANCE_INDEX = Billboard . TRANSLUCENCY_BY_DISTANCE_INDEX ;
86
86
var PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX = Billboard . PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX ;
87
- var DISTANCE_DISPLAY_CONDITION_INDEX = Billboard . DISTANCE_DISPLAY_CONDITION_INDEX ;
87
+ var DISTANCE_DISPLAY_CONDITION_INDEX = Billboard . DISTANCE_DISPLAY_CONDITION ;
88
88
var DISABLE_DEPTH_DISTANCE = Billboard . DISABLE_DEPTH_DISTANCE ;
89
+ var TEXTURE_COORDINATE_BOUNDS = Billboard . TEXTURE_COORDINATE_BOUNDS ;
89
90
var NUMBER_OF_PROPERTIES = Billboard . NUMBER_OF_PROPERTIES ;
90
91
91
92
var attributeLocations ;
@@ -99,8 +100,9 @@ define([
99
100
eyeOffset : 5 , // 4 bytes free
100
101
scaleByDistance : 6 ,
101
102
pixelOffsetScaleByDistance : 7 ,
102
- distanceDisplayConditionAndDisableDepth : 8 ,
103
- a_batchId : 9
103
+ compressedAttribute3 : 8 ,
104
+ textureCoordinateBounds : 9 ,
105
+ a_batchId : 10
104
106
} ;
105
107
106
108
var attributeLocationsInstanced = {
@@ -113,8 +115,9 @@ define([
113
115
eyeOffset : 6 , // texture range in w
114
116
scaleByDistance : 7 ,
115
117
pixelOffsetScaleByDistance : 8 ,
116
- distanceDisplayConditionAndDisableDepth : 9 ,
117
- a_batchId : 10
118
+ compressedAttribute3 : 9 ,
119
+ textureCoordinateBounds : 10 ,
120
+ a_batchId : 11
118
121
} ;
119
122
120
123
/**
@@ -208,6 +211,9 @@ define([
208
211
this . _shaderDisableDepthDistance = false ;
209
212
this . _compiledShaderDisableDepthDistance = false ;
210
213
214
+ this . _shaderClampToGround = false ;
215
+ this . _compiledShaderClampToGround = false ;
216
+
211
217
this . _propertiesChanged = new Uint32Array ( NUMBER_OF_PROPERTIES ) ;
212
218
213
219
this . _maxSize = 0.0 ;
@@ -302,7 +308,8 @@ define([
302
308
BufferUsage . STATIC_DRAW , // SCALE_BY_DISTANCE_INDEX
303
309
BufferUsage . STATIC_DRAW , // TRANSLUCENCY_BY_DISTANCE_INDEX
304
310
BufferUsage . STATIC_DRAW , // PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX
305
- BufferUsage . STATIC_DRAW // DISTANCE_DISPLAY_CONDITION_INDEX
311
+ BufferUsage . STATIC_DRAW , // DISTANCE_DISPLAY_CONDITION_INDEX
312
+ BufferUsage . STATIC_DRAW // TEXTURE_COORDINATE_BOUNDS
306
313
] ;
307
314
308
315
this . _highlightColor = Color . clone ( Color . WHITE ) ; // Only used by Vector3DTilePoints
@@ -732,10 +739,15 @@ define([
732
739
componentDatatype : ComponentDatatype . FLOAT ,
733
740
usage : buffersUsage [ PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX ]
734
741
} , {
735
- index : attributeLocations . distanceDisplayConditionAndDisableDepth ,
736
- componentsPerAttribute : 3 ,
742
+ index : attributeLocations . compressedAttribute3 ,
743
+ componentsPerAttribute : 4 ,
737
744
componentDatatype : ComponentDatatype . FLOAT ,
738
745
usage : buffersUsage [ DISTANCE_DISPLAY_CONDITION_INDEX ]
746
+ } , {
747
+ index : attributeLocations . textureCoordinateBounds ,
748
+ componentsPerAttribute : 4 ,
749
+ componentDatatype : ComponentDatatype . FLOAT ,
750
+ usage : buffersUsage [ TEXTURE_COORDINATE_BOUNDS ]
739
751
} ] ;
740
752
741
753
// Instancing requires one non-instanced attribute.
@@ -818,6 +830,7 @@ define([
818
830
var UPPER_BOUND = 32768.0 ; // 2^15
819
831
820
832
var LEFT_SHIFT16 = 65536.0 ; // 2^16
833
+ var LEFT_SHIFT12 = 4096.0 ; // 2^12
821
834
var LEFT_SHIFT8 = 256.0 ; // 2^8
822
835
var LEFT_SHIFT7 = 128.0 ;
823
836
var LEFT_SHIFT5 = 32.0 ;
@@ -1020,6 +1033,9 @@ define([
1020
1033
var dimensions = billboardCollection . _textureAtlas . texture . dimensions ;
1021
1034
var imageHeight = Math . round ( defaultValue ( billboard . height , dimensions . y * height ) ) ;
1022
1035
billboardCollection . _maxSize = Math . max ( billboardCollection . _maxSize , imageHeight ) ;
1036
+ var labelHorizontalOrigin = defaultValue ( billboard . _labelHorizontalOrigin , - 2 ) ;
1037
+ labelHorizontalOrigin += 2 ;
1038
+ var compressed3 = imageHeight * LEFT_SHIFT2 + labelHorizontalOrigin ;
1023
1039
1024
1040
var red = Color . floatToByte ( color . red ) ;
1025
1041
var green = Color . floatToByte ( color . green ) ;
@@ -1036,13 +1052,13 @@ define([
1036
1052
1037
1053
if ( billboardCollection . _instanced ) {
1038
1054
i = billboard . _index ;
1039
- writer ( i , compressed0 , compressed1 , compressed2 , imageHeight ) ;
1055
+ writer ( i , compressed0 , compressed1 , compressed2 , compressed3 ) ;
1040
1056
} else {
1041
1057
i = billboard . _index * 4 ;
1042
- writer ( i + 0 , compressed0 , compressed1 , compressed2 , imageHeight ) ;
1043
- writer ( i + 1 , compressed0 , compressed1 , compressed2 , imageHeight ) ;
1044
- writer ( i + 2 , compressed0 , compressed1 , compressed2 , imageHeight ) ;
1045
- writer ( i + 3 , compressed0 , compressed1 , compressed2 , imageHeight ) ;
1058
+ writer ( i + 0 , compressed0 , compressed1 , compressed2 , compressed3 ) ;
1059
+ writer ( i + 1 , compressed0 , compressed1 , compressed2 , compressed3 ) ;
1060
+ writer ( i + 2 , compressed0 , compressed1 , compressed2 , compressed3 ) ;
1061
+ writer ( i + 3 , compressed0 , compressed1 , compressed2 , compressed3 ) ;
1046
1062
}
1047
1063
}
1048
1064
@@ -1158,9 +1174,9 @@ define([
1158
1174
}
1159
1175
}
1160
1176
1161
- function writeDistanceDisplayConditionAndDepthDisable ( billboardCollection , context , textureAtlasCoordinates , vafWriters , billboard ) {
1177
+ function writeCompressedAttribute3 ( billboardCollection , context , textureAtlasCoordinates , vafWriters , billboard ) {
1162
1178
var i ;
1163
- var writer = vafWriters [ attributeLocations . distanceDisplayConditionAndDisableDepth ] ;
1179
+ var writer = vafWriters [ attributeLocations . compressedAttribute3 ] ;
1164
1180
var near = 0.0 ;
1165
1181
var far = Number . MAX_VALUE ;
1166
1182
@@ -1176,6 +1192,10 @@ define([
1176
1192
}
1177
1193
1178
1194
var disableDepthTestDistance = billboard . disableDepthTestDistance ;
1195
+ if ( billboard . heightReference === HeightReference . CLAMP_TO_GROUND && disableDepthTestDistance === 0.0 && billboardCollection . _scene . context . depthTexture ) {
1196
+ disableDepthTestDistance = 2000.0 ;
1197
+ }
1198
+
1179
1199
disableDepthTestDistance *= disableDepthTestDistance ;
1180
1200
if ( disableDepthTestDistance > 0.0 ) {
1181
1201
billboardCollection . _shaderDisableDepthDistance = true ;
@@ -1184,15 +1204,89 @@ define([
1184
1204
}
1185
1205
}
1186
1206
1207
+ var imageHeight ;
1208
+ var imageWidth ;
1209
+
1210
+ if ( ! defined ( billboard . _labelDimensions ) ) {
1211
+ var height = 0 ;
1212
+ var width = 0 ;
1213
+ var index = billboard . _imageIndex ;
1214
+ if ( index !== - 1 ) {
1215
+ var imageRectangle = textureAtlasCoordinates [ index ] ;
1216
+
1217
+ //>>includeStart('debug', pragmas.debug);
1218
+ if ( ! defined ( imageRectangle ) ) {
1219
+ throw new DeveloperError ( 'Invalid billboard image index: ' + index ) ;
1220
+ }
1221
+ //>>includeEnd('debug');
1222
+
1223
+ height = imageRectangle . height ;
1224
+ width = imageRectangle . width ;
1225
+ }
1226
+
1227
+ imageHeight = Math . round ( defaultValue ( billboard . height , billboardCollection . _textureAtlas . texture . dimensions . y * height ) ) ;
1228
+
1229
+ var textureWidth = billboardCollection . _textureAtlas . texture . width ;
1230
+ imageWidth = Math . round ( defaultValue ( billboard . width , textureWidth * width ) ) ;
1231
+ } else {
1232
+ imageWidth = billboard . _labelDimensions . x ;
1233
+ imageHeight = billboard . _labelDimensions . y ;
1234
+ }
1235
+
1236
+ var w = Math . floor ( CesiumMath . clamp ( imageWidth , 0.0 , LEFT_SHIFT12 ) ) ;
1237
+ var h = Math . floor ( CesiumMath . clamp ( imageHeight , 0.0 , LEFT_SHIFT12 ) ) ;
1238
+ var dimensions = w * LEFT_SHIFT12 + h ;
1239
+
1240
+ if ( billboardCollection . _instanced ) {
1241
+ i = billboard . _index ;
1242
+ writer ( i , near , far , disableDepthTestDistance , dimensions ) ;
1243
+ } else {
1244
+ i = billboard . _index * 4 ;
1245
+ writer ( i + 0 , near , far , disableDepthTestDistance , dimensions ) ;
1246
+ writer ( i + 1 , near , far , disableDepthTestDistance , dimensions ) ;
1247
+ writer ( i + 2 , near , far , disableDepthTestDistance , dimensions ) ;
1248
+ writer ( i + 3 , near , far , disableDepthTestDistance , dimensions ) ;
1249
+ }
1250
+ }
1251
+
1252
+ function writeTextureCoordinateBounds ( billboardCollection , context , textureAtlasCoordinates , vafWriters , billboard ) {
1253
+ if ( billboard . heightReference === HeightReference . CLAMP_TO_GROUND ) {
1254
+ billboardCollection . _shaderClampToGround = billboardCollection . _scene . context . depthTexture ;
1255
+ }
1256
+ var i ;
1257
+ var writer = vafWriters [ attributeLocations . textureCoordinateBounds ] ;
1258
+
1259
+ var minX = 0 ;
1260
+ var minY = 0 ;
1261
+ var width = 0 ;
1262
+ var height = 0 ;
1263
+ var index = billboard . _imageIndex ;
1264
+ if ( index !== - 1 ) {
1265
+ var imageRectangle = textureAtlasCoordinates [ index ] ;
1266
+
1267
+ //>>includeStart('debug', pragmas.debug);
1268
+ if ( ! defined ( imageRectangle ) ) {
1269
+ throw new DeveloperError ( 'Invalid billboard image index: ' + index ) ;
1270
+ }
1271
+ //>>includeEnd('debug');
1272
+
1273
+ minX = imageRectangle . x ;
1274
+ minY = imageRectangle . y ;
1275
+ width = imageRectangle . width ;
1276
+ height = imageRectangle . height ;
1277
+ }
1278
+ var maxX = minX + width ;
1279
+ var maxY = minY + height ;
1280
+
1187
1281
if ( billboardCollection . _instanced ) {
1188
1282
i = billboard . _index ;
1189
- writer ( i , near , far , disableDepthTestDistance ) ;
1283
+ writer ( i , minX , minY , maxX , maxY ) ;
1190
1284
} else {
1191
1285
i = billboard . _index * 4 ;
1192
- writer ( i + 0 , near , far , disableDepthTestDistance ) ;
1193
- writer ( i + 1 , near , far , disableDepthTestDistance ) ;
1194
- writer ( i + 2 , near , far , disableDepthTestDistance ) ;
1195
- writer ( i + 3 , near , far , disableDepthTestDistance ) ;
1286
+ writer ( i + 0 , minX , minY , maxX , maxY ) ;
1287
+ writer ( i + 1 , minX , minY , maxX , maxY ) ;
1288
+ writer ( i + 2 , minX , minY , maxX , maxY ) ;
1289
+ writer ( i + 3 , minX , minY , maxX , maxY ) ;
1196
1290
}
1197
1291
}
1198
1292
@@ -1225,7 +1319,8 @@ define([
1225
1319
writeEyeOffset ( billboardCollection , context , textureAtlasCoordinates , vafWriters , billboard ) ;
1226
1320
writeScaleByDistance ( billboardCollection , context , textureAtlasCoordinates , vafWriters , billboard ) ;
1227
1321
writePixelOffsetScaleByDistance ( billboardCollection , context , textureAtlasCoordinates , vafWriters , billboard ) ;
1228
- writeDistanceDisplayConditionAndDepthDisable ( billboardCollection , context , textureAtlasCoordinates , vafWriters , billboard ) ;
1322
+ writeCompressedAttribute3 ( billboardCollection , context , textureAtlasCoordinates , vafWriters , billboard ) ;
1323
+ writeTextureCoordinateBounds ( billboardCollection , context , textureAtlasCoordinates , vafWriters , billboard ) ;
1229
1324
writeBatchId ( billboardCollection , context , textureAtlasCoordinates , vafWriters , billboard ) ;
1230
1325
}
1231
1326
@@ -1421,8 +1516,12 @@ define([
1421
1516
writers . push ( writePixelOffsetScaleByDistance ) ;
1422
1517
}
1423
1518
1424
- if ( properties [ DISTANCE_DISPLAY_CONDITION_INDEX ] || properties [ DISABLE_DEPTH_DISTANCE ] ) {
1425
- writers . push ( writeDistanceDisplayConditionAndDepthDisable ) ;
1519
+ if ( properties [ DISTANCE_DISPLAY_CONDITION_INDEX ] || properties [ DISABLE_DEPTH_DISTANCE ] || properties [ IMAGE_INDEX_INDEX ] || properties [ POSITION_INDEX ] ) {
1520
+ writers . push ( writeCompressedAttribute3 ) ;
1521
+ }
1522
+
1523
+ if ( properties [ IMAGE_INDEX_INDEX ] || properties [ POSITION_INDEX ] ) {
1524
+ writers . push ( writeTextureCoordinateBounds ) ;
1426
1525
}
1427
1526
1428
1527
var numWriters = writers . length ;
@@ -1540,7 +1639,8 @@ define([
1540
1639
( this . _shaderTranslucencyByDistance !== this . _compiledShaderTranslucencyByDistance ) ||
1541
1640
( this . _shaderPixelOffsetScaleByDistance !== this . _compiledShaderPixelOffsetScaleByDistance ) ||
1542
1641
( this . _shaderDistanceDisplayCondition !== this . _compiledShaderDistanceDisplayCondition ) ||
1543
- ( this . _shaderDisableDepthDistance !== this . _compiledShaderDisableDepthDistance ) ) {
1642
+ ( this . _shaderDisableDepthDistance !== this . _compiledShaderDisableDepthDistance ) ||
1643
+ ( this . _shaderClampToGround !== this . _compiledShaderClampToGround ) ) {
1544
1644
1545
1645
vsSource = BillboardCollectionVS ;
1546
1646
fsSource = BillboardCollectionFS ;
@@ -1580,6 +1680,9 @@ define([
1580
1680
if ( this . _shaderDisableDepthDistance ) {
1581
1681
vs . defines . push ( 'DISABLE_DEPTH_DISTANCE' ) ;
1582
1682
}
1683
+ if ( this . _shaderClampToGround ) {
1684
+ vs . defines . push ( 'CLAMP_TO_GROUND' ) ;
1685
+ }
1583
1686
1584
1687
var vectorFragDefine = defined ( this . _batchTable ) ? 'VECTOR_TILE' : '' ;
1585
1688
@@ -1588,6 +1691,9 @@ define([
1588
1691
defines : [ 'OPAQUE' , vectorFragDefine ] ,
1589
1692
sources : [ fsSource ]
1590
1693
} ) ;
1694
+ if ( this . _shaderClampToGround ) {
1695
+ fs . defines . push ( 'CLAMP_TO_GROUND' ) ;
1696
+ }
1591
1697
this . _sp = ShaderProgram . replaceCache ( {
1592
1698
context : context ,
1593
1699
shaderProgram : this . _sp ,
@@ -1600,6 +1706,9 @@ define([
1600
1706
defines : [ 'TRANSLUCENT' , vectorFragDefine ] ,
1601
1707
sources : [ fsSource ]
1602
1708
} ) ;
1709
+ if ( this . _shaderClampToGround ) {
1710
+ fs . defines . push ( 'CLAMP_TO_GROUND' ) ;
1711
+ }
1603
1712
this . _spTranslucent = ShaderProgram . replaceCache ( {
1604
1713
context : context ,
1605
1714
shaderProgram : this . _spTranslucent ,
@@ -1614,6 +1723,9 @@ define([
1614
1723
defines : [ vectorFragDefine ] ,
1615
1724
sources : [ fsSource ]
1616
1725
} ) ;
1726
+ if ( this . _shaderClampToGround ) {
1727
+ fs . defines . push ( 'CLAMP_TO_GROUND' ) ;
1728
+ }
1617
1729
this . _sp = ShaderProgram . replaceCache ( {
1618
1730
context : context ,
1619
1731
shaderProgram : this . _sp ,
@@ -1628,6 +1740,9 @@ define([
1628
1740
defines : [ vectorFragDefine ] ,
1629
1741
sources : [ fsSource ]
1630
1742
} ) ;
1743
+ if ( this . _shaderClampToGround ) {
1744
+ fs . defines . push ( 'CLAMP_TO_GROUND' ) ;
1745
+ }
1631
1746
this . _spTranslucent = ShaderProgram . replaceCache ( {
1632
1747
context : context ,
1633
1748
shaderProgram : this . _spTranslucent ,
@@ -1644,6 +1759,7 @@ define([
1644
1759
this . _compiledShaderPixelOffsetScaleByDistance = this . _shaderPixelOffsetScaleByDistance ;
1645
1760
this . _compiledShaderDistanceDisplayCondition = this . _shaderDistanceDisplayCondition ;
1646
1761
this . _compiledShaderDisableDepthDistance = this . _shaderDisableDepthDistance ;
1762
+ this . _compiledShaderClampToGround = this . _shaderClampToGround ;
1647
1763
}
1648
1764
1649
1765
var commandList = frameState . commandList ;
0 commit comments