I added a skybox programmatically, then exported the scene with SceneSerializer. Here’s what got exported (I removed unrelated properties):
"reflectionTexture": {
"url": "assets/textures/skybox/skybox",
"files": [
"assets/textures/skybox/skybox_px.jpg",
"assets/textures/skybox/skybox_py.jpg",
"assets/textures/skybox/skybox_pz.jpg",
"assets/textures/skybox/skybox_nx.jpg",
"assets/textures/skybox/skybox_ny.jpg",
"assets/textures/skybox/skybox_nz.jpg"
],
"extensions": [
"_px.jpg","_py.jpg","_pz.jpg","_nx.jpg","_ny.jpg","_nz.jpg"
],
"name": "assets/textures/skybox/skybox",
"coordinatesMode": 5,
"isCube": true
}
Looks fine, and the files exist, but SceneLoader.Load throws:
Error: Cannot load cubemap because files were not defined
at Engine._Engines_thinEngine_js__WEBPACK_IMPORTED_MODULE_0__.ThinEngine.createCubeTextureBase (engine.cubeTexture.js:187:19)
at Engine._Engines_thinEngine_js__WEBPACK_IMPORTED_MODULE_0__.ThinEngine.createCubeTexture (engine.cubeTexture.js:209:17)
at Engine._Engines_thinEngine_js__WEBPACK_IMPORTED_MODULE_6__.ThinEngine.createPrefilteredCubeTexture (dds.js:668:17)
at CubeTexture._loadTexture (cubeTexture.js:335:51)
at CubeTexture.updateURL (cubeTexture.js:267:18)
at new CubeTexture (cubeTexture.js:101:15)
at Function.CubeTexture.CreateFromPrefilteredData (cubeTexture.js:193:22)
at loadAssetContainer (babylonFileLoader.js:197:115)
at Object.load (babylonFileLoader.js:886:29)
at eval (sceneLoader.js:579:35)
The problem starts from this line (babylonFileLoader.js:197):
var cubeTexture = CubeTexture.CreateFromPrefilteredData((parsedData.environmentTexture.match(/https?:\/\//g) ? "" : rootUrl) + parsedData.environmentTexture, scene, parsedData.environmentTextureForcedExtension);
rootUrl=“assets/scenes/”, and parsedData.environmentTexture=“assets/textures/skybox/skybox”. These get appended, and the resulting path is incorrect.