(cnode *Node)
| 52 | } |
| 53 | |
| 54 | func (d *Decoder) newNode(cnode *Node) (core.INode, error) { |
| 55 | |
| 56 | var node core.INode |
| 57 | switch nt := cnode.Instance.(type) { |
| 58 | // Empty Node |
| 59 | case nil: |
| 60 | node = core.NewNode() |
| 61 | // Geometry |
| 62 | case *InstanceGeometry: |
| 63 | |
| 64 | // Get geometry instance |
| 65 | geomi, gtype, err := d.GetGeometry(nt.Url) |
| 66 | if err != nil { |
| 67 | return nil, err |
| 68 | } |
| 69 | |
| 70 | switch gtype { |
| 71 | case gls.TRIANGLES: |
| 72 | mesh := graphic.NewMesh(geomi, nil) |
| 73 | geom := geomi.GetGeometry() |
| 74 | // Associates the material in <bind_material> with the geometry group material |
| 75 | for _, im := range nt.BindMaterial.TechniqueCommon.InstanceMaterial { |
| 76 | matid := strings.TrimPrefix(im.Target, "#") |
| 77 | for i := 0; i < geom.GroupCount(); i++ { |
| 78 | group := geom.GroupAt(i) |
| 79 | if group.Matid == matid { |
| 80 | mat, err := d.GetMaterial(im.Target) |
| 81 | if err != nil { |
| 82 | return nil, err |
| 83 | } |
| 84 | mesh.AddGroupMaterial(mat, i) |
| 85 | break |
| 86 | } |
| 87 | } |
| 88 | } |
| 89 | node = mesh |
| 90 | |
| 91 | case gls.POINTS: |
| 92 | mat := material.NewPoint(&math32.Color{}) |
| 93 | mat.SetSize(30) |
| 94 | node = graphic.NewPoints(geomi, mat) |
| 95 | |
| 96 | case gls.LINES: |
| 97 | mat := material.NewBasic() |
| 98 | node = graphic.NewLines(geomi, mat) |
| 99 | |
| 100 | case gls.LINE_STRIP: |
| 101 | mat := material.NewBasic() |
| 102 | node = graphic.NewLineStrip(geomi, mat) |
| 103 | |
| 104 | default: |
| 105 | return nil, fmt.Errorf("primitive not supported") |
| 106 | } |
| 107 | default: |
| 108 | return nil, fmt.Errorf("instance geometry type:%T not supported", nt) |
| 109 | } |
| 110 | |
| 111 | n := node.GetNode() |
no test coverage detected