material_pbr.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package gltf
  2. import (
  3. "fmt"
  4. "github.com/g3n/engine/material"
  5. "github.com/g3n/engine/math32"
  6. )
  7. func (g *GLTF) loadMaterialPBR(m *Material) (material.IMaterial, error) {
  8. // Get pbr information
  9. pbr := m.PbrMetallicRoughness
  10. if pbr == nil {
  11. return nil, fmt.Errorf("PbrMetallicRoughness not supplied")
  12. }
  13. // Create new physically based material
  14. pm := material.NewPhysical()
  15. // Double sided
  16. if m.DoubleSided {
  17. pm.SetSide(material.SideDouble)
  18. } else {
  19. pm.SetSide(material.SideFront)
  20. }
  21. var alphaMode string
  22. if len(m.AlphaMode) > 0{
  23. alphaMode = m.AlphaMode
  24. } else {
  25. alphaMode = "OPAQUE"
  26. }
  27. if alphaMode == "BLEND" {
  28. pm.SetTransparent(true)
  29. } else {
  30. pm.SetTransparent(false)
  31. if alphaMode == "MASK" {
  32. // TODO m.AlphaCutoff
  33. // pm.SetAlphaCutoff
  34. }
  35. }
  36. // BaseColorFactor
  37. var baseColorFactor math32.Color4
  38. if pbr.BaseColorFactor != nil {
  39. baseColorFactor = math32.Color4{pbr.BaseColorFactor[0], pbr.BaseColorFactor[1], pbr.BaseColorFactor[2], pbr.BaseColorFactor[3]}
  40. } else {
  41. baseColorFactor = math32.Color4{1,1,1,1}
  42. }
  43. pm.SetBaseColorFactor(&baseColorFactor)
  44. // MetallicFactor
  45. var metallicFactor float32
  46. if pbr.MetallicFactor != nil {
  47. metallicFactor = *pbr.MetallicFactor
  48. } else {
  49. metallicFactor = 1
  50. }
  51. pm.SetMetallicFactor(metallicFactor)
  52. // RoughnessFactor
  53. var roughnessFactor float32
  54. if pbr.RoughnessFactor != nil {
  55. roughnessFactor = *pbr.RoughnessFactor
  56. } else {
  57. roughnessFactor = 1
  58. }
  59. pm.SetRoughnessFactor(roughnessFactor)
  60. // EmissiveFactor
  61. var emissiveFactor math32.Color
  62. if m.EmissiveFactor != nil {
  63. emissiveFactor = math32.Color{m.EmissiveFactor[0], m.EmissiveFactor[1], m.EmissiveFactor[2]}
  64. } else {
  65. if m.EmissiveTexture != nil {
  66. emissiveFactor = math32.Color{1, 1, 1}
  67. } else {
  68. emissiveFactor = math32.Color{0,0,0}
  69. }
  70. }
  71. pm.SetEmissiveFactor(&emissiveFactor)
  72. // BaseColorTexture
  73. if pbr.BaseColorTexture != nil {
  74. tex, err := g.LoadTexture(pbr.BaseColorTexture.Index)
  75. if err != nil {
  76. return nil, err
  77. }
  78. pm.SetBaseColorMap(tex)
  79. }
  80. // MetallicRoughnessTexture
  81. if pbr.MetallicRoughnessTexture != nil {
  82. tex, err := g.LoadTexture(pbr.MetallicRoughnessTexture.Index)
  83. if err != nil {
  84. return nil, err
  85. }
  86. pm.SetMetallicRoughnessMap(tex)
  87. }
  88. // NormalTexture
  89. if m.NormalTexture != nil {
  90. tex, err := g.LoadTexture(m.NormalTexture.Index)
  91. if err != nil {
  92. return nil, err
  93. }
  94. pm.SetNormalMap(tex)
  95. }
  96. // OcclusionTexture
  97. if m.OcclusionTexture != nil {
  98. tex, err := g.LoadTexture(m.OcclusionTexture.Index)
  99. if err != nil {
  100. return nil, err
  101. }
  102. pm.SetOcclusionMap(tex)
  103. }
  104. // EmissiveTexture
  105. if m.EmissiveTexture != nil {
  106. tex, err := g.LoadTexture(m.EmissiveTexture.Index)
  107. if err != nil {
  108. return nil, err
  109. }
  110. pm.SetEmissiveMap(tex)
  111. }
  112. return pm, nil
  113. }