LoadNode creates and returns a new Node described by the specified index in the decoded GLTF Nodes array.
(nodeIdx int)
| 177 | // LoadNode creates and returns a new Node described by the specified index |
| 178 | // in the decoded GLTF Nodes array. |
| 179 | func (g *GLTF) LoadNode(nodeIdx int) (core.INode, error) { |
| 180 | |
| 181 | // Check if provided node index is valid |
| 182 | if nodeIdx < 0 || nodeIdx >= len(g.Nodes) { |
| 183 | return nil, fmt.Errorf("invalid node index") |
| 184 | } |
| 185 | nodeData := g.Nodes[nodeIdx] |
| 186 | // Return cached if available |
| 187 | if nodeData.cache != nil { |
| 188 | log.Debug("Fetching Node %d (cached)", nodeIdx) |
| 189 | return nodeData.cache, nil |
| 190 | } |
| 191 | log.Debug("Loading Node %d", nodeIdx) |
| 192 | |
| 193 | var in core.INode |
| 194 | var err error |
| 195 | // Check if the node is a Mesh (triangles, lines, etc...) |
| 196 | if nodeData.Mesh != nil { |
| 197 | in, err = g.LoadMesh(*nodeData.Mesh) |
| 198 | if err != nil { |
| 199 | return nil, err |
| 200 | } |
| 201 | |
| 202 | if nodeData.Skin != nil { |
| 203 | |
| 204 | mesh, ok := in.(*graphic.Mesh) |
| 205 | if !ok { |
| 206 | children := in.GetNode().Children() |
| 207 | if len(children) > 1 { |
| 208 | return nil, fmt.Errorf("skinning/rigging meshes with more than a single primitive is not supported") |
| 209 | } |
| 210 | mesh = children[0].(*graphic.Mesh) |
| 211 | } |
| 212 | |
| 213 | // Create RiggedMesh |
| 214 | rm := graphic.NewRiggedMesh(mesh) |
| 215 | skeleton, err := g.LoadSkin(*nodeData.Skin) |
| 216 | if err != nil { |
| 217 | return nil, err |
| 218 | } |
| 219 | rm.SetSkeleton(skeleton) |
| 220 | in = rm |
| 221 | } |
| 222 | |
| 223 | // Check if the node is Camera |
| 224 | } else if nodeData.Camera != nil { |
| 225 | in, err = g.LoadCamera(*nodeData.Camera) |
| 226 | if err != nil { |
| 227 | return nil, err |
| 228 | } |
| 229 | // Other cases, return empty node |
| 230 | } else { |
| 231 | log.Debug("Empty Node") |
| 232 | in = core.NewNode() |
| 233 | } |
| 234 | |
| 235 | // Get *core.Node from core.INode |
| 236 | node := in.GetNode() |
no test coverage detected