NewMesh creates and returns a mesh from an specified decoded object.
(obj *Object)
| 232 | |
| 233 | // NewMesh creates and returns a mesh from an specified decoded object. |
| 234 | func (dec *Decoder) NewMesh(obj *Object) (*graphic.Mesh, error) { |
| 235 | |
| 236 | // Creates object geometry |
| 237 | geom, err := dec.NewGeometry(obj) |
| 238 | if err != nil { |
| 239 | return nil, err |
| 240 | } |
| 241 | |
| 242 | // Single material |
| 243 | if geom.GroupCount() == 1 { |
| 244 | // get Material info from mtl file and ensure it's valid. |
| 245 | // substitute default material if it is not. |
| 246 | var matDesc *Material |
| 247 | var matName string |
| 248 | if len(obj.materials) > 0 { |
| 249 | matName = obj.materials[0] |
| 250 | } |
| 251 | matDesc = dec.Materials[matName] |
| 252 | if matDesc == nil { |
| 253 | matDesc = defaultMat |
| 254 | // log warning |
| 255 | msg := fmt.Sprintf("could not find material for %s. using default material.", obj.Name) |
| 256 | dec.appendWarn(objType, msg) |
| 257 | } |
| 258 | |
| 259 | // Creates material for mesh |
| 260 | mat := material.NewStandard(&matDesc.Diffuse) |
| 261 | ambientColor := mat.AmbientColor() |
| 262 | mat.SetAmbientColor(ambientColor.Multiply(&matDesc.Ambient)) |
| 263 | mat.SetSpecularColor(&matDesc.Specular) |
| 264 | mat.SetShininess(matDesc.Shininess) |
| 265 | // Loads material textures if specified |
| 266 | err = dec.loadTex(&mat.Material, matDesc) |
| 267 | if err != nil { |
| 268 | return nil, err |
| 269 | } |
| 270 | |
| 271 | return graphic.NewMesh(geom, mat), nil |
| 272 | } |
| 273 | |
| 274 | // Multi material |
| 275 | mesh := graphic.NewMesh(geom, nil) |
| 276 | for idx := 0; idx < geom.GroupCount(); idx++ { |
| 277 | group := geom.GroupAt(idx) |
| 278 | |
| 279 | // get Material info from mtl file and ensure it's valid. |
| 280 | // substitute default material if it is not. |
| 281 | var matDesc *Material |
| 282 | var matName string |
| 283 | if len(obj.materials) > group.Matindex { |
| 284 | matName = obj.materials[group.Matindex] |
| 285 | } |
| 286 | matDesc = dec.Materials[matName] |
| 287 | if matDesc == nil { |
| 288 | matDesc = defaultMat |
| 289 | // log warning |
| 290 | msg := fmt.Sprintf("could not find material for %s. using default material.", obj.Name) |
| 291 | dec.appendWarn(objType, msg) |
no test coverage detected