| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- package gltf
- import (
- "fmt"
- "github.com/g3n/engine/material"
- "github.com/g3n/engine/math32"
- )
- func (g *GLTF) loadMaterialPBR(m *Material) (material.IMaterial, error) {
- // Get pbr information
- pbr := m.PbrMetallicRoughness
- if pbr == nil {
- return nil, fmt.Errorf("PbrMetallicRoughness not supplied")
- }
- // Create new physically based material
- pm := material.NewPhysical()
- // Double sided
- if m.DoubleSided {
- pm.SetSide(material.SideDouble)
- } else {
- pm.SetSide(material.SideFront)
- }
- var alphaMode string
- if len(m.AlphaMode) > 0 {
- alphaMode = m.AlphaMode
- } else {
- alphaMode = "OPAQUE"
- }
- if alphaMode == "BLEND" {
- pm.SetTransparent(true)
- } else {
- pm.SetTransparent(false)
- if alphaMode == "MASK" {
- // TODO m.AlphaCutoff
- // pm.SetAlphaCutoff
- }
- }
- // BaseColorFactor
- var baseColorFactor math32.Color4
- if pbr.BaseColorFactor != nil {
- baseColorFactor = math32.Color4{pbr.BaseColorFactor[0], pbr.BaseColorFactor[1], pbr.BaseColorFactor[2], pbr.BaseColorFactor[3]}
- } else {
- baseColorFactor = math32.Color4{1, 1, 1, 1}
- }
- pm.SetBaseColorFactor(&baseColorFactor)
- // MetallicFactor
- var metallicFactor float32
- if pbr.MetallicFactor != nil {
- metallicFactor = *pbr.MetallicFactor
- } else {
- if pbr.MetallicRoughnessTexture != nil {
- metallicFactor = 1
- } else {
- metallicFactor = 0
- }
- }
- pm.SetMetallicFactor(metallicFactor)
- // RoughnessFactor
- var roughnessFactor float32
- if pbr.RoughnessFactor != nil {
- roughnessFactor = *pbr.RoughnessFactor
- } else {
- roughnessFactor = 1
- }
- pm.SetRoughnessFactor(roughnessFactor)
- // EmissiveFactor
- var emissiveFactor math32.Color
- if m.EmissiveFactor != nil {
- emissiveFactor = math32.Color{m.EmissiveFactor[0], m.EmissiveFactor[1], m.EmissiveFactor[2]}
- } else {
- if m.EmissiveTexture != nil {
- emissiveFactor = math32.Color{1, 1, 1}
- } else {
- emissiveFactor = math32.Color{0, 0, 0}
- }
- }
- pm.SetEmissiveFactor(&emissiveFactor)
- // BaseColorTexture
- if pbr.BaseColorTexture != nil {
- tex, err := g.LoadTexture(pbr.BaseColorTexture.Index)
- if err != nil {
- return nil, err
- }
- pm.SetBaseColorMap(tex)
- }
- // MetallicRoughnessTexture
- if pbr.MetallicRoughnessTexture != nil {
- tex, err := g.LoadTexture(pbr.MetallicRoughnessTexture.Index)
- if err != nil {
- return nil, err
- }
- pm.SetMetallicRoughnessMap(tex)
- }
- // NormalTexture
- if m.NormalTexture != nil {
- tex, err := g.LoadTexture(m.NormalTexture.Index)
- if err != nil {
- return nil, err
- }
- pm.SetNormalMap(tex)
- }
- // OcclusionTexture
- if m.OcclusionTexture != nil {
- tex, err := g.LoadTexture(m.OcclusionTexture.Index)
- if err != nil {
- return nil, err
- }
- pm.SetOcclusionMap(tex)
- }
- // EmissiveTexture
- if m.EmissiveTexture != nil {
- tex, err := g.LoadTexture(m.EmissiveTexture.Index)
- if err != nil {
- return nil, err
- }
- pm.SetEmissiveMap(tex)
- }
- return pm, nil
- }
|