@cesium/engine 10.0.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/Build/Workers/{chunk-AA4GZKOT.js → chunk-2EDC3QGH.js} +1 -1
  2. package/Build/Workers/{chunk-DKVHRNFY.js → chunk-2MKRG7L7.js} +5 -5
  3. package/Build/Workers/{chunk-X23FRWHJ.js → chunk-2RZYNSMR.js} +6 -6
  4. package/Build/Workers/{chunk-TO2PVHKI.js → chunk-4NBRIKB3.js} +2 -2
  5. package/Build/Workers/{chunk-GRAT5GE7.js → chunk-4TK5YR6Q.js} +5 -5
  6. package/Build/Workers/{chunk-XD445VDH.js → chunk-54VC7SCM.js} +7 -7
  7. package/Build/Workers/{chunk-G3YR53LY.js → chunk-5IY5BXCT.js} +13 -13
  8. package/Build/Workers/{chunk-O3JCMSS3.js → chunk-6FFGOENI.js} +54 -7
  9. package/Build/Workers/{chunk-7XGC6YB2.js → chunk-6PJIHPQB.js} +13 -13
  10. package/Build/Workers/{chunk-GR3CDLCP.js → chunk-6ZREIBKS.js} +7 -7
  11. package/Build/Workers/{chunk-4MSUJ4I7.js → chunk-AI3O7UN2.js} +6 -6
  12. package/Build/Workers/{chunk-COYFZ5VA.js → chunk-AS7P4BHI.js} +6 -6
  13. package/Build/Workers/{chunk-JYAHOGGL.js → chunk-AUM45VEG.js} +16 -15
  14. package/Build/Workers/{chunk-BDFNKFOE.js → chunk-BBO6BGLC.js} +13 -13
  15. package/Build/Workers/{chunk-AVI4IUWC.js → chunk-BH5ZEN4I.js} +10 -10
  16. package/Build/Workers/{chunk-4BAE4PWO.js → chunk-BJ3WF5RW.js} +6 -6
  17. package/Build/Workers/{chunk-Q55ECN3Y.js → chunk-BUOFSNFW.js} +1 -1
  18. package/Build/Workers/{chunk-QX5XS4LC.js → chunk-BZXF3GNX.js} +2 -2
  19. package/Build/Workers/{chunk-PYHLO636.js → chunk-DJXXI7UF.js} +5 -5
  20. package/Build/Workers/{chunk-LCLJJ2MZ.js → chunk-DVAIU7A4.js} +17 -17
  21. package/Build/Workers/{chunk-SYCPRK3D.js → chunk-FJT3ERV7.js} +9 -9
  22. package/Build/Workers/{chunk-L6RTJ3RE.js → chunk-GOHDOWU5.js} +14 -14
  23. package/Build/Workers/{chunk-MSKXMXJI.js → chunk-HA6TZ3XT.js} +4 -4
  24. package/Build/Workers/{chunk-PCP4YQST.js → chunk-HBZSCVZC.js} +11 -11
  25. package/Build/Workers/{chunk-5S7OLEPK.js → chunk-HC7RYWPZ.js} +12 -12
  26. package/Build/Workers/{chunk-VE7BFUIX.js → chunk-HFMJM3SX.js} +1 -1
  27. package/Build/Workers/{chunk-OOK53QUQ.js → chunk-HFPMX5L2.js} +1 -1
  28. package/Build/Workers/{chunk-VFBNELXB.js → chunk-HO2NTC7I.js} +6 -6
  29. package/Build/Workers/{chunk-DOXCPOG4.js → chunk-HZPMWR4H.js} +7 -7
  30. package/Build/Workers/{chunk-I2RC4XVN.js → chunk-IBG5FVXC.js} +4 -4
  31. package/Build/Workers/{chunk-LEABCTLP.js → chunk-IXLNNST6.js} +4 -4
  32. package/Build/Workers/{chunk-4YSNMHZ4.js → chunk-JYUCC5NV.js} +6 -6
  33. package/Build/Workers/{chunk-BCL4PHHT.js → chunk-KFW4UNQH.js} +10 -10
  34. package/Build/Workers/{chunk-R6B7UCQB.js → chunk-KKAEXHDY.js} +2 -2
  35. package/Build/Workers/{chunk-BJF5LOWE.js → chunk-L6FARMF6.js} +7 -7
  36. package/Build/Workers/{chunk-C2CGMAIU.js → chunk-N3BIL6WA.js} +13 -13
  37. package/Build/Workers/{chunk-STBBMQGG.js → chunk-O5SSW3B3.js} +6 -6
  38. package/Build/Workers/{chunk-S3PI2KFM.js → chunk-OC4MYPVW.js} +2 -2
  39. package/Build/Workers/{chunk-MDHQR3ZS.js → chunk-OOA6GXKD.js} +7 -7
  40. package/Build/Workers/{chunk-AD5HBJ2F.js → chunk-OSCHEWSG.js} +7 -7
  41. package/Build/Workers/{chunk-NTXTUNEF.js → chunk-QGT2GMOK.js} +4 -4
  42. package/Build/Workers/{chunk-VO3ACQB2.js → chunk-RFQYEYAL.js} +17 -17
  43. package/Build/Workers/{chunk-KUN2ZA5X.js → chunk-RJF5ZP76.js} +4 -4
  44. package/Build/Workers/{chunk-QD4KM3GO.js → chunk-SIZXFNJY.js} +6 -5
  45. package/Build/Workers/{chunk-FXIHSF7O.js → chunk-SRZJCF7G.js} +9 -9
  46. package/Build/Workers/{chunk-T77JILCU.js → chunk-T4MB73MC.js} +2 -2
  47. package/Build/Workers/{chunk-3WUV74WM.js → chunk-TTI2SUWJ.js} +2 -2
  48. package/Build/Workers/{chunk-QMLTCCYG.js → chunk-VHJ5ESXF.js} +1 -1
  49. package/Build/Workers/{chunk-2J3JKXCP.js → chunk-VSFFJGTA.js} +9 -5
  50. package/Build/Workers/{chunk-DGS5QNIO.js → chunk-WQRXRDCZ.js} +11 -11
  51. package/Build/Workers/{chunk-OORVMGDU.js → chunk-WXDGOYTT.js} +12 -7
  52. package/Build/Workers/{chunk-RJYML24O.js → chunk-XLCZE6DD.js} +423 -448
  53. package/Build/Workers/combineGeometry.js +22 -22
  54. package/Build/Workers/createBoxGeometry.js +16 -16
  55. package/Build/Workers/createBoxOutlineGeometry.js +14 -14
  56. package/Build/Workers/createCircleGeometry.js +24 -24
  57. package/Build/Workers/createCircleOutlineGeometry.js +17 -17
  58. package/Build/Workers/createCoplanarPolygonGeometry.js +31 -31
  59. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +29 -29
  60. package/Build/Workers/createCorridorGeometry.js +27 -27
  61. package/Build/Workers/createCorridorOutlineGeometry.js +26 -26
  62. package/Build/Workers/createCylinderGeometry.js +18 -18
  63. package/Build/Workers/createCylinderOutlineGeometry.js +16 -16
  64. package/Build/Workers/createEllipseGeometry.js +24 -24
  65. package/Build/Workers/createEllipseOutlineGeometry.js +17 -17
  66. package/Build/Workers/createEllipsoidGeometry.js +17 -17
  67. package/Build/Workers/createEllipsoidOutlineGeometry.js +16 -16
  68. package/Build/Workers/createFrustumGeometry.js +16 -16
  69. package/Build/Workers/createFrustumOutlineGeometry.js +16 -16
  70. package/Build/Workers/createGeometry.js +22 -22
  71. package/Build/Workers/createGroundPolylineGeometry.js +20 -20
  72. package/Build/Workers/createPlaneGeometry.js +14 -14
  73. package/Build/Workers/createPlaneOutlineGeometry.js +13 -13
  74. package/Build/Workers/createPolygonGeometry.js +30 -30
  75. package/Build/Workers/createPolygonOutlineGeometry.js +28 -28
  76. package/Build/Workers/createPolylineGeometry.js +23 -23
  77. package/Build/Workers/createPolylineVolumeGeometry.js +29 -29
  78. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +25 -25
  79. package/Build/Workers/createRectangleGeometry.js +25 -25
  80. package/Build/Workers/createRectangleOutlineGeometry.js +18 -18
  81. package/Build/Workers/createSimplePolylineGeometry.js +21 -21
  82. package/Build/Workers/createSphereGeometry.js +17 -17
  83. package/Build/Workers/createSphereOutlineGeometry.js +16 -16
  84. package/Build/Workers/createTaskProcessorWorker.js +3 -3
  85. package/Build/Workers/createVectorTileClampedPolylines.js +13 -13
  86. package/Build/Workers/createVectorTileGeometries.js +22 -22
  87. package/Build/Workers/createVectorTilePoints.js +12 -12
  88. package/Build/Workers/createVectorTilePolygons.js +20 -20
  89. package/Build/Workers/createVectorTilePolylines.js +13 -13
  90. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +20 -20
  91. package/Build/Workers/createVerticesFromHeightmap.js +24 -20
  92. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +17 -17
  93. package/Build/Workers/createWallGeometry.js +22 -22
  94. package/Build/Workers/createWallOutlineGeometry.js +21 -21
  95. package/Build/Workers/decodeDraco.js +11 -11
  96. package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +28 -5
  97. package/Build/Workers/decodeI3S.js +10 -10
  98. package/Build/Workers/transcodeKTX2.js +20 -22
  99. package/Build/Workers/transferTypedArrayTest.js +1 -1
  100. package/Build/Workers/upsampleQuantizedTerrainMesh.js +20 -20
  101. package/Source/Core/CompressedTextureBuffer.js +11 -0
  102. package/Source/Core/Ion.js +1 -1
  103. package/Source/Core/KTX2Transcoder.js +9 -16
  104. package/Source/Core/PixelFormat.js +1 -15
  105. package/Source/Core/Simon1994PlanetaryPositions.js +2 -1
  106. package/Source/Core/Transforms.js +137 -2
  107. package/Source/DataSources/BillboardGraphics.js +16 -0
  108. package/Source/DataSources/BillboardVisualizer.js +7 -0
  109. package/Source/DataSources/CallbackProperty.js +8 -2
  110. package/Source/DataSources/CheckerboardMaterialProperty.js +7 -1
  111. package/Source/DataSources/ColorMaterialProperty.js +7 -1
  112. package/Source/DataSources/CompositeMaterialProperty.js +5 -4
  113. package/Source/DataSources/CompositePositionProperty.js +7 -1
  114. package/Source/DataSources/CompositeProperty.js +5 -5
  115. package/Source/DataSources/ConstantPositionProperty.js +7 -1
  116. package/Source/DataSources/Entity.js +1 -1
  117. package/Source/DataSources/GridMaterialProperty.js +7 -1
  118. package/Source/DataSources/ImageMaterialProperty.js +8 -1
  119. package/Source/DataSources/MaterialProperty.js +7 -1
  120. package/Source/DataSources/NodeTransformationProperty.js +7 -1
  121. package/Source/DataSources/PathVisualizer.js +4 -4
  122. package/Source/DataSources/PointGraphics.js +17 -0
  123. package/Source/DataSources/PointVisualizer.js +12 -0
  124. package/Source/DataSources/PolylineArrowMaterialProperty.js +7 -1
  125. package/Source/DataSources/PolylineDashMaterialProperty.js +7 -1
  126. package/Source/DataSources/PolylineGlowMaterialProperty.js +7 -1
  127. package/Source/DataSources/PolylineOutlineMaterialProperty.js +7 -1
  128. package/Source/DataSources/PositionProperty.js +5 -8
  129. package/Source/DataSources/PositionPropertyArray.js +7 -1
  130. package/Source/DataSources/Property.js +1 -1
  131. package/Source/DataSources/PropertyArray.js +5 -5
  132. package/Source/DataSources/PropertyBag.js +5 -4
  133. package/Source/DataSources/ReferenceProperty.js +7 -1
  134. package/Source/DataSources/SampledPositionProperty.js +7 -1
  135. package/Source/DataSources/SampledProperty.js +6 -4
  136. package/Source/DataSources/ScaledPositionProperty.js +6 -0
  137. package/Source/DataSources/StripeMaterialProperty.js +7 -1
  138. package/Source/DataSources/TerrainOffsetProperty.js +9 -0
  139. package/Source/DataSources/TimeIntervalCollectionPositionProperty.js +7 -1
  140. package/Source/DataSources/TimeIntervalCollectionProperty.js +5 -5
  141. package/Source/DataSources/VelocityOrientationProperty.js +6 -1
  142. package/Source/DataSources/VelocityVectorProperty.js +3 -5
  143. package/Source/Renderer/AutomaticUniforms.js +3 -18
  144. package/Source/Renderer/Context.js +15 -0
  145. package/Source/Renderer/CubeMap.js +326 -348
  146. package/Source/Renderer/CubeMapFace.js +26 -48
  147. package/Source/Renderer/PixelDatatype.js +23 -0
  148. package/Source/Renderer/Sampler.js +7 -13
  149. package/Source/Renderer/ShaderProgram.js +7 -0
  150. package/Source/Renderer/Texture.js +396 -332
  151. package/Source/Renderer/UniformState.js +8 -33
  152. package/Source/Renderer/demodernizeShader.js +2 -0
  153. package/Source/Renderer/loadCubeMap.js +3 -8
  154. package/Source/Scene/ArcGisMapService.js +1 -1
  155. package/Source/Scene/Billboard.js +29 -2
  156. package/Source/Scene/BillboardCollection.js +49 -0
  157. package/Source/Scene/BingMapsImageryProvider.js +10 -1
  158. package/Source/Scene/CameraEventAggregator.js +49 -5
  159. package/Source/Scene/Globe.js +1 -1
  160. package/Source/Scene/GlobeSurfaceShaderSet.js +29 -24
  161. package/Source/Scene/GlobeSurfaceTileProvider.js +5 -3
  162. package/Source/Scene/ImageBasedLighting.js +36 -36
  163. package/Source/Scene/Label.js +2 -2
  164. package/Source/Scene/Material.js +24 -2
  165. package/Source/Scene/Model/ImageBasedLightingPipelineStage.js +7 -15
  166. package/Source/Scene/Model/Model.js +1 -1
  167. package/Source/Scene/PointPrimitive.js +28 -2
  168. package/Source/Scene/PointPrimitiveCollection.js +22 -9
  169. package/Source/Scene/PostProcessStageCollection.js +45 -15
  170. package/Source/Scene/PostProcessStageLibrary.js +26 -0
  171. package/Source/Scene/Scene.js +20 -22
  172. package/Source/Scene/SceneTransforms.js +0 -62
  173. package/Source/Scene/ScreenSpaceCameraController.js +11 -4
  174. package/Source/Scene/SkyBox.js +13 -19
  175. package/Source/Scene/SpecularEnvironmentCubeMap.js +240 -0
  176. package/Source/Scene/Tonemapper.js +35 -23
  177. package/Source/Scene/VoxelPrimitive.js +0 -29
  178. package/Source/Scene/VoxelRenderResources.js +0 -3
  179. package/Source/Shaders/BillboardCollectionFS.glsl +4 -0
  180. package/Source/Shaders/BillboardCollectionFS.js +4 -0
  181. package/Source/Shaders/BillboardCollectionVS.glsl +3 -1
  182. package/Source/Shaders/BillboardCollectionVS.js +3 -1
  183. package/Source/Shaders/BrdfLutGeneratorFS.glsl +30 -13
  184. package/Source/Shaders/BrdfLutGeneratorFS.js +30 -13
  185. package/Source/Shaders/Builtin/CzmBuiltins.js +2 -2
  186. package/Source/Shaders/Builtin/Functions/pbrLighting.glsl +42 -41
  187. package/Source/Shaders/Builtin/Functions/pbrLighting.js +42 -41
  188. package/Source/Shaders/Builtin/Functions/pbrNeutralTonemapping.glsl +23 -0
  189. package/Source/Shaders/Builtin/Functions/pbrNeutralTonemapping.js +25 -0
  190. package/Source/Shaders/Builtin/Functions/textureCube.glsl +21 -2
  191. package/Source/Shaders/Builtin/Functions/textureCube.js +21 -2
  192. package/Source/Shaders/Builtin/Structs/materialInput.glsl +2 -0
  193. package/Source/Shaders/Builtin/Structs/materialInput.js +2 -0
  194. package/Source/Shaders/GlobeFS.glsl +10 -4
  195. package/Source/Shaders/GlobeFS.js +10 -4
  196. package/Source/Shaders/Materials/WaterMaskMaterial.glsl +15 -0
  197. package/Source/Shaders/Materials/WaterMaskMaterial.js +17 -0
  198. package/Source/Shaders/Model/AtmosphereStageFS.glsl +1 -1
  199. package/Source/Shaders/Model/AtmosphereStageFS.js +1 -1
  200. package/Source/Shaders/Model/ImageBasedLightingStageFS.glsl +57 -46
  201. package/Source/Shaders/Model/ImageBasedLightingStageFS.js +57 -46
  202. package/Source/Shaders/Model/LightingStageFS.glsl +8 -7
  203. package/Source/Shaders/Model/LightingStageFS.js +8 -7
  204. package/Source/Shaders/Model/MaterialStageFS.glsl +10 -14
  205. package/Source/Shaders/Model/MaterialStageFS.js +10 -14
  206. package/Source/Shaders/PointPrimitiveCollectionFS.glsl +4 -0
  207. package/Source/Shaders/PointPrimitiveCollectionFS.js +4 -0
  208. package/Source/Shaders/PointPrimitiveCollectionVS.glsl +9 -7
  209. package/Source/Shaders/PointPrimitiveCollectionVS.js +9 -7
  210. package/Source/Shaders/PostProcessStages/AcesTonemappingStage.glsl +4 -0
  211. package/Source/Shaders/PostProcessStages/AcesTonemappingStage.js +4 -0
  212. package/Source/Shaders/PostProcessStages/FilmicTonemapping.glsl +4 -0
  213. package/Source/Shaders/PostProcessStages/FilmicTonemapping.js +4 -0
  214. package/Source/Shaders/PostProcessStages/ModifiedReinhardTonemapping.glsl +4 -0
  215. package/Source/Shaders/PostProcessStages/ModifiedReinhardTonemapping.js +4 -0
  216. package/Source/Shaders/PostProcessStages/PbrNeutralTonemapping.glsl +25 -0
  217. package/Source/Shaders/PostProcessStages/PbrNeutralTonemapping.js +27 -0
  218. package/Source/Shaders/PostProcessStages/ReinhardTonemapping.glsl +4 -0
  219. package/Source/Shaders/PostProcessStages/ReinhardTonemapping.js +4 -0
  220. package/Source/Shaders/SkyAtmosphereFS.glsl +1 -1
  221. package/Source/Shaders/SkyAtmosphereFS.js +1 -1
  222. package/Source/Widget/CesiumWidget.js +1 -1
  223. package/index.d.ts +191 -106
  224. package/index.js +133 -134
  225. package/package.json +4 -4
  226. package/Source/Scene/OctahedralProjectedCubeMap.js +0 -445
  227. package/Source/Shaders/Builtin/Functions/sampleOctahedralProjection.glsl +0 -78
  228. package/Source/Shaders/Builtin/Functions/sampleOctahedralProjection.js +0 -80
  229. package/Source/Shaders/OctahedralProjectionAtlasFS.glsl +0 -89
  230. package/Source/Shaders/OctahedralProjectionAtlasFS.js +0 -91
  231. package/Source/Shaders/OctahedralProjectionFS.glsl +0 -14
  232. package/Source/Shaders/OctahedralProjectionFS.js +0 -16
  233. package/Source/Shaders/OctahedralProjectionVS.glsl +0 -10
  234. package/Source/Shaders/OctahedralProjectionVS.js +0 -12
