material_pbr.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. if pbr.MetallicRoughnessTexture != nil {
  50. metallicFactor = 1
  51. } else {
  52. metallicFactor = 0
  53. }
  54. }
  55. pm.SetMetallicFactor(metallicFactor)
  56. // RoughnessFactor
  57. var roughnessFactor float32
  58. if pbr.RoughnessFactor != nil {
  59. roughnessFactor = *pbr.RoughnessFactor
  60. } else {
  61. roughnessFactor = 1
  62. }
  63. pm.SetRoughnessFactor(roughnessFactor)
  64. // EmissiveFactor
  65. var emissiveFactor math32.Color
  66. if m.EmissiveFactor != nil {
  67. emissiveFactor = math32.Color{m.EmissiveFactor[0], m.EmissiveFactor[1], m.EmissiveFactor[2]}
  68. } else {
  69. if m.EmissiveTexture != nil {
  70. emissiveFactor = math32.Color{1, 1, 1}
  71. } else {
  72. emissiveFactor = math32.Color{0, 0, 0}
  73. }
  74. }
  75. pm.SetEmissiveFactor(&emissiveFactor)
  76. // BaseColorTexture
  77. if pbr.BaseColorTexture != nil {
  78. tex, err := g.LoadTexture(pbr.BaseColorTexture.Index)
  79. if err != nil {
  80. return nil, err
  81. }
  82. pm.SetBaseColorMap(tex)
  83. }
  84. // MetallicRoughnessTexture
  85. if pbr.MetallicRoughnessTexture != nil {
  86. tex, err := g.LoadTexture(pbr.MetallicRoughnessTexture.Index)
  87. if err != nil {
  88. return nil, err
  89. }
  90. pm.SetMetallicRoughnessMap(tex)
  91. }
  92. // NormalTexture
  93. if m.NormalTexture != nil {
  94. tex, err := g.LoadTexture(m.NormalTexture.Index)
  95. if err != nil {
  96. return nil, err
  97. }
  98. pm.SetNormalMap(tex)
  99. }
  100. // OcclusionTexture
  101. if m.OcclusionTexture != nil {
  102. tex, err := g.LoadTexture(m.OcclusionTexture.Index)
  103. if err != nil {
  104. return nil, err
  105. }
  106. pm.SetOcclusionMap(tex)
  107. }
  108. // EmissiveTexture
  109. if m.EmissiveTexture != nil {
  110. tex, err := g.LoadTexture(m.EmissiveTexture.Index)
  111. if err != nil {
  112. return nil, err
  113. }
  114. pm.SetEmissiveMap(tex)
  115. }
  116. return pm, nil
  117. }