BabylonExporter.GLTFExporter.Texture.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. using BabylonExport.Entities;
  2. using GLTFExport.Entities;
  3. namespace Max2Babylon
  4. {
  5. partial class BabylonExporter
  6. {
  7. private GLTFTextureInfo ExportTexture(BabylonTexture babylonTexture, GLTF gltf)
  8. {
  9. if (babylonTexture == null)
  10. {
  11. return null;
  12. }
  13. RaiseMessage("GLTFExporter.Texture | ExportTexture babylonTexture.name=" + babylonTexture.name, 1);
  14. // --------------------------
  15. // -------- Sampler ---------
  16. // --------------------------
  17. RaiseMessage("GLTFExporter.Texture | create sampler", 1);
  18. GLTFSampler gltfSampler = new GLTFSampler();
  19. gltfSampler.index = gltf.SamplersList.Count;
  20. gltf.SamplersList.Add(gltfSampler);
  21. // --- Retreive info from babylon texture ---
  22. // Mag and min filters
  23. GLTFSampler.TextureMagFilter? magFilter;
  24. GLTFSampler.TextureMinFilter? minFilter;
  25. getSamplingParameters(babylonTexture.samplingMode, out magFilter, out minFilter);
  26. gltfSampler.magFilter = magFilter;
  27. gltfSampler.minFilter = minFilter;
  28. // WrapS and wrapT
  29. gltfSampler.wrapS = getWrapMode(babylonTexture.wrapU);
  30. gltfSampler.wrapT = getWrapMode(babylonTexture.wrapV);
  31. // --------------------------
  32. // --------- Image ----------
  33. // --------------------------
  34. RaiseMessage("GLTFExporter.Texture | create image", 1);
  35. GLTFImage gltfImage = new GLTFImage
  36. {
  37. uri = babylonTexture.name
  38. };
  39. gltfImage.index = gltf.ImagesList.Count;
  40. gltf.ImagesList.Add(gltfImage);
  41. // --------------------------
  42. // -------- Texture ---------
  43. // --------------------------
  44. RaiseMessage("GLTFExporter.Texture | create texture", 1);
  45. var gltfTexture = new GLTFTexture
  46. {
  47. name = babylonTexture.name,
  48. sampler = gltfSampler.index,
  49. source = gltfImage.index
  50. };
  51. gltfTexture.index = gltf.TexturesList.Count;
  52. gltf.TexturesList.Add(gltfTexture);
  53. // --------------------------
  54. // ------ TextureInfo -------
  55. // --------------------------
  56. var gltfTextureInfo = new GLTFTextureInfo
  57. {
  58. index = gltfTexture.index
  59. };
  60. // TODO - Animations
  61. //// Copy image to output
  62. //var absolutePath = texture.Map.FullFilePath;
  63. //try
  64. //{
  65. // if (File.Exists(absolutePath))
  66. // {
  67. // if (CopyTexturesToOutput)
  68. // {
  69. // RaiseMessage("GLTFExporter.Texture | copy image src path = "+ absolutePath + " and dest path = "+ Path.Combine(gltf.OutputPath, gltfTexture.name));
  70. // File.Copy(absolutePath, Path.Combine(gltf.OutputPath, gltfTexture.name), true);
  71. // }
  72. // }
  73. // else
  74. // {
  75. // RaiseWarning(string.Format("Texture {0} not found.", gltfTexture.name), 2);
  76. // }
  77. //}
  78. //catch
  79. //{
  80. // // silently fails
  81. //}
  82. return gltfTextureInfo;
  83. }
  84. private void getSamplingParameters(BabylonTexture.SamplingMode samplingMode, out GLTFSampler.TextureMagFilter? magFilter, out GLTFSampler.TextureMinFilter? minFilter)
  85. {
  86. switch (samplingMode)
  87. {
  88. case BabylonTexture.SamplingMode.NEAREST_NEAREST_MIPLINEAR:
  89. magFilter = GLTFSampler.TextureMagFilter.NEAREST;
  90. minFilter = GLTFSampler.TextureMinFilter.NEAREST_MIPMAP_LINEAR;
  91. break;
  92. case BabylonTexture.SamplingMode.LINEAR_LINEAR_MIPNEAREST:
  93. magFilter = GLTFSampler.TextureMagFilter.LINEAR;
  94. minFilter = GLTFSampler.TextureMinFilter.LINEAR_MIPMAP_NEAREST;
  95. break;
  96. case BabylonTexture.SamplingMode.LINEAR_LINEAR_MIPLINEAR:
  97. magFilter = GLTFSampler.TextureMagFilter.LINEAR;
  98. minFilter = GLTFSampler.TextureMinFilter.LINEAR_MIPMAP_LINEAR;
  99. break;
  100. case BabylonTexture.SamplingMode.NEAREST_NEAREST_MIPNEAREST:
  101. magFilter = GLTFSampler.TextureMagFilter.NEAREST;
  102. minFilter = GLTFSampler.TextureMinFilter.NEAREST_MIPMAP_NEAREST;
  103. break;
  104. case BabylonTexture.SamplingMode.NEAREST_LINEAR_MIPNEAREST:
  105. magFilter = GLTFSampler.TextureMagFilter.NEAREST;
  106. minFilter = GLTFSampler.TextureMinFilter.LINEAR_MIPMAP_NEAREST;
  107. break;
  108. case BabylonTexture.SamplingMode.NEAREST_LINEAR_MIPLINEAR:
  109. magFilter = GLTFSampler.TextureMagFilter.NEAREST;
  110. minFilter = GLTFSampler.TextureMinFilter.LINEAR_MIPMAP_LINEAR;
  111. break;
  112. case BabylonTexture.SamplingMode.NEAREST_LINEAR:
  113. magFilter = GLTFSampler.TextureMagFilter.NEAREST;
  114. minFilter = GLTFSampler.TextureMinFilter.LINEAR;
  115. break;
  116. case BabylonTexture.SamplingMode.NEAREST_NEAREST:
  117. magFilter = GLTFSampler.TextureMagFilter.NEAREST;
  118. minFilter = GLTFSampler.TextureMinFilter.NEAREST;
  119. break;
  120. case BabylonTexture.SamplingMode.LINEAR_NEAREST_MIPNEAREST:
  121. magFilter = GLTFSampler.TextureMagFilter.LINEAR;
  122. minFilter = GLTFSampler.TextureMinFilter.NEAREST_MIPMAP_NEAREST;
  123. break;
  124. case BabylonTexture.SamplingMode.LINEAR_NEAREST_MIPLINEAR:
  125. magFilter = GLTFSampler.TextureMagFilter.LINEAR;
  126. minFilter = GLTFSampler.TextureMinFilter.NEAREST_MIPMAP_LINEAR;
  127. break;
  128. case BabylonTexture.SamplingMode.LINEAR_LINEAR:
  129. magFilter = GLTFSampler.TextureMagFilter.LINEAR;
  130. minFilter = GLTFSampler.TextureMinFilter.LINEAR;
  131. break;
  132. case BabylonTexture.SamplingMode.LINEAR_NEAREST:
  133. magFilter = GLTFSampler.TextureMagFilter.LINEAR;
  134. minFilter = GLTFSampler.TextureMinFilter.NEAREST;
  135. break;
  136. default:
  137. RaiseError("GLTFExporter.Texture | texture sampling mode not found");
  138. magFilter = null;
  139. minFilter = null;
  140. break;
  141. }
  142. }
  143. private GLTFSampler.TextureWrapMode? getWrapMode(BabylonTexture.AddressMode babylonTextureAdresseMode)
  144. {
  145. switch (babylonTextureAdresseMode)
  146. {
  147. case BabylonTexture.AddressMode.CLAMP_ADDRESSMODE:
  148. return GLTFSampler.TextureWrapMode.CLAMP_TO_EDGE;
  149. case BabylonTexture.AddressMode.WRAP_ADDRESSMODE:
  150. return GLTFSampler.TextureWrapMode.REPEAT;
  151. case BabylonTexture.AddressMode.MIRROR_ADDRESSMODE:
  152. return GLTFSampler.TextureWrapMode.MIRRORED_REPEAT;
  153. default:
  154. RaiseError("GLTFExporter.Texture | texture wrap mode not found");
  155. return null;
  156. }
  157. }
  158. }
  159. }