@@ -14,6 +14,51 @@ import TextureMagnificationFilter from "./TextureMagnificationFilter.js";
14
14
  import TextureMinificationFilter from "./TextureMinificationFilter.js";
15
15
 
16
16
  /**
17
+ * @typedef CubeMap.BufferSource
18
+ *
19
+ * @property {TypedArray} arrayBufferView A view of a binary data buffer containing pixel values.
20
+ * @property {number} width The width of one face of the cube map, in pixels. Must be equal to height.
21
+ * @property {number} height The height of one face of the cube map, in pixels. Must be equal to width.
22
+ *
23
+ * @private
24
+ */
25
+
26
+ /**
27
+ * @typedef CubeMap.Source
28
+ *
29
+ * @property {ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|CubeMap.BufferSource} positiveX
30
+ * @property {ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|CubeMap.BufferSource} negativeX
31
+ * @property {ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|CubeMap.BufferSource} positiveY
32
+ * @property {ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|CubeMap.BufferSource} negativeY
33
+ * @property {ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|CubeMap.BufferSource} positiveZ
34
+ * @property {ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|CubeMap.BufferSource} negativeZ
35
+ */
36
+
37
+ /**
38
+ * @typedef CubeMap.ConstructorOptions
39
+ *
40
+ * @property {Context} context
41
+ * @property {CubeMap.Source} [source] The source for texel values to be loaded into the texture.
42
+ * @property {PixelFormat} [pixelFormat=PixelFormat.RGBA] The format of each pixel, i.e., the number of components it has and what they represent.
43
+ * @property {PixelDatatype} [pixelDatatype=PixelDatatype.UNSIGNED_BYTE] The data type of each pixel.
44
+ * @property {boolean} [flipY=true] If true, the source values will be read as if the y-axis is inverted (y=0 at the top).
45
+ * @property {boolean} [skipColorSpaceConversion=false] If true, color space conversions will be skipped when reading the texel values.
46
+ * @property {Sampler} [sampler] Information about how to sample the cubemap texture.
47
+ * @property {number} [width] The pixel width of the texture. If not supplied, must be available from the source. Must be equal to height.
48
+ * @property {number} [height] The pixel height of the texture. If not supplied, must be available from the source. Must be equal to width.
49
+ * @property {boolean} [preMultiplyAlpha] If true, the alpha channel will be multiplied into the other channels.
50
+ *
51
+ * @private
52
+ */
53
+
54
+ /**
55
+ * A wrapper for a {@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLTexture|WebGLTexture}
56
+ * used as a cube map, to abstract away the verbose GL calls associated with setting up a texture.
57
+ *
58
+ * @alias CubeMap
59
+ * @constructor
60
+ *
61
+ * @param {CubeMap.ConstructorOptions} options An object describing initialization options.
17
62
  * @private
18
63
  */
