BabylonExporter.GLTFExporter.Texture.cs 7.8 KB

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