package gltf import ( "github.com/g3n/engine/material" "github.com/g3n/engine/math32" ) // loadMaterialCommon receives an interface value describing a KHR_materials_common extension, // decodes it and returns a Material closest to the specified description // The specification of this extension is at: // https://github.com/KhronosGroup/glTF/tree/master/extensions/Khronos/KHR_materials_common func (g *GLTF) loadMaterialCommon(ext interface{}) (material.IMaterial, error) { // The extension must be an object m := ext.(map[string]interface{}) // Double sided doubleSided := false val, ok := m["doubleSided"] if ok { doubleSided = val.(bool) } // Technique technique := "" val, ok = m["technique"] if ok { technique = val.(string) } // Transparent transparent := false val, ok = m["transparent"] if ok { transparent = val.(bool) } // Defaul values ambient := []float32{0, 0, 0, 1} diffuse := []float32{0, 0, 0, 1} emission := []float32{0, 0, 0, 1} specular := []float32{0, 0, 0, 1} shininess := float32(0) transparency := float32(1) // Converts a slice of interface values which should be float64 to // to a slice of float32 convIF32 := func(v interface{}) []float32 { si := v.([]interface{}) res := make([]float32, 0) for i := 0; i < len(si); i++ { res = append(res, float32(si[i].(float64))) } return res } // Values values, ok := m["values"].(map[string]interface{}) if ok { // Ambient light val, ok = values["ambient"] if ok { ambient = convIF32(val) } // Diffuse light val, ok = values["diffuse"] if ok { diffuse = convIF32(val) } // Emission light val, ok = values["emission"] if ok { emission = convIF32(val) } // Specular light val, ok = values["specular"] if ok { specular = convIF32(val) } // Shininess val, ok = values["shininess"] if ok { s := convIF32(val) shininess = s[0] } // Transparency val, ok = values["transparency"] if ok { s := convIF32(val) transparency = s[0] } } //log.Error("doubleSided:%v", doubleSided) //log.Error("technique:%v", technique) //log.Error("transparent:%v", transparent) //log.Error("values:%v", values) //log.Error("ambient:%v", ambient) //log.Error("diffuse:%v", diffuse) //log.Error("emission:%v", emission) //log.Error("specular:%v", specular) //log.Error("shininess:%v", shininess) //log.Error("transparency:%v", transparency) var imat material.IMaterial if technique == "PHONG" { pm := material.NewPhong(&math32.Color{diffuse[0], diffuse[1], diffuse[2]}) pm.SetAmbientColor(&math32.Color{ambient[0], ambient[1], ambient[2]}) pm.SetEmissiveColor(&math32.Color{emission[0], emission[1], emission[2]}) pm.SetSpecularColor(&math32.Color{specular[0], specular[1], specular[2]}) pm.SetShininess(shininess) pm.SetOpacity(transparency) imat = pm } else { sm := material.NewStandard(&math32.Color{diffuse[0], diffuse[1], diffuse[2]}) sm.SetAmbientColor(&math32.Color{ambient[0], ambient[1], ambient[2]}) sm.SetEmissiveColor(&math32.Color{emission[0], emission[1], emission[2]}) sm.SetSpecularColor(&math32.Color{specular[0], specular[1], specular[2]}) sm.SetShininess(shininess) sm.SetOpacity(transparency) imat = sm } // Double Sided mat := imat.GetMaterial() if doubleSided { mat.SetSide(material.SideDouble) } else { mat.SetSide(material.SideFront) } // Transparency if transparent { mat.SetDepthMask(true) } else { mat.SetDepthMask(false) } return imat, nil }