19
64
  function CubeMap(options) {
@@ -23,67 +68,55 @@ function CubeMap(options) {
23
68
  Check.defined("options.context", options.context);
24
69
  //>>includeEnd('debug');
25
70
 
26
- const context = options.context;
27
- const source = options.source;
28
- let width;
29
- let height;
71
+ const {
72
+ context,
73
+ source,
74
+ pixelFormat = PixelFormat.RGBA,
75
+ pixelDatatype = PixelDatatype.UNSIGNED_BYTE,
76
+ flipY = true,
77
+ skipColorSpaceConversion = false,
78
+ sampler = new Sampler(),
79
+ } = options;
30
80
 
31
- if (defined(source)) {
32
- const faces = [
33
- source.positiveX,
34
- source.negativeX,
35
- source.positiveY,
36
- source.negativeY,
37
- source.positiveZ,
38
- source.negativeZ,
39
- ];
81
+ // Use premultiplied alpha for opaque textures should perform better on Chrome:
82
+ // http://media.tojicode.com/webglCamp4/#20
83
+ const preMultiplyAlpha =
84
+ options.preMultiplyAlpha ||
85
+ pixelFormat === PixelFormat.RGB ||
86
+ pixelFormat === PixelFormat.LUMINANCE;
40
87
 
88
+ let { width, height } = options;
89
+
90
+ if (defined(source)) {
41
91
  //>>includeStart('debug', pragmas.debug);
42
92
  if (
43
- !faces[0] ||
44
- !faces[1] ||
45
- !faces[2] ||
46
- !faces[3] ||
47
- !faces[4] ||
48
- !faces[5]
93
+ !Object.values(CubeMap.FaceName).every((faceName) =>
94
+ defined(source[faceName])
95
+ )
49
96
  ) {
50
97
  throw new DeveloperError(
51
- "options.source requires positiveX, negativeX, positiveY, negativeY, positiveZ, and negativeZ faces."
98
+ `options.source requires faces ${Object.values(CubeMap.FaceName).join(
99
+ ", "
100
+ )}.`
52
101
  );
53
102
  }
54
103
  //>>includeEnd('debug');
55
104
 
56
- width = faces[0].width;
57
- height = faces[0].height;
105
+ ({ width, height } = source.positiveX);
58
106
 
59
107
  //>>includeStart('debug', pragmas.debug);
60
- for (let i = 1; i < 6; ++i) {
61
- if (
62
- Number(faces[i].width) !== width ||
63
- Number(faces[i].height) !== height
64
- ) {
108
+ for (const faceName of CubeMap.getFaceNames()) {
109
+ const face = source[faceName];
110
+ if (Number(face.width) !== width || Number(face.height) !== height) {
65
111
  throw new DeveloperError(
66
112
  "Each face in options.source must have the same width and height."
67
113
  );
68
114
  }
69
115
  }
70
116
  //>>includeEnd('debug');
71
- } else {
72
- width = options.width;
73
- height = options.height;
74
117
  }
75
118
 
76
119
  const size = width;
77
- const pixelDatatype = defaultValue(
78
- options.pixelDatatype,
79
- PixelDatatype.UNSIGNED_BYTE
80
- );
81
- const pixelFormat = defaultValue(options.pixelFormat, PixelFormat.RGBA);
82
- const internalFormat = PixelFormat.toInternalFormat(
83
- pixelFormat,
84
- pixelDatatype,
85
- context
86
- );
87
120
 
88
121
  //>>includeStart('debug', pragmas.debug);
89
122
  if (!defined(width) || !defined(height)) {
@@ -102,7 +135,7 @@ function CubeMap(options) {
102
135
 
103
136
  if (size > ContextLimits.maximumCubeMapSize) {
104
137
  throw new DeveloperError(
105
- `Width and height must be less than or equal to the maximum cube map size (${ContextLimits.maximumCubeMapSize}). Check maximumCubeMapSize.`
138
+ `Width and height must be less than or equal to the maximum cube map size (${ContextLimits.maximumCubeMapSize}). Check maximumCubeMapSize.`
106
139
  );
107
140
  }
108
141
 
@@ -138,168 +171,135 @@ function CubeMap(options) {
138
171
 
139
172
  const sizeInBytes =
140
173
  PixelFormat.textureSizeInBytes(pixelFormat, pixelDatatype, size, size) * 6;
141
-
142
- // Use premultiplied alpha for opaque textures should perform better on Chrome:
143
- // http://media.tojicode.com/webglCamp4/#20
144
- const preMultiplyAlpha =
145
- options.preMultiplyAlpha ||
146
- pixelFormat === PixelFormat.RGB ||
147
- pixelFormat === PixelFormat.LUMINANCE;
148
- const flipY = defaultValue(options.flipY, true);
149
- const skipColorSpaceConversion = defaultValue(
150
- options.skipColorSpaceConversion,
151
- false
174
+ const internalFormat = PixelFormat.toInternalFormat(
175
+ pixelFormat,
176
+ pixelDatatype,
177
+ context
152
178
  );
153
179
 
154
180
  const gl = context._gl;
155
181
  const textureTarget = gl.TEXTURE_CUBE_MAP;
156
182
  const texture = gl.createTexture();
157
183
 
184
+ this._context = context;
185
+ this._textureFilterAnisotropic = context._textureFilterAnisotropic;
186
+ this._textureTarget = textureTarget;
187
+ this._texture = texture;
188
+ this._pixelFormat = pixelFormat;
189
+ this._pixelDatatype = pixelDatatype;
190
+ this._size = size;
191
+ this._hasMipmap = false;
192
+ this._sizeInBytes = sizeInBytes;
193
+ this._preMultiplyAlpha = preMultiplyAlpha;
194
+ this._flipY = flipY;
195
+
196
+ const initialized = defined(source);
197
+ function constructFace(targetFace) {
198
+ return new CubeMapFace(
199
+ context,
200
+ texture,
201
+ textureTarget,
202
+ targetFace,
203
+ internalFormat,
204
+ pixelFormat,
205
+ pixelDatatype,
206
+ size,
207
+ preMultiplyAlpha,
208
+ flipY,
209
+ initialized
210
+ );
211
+ }
212
+ this._positiveX = constructFace(gl.TEXTURE_CUBE_MAP_POSITIVE_X);
213
+ this._negativeX = constructFace(gl.TEXTURE_CUBE_MAP_NEGATIVE_X);
214
+ this._positiveY = constructFace(gl.TEXTURE_CUBE_MAP_POSITIVE_Y);
215
+ this._negativeY = constructFace(gl.TEXTURE_CUBE_MAP_NEGATIVE_Y);
216
+ this._positiveZ = constructFace(gl.TEXTURE_CUBE_MAP_POSITIVE_Z);
217
+ this._negativeZ = constructFace(gl.TEXTURE_CUBE_MAP_NEGATIVE_Z);
218
+
219
+ this._sampler = sampler;
220
+ setupSampler(this, sampler);
221
+
158
222
  gl.activeTexture(gl.TEXTURE0);
159
223
  gl.bindTexture(textureTarget, texture);
160
224
 
161
- function createFace(
162
- target,
163
- sourceFace,
164
- preMultiplyAlpha,
165
- flipY,
166
- skipColorSpaceConversion
167
- ) {
168
- let arrayBufferView = sourceFace.arrayBufferView;
169
- if (!defined(arrayBufferView)) {
170
- arrayBufferView = sourceFace.bufferView;
171
- }
225
+ if (skipColorSpaceConversion) {
226
+ gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);
227
+ } else {
228
+ gl.pixelStorei(
229
+ gl.UNPACK_COLORSPACE_CONVERSION_WEBGL,
230
+ gl.BROWSER_DEFAULT_WEBGL
231
+ );
232
+ }
172
233
 
173
- let unpackAlignment = 4;
174
- if (defined(arrayBufferView)) {
175
- unpackAlignment = PixelFormat.alignmentInBytes(
176
- pixelFormat,
177
- pixelDatatype,
178
- width
179
- );
180
- }
234
+ for (const faceName of CubeMap.getFaceNames()) {
235
+ loadFace(this[faceName], source?.[faceName], 0);
236
+ }
181
237
 
182
- gl.pixelStorei(gl.UNPACK_ALIGNMENT, unpackAlignment);
238
+ gl.bindTexture(textureTarget, null);
239
+ }
183
240
 
184
- if (skipColorSpaceConversion) {
185
- gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);
186
- } else {
187
- gl.pixelStorei(
188
- gl.UNPACK_COLORSPACE_CONVERSION_WEBGL,
189
- gl.BROWSER_DEFAULT_WEBGL
190
- );
191
- }
241
+ /**
242
+ * An enum defining the names of the faces of a cube map.
243
+ *
244
+ * @alias {CubeMap.FaceName}
245
+ * @enum {string}
246
+ *
247
+ * @private
248
+ */
249
+ CubeMap.FaceName = Object.freeze({
250
+ POSITIVEX: "positiveX",
251
+ NEGATIVEX: "negativeX",
252
+ POSITIVEY: "positiveY",
253
+ NEGATIVEY: "negativeY",
254
+ POSITIVEZ: "positiveZ",
255
+ NEGATIVEZ: "negativeZ",
256
+ });
192
257
 
193
- if (defined(arrayBufferView)) {
194
- gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
195
- gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
196
-
197
- if (flipY) {
198
- arrayBufferView = PixelFormat.flipY(
199
- arrayBufferView,
200
- pixelFormat,
201
- pixelDatatype,
202
- size,
203
- size
204
- );
205
- }
206
- gl.texImage2D(
207
- target,
208
- 0,
209
- internalFormat,
210
- size,
211
- size,
212
- 0,
213
- pixelFormat,
214
- PixelDatatype.toWebGLConstant(pixelDatatype, context),
215
- arrayBufferView
216
- );
217
- } else {
218
- // Only valid for DOM-Element uploads
219
- gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, preMultiplyAlpha);
220
- gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipY);
221
-
222
- // Source: ImageData, HTMLImageElement, HTMLCanvasElement, or HTMLVideoElement
223
- gl.texImage2D(
224
- target,
225
- 0,
226
- internalFormat,
227
- pixelFormat,
228
- PixelDatatype.toWebGLConstant(pixelDatatype, context),
229
- sourceFace
230
- );
231
- }
232
- }
258
+ function* makeFacesIterator() {
259
+ yield CubeMap.FaceName.POSITIVEX;
260
+ yield CubeMap.FaceName.NEGATIVEX;
261
+ yield CubeMap.FaceName.POSITIVEY;
262
+ yield CubeMap.FaceName.NEGATIVEY;
263
+ yield CubeMap.FaceName.POSITIVEZ;
264
+ yield CubeMap.FaceName.NEGATIVEZ;
265
+ }
233
266
 
234
- if (defined(source)) {
235
- createFace(
236
- gl.TEXTURE_CUBE_MAP_POSITIVE_X,
237
- source.positiveX,
238
- preMultiplyAlpha,
239
- flipY,
240
- skipColorSpaceConversion
241
- );
242
- createFace(
243
- gl.TEXTURE_CUBE_MAP_NEGATIVE_X,
244
- source.negativeX,
245
- preMultiplyAlpha,
246
- flipY,
247
- skipColorSpaceConversion
248
- );
249
- createFace(
250
- gl.TEXTURE_CUBE_MAP_POSITIVE_Y,
251
- source.positiveY,
252
- preMultiplyAlpha,
253
- flipY,
254
- skipColorSpaceConversion
255
- );
256
- createFace(
257
- gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,
258
- source.negativeY,
259
- preMultiplyAlpha,
260
- flipY,
261
- skipColorSpaceConversion
262
- );
263
- createFace(
264
- gl.TEXTURE_CUBE_MAP_POSITIVE_Z,
265
- source.positiveZ,
266
- preMultiplyAlpha,
267
- flipY,
268
- skipColorSpaceConversion
269
- );
270
- createFace(
271
- gl.TEXTURE_CUBE_MAP_NEGATIVE_Z,
272
- source.negativeZ,
273
- preMultiplyAlpha,
274
- flipY,
275
- skipColorSpaceConversion
276
- );
277
- } else {
278
- gl.texImage2D(
279
- gl.TEXTURE_CUBE_MAP_POSITIVE_X,
280
- 0,
281
- internalFormat,
282
- size,
283
- size,
284
- 0,
285
- pixelFormat,
286
- PixelDatatype.toWebGLConstant(pixelDatatype, context),
287
- null
288
- );
289
- gl.texImage2D(
290
- gl.TEXTURE_CUBE_MAP_NEGATIVE_X,
291
- 0,
292
- internalFormat,
293
- size,
294
- size,
295
- 0,
296
- pixelFormat,
297
- PixelDatatype.toWebGLConstant(pixelDatatype, context),
298
- null
299
- );
267
+ /**
268
+ * Creates an iterator for looping over the cubemap faces.
269
+ *
270
+ * @type {Iterable<CubeMap.FaceName>}
271
+ *
272
+ * @private
273
+ */
274
+ CubeMap.getFaceNames = function () {
275
+ return makeFacesIterator();
276
+ };
277
+
278
+ /**
279
+ * Load texel data into one face of a cube map.
280
+ *
281
+ * @param {CubeMapFace} cubeMapFace The face to which texel values will be loaded.
282
+ * @param {ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|CubeMap.BufferSource} [source] The source for texel values to be loaded into the texture.
283
+ * @param {number} [mipLevel=0] The mip level to which the texel values will be loaded.
284
+ *
285
+ * @private
286
+ */
287
+ function loadFace(cubeMapFace, source, mipLevel) {
288
+ mipLevel = defaultValue(mipLevel, 0);
289
+ const targetFace = cubeMapFace._targetFace;
290
+ const size = Math.max(Math.floor(cubeMapFace._size / 2 ** mipLevel), 1);
291
+ const pixelFormat = cubeMapFace._pixelFormat;
292
+ const pixelDatatype = cubeMapFace._pixelDatatype;
293
+ const internalFormat = cubeMapFace._internalFormat;
294
+ const flipY = cubeMapFace._flipY;
295
+ const preMultiplyAlpha = cubeMapFace._preMultiplyAlpha;
296
+ const context = cubeMapFace._context;
297
+ const gl = context._gl;
298
+
299
+ if (!defined(source)) {
300
300
  gl.texImage2D(
301
- gl.TEXTURE_CUBE_MAP_POSITIVE_Y,
302
- 0,
301
+ targetFace,
302
+ mipLevel,
303
303
  internalFormat,
304
304
  size,
305
305
  size,
@@ -308,136 +308,57 @@ function CubeMap(options) {
308
308
  PixelDatatype.toWebGLConstant(pixelDatatype, context),
309
309
  null
310
310
  );
311
- gl.texImage2D(
312
- gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,
313
- 0,
314
- internalFormat,
315
- size,
316
- size,
317
- 0,
311
+ return;
312
+ }
313
+
314
+ let { arrayBufferView } = source;
315
+
316
+ let unpackAlignment = 4;
317
+ if (defined(arrayBufferView)) {
318
+ unpackAlignment = PixelFormat.alignmentInBytes(
318
319
  pixelFormat,
319
- PixelDatatype.toWebGLConstant(pixelDatatype, context),
320
- null
320
+ pixelDatatype,
321
+ size
321
322
  );
323
+ }
324
+ gl.pixelStorei(gl.UNPACK_ALIGNMENT, unpackAlignment);
325
+
326
+ if (defined(arrayBufferView)) {
327
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
328
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
329
+ if (flipY) {
330
+ arrayBufferView = PixelFormat.flipY(
331
+ arrayBufferView,
332
+ pixelFormat,
333
+ pixelDatatype,
334
+ size,
335
+ size
336
+ );
337
+ }
322
338
  gl.texImage2D(
323
- gl.TEXTURE_CUBE_MAP_POSITIVE_Z,
324
- 0,
339
+ targetFace,
340
+ mipLevel,
325
341
  internalFormat,
326
342
  size,
327
343
  size,
328
344
  0,
329
345
  pixelFormat,
330
346
  PixelDatatype.toWebGLConstant(pixelDatatype, context),
331
- null
347
+ arrayBufferView
332
348
  );
349
+ } else {
350
+ // Only valid for DOM-Element uploads
351
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, preMultiplyAlpha);
352
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipY);
333
353
  gl.texImage2D(
334
- gl.TEXTURE_CUBE_MAP_NEGATIVE_Z,
335
- 0,
354
+ targetFace,
355
+ mipLevel,
336
356
  internalFormat,
337
- size,
338
- size,
339
- 0,
340
357
  pixelFormat,
341
358
  PixelDatatype.toWebGLConstant(pixelDatatype, context),
342
- null
359
+ source
343
360
  );
344
361
  }
345
- gl.bindTexture(textureTarget, null);
346
-
347
- this._context = context;
348
- this._textureFilterAnisotropic = context._textureFilterAnisotropic;
349
- this._textureTarget = textureTarget;
350
- this._texture = texture;
351
- this._pixelFormat = pixelFormat;
352
- this._pixelDatatype = pixelDatatype;
353
- this._size = size;
354
- this._hasMipmap = false;
355
- this._sizeInBytes = sizeInBytes;
356
- this._preMultiplyAlpha = preMultiplyAlpha;
357
- this._flipY = flipY;
358
- this._sampler = undefined;
359
-
360
- const initialized = defined(source);
361
- this._positiveX = new CubeMapFace(
362
- context,
363
- texture,
364
- textureTarget,
365
- gl.TEXTURE_CUBE_MAP_POSITIVE_X,
366
- internalFormat,
367
- pixelFormat,
368
- pixelDatatype,
369
- size,
370
- preMultiplyAlpha,
371
- flipY,
372
- initialized
373
- );
374
- this._negativeX = new CubeMapFace(
375
- context,
376
- texture,
377
- textureTarget,
378
- gl.TEXTURE_CUBE_MAP_NEGATIVE_X,
379
- internalFormat,
380
- pixelFormat,
381
- pixelDatatype,
382
- size,
383
- preMultiplyAlpha,
384
- flipY,
385
- initialized
386
- );
387
- this._positiveY = new CubeMapFace(
388
- context,
389
- texture,
390
- textureTarget,
391
- gl.TEXTURE_CUBE_MAP_POSITIVE_Y,
392
- internalFormat,
393
- pixelFormat,
394
- pixelDatatype,
395
- size,
396
- preMultiplyAlpha,
397
- flipY,
398
- initialized
399
- );
400
- this._negativeY = new CubeMapFace(
401
- context,
402
- texture,
403
- textureTarget,
404
- gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,
405
- internalFormat,
406
- pixelFormat,
407
- pixelDatatype,
408
- size,
409
- preMultiplyAlpha,
410
- flipY,
411
- initialized
412
- );
413
- this._positiveZ = new CubeMapFace(
414
- context,
415
- texture,
416
- textureTarget,
417
- gl.TEXTURE_CUBE_MAP_POSITIVE_Z,
418
- internalFormat,
419
- pixelFormat,
420
- pixelDatatype,
421
- size,
422
- preMultiplyAlpha,
423
- flipY,
424
- initialized
425
- );
426
- this._negativeZ = new CubeMapFace(
427
- context,
428
- texture,
429
- textureTarget,
430
- gl.TEXTURE_CUBE_MAP_NEGATIVE_Z,
431
- internalFormat,
432
- pixelFormat,
433
- pixelDatatype,
434
- size,
435
- preMultiplyAlpha,
436
- flipY,
437
- initialized
438
- );
439
-
440
- this.sampler = defined(options.sampler) ? options.sampler : new Sampler();
441
362
  }
442
363
 
443
364
  Object.defineProperties(CubeMap.prototype, {
@@ -476,52 +397,7 @@ Object.defineProperties(CubeMap.prototype, {
476
397
  return this._sampler;
477
398
  },
478
399
  set: function (sampler) {
479
- let minificationFilter = sampler.minificationFilter;
480
- let magnificationFilter = sampler.magnificationFilter;
481
-
482
- const mipmap =
483
- minificationFilter ===
484
- TextureMinificationFilter.NEAREST_MIPMAP_NEAREST ||
485
- minificationFilter ===
486
- TextureMinificationFilter.NEAREST_MIPMAP_LINEAR ||
487
- minificationFilter ===
488
- TextureMinificationFilter.LINEAR_MIPMAP_NEAREST ||
489
- minificationFilter === TextureMinificationFilter.LINEAR_MIPMAP_LINEAR;
490
-
491
- const context = this._context;
492
- const pixelDatatype = this._pixelDatatype;
493
-
494
- // float textures only support nearest filtering unless the linear extensions are supported, so override the sampler's settings
495
- if (
496
- (pixelDatatype === PixelDatatype.FLOAT &&
497
- !context.textureFloatLinear) ||
498
- (pixelDatatype === PixelDatatype.HALF_FLOAT &&
499
- !context.textureHalfFloatLinear)
500
- ) {
501
- minificationFilter = mipmap
502
- ? TextureMinificationFilter.NEAREST_MIPMAP_NEAREST
503
- : TextureMinificationFilter.NEAREST;
504
- magnificationFilter = TextureMagnificationFilter.NEAREST;
505
- }
506
-
507
- const gl = context._gl;
508
- const target = this._textureTarget;
509
-
510
- gl.activeTexture(gl.TEXTURE0);
511
- gl.bindTexture(target, this._texture);
512
- gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, minificationFilter);
513
- gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, magnificationFilter);
514
- gl.texParameteri(target, gl.TEXTURE_WRAP_S, sampler.wrapS);
515
- gl.texParameteri(target, gl.TEXTURE_WRAP_T, sampler.wrapT);
516
- if (defined(this._textureFilterAnisotropic)) {
517
- gl.texParameteri(
518
- target,
519
- this._textureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT,
520
- sampler.maximumAnisotropy
521
- );
522
- }
523
- gl.bindTexture(target, null);
524
-
400
+ setupSampler(this, sampler);
525
401
  this._sampler = sampler;
526
402
  },
527
403
  },
@@ -571,6 +447,108 @@ Object.defineProperties(CubeMap.prototype, {
571
447
  },
572
448
  });
573
449
 
450
+ /**
451
+ * Set up a sampler for use with a cube map.
452
+ * @param {CubeMap} cubeMap The cube map containing the texture to be sampled by this sampler.
453
+ * @param {Sampler} sampler Information about how to sample the cubemap texture.
454
+ * @private
455
+ */
456
+ function setupSampler(cubeMap, sampler) {
457
+ let { minificationFilter, magnificationFilter } = sampler;
458
+
459
+ const mipmap = [
460
+ TextureMinificationFilter.NEAREST_MIPMAP_NEAREST,
461
+ TextureMinificationFilter.NEAREST_MIPMAP_LINEAR,
462
+ TextureMinificationFilter.LINEAR_MIPMAP_NEAREST,
463
+ TextureMinificationFilter.LINEAR_MIPMAP_LINEAR,
464
+ ].includes(minificationFilter);
465
+
466
+ const context = cubeMap._context;
467
+ const pixelDatatype = cubeMap._pixelDatatype;
468
+
469
+ // float textures only support nearest filtering unless the linear extensions are supported
470
+ if (
471
+ (pixelDatatype === PixelDatatype.FLOAT && !context.textureFloatLinear) ||
472
+ (pixelDatatype === PixelDatatype.HALF_FLOAT &&
473
+ !context.textureHalfFloatLinear)
474
+ ) {
475
+ // override the sampler's settings
476
+ minificationFilter = mipmap
477
+ ? TextureMinificationFilter.NEAREST_MIPMAP_NEAREST
478
+ : TextureMinificationFilter.NEAREST;
479
+ magnificationFilter = TextureMagnificationFilter.NEAREST;
480
+ }
481
+
482
+ const gl = context._gl;
483
+ const target = cubeMap._textureTarget;
484
+
485
+ gl.activeTexture(gl.TEXTURE0);
486
+ gl.bindTexture(target, cubeMap._texture);
487
+ gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, minificationFilter);
488
+ gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, magnificationFilter);
489
+ gl.texParameteri(target, gl.TEXTURE_WRAP_S, sampler.wrapS);
490
+ gl.texParameteri(target, gl.TEXTURE_WRAP_T, sampler.wrapT);
491
+ if (defined(cubeMap._textureFilterAnisotropic)) {
492
+ gl.texParameteri(
493
+ target,
494
+ cubeMap._textureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT,
495
+ sampler.maximumAnisotropy
496
+ );
497
+ }
498
+ gl.bindTexture(target, null);
499
+ }
500
+
501
+ /**
502
+ * Load a complete mipmap chain for each cubemap face.
503
+ *
504
+ * @param {CubeMap.Source[]} source The source data for each mip level, beginning at level 1.
505
+ * @param {boolean} [skipColorSpaceConversion=false] If true, color space conversions will be skipped when reading the texel values.
506
+ *
507
+ * @private
508
+ */
509
+ CubeMap.prototype.loadMipmaps = function (source, skipColorSpaceConversion) {
510
+ //>>includeStart('debug', pragmas.debug);
511
+ Check.defined("source", source);
512
+ if (!Array.isArray(source)) {
513
+ throw new DeveloperError(`source must be an array`);
514
+ }
515
+ const mipCount = Math.log2(this._size);
516
+ if (source.length !== mipCount) {
517
+ throw new DeveloperError(`all mip levels must be defined`);
518
+ }
519
+ //>>includeEnd('debug');
520
+
521
+ skipColorSpaceConversion = defaultValue(skipColorSpaceConversion, false);
522
+ const gl = this._context._gl;
523
+ const texture = this._texture;
524
+ const textureTarget = this._textureTarget;
525
+
526
+ gl.activeTexture(gl.TEXTURE0);
527
+ gl.bindTexture(textureTarget, texture);
528
+
529
+ if (skipColorSpaceConversion) {
530
+ gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);
531
+ } else {
532
+ gl.pixelStorei(
533
+ gl.UNPACK_COLORSPACE_CONVERSION_WEBGL,
534
+ gl.BROWSER_DEFAULT_WEBGL
535
+ );
536
+ }
537
+
538
+ for (let i = 0; i < source.length; i++) {
539
+ const mipSource = source[i];
540
+ // mipLevel 0 was the base layer, already loaded when the CubeMap was constructed.
541
+ const mipLevel = i + 1;
542
+ for (const faceName of CubeMap.getFaceNames()) {
543
+ loadFace(this[faceName], mipSource[faceName], mipLevel);
544
+ }
545
+ }
546
+
547
+ gl.bindTexture(textureTarget, null);
548
+
549
+ this._hasMipmap = true;
550
+ };
551
+
574
552
  /**
575
553
  * Generates a complete mipmap chain for each cubemap face.
576
554
  *