SceneBuilder.Materials.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
  1. using System;
  2. using System.IO;
  3. using BabylonExport.Entities;
  4. using UnityEditor;
  5. using UnityEngine;
  6. namespace Unity3D2Babylon
  7. {
  8. partial class SceneBuilder
  9. {
  10. private void CopyTextureCube(string texturePath, Cubemap cubemap, BabylonTexture babylonTexture)
  11. {
  12. if (!babylonScene.AddTextureCube(texturePath))
  13. {
  14. return;
  15. }
  16. try
  17. {
  18. foreach (CubemapFace face in Enum.GetValues(typeof(CubemapFace)))
  19. {
  20. var faceTexturePath = Path.Combine(babylonScene.OutputPath, Path.GetFileNameWithoutExtension(texturePath));
  21. switch (face)
  22. {
  23. case CubemapFace.PositiveX:
  24. faceTexturePath += "_px.jpg";
  25. break;
  26. case CubemapFace.NegativeX:
  27. faceTexturePath += "_nx.jpg";
  28. break;
  29. case CubemapFace.PositiveY:
  30. faceTexturePath += "_py.jpg";
  31. break;
  32. case CubemapFace.NegativeY:
  33. faceTexturePath += "_ny.jpg";
  34. break;
  35. case CubemapFace.PositiveZ:
  36. faceTexturePath += "_pz.jpg";
  37. break;
  38. case CubemapFace.NegativeZ:
  39. faceTexturePath += "_nz.jpg";
  40. break;
  41. default:
  42. continue;
  43. }
  44. var tempTexture = new Texture2D(cubemap.width, cubemap.height, TextureFormat.RGB24, false);
  45. tempTexture.SetPixels(cubemap.GetPixels(face));
  46. tempTexture.Apply();
  47. // Flip faces in cube texture.
  48. tempTexture = FlipTexture(tempTexture);
  49. File.WriteAllBytes(faceTexturePath, tempTexture.EncodeToJPG());
  50. }
  51. }
  52. catch (Exception ex)
  53. {
  54. Debug.LogException(ex);
  55. }
  56. var textureName = Path.GetFileNameWithoutExtension(texturePath);
  57. babylonTexture.name = textureName;
  58. babylonTexture.isCube = true;
  59. babylonTexture.level = exportationOptions.ReflectionDefaultLevel;
  60. babylonTexture.coordinatesMode = 3;
  61. }
  62. private Texture2D FlipTexture(Texture2D original)
  63. {
  64. Texture2D flipped = new Texture2D(original.width, original.height);
  65. for (int i = 0; i < original.width; i++)
  66. {
  67. for (int j = 0; j < original.height; j++)
  68. {
  69. flipped.SetPixel(i, original.height - j - 1, original.GetPixel(i, j));
  70. }
  71. }
  72. flipped.Apply();
  73. return flipped;
  74. }
  75. private void CopyTexture(string texturePath, Texture2D texture2D, BabylonTexture babylonTexture, bool isLightmap = false)
  76. {
  77. bool needToDelete = false;
  78. var useJPG = !texture2D.alphaIsTransparency;
  79. // Convert unsupported file extensions
  80. if (texturePath.EndsWith(".psd") || texturePath.EndsWith(".tif") || texturePath.EndsWith(".exr"))
  81. {
  82. try
  83. {
  84. // Change texture import settings to be able to read texture data
  85. var textureImporter = AssetImporter.GetAtPath(texturePath) as TextureImporter;
  86. var previousIsReadable = textureImporter.isReadable;
  87. var previousNormalMap = textureImporter.normalmap;
  88. var previousLightmap = textureImporter.lightmap;
  89. var previousConvertToNormalmap = textureImporter.convertToNormalmap;
  90. var previousTextureType = textureImporter.textureType;
  91. var previousGrayscaleToAlpha = textureImporter.grayscaleToAlpha;
  92. textureImporter.textureType = TextureImporterType.Advanced;
  93. textureImporter.isReadable = true;
  94. textureImporter.lightmap = false;
  95. textureImporter.normalmap = false;
  96. textureImporter.convertToNormalmap = false;
  97. textureImporter.grayscaleToAlpha = false;
  98. AssetDatabase.ImportAsset(texturePath);
  99. texturePath = Path.Combine(Path.GetTempPath(), Path.GetFileName(texturePath));
  100. var extension = useJPG ? ".jpg" : ".png";
  101. texturePath = texturePath.Replace(".psd", extension).Replace(".tif", extension).Replace(".exr", extension);
  102. var tempTexture = new Texture2D(texture2D.width, texture2D.height, TextureFormat.ARGB32, false);
  103. if (isLightmap)
  104. {
  105. Color[] pixels = texture2D.GetPixels(0, 0, texture2D.width, texture2D.height);
  106. for (int index = 0; index < pixels.Length; index++)
  107. {
  108. pixels[index].r = pixels[index].r * pixels[index].a * 5;
  109. pixels[index].g = pixels[index].g * pixels[index].a * 5;
  110. pixels[index].b = pixels[index].b * pixels[index].a * 5;
  111. }
  112. tempTexture.SetPixels(pixels);
  113. }
  114. else {
  115. tempTexture.SetPixels32(texture2D.GetPixels32());
  116. }
  117. tempTexture.Apply();
  118. File.WriteAllBytes(texturePath, useJPG ? tempTexture.EncodeToJPG() : tempTexture.EncodeToPNG());
  119. needToDelete = true;
  120. // Restore
  121. textureImporter.isReadable = previousIsReadable;
  122. textureImporter.normalmap = previousNormalMap;
  123. textureImporter.lightmap = previousLightmap;
  124. textureImporter.convertToNormalmap = previousConvertToNormalmap;
  125. textureImporter.textureType = previousTextureType;
  126. textureImporter.grayscaleToAlpha = previousGrayscaleToAlpha;
  127. AssetDatabase.ImportAsset(texturePath, ImportAssetOptions.ForceUpdate);
  128. }
  129. catch (Exception ex)
  130. {
  131. Debug.LogException(ex);
  132. }
  133. }
  134. var textureName = Path.GetFileName(texturePath);
  135. babylonTexture.name = textureName;
  136. babylonScene.AddTexture(texturePath);
  137. if (needToDelete)
  138. {
  139. File.Delete(texturePath);
  140. }
  141. }
  142. private BabylonMaterial DumpMaterial(Material material, Renderer renderer)
  143. {
  144. if (renderer.sharedMaterial.shader.name == "Standard")
  145. {
  146. return DumpPBRMaterial(renderer.sharedMaterial, renderer, true);
  147. }
  148. else if (renderer.sharedMaterial.shader.name == "Standard (Specular setup)")
  149. {
  150. return DumpPBRMaterial(renderer.sharedMaterial, renderer, false);
  151. }
  152. return DumpStandardMaterial(renderer.sharedMaterial, renderer);
  153. }
  154. private BabylonMaterial DumpStandardMaterial(Material material, Renderer renderer)
  155. {
  156. var materialNotSupported = false;
  157. if (!materialsDictionary.ContainsKey(material.name))
  158. {
  159. var bMat = new BabylonStandardMaterial
  160. {
  161. name = material.name,
  162. id = Guid.NewGuid().ToString(),
  163. diffuse = new float[4],
  164. specular = new float[4]
  165. };
  166. bMat.diffuse[0] = 1.0f;
  167. bMat.diffuse[1] = 1.0f;
  168. bMat.diffuse[2] = 1.0f;
  169. bMat.diffuse[3] = 1.0f;
  170. if (material.HasProperty("_Color"))
  171. {
  172. bMat.diffuse = material.color.ToFloat();
  173. }
  174. if (material.HasProperty("_SpecColor"))
  175. {
  176. var specColor = material.GetColor("_SpecColor");
  177. bMat.specular = specColor.ToFloat();
  178. }
  179. if (material.HasProperty("_Shininess"))
  180. {
  181. var specShininess = material.GetFloat("_Shininess");
  182. bMat.specularPower = specShininess * 128;
  183. }
  184. if (material.HasProperty("_Emission"))
  185. {
  186. var emissiveColor = material.GetColor("_Emission");
  187. bMat.emissive = emissiveColor.ToFloat();
  188. }
  189. if (material.mainTexture && material.mainTexture.GetType().FullName == "UnityEngine.ProceduralTexture")
  190. {
  191. materialNotSupported = true;
  192. Debug.LogWarning("ProceduralTexture: " + material.mainTexture.name + " not supported by Babylon.js");
  193. }
  194. if (material.mainTexture && !(materialNotSupported))
  195. {
  196. var mainTexturePath = AssetDatabase.GetAssetPath(material.mainTexture);
  197. bMat.diffuseTexture = new BabylonTexture
  198. {
  199. uScale = material.mainTextureScale.x,
  200. vScale = material.mainTextureScale.y,
  201. uOffset = material.mainTextureOffset.x,
  202. vOffset = material.mainTextureOffset.y
  203. };
  204. var mainTexture2D = material.mainTexture as Texture2D;
  205. CopyTexture(mainTexturePath, mainTexture2D, bMat.diffuseTexture);
  206. var alphaCuttOff = 0f;
  207. if (material.HasProperty("_Cutoff"))
  208. {
  209. alphaCuttOff = material.GetFloat("_Cutoff");
  210. }
  211. if ((mainTexture2D && mainTexture2D.alphaIsTransparency) || alphaCuttOff > 0)
  212. {
  213. bMat.diffuseTexture.hasAlpha = true;
  214. bMat.backFaceCulling = false;
  215. }
  216. bMat.diffuse[0] = 1.0f;
  217. bMat.diffuse[1] = 1.0f;
  218. bMat.diffuse[2] = 1.0f;
  219. bMat.diffuse[3] = 1.0f;
  220. }
  221. bMat.bumpTexture = DumpTextureFromMaterial(material, "_BumpMap");
  222. bMat.emissiveTexture = DumpTextureFromMaterial(material, "_Illum");
  223. bMat.ambientTexture = DumpTextureFromMaterial(material, "_LightMap");
  224. bMat.reflectionTexture = DumpTextureFromMaterial(material, "_Cube");
  225. if (bMat.ambientTexture == null && renderer.lightmapIndex >= 0 && renderer.lightmapIndex != 255 && LightmapSettings.lightmaps.Length > renderer.lightmapIndex)
  226. {
  227. var lightmap = LightmapSettings.lightmaps[renderer.lightmapIndex].lightmapFar;
  228. bMat.lightmapTexture = DumpTexture(lightmap, isLightmap: true);
  229. bMat.lightmapTexture.coordinatesIndex = 1;
  230. bMat.useLightmapAsShadowmap = true;
  231. bMat.lightmapTexture.uScale = renderer.lightmapScaleOffset.x;
  232. bMat.lightmapTexture.vScale = renderer.lightmapScaleOffset.y;
  233. bMat.lightmapTexture.uOffset = renderer.lightmapScaleOffset.z;
  234. bMat.lightmapTexture.vOffset = renderer.lightmapScaleOffset.w;
  235. }
  236. materialsDictionary.Add(bMat.name, bMat);
  237. return bMat;
  238. }
  239. return materialsDictionary[material.name];
  240. }
  241. private BabylonMaterial DumpPBRMaterial(Material material, Renderer renderer, bool metallic)
  242. {
  243. if (materialsDictionary.ContainsKey(material.name))
  244. {
  245. return materialsDictionary[material.name];
  246. }
  247. var babylonPbrMaterial = new BabylonPBRMaterial
  248. {
  249. name = material.name,
  250. id = Guid.NewGuid().ToString(),
  251. albedo = new float[4],
  252. useEmissiveAsIllumination = true,
  253. useSpecularOverAlpha = true,
  254. useRadianceOverAlpha = true,
  255. };
  256. babylonPbrMaterial.environmentIntensity = RenderSettings.ambientIntensity;
  257. // Albedo
  258. if (material.HasProperty("_Color"))
  259. {
  260. babylonPbrMaterial.albedo = material.color.ToFloat();
  261. }
  262. babylonPbrMaterial.albedoTexture = DumpTextureFromMaterial(material, "_MainTex");
  263. // Transparency
  264. DumpTransparency(material, babylonPbrMaterial);
  265. // Glossiess/Reflectivity
  266. DumpGlossinessReflectivity(material, metallic, babylonPbrMaterial);
  267. // Occlusion
  268. babylonPbrMaterial.ambientTexture = DumpTextureFromMaterial(material, "_OcclusionMap");
  269. if (babylonPbrMaterial.ambientTexture != null && material.HasProperty("_OcclusionStrength"))
  270. {
  271. babylonPbrMaterial.ambientTexture.level = material.GetFloat("_OcclusionStrength");
  272. }
  273. // Emissive
  274. if (material.HasProperty("_EmissionColor"))
  275. {
  276. babylonPbrMaterial.emissive = material.GetColor("_EmissionColor").ToFloat();
  277. }
  278. babylonPbrMaterial.emissiveTexture = DumpTextureFromMaterial(material, "_EmissionMap");
  279. // Normal
  280. babylonPbrMaterial.bumpTexture = DumpTextureFromMaterial(material, "_BumpMap");
  281. if (babylonPbrMaterial.bumpTexture != null && material.HasProperty("_BumpMapScale"))
  282. {
  283. babylonPbrMaterial.bumpTexture.level = material.GetFloat("_BumpMapScale");
  284. }
  285. // Reflection
  286. babylonPbrMaterial.reflectionTexture = DumpReflectionTexture();
  287. materialsDictionary.Add(babylonPbrMaterial.name, babylonPbrMaterial);
  288. return babylonPbrMaterial;
  289. }
  290. private void DumpGlossinessReflectivity(Material material, bool metallic, BabylonPBRMaterial babylonPbrMaterial)
  291. {
  292. if (material.HasProperty("_Glossiness"))
  293. {
  294. babylonPbrMaterial.microSurface = material.GetFloat("_Glossiness");
  295. }
  296. if (metallic)
  297. {
  298. if (material.HasProperty("_Metallic"))
  299. {
  300. var metalness = material.GetFloat("_Metallic");
  301. babylonPbrMaterial.reflectivity = new float[] { metalness * babylonPbrMaterial.albedo[0],
  302. metalness * babylonPbrMaterial.albedo[1],
  303. metalness * babylonPbrMaterial.albedo[2] };
  304. if (babylonPbrMaterial.albedoTexture != null)
  305. {
  306. var albedoTexture = material.GetTexture("_MainTex") as Texture2D;
  307. if (albedoTexture != null)
  308. {
  309. var albedoPixels = GetPixels(albedoTexture);
  310. var reflectivityTexture = new Texture2D(albedoTexture.width, albedoTexture.height, TextureFormat.RGBA32, false);
  311. reflectivityTexture.alphaIsTransparency = true;
  312. babylonPbrMaterial.useMicroSurfaceFromReflectivityMapAlpha = true;
  313. var metallicTexture = material.GetTexture("_MetallicGlossMap") as Texture2D;
  314. if (metallicTexture == null)
  315. {
  316. for (var i = 0; i < albedoTexture.width; i++)
  317. {
  318. for (var j = 0; j < albedoTexture.height; j++)
  319. {
  320. albedoPixels[j * albedoTexture.width + i].r *= metalness;
  321. albedoPixels[j * albedoTexture.width + i].g *= metalness;
  322. albedoPixels[j * albedoTexture.width + i].b *= metalness;
  323. albedoPixels[j * albedoTexture.width + i].a = babylonPbrMaterial.microSurface;
  324. }
  325. }
  326. }
  327. else
  328. {
  329. var metallicPixels = GetPixels(metallicTexture);
  330. for (var i = 0; i < albedoTexture.width; i++)
  331. {
  332. for (var j = 0; j < albedoTexture.height; j++)
  333. {
  334. var metallicPixel = metallicPixels[j * albedoTexture.width + i];
  335. albedoPixels[j * albedoTexture.width + i].r *= metallicPixel.r;
  336. albedoPixels[j * albedoTexture.width + i].g *= metallicPixel.r;
  337. albedoPixels[j * albedoTexture.width + i].b *= metallicPixel.r;
  338. albedoPixels[j * albedoTexture.width + i].a = metallicPixel.a;
  339. }
  340. }
  341. }
  342. reflectivityTexture.SetPixels(albedoPixels);
  343. reflectivityTexture.Apply();
  344. var textureName = albedoTexture.name + "_MetallicGlossMap.png";
  345. var babylonTexture = new BabylonTexture { name = textureName };
  346. var textureScale = material.GetTextureScale("_MainTex");
  347. babylonTexture.uScale = textureScale.x;
  348. babylonTexture.vScale = textureScale.y;
  349. var textureOffset = material.GetTextureOffset("_MainTex");
  350. babylonTexture.uOffset = textureOffset.x;
  351. babylonTexture.vOffset = textureOffset.y;
  352. var reflectivityTexturePath = Path.Combine(Path.GetTempPath(), textureName);
  353. File.WriteAllBytes(reflectivityTexturePath, reflectivityTexture.EncodeToPNG());
  354. babylonScene.AddTexture(reflectivityTexturePath);
  355. if (File.Exists(reflectivityTexturePath))
  356. {
  357. File.Delete(reflectivityTexturePath);
  358. }
  359. babylonPbrMaterial.reflectivityTexture = babylonTexture;
  360. }
  361. }
  362. //else
  363. //{
  364. // TODO. Manage Albedo Cube Texture.
  365. //}
  366. }
  367. }
  368. else
  369. {
  370. if (material.HasProperty("_SpecColor"))
  371. {
  372. babylonPbrMaterial.reflectivity = material.GetColor("_SpecColor").ToFloat();
  373. }
  374. babylonPbrMaterial.reflectivityTexture = DumpTextureFromMaterial(material, "_SpecGlossMap");
  375. if (babylonPbrMaterial.reflectivityTexture != null && babylonPbrMaterial.reflectivityTexture.hasAlpha)
  376. {
  377. babylonPbrMaterial.useMicroSurfaceFromReflectivityMapAlpha = true;
  378. }
  379. }
  380. }
  381. private static Color[] GetPixels(Texture2D texture)
  382. {
  383. string texturePath = AssetDatabase.GetAssetPath(texture);
  384. // Change texture import settings to be able to read texture data
  385. var textureImporter = AssetImporter.GetAtPath(texturePath) as TextureImporter;
  386. var previousIsReadable = textureImporter.isReadable;
  387. var previousNormalMap = textureImporter.normalmap;
  388. var previousLightmap = textureImporter.lightmap;
  389. var previousConvertToNormalmap = textureImporter.convertToNormalmap;
  390. var previousTextureType = textureImporter.textureType;
  391. var previousGrayscaleToAlpha = textureImporter.grayscaleToAlpha;
  392. textureImporter.textureType = TextureImporterType.Advanced;
  393. textureImporter.isReadable = true;
  394. textureImporter.lightmap = false;
  395. textureImporter.normalmap = false;
  396. textureImporter.convertToNormalmap = false;
  397. textureImporter.grayscaleToAlpha = false;
  398. AssetDatabase.ImportAsset(texturePath);
  399. var pixels = texture.GetPixels();
  400. // Restore
  401. textureImporter.isReadable = previousIsReadable;
  402. textureImporter.normalmap = previousNormalMap;
  403. textureImporter.lightmap = previousLightmap;
  404. textureImporter.convertToNormalmap = previousConvertToNormalmap;
  405. textureImporter.textureType = previousTextureType;
  406. textureImporter.grayscaleToAlpha = previousGrayscaleToAlpha;
  407. return pixels;
  408. }
  409. private static void DumpTransparency(Material material, BabylonPBRMaterial babylonPbrMaterial)
  410. {
  411. if (material.HasProperty("_Mode"))
  412. {
  413. var mode = material.GetFloat("_Mode");
  414. if (mode >= 2.0f)
  415. {
  416. // Transparent Albedo
  417. if (babylonPbrMaterial.albedoTexture != null && babylonPbrMaterial.albedoTexture.hasAlpha)
  418. {
  419. babylonPbrMaterial.useAlphaFromAlbedoTexture = true;
  420. }
  421. // Material Alpha
  422. else
  423. {
  424. babylonPbrMaterial.alpha = babylonPbrMaterial.albedo[3];
  425. }
  426. }
  427. else if (mode == 1.0f)
  428. {
  429. // Cutout
  430. // Follow the texture hasAlpha property.
  431. }
  432. else
  433. {
  434. // Opaque
  435. if (babylonPbrMaterial.albedoTexture != null)
  436. {
  437. babylonPbrMaterial.albedoTexture.hasAlpha = false;
  438. }
  439. babylonPbrMaterial.alpha = 1.0f;
  440. }
  441. }
  442. }
  443. private BabylonTexture DumpReflectionTexture()
  444. {
  445. if (sceneReflectionTexture != null)
  446. {
  447. return sceneReflectionTexture;
  448. }
  449. // Take only reflection source currently and not the RenderSettings.ambientMode
  450. if (RenderSettings.defaultReflectionMode == UnityEngine.Rendering.DefaultReflectionMode.Skybox)
  451. {
  452. var skybox = RenderSettings.skybox;
  453. if (skybox != null)
  454. {
  455. if (skybox.shader.name == "Skybox/Cubemap")
  456. {
  457. var cubeMap = skybox.GetTexture("_Tex") as Cubemap;
  458. if (cubeMap != null)
  459. {
  460. sceneReflectionTexture = new BabylonTexture();
  461. CopyTextureCube("sceneReflectionTexture.hdr", cubeMap, sceneReflectionTexture);
  462. sceneReflectionTexture.level = RenderSettings.reflectionIntensity;
  463. }
  464. }
  465. //else if (skybox.shader.name == "Skybox/6 Sided")
  466. //{
  467. // // TODO. HDR faces.
  468. //}
  469. }
  470. }
  471. else if (RenderSettings.customReflection != null)
  472. {
  473. var cubeMap = RenderSettings.customReflection;
  474. sceneReflectionTexture = new BabylonTexture();
  475. CopyTextureCube("sceneReflectionTexture.hdr", cubeMap, sceneReflectionTexture);
  476. sceneReflectionTexture.level = RenderSettings.reflectionIntensity;
  477. }
  478. return sceneReflectionTexture;
  479. }
  480. private BabylonTexture DumpTextureFromMaterial(Material material, string name)
  481. {
  482. if (!material.HasProperty(name))
  483. {
  484. return null;
  485. }
  486. var texture = material.GetTexture(name);
  487. return DumpTexture(texture, material, name);
  488. }
  489. private BabylonTexture DumpTexture(Texture texture, Material material = null, string name = "", bool isLightmap = false)
  490. {
  491. if (texture == null)
  492. {
  493. return null;
  494. }
  495. var texturePath = AssetDatabase.GetAssetPath(texture);
  496. var textureName = Path.GetFileName(texturePath);
  497. var babylonTexture = new BabylonTexture { name = textureName };
  498. if (material != null)
  499. {
  500. var textureScale = material.GetTextureScale(name);
  501. babylonTexture.uScale = textureScale.x;
  502. babylonTexture.vScale = textureScale.y;
  503. var textureOffset = material.GetTextureOffset(name);
  504. babylonTexture.uOffset = textureOffset.x;
  505. babylonTexture.vOffset = textureOffset.y;
  506. }
  507. var texture2D = texture as Texture2D;
  508. if (texture2D)
  509. {
  510. babylonTexture.hasAlpha = texture2D.alphaIsTransparency;
  511. CopyTexture(texturePath, texture2D, babylonTexture, isLightmap);
  512. }
  513. else
  514. {
  515. var cubemap = texture as Cubemap;
  516. if (cubemap != null)
  517. {
  518. CopyTextureCube(texturePath, cubemap, babylonTexture);
  519. }
  520. }
  521. return babylonTexture;
  522. }
  523. }
  524. }