BabylonExporter.GLTFExporter.Texture.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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.OutputFolder, name);
  24. var imageFormat = Path.GetExtension(name) == ".jpg" ? System.Drawing.Imaging.ImageFormat.Jpeg : System.Drawing.Imaging.ImageFormat.Png;
  25. RaiseMessage($"GLTFExporter.Texture | write image '{name}' to '{absolutePath}'", 1);
  26. bitmap.Save(absolutePath, imageFormat);
  27. }
  28. return ExportTexture(babylonTexture, gltf, name);
  29. }
  30. private GLTFTextureInfo ExportTexture(BabylonTexture babylonTexture, GLTF gltf, string name = null)
  31. {
  32. if (babylonTexture == null)
  33. {
  34. return null;
  35. }
  36. if (name == null)
  37. {
  38. name = babylonTexture.name;
  39. }
  40. RaiseMessage("GLTFExporter.Texture | Export texture named: " + name, 1);
  41. // --------------------------
  42. // -------- Sampler ---------
  43. // --------------------------
  44. RaiseMessage("GLTFExporter.Texture | create sampler", 2);
  45. GLTFSampler gltfSampler = new GLTFSampler();
  46. gltfSampler.index = gltf.SamplersList.Count;
  47. gltf.SamplersList.Add(gltfSampler);
  48. // --- Retreive info from babylon texture ---
  49. // Mag and min filters
  50. GLTFSampler.TextureMagFilter? magFilter;
  51. GLTFSampler.TextureMinFilter? minFilter;
  52. getSamplingParameters(babylonTexture.samplingMode, out magFilter, out minFilter);
  53. gltfSampler.magFilter = magFilter;
  54. gltfSampler.minFilter = minFilter;
  55. // WrapS and wrapT
  56. gltfSampler.wrapS = getWrapMode(babylonTexture.wrapU);
  57. gltfSampler.wrapT = getWrapMode(babylonTexture.wrapV);
  58. // --------------------------
  59. // --------- Image ----------
  60. // --------------------------
  61. RaiseMessage("GLTFExporter.Texture | create image", 2);
  62. GLTFImage gltfImage = new GLTFImage
  63. {
  64. uri = name
  65. };
  66. gltfImage.index = gltf.ImagesList.Count;
  67. gltf.ImagesList.Add(gltfImage);
  68. switch (Path.GetExtension(name))
  69. {
  70. case ".jpg":
  71. gltfImage.FileExtension = "jpeg";
  72. break;
  73. case ".png":
  74. gltfImage.FileExtension = "png";
  75. break;
  76. }
  77. // --------------------------
  78. // -------- Texture ---------
  79. // --------------------------
  80. RaiseMessage("GLTFExporter.Texture | create texture", 2);
  81. var gltfTexture = new GLTFTexture
  82. {
  83. name = name,
  84. sampler = gltfSampler.index,
  85. source = gltfImage.index
  86. };
  87. gltfTexture.index = gltf.TexturesList.Count;
  88. gltf.TexturesList.Add(gltfTexture);
  89. // --------------------------
  90. // ------ TextureInfo -------
  91. // --------------------------
  92. var gltfTextureInfo = new GLTFTextureInfo
  93. {
  94. index = gltfTexture.index
  95. };
  96. // TODO - Animations
  97. return gltfTextureInfo;
  98. }
  99. private void getSamplingParameters(BabylonTexture.SamplingMode samplingMode, out GLTFSampler.TextureMagFilter? magFilter, out GLTFSampler.TextureMinFilter? minFilter)
  100. {
  101. switch (samplingMode)
  102. {
  103. case BabylonTexture.SamplingMode.NEAREST_NEAREST_MIPLINEAR:
  104. magFilter = GLTFSampler.TextureMagFilter.NEAREST;
  105. minFilter = GLTFSampler.TextureMinFilter.NEAREST_MIPMAP_LINEAR;
  106. break;
  107. case BabylonTexture.SamplingMode.LINEAR_LINEAR_MIPNEAREST:
  108. magFilter = GLTFSampler.TextureMagFilter.LINEAR;
  109. minFilter = GLTFSampler.TextureMinFilter.LINEAR_MIPMAP_NEAREST;
  110. break;
  111. case BabylonTexture.SamplingMode.LINEAR_LINEAR_MIPLINEAR:
  112. magFilter = GLTFSampler.TextureMagFilter.LINEAR;
  113. minFilter = GLTFSampler.TextureMinFilter.LINEAR_MIPMAP_LINEAR;
  114. break;
  115. case BabylonTexture.SamplingMode.NEAREST_NEAREST_MIPNEAREST:
  116. magFilter = GLTFSampler.TextureMagFilter.NEAREST;
  117. minFilter = GLTFSampler.TextureMinFilter.NEAREST_MIPMAP_NEAREST;
  118. break;
  119. case BabylonTexture.SamplingMode.NEAREST_LINEAR_MIPNEAREST:
  120. magFilter = GLTFSampler.TextureMagFilter.NEAREST;
  121. minFilter = GLTFSampler.TextureMinFilter.LINEAR_MIPMAP_NEAREST;
  122. break;
  123. case BabylonTexture.SamplingMode.NEAREST_LINEAR_MIPLINEAR:
  124. magFilter = GLTFSampler.TextureMagFilter.NEAREST;
  125. minFilter = GLTFSampler.TextureMinFilter.LINEAR_MIPMAP_LINEAR;
  126. break;
  127. case BabylonTexture.SamplingMode.NEAREST_LINEAR:
  128. magFilter = GLTFSampler.TextureMagFilter.NEAREST;
  129. minFilter = GLTFSampler.TextureMinFilter.LINEAR;
  130. break;
  131. case BabylonTexture.SamplingMode.NEAREST_NEAREST:
  132. magFilter = GLTFSampler.TextureMagFilter.NEAREST;
  133. minFilter = GLTFSampler.TextureMinFilter.NEAREST;
  134. break;
  135. case BabylonTexture.SamplingMode.LINEAR_NEAREST_MIPNEAREST:
  136. magFilter = GLTFSampler.TextureMagFilter.LINEAR;
  137. minFilter = GLTFSampler.TextureMinFilter.NEAREST_MIPMAP_NEAREST;
  138. break;
  139. case BabylonTexture.SamplingMode.LINEAR_NEAREST_MIPLINEAR:
  140. magFilter = GLTFSampler.TextureMagFilter.LINEAR;
  141. minFilter = GLTFSampler.TextureMinFilter.NEAREST_MIPMAP_LINEAR;
  142. break;
  143. case BabylonTexture.SamplingMode.LINEAR_LINEAR:
  144. magFilter = GLTFSampler.TextureMagFilter.LINEAR;
  145. minFilter = GLTFSampler.TextureMinFilter.LINEAR;
  146. break;
  147. case BabylonTexture.SamplingMode.LINEAR_NEAREST:
  148. magFilter = GLTFSampler.TextureMagFilter.LINEAR;
  149. minFilter = GLTFSampler.TextureMinFilter.NEAREST;
  150. break;
  151. default:
  152. RaiseError("GLTFExporter.Texture | texture sampling mode not found");
  153. magFilter = null;
  154. minFilter = null;
  155. break;
  156. }
  157. }
  158. private GLTFSampler.TextureWrapMode? getWrapMode(BabylonTexture.AddressMode babylonTextureAdresseMode)
  159. {
  160. switch (babylonTextureAdresseMode)
  161. {
  162. case BabylonTexture.AddressMode.CLAMP_ADDRESSMODE:
  163. return GLTFSampler.TextureWrapMode.CLAMP_TO_EDGE;
  164. case BabylonTexture.AddressMode.WRAP_ADDRESSMODE:
  165. return GLTFSampler.TextureWrapMode.REPEAT;
  166. case BabylonTexture.AddressMode.MIRROR_ADDRESSMODE:
  167. return GLTFSampler.TextureWrapMode.MIRRORED_REPEAT;
  168. default:
  169. RaiseError("GLTFExporter.Texture | texture wrap mode not found");
  170. return null;
  171. }
  172. }
  173. }
  174. }