material_pbr.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. // BaseColorFactor
  16. var baseColorFactor math32.Color4
  17. if pbr.BaseColorFactor != nil {
  18. baseColorFactor = math32.Color4{pbr.BaseColorFactor[0], pbr.BaseColorFactor[1], pbr.BaseColorFactor[2], pbr.BaseColorFactor[3]}
  19. } else {
  20. baseColorFactor = math32.Color4{1,1,1,1}
  21. }
  22. pm.SetBaseColorFactor(&baseColorFactor)
  23. // MetallicFactor
  24. var metallicFactor float32
  25. if pbr.MetallicFactor != nil {
  26. metallicFactor = *pbr.MetallicFactor
  27. } else {
  28. metallicFactor = 1
  29. }
  30. pm.SetMetallicFactor(metallicFactor)
  31. // RoughnessFactor
  32. var roughnessFactor float32
  33. if pbr.RoughnessFactor != nil {
  34. roughnessFactor = *pbr.RoughnessFactor
  35. } else {
  36. roughnessFactor = 1
  37. }
  38. pm.SetRoughnessFactor(roughnessFactor)
  39. // EmissiveFactor
  40. var emissiveFactor math32.Color
  41. if m.EmissiveFactor != nil {
  42. emissiveFactor = math32.Color{m.EmissiveFactor[0], m.EmissiveFactor[1], m.EmissiveFactor[2]}
  43. } else {
  44. if m.EmissiveTexture != nil {
  45. emissiveFactor = math32.Color{1, 1, 1}
  46. } else {
  47. emissiveFactor = math32.Color{0,0,0}
  48. }
  49. }
  50. pm.SetEmissiveFactor(&emissiveFactor)
  51. // BaseColorTexture
  52. if pbr.BaseColorTexture != nil {
  53. tex, err := g.NewTexture(pbr.BaseColorTexture.Index)
  54. if err != nil {
  55. return nil, err
  56. }
  57. pm.SetBaseColorMap(tex)
  58. }
  59. // MetallicRoughnessTexture
  60. if pbr.MetallicRoughnessTexture != nil {
  61. tex, err := g.NewTexture(pbr.MetallicRoughnessTexture.Index)
  62. if err != nil {
  63. return nil, err
  64. }
  65. pm.SetMetallicRoughnessMap(tex)
  66. }
  67. // NormalTexture
  68. if m.NormalTexture != nil {
  69. tex, err := g.NewTexture(m.NormalTexture.Index)
  70. if err != nil {
  71. return nil, err
  72. }
  73. pm.SetNormalMap(tex)
  74. }
  75. // OcclusionTexture
  76. if m.OcclusionTexture != nil {
  77. tex, err := g.NewTexture(m.OcclusionTexture.Index)
  78. if err != nil {
  79. return nil, err
  80. }
  81. pm.SetOcclusionMap(tex)
  82. }
  83. // EmissiveTexture
  84. if m.EmissiveTexture != nil {
  85. tex, err := g.NewTexture(m.EmissiveTexture.Index)
  86. if err != nil {
  87. return nil, err
  88. }
  89. pm.SetEmissiveMap(tex)
  90. }
  91. return pm, nil
  92. }