modeler

package
v0.25.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 16, 2024 License: BSD-2-Clause Imports: 10 Imported by: 18

Documentation

Overview

Package modeler implements helper methods to write common glTF entities (indices, positions, colors, ...) into buffers.

Example
package main

import (
	"github.com/qmuntal/gltf"
	"github.com/qmuntal/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

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func ReadAccessor added in v0.17.0

func ReadAccessor(doc *gltf.Document, acr *gltf.Accessor, buffer any) (any, error)

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 added in v0.17.0

func ReadBufferView(doc *gltf.Document, bv *gltf.BufferView) ([]byte, error)

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 added in v0.17.0

func ReadColor(doc *gltf.Document, acr *gltf.Accessor, buffer [][4]uint8) ([][4]uint8, error)

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 added in v0.17.0

func ReadColor64(doc *gltf.Document, acr *gltf.Accessor, buffer [][4]uint16) ([][4]uint16, error)

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 added in v0.17.0

func ReadIndices(doc *gltf.Document, acr *gltf.Accessor, buffer []uint32) ([]uint32, error)

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 added in v0.17.0

func ReadJoints(doc *gltf.Document, acr *gltf.Accessor, buffer [][4]uint16) ([][4]uint16, error)

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 ReadNormal added in v0.17.0

func ReadNormal(doc *gltf.Document, acr *gltf.Accessor, buffer [][3]float32) ([][3]float32, error)

ReadNormal returns the data referenced by acr.

See ReadAccessor for more info.

func ReadPosition added in v0.17.0

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 ReadTangent added in v0.17.0

func ReadTangent(doc *gltf.Document, acr *gltf.Accessor, buffer [][4]float32) ([][4]float32, error)

ReadTangent returns the data referenced by acr.

See ReadAccessor for more info.

func ReadTextureCoord added in v0.17.0

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 added in v0.17.0

func ReadWeights(doc *gltf.Document, acr *gltf.Accessor, buffer [][4]float32) ([][4]float32, error)

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 added in v0.16.0

func WriteAccessor(doc *gltf.Document, target gltf.Target, data any) uint32

WriteAccessor adds a new Accessor to doc and fills the buffer with the data. Returns the index of the new accessor.

func WriteAccessorsInterleaved added in v0.17.3

func WriteAccessorsInterleaved(doc *gltf.Document, data ...any) ([]uint32, error)

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/qmuntal/gltf"
	"github.com/qmuntal/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 added in v0.17.3

func WriteAttributesInterleaved(doc *gltf.Document, v Attributes) (map[string]uint32, error)

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/qmuntal/gltf"
	"github.com/qmuntal/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 added in v0.16.0

func WriteBufferView(doc *gltf.Document, target gltf.Target, data any) uint32

WriteBufferView adds a new BufferView to doc and fills the buffer with the data. Returns the index of the new buffer view.

func WriteBufferViewInterleaved added in v0.17.3

func WriteBufferViewInterleaved(doc *gltf.Document, data ...any) (uint32, error)

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 added in v0.16.0

func WriteColor(doc *gltf.Document, data any) uint32

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 added in v0.16.0

func WriteImage(doc *gltf.Document, name string, mimeType string, r io.Reader) (uint32, error)

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/qmuntal/gltf"
	"github.com/qmuntal/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 added in v0.16.0

func WriteIndices(doc *gltf.Document, data any) uint32

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 added in v0.16.0

func WriteJoints(doc *gltf.Document, data any) uint32

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 added in v0.16.0

func WriteNormal(doc *gltf.Document, data [][3]float32) uint32

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 added in v0.16.0

func WritePosition(doc *gltf.Document, data [][3]float32) uint32

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 added in v0.16.0

func WriteTangent(doc *gltf.Document, data [][4]float32) uint32

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 added in v0.16.0

func WriteTextureCoord(doc *gltf.Document, data any) uint32

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 added in v0.16.0

func WriteWeights(doc *gltf.Document, data any) uint32

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 added in v0.17.3

type Attributes struct {
	Position [][3]float32
	Normal   [][3]float32
	Tangent  [][4]float32
	// [][2]uint8, [][2]uint16 or [][2]float32
	TextureCoord_0, TextureCoord_1 any
	// [][4]uint8, [][4]uint16 or [][4]float32
	Weights any
	// [][4]uint8 or [][4]uint16
	Joints any
	//[]color.RGBA, []color.RGBA64, [][4]uint8, [][3]uint8, [][4]uint16, [][3]uint16, [][3]float32 or [][4]float32
	Color            any
	CustomAttributes []CustomAttribute
}

Attributes defines all the vertex attributes that can be associated to a primitive.

type CustomAttribute added in v0.17.3

type CustomAttribute struct {
	Name string
	Data any
}

CustomAttribute defines an application-specific attribute

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL