BabylonExporter.Material.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using System;
  2. using System.Collections.Generic;
  3. using Autodesk.Max;
  4. using BabylonExport.Entities;
  5. namespace Max2Babylon
  6. {
  7. partial class BabylonExporter
  8. {
  9. readonly List<IMtl> referencedMaterials = new List<IMtl>();
  10. private void ExportMaterial(IMtl materialNode, BabylonScene babylonScene)
  11. {
  12. var name = materialNode.Name;
  13. var id = materialNode.GetGuid().ToString();
  14. RaiseMessage(name, 1);
  15. if (materialNode.NumSubMtls > 0)
  16. {
  17. var babylonMultimaterial = new BabylonMultiMaterial();
  18. babylonMultimaterial.name = name;
  19. babylonMultimaterial.id = id;
  20. var guids = new List<string>();
  21. for (var index = 0; index < materialNode.NumSubMtls; index++)
  22. {
  23. var subMat = materialNode.GetSubMtl(index);
  24. if (subMat != null)
  25. {
  26. guids.Add(subMat.GetGuid().ToString());
  27. if (!referencedMaterials.Contains(subMat))
  28. {
  29. referencedMaterials.Add(subMat);
  30. ExportMaterial(subMat, babylonScene);
  31. }
  32. }
  33. else
  34. {
  35. guids.Add(Guid.Empty.ToString());
  36. }
  37. }
  38. babylonMultimaterial.materials = guids.ToArray();
  39. babylonScene.MultiMaterialsList.Add(babylonMultimaterial);
  40. return;
  41. }
  42. var babylonMaterial = new BabylonMaterial();
  43. babylonMaterial.name = name;
  44. babylonMaterial.id = id;
  45. babylonMaterial.ambient = materialNode.GetAmbient(0, false).ToArray();
  46. babylonMaterial.diffuse = materialNode.GetDiffuse(0, false).ToArray();
  47. babylonMaterial.specular = materialNode.GetSpecular(0, false).Scale(materialNode.GetShinStr(0, false));
  48. babylonMaterial.specularPower = materialNode.GetShininess(0, false) * 256;
  49. babylonMaterial.emissive = materialNode.GetSelfIllumColorOn(0, false) ? materialNode.GetSelfIllumColor(0, false).ToArray() : materialNode.GetDiffuse(0, false).Scale(materialNode.GetSelfIllum(0, false));
  50. babylonMaterial.alpha = 1.0f - materialNode.GetXParency(0, false);
  51. var stdMat = materialNode.GetParamBlock(0).Owner as IStdMat2;
  52. if (stdMat != null)
  53. {
  54. babylonMaterial.backFaceCulling = !stdMat.TwoSided;
  55. babylonMaterial.wireframe = stdMat.Wire;
  56. // Textures
  57. babylonMaterial.ambientTexture = ExportTexture(stdMat, 0, babylonScene); // Ambient
  58. babylonMaterial.diffuseTexture = ExportTexture(stdMat, 1, babylonScene); // Diffuse
  59. babylonMaterial.specularTexture = ExportTexture(stdMat, 2, babylonScene); // Specular
  60. babylonMaterial.emissiveTexture = ExportTexture(stdMat, 5, babylonScene); // Emissive
  61. babylonMaterial.opacityTexture = ExportTexture(stdMat, 6, babylonScene); // Opacity
  62. babylonMaterial.bumpTexture = ExportTexture(stdMat, 8, babylonScene); // Bump
  63. babylonMaterial.reflectionTexture = ExportTexture(stdMat, 9, babylonScene, true); // Reflection
  64. // Constraints
  65. if (babylonMaterial.diffuseTexture != null)
  66. {
  67. babylonMaterial.emissive = new [] { 1.0f, 1.0f, 1.0f };
  68. }
  69. if (babylonMaterial.emissiveTexture != null)
  70. {
  71. babylonMaterial.emissive = new float[]{0, 0, 0};
  72. }
  73. if (babylonMaterial.opacityTexture != null && babylonMaterial.diffuseTexture != null &&
  74. babylonMaterial.diffuseTexture.name == babylonMaterial.opacityTexture.name &&
  75. babylonMaterial.diffuseTexture.hasAlpha && !babylonMaterial.opacityTexture.getAlphaFromRGB)
  76. {
  77. // This is a alpha testing purpose
  78. babylonMaterial.opacityTexture = null;
  79. babylonMaterial.diffuseTexture.hasAlpha = true;
  80. RaiseWarning("Opacity texture was removed because alpha from diffuse texture can be use instead", 2);
  81. RaiseWarning("If you do not want this behavior, just set Alpha Source = None on your diffuse texture", 2);
  82. }
  83. }
  84. babylonScene.MaterialsList.Add(babylonMaterial);
  85. }
  86. }
  87. }