Documentation
¶
Overview ¶
Package modeler implements helper methods to write common glTF entities (indices, positions, colors, ...) into buffers.
Example ¶
package main import ( "github.com/amorist/gltf" "github.com/amorist/gltf/modeler" ) func main() { doc := gltf.NewDocument() positionAccessor := modeler.WritePosition(doc, [][3]float32{{43, 43, 0}, {83, 43, 0}, {63, 63, 40}, {43, 83, 0}, {83, 83, 0}}) indicesAccessor := modeler.WriteIndices(doc, []uint16{0, 1, 2, 3, 1, 0, 0, 2, 3, 1, 4, 2, 4, 3, 2, 4, 1, 3}) colorIndices := modeler.WriteColor(doc, [][3]uint8{{50, 155, 255}, {0, 100, 200}, {255, 155, 50}, {155, 155, 155}, {25, 25, 25}}) doc.Meshes = []*gltf.Mesh{{ Name: "Pyramid", Primitives: []*gltf.Primitive{ { Indices: gltf.Index(indicesAccessor), Attributes: map[string]uint32{ gltf.POSITION: positionAccessor, gltf.COLOR_0: colorIndices, }, }, }, }} doc.Nodes = []*gltf.Node{{Name: "Root", Mesh: gltf.Index(0)}} doc.Scenes[0].Nodes = append(doc.Scenes[0].Nodes, 0) if err := gltf.SaveBinary(doc, "./example.glb"); err != nil { panic(err) } }
Output:
Index ¶
- func ReadAccessor(doc *gltf.Document, acr *gltf.Accessor, buffer interface{}) (interface{}, error)
- func ReadBufferView(doc *gltf.Document, bv *gltf.BufferView) ([]byte, error)
- func ReadColor(doc *gltf.Document, acr *gltf.Accessor, buffer [][4]uint8) ([][4]uint8, error)
- func ReadColor64(doc *gltf.Document, acr *gltf.Accessor, buffer [][4]uint16) ([][4]uint16, error)
- func ReadIndices(doc *gltf.Document, acr *gltf.Accessor, buffer []uint32) ([]uint32, error)
- func ReadJoints(doc *gltf.Document, acr *gltf.Accessor, buffer [][4]uint16) ([][4]uint16, error)
- func ReadNormal(doc *gltf.Document, acr *gltf.Accessor, buffer [][3]float32) ([][3]float32, error)
- func ReadPosition(doc *gltf.Document, acr *gltf.Accessor, buffer [][3]float32) ([][3]float32, error)
- func ReadTangent(doc *gltf.Document, acr *gltf.Accessor, buffer [][4]float32) ([][4]float32, error)
- func ReadTextureCoord(doc *gltf.Document, acr *gltf.Accessor, buffer [][2]float32) ([][2]float32, error)
- func ReadWeights(doc *gltf.Document, acr *gltf.Accessor, buffer [][4]float32) ([][4]float32, error)
- func WriteAccessor(doc *gltf.Document, target gltf.Target, data interface{}) uint32
- func WriteAccessorsInterleaved(doc *gltf.Document, data ...interface{}) ([]uint32, error)
- func WriteAttributesInterleaved(doc *gltf.Document, v Attributes) (map[string]uint32, error)
- func WriteBufferView(doc *gltf.Document, target gltf.Target, data interface{}) uint32
- func WriteBufferViewInterleaved(doc *gltf.Document, data ...interface{}) (uint32, error)
- func WriteColor(doc *gltf.Document, data interface{}) uint32
- func WriteImage(doc *gltf.Document, name string, mimeType string, r io.Reader) (uint32, error)
- func WriteIndices(doc *gltf.Document, data interface{}) uint32
- func WriteJoints(doc *gltf.Document, data interface{}) uint32
- func WriteNormal(doc *gltf.Document, data [][3]float32) uint32
- func WritePosition(doc *gltf.Document, data [][3]float32) uint32
- func WriteTangent(doc *gltf.Document, data [][4]float32) uint32
- func WriteTextureCoord(doc *gltf.Document, data interface{}) uint32
- func WriteWeights(doc *gltf.Document, data interface{}) uint32
- type Attributes
- type CustomAttribute
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func ReadAccessor ¶
ReadAccessor returns the data references by acr as an slice whose element types are the ones associated with acr.ComponentType and acr.Type.
If data is an slice whose elements type matches the accessor type then data will be used as backing slice, else a new slice will be allocated.
ReadAccessor supports all types of accessors: non-interleaved, interleaved, sparse, without buffer views, ..., and any combinations of them.
ReadAccessor is safe to use even with malformed documents. If that happens it will return an error instead of panic.
func ReadBufferView ¶
ReadBufferView returns the slice of bytes associated with the BufferView.
It is safe to use even with malformed documents. If that happens it will return an error instead of panic.
func ReadColor ¶
ReadColor returns the data referenced by acr. If acr.ComponentType is other than Ubyte the data will be converted and normalized appropriately.
See ReadAccessor for more info.
func ReadColor64 ¶
ReadColor returns the data referenced by acr. If acr.ComponentType is other than Ushort the data will be converted and normalized appropriately.
See ReadAccessor for more info.
func ReadIndices ¶
ReadIndices returns the data referenced by acr. If acr.ComponentType is other than Uint the data will be converted appropriately.
See ReadAccessor for more info.
func ReadJoints ¶
ReadJoints returns the data referenced by acr. If acr.ComponentType is other than Ushort the data will be converted and denormalized appropriately.
See ReadAccessor for more info.
func ReadPosition ¶
func ReadPosition(doc *gltf.Document, acr *gltf.Accessor, buffer [][3]float32) ([][3]float32, error)
ReadPosition returns the data referenced by acr.
See ReadAccessor for more info.
func ReadTextureCoord ¶
func ReadTextureCoord(doc *gltf.Document, acr *gltf.Accessor, buffer [][2]float32) ([][2]float32, error)
ReadTextureCoord returns the data referenced by acr. If acr.ComponentType is other than Float the data will be converted and denormalized appropriately.
See ReadAccessor for more info.
func ReadWeights ¶
ReadWeights returns the data referenced by acr. If acr.ComponentType is other than Float the data will be converted and denormalized appropriately.
See ReadAccessor for more info.
func WriteAccessor ¶
WriteAccessor adds a new Accessor to doc and fills the buffer with the data. Returns the index of the new accessor.
func WriteAccessorsInterleaved ¶
WriteAccessorsInterleaved adds as many accessors as elements in data all pointing to the same interleaved buffer view and fills the buffer with the data. Returns an slice with the indices of the newly created accessors, with the same order as data or an error if the data elements don´t have all the same length.
Example ¶
package main import ( "github.com/amorist/gltf" "github.com/amorist/gltf/modeler" ) func main() { doc := gltf.NewDocument() indices, _ := modeler.WriteAccessorsInterleaved(doc, [][3]float32{{43, 43, 0}, {83, 43, 0}, {63, 63, 40}, {43, 83, 0}, {83, 83, 0}}, [][3]uint8{{50, 155, 255}, {0, 100, 200}, {255, 155, 50}, {155, 155, 155}, {25, 25, 25}}, ) indicesAccessor := modeler.WriteIndices(doc, []uint16{0, 1, 2, 3, 1, 0, 0, 2, 3, 1, 4, 2, 4, 3, 2, 4, 1, 3}) doc.Meshes = []*gltf.Mesh{{ Name: "Pyramid", Primitives: []*gltf.Primitive{ { Indices: gltf.Index(indicesAccessor), Attributes: map[string]uint32{ gltf.POSITION: indices[0], gltf.COLOR_0: indices[1], }, }, }, }} doc.Nodes = []*gltf.Node{{Name: "Root", Mesh: gltf.Index(0)}} doc.Scenes[0].Nodes = append(doc.Scenes[0].Nodes, 0) if err := gltf.SaveBinary(doc, "./example.glb"); err != nil { panic(err) } }
Output:
func WriteAttributesInterleaved ¶
WriteAttributesInterleaved write all the attributes in v which are not nil and have a non-zero length. Returns an attribute map that can be directly used as a primitive attributes.
Example ¶
package main import ( "github.com/amorist/gltf" "github.com/amorist/gltf/modeler" ) func main() { doc := gltf.NewDocument() attrs, _ := modeler.WriteAttributesInterleaved(doc, modeler.Attributes{ Position: [][3]float32{{1, 2, 3}, {0, 0, -1}}, Normal: [][3]float32{{1, 2, 3}, {0, 0, -1}}, Tangent: [][4]float32{{1, 2, 3, 4}, {1, 2, 3, 4}}, TextureCoord_0: [][2]uint8{{0, 255}, {255, 0}}, TextureCoord_1: [][2]float32{{1, 2}, {1, 2}}, Joints: [][4]uint8{{1, 2, 3, 4}, {1, 2, 3, 4}}, Weights: [][4]uint8{{1, 2, 3, 4}, {1, 2, 3, 4}}, Color: [][3]uint8{{255, 255, 255}, {0, 255, 0}}, CustomAttributes: []modeler.CustomAttribute{ {Name: "COLOR_1", Data: [][3]uint8{{0, 0, 255}, {100, 200, 0}}}, {Name: "COLOR_2", Data: [][4]uint8{{23, 58, 188, 1}, {0, 155, 0, 0}}}, }, }) indicesAccessor := modeler.WriteIndices(doc, []uint16{0, 1, 2, 3, 1, 0, 0, 2, 3, 1, 4, 2, 4, 3, 2, 4, 1, 3}) doc.Meshes = []*gltf.Mesh{{ Name: "Pyramid", Primitives: []*gltf.Primitive{ { Indices: gltf.Index(indicesAccessor), Attributes: attrs, }, }, }} doc.Nodes = []*gltf.Node{{Name: "Root", Mesh: gltf.Index(0)}} doc.Scenes[0].Nodes = append(doc.Scenes[0].Nodes, 0) if err := gltf.SaveBinary(doc, "./example.glb"); err != nil { panic(err) } }
Output:
func WriteBufferView ¶
WriteBufferView adds a new BufferView to doc and fills the buffer with the data. Returns the index of the new buffer view.
func WriteBufferViewInterleaved ¶
WriteBufferViewInterleaved adds a new BufferView to doc and fills the buffer with one or more vertex attribute. If success it returns the index of the new buffer view. Returns the index of the new buffer view or an error if the data elements don´t have all the same length.
func WriteColor ¶
WriteColor adds a new COLOR accessor to doc and fills the buffer with data. If success it returns the index of the new accessor.
func WriteImage ¶
WriteImage adds a new image to doc and fills the buffer with the image data. If success it returns the index of the new image.
Example ¶
package main import ( "bytes" "io/ioutil" "github.com/amorist/gltf" "github.com/amorist/gltf/modeler" ) func main() { img, err := ioutil.ReadFile("../assets/gopher_high.png") if err != nil { panic(err) } doc := gltf.NewDocument() indicesAccessor := modeler.WriteIndices(doc, []uint16{0, 1, 2, 3, 1, 0, 0, 2, 3, 1, 4, 2, 4, 3, 2, 4, 1, 3}) positionAccessor := modeler.WritePosition(doc, [][3]float32{{43, 43, 0}, {83, 43, 0}, {63, 63, 40}, {43, 83, 0}, {83, 83, 0}}) textureAccessor := modeler.WriteTextureCoord(doc, [][2]float32{{0, 1}, {0.4, 1}, {0.4, 0}, {0.4, 1}, {0, 1}}) imageIdx, err := modeler.WriteImage(doc, "gopher", "image/png", bytes.NewReader(img)) if err != nil { panic(err) } doc.Textures = append(doc.Textures, &gltf.Texture{Source: gltf.Index(imageIdx)}) doc.Materials = append(doc.Materials, &gltf.Material{ Name: "Texture", PBRMetallicRoughness: &gltf.PBRMetallicRoughness{ BaseColorTexture: &gltf.TextureInfo{ Index: uint32(len(doc.Textures) - 1), }, MetallicFactor: gltf.Float(0), }, }) doc.Meshes = []*gltf.Mesh{{ Name: "Pyramid", Primitives: []*gltf.Primitive{ { Indices: gltf.Index(indicesAccessor), Attributes: map[string]uint32{ gltf.POSITION: positionAccessor, gltf.TEXCOORD_0: textureAccessor, }, Material: gltf.Index(uint32(len(doc.Materials) - 1)), }, }, }} doc.Nodes = []*gltf.Node{{Name: "Root", Mesh: gltf.Index(0)}} doc.Scenes[0].Nodes = append(doc.Scenes[0].Nodes, 0) if err := gltf.SaveBinary(doc, "./example.glb"); err != nil { panic(err) } }
Output:
func WriteIndices ¶
WriteIndices adds a new INDICES accessor to doc and fills the last buffer with data. If success it returns the index of the new accessor.
func WriteJoints ¶
WriteJoints adds a new JOINTS accessor to doc and fills the last buffer with data. If success it returns the index of the new accessor.
func WriteNormal ¶
WriteNormal adds a new NORMAL accessor to doc and fills the last buffer with data. If success it returns the index of the new accessor.
func WritePosition ¶
WritePosition adds a new POSITION accessor to doc and fills the last buffer with data. If success it returns the index of the new accessor.
func WriteTangent ¶
WriteTangent adds a new TANGENT accessor to doc and fills the last buffer with data. If success it returns the index of the new accessor.
func WriteTextureCoord ¶
WriteTextureCoord adds a new TEXTURECOORD accessor to doc and fills the last buffer with data. If success it returns the index of the new accessor.
func WriteWeights ¶
WriteWeights adds a new WEIGHTS accessor to doc and fills the last buffer with data. If success it returns the index of the new accessor.
Types ¶
type Attributes ¶
type Attributes struct { Position [][3]float32 Normal [][3]float32 Tangent [][4]float32 // [][2]uint8, [][2]uint16 or [][2]float32 TextureCoord_0, TextureCoord_1 interface{} // [][4]uint8, [][4]uint16 or [][4]float32 Weights interface{} // [][4]uint8 or [][4]uint16 Joints interface{} //[]color.RGBA, []color.RGBA64, [][4]uint8, [][3]uint8, [][4]uint16, [][3]uint16, [][3]float32 or [][4]float32 Color interface{} CustomAttributes []CustomAttribute }
Attributes defines all the vertex attributes that can be associated to a primitive.
type CustomAttribute ¶
type CustomAttribute struct { Name string Data interface{} }
CustomAttribute defines an application-specific attribute