Documentation ¶
Overview ¶
Package obj implements a simple parser for Wavefront ".obj" file format.
Example (ObjParser) ¶
package main import ( "fmt" "os" "github.com/cozely/cozely/formats/obj" ) func main() { f, err := os.Open("testdata/cube.obj") if err != nil { fmt.Println(err) return } obj.Parse(f, builder{}) } //////////////////////////////////////////////////////////////////////////////// type builder struct{ obj.DefaultBuilder } func (builder) Comment(txt string) error { fmt.Printf("%s\n", txt) return nil } func (builder) O(name string) error { fmt.Printf("o %s\n", name) return nil } func (builder) G(names ...string) error { fmt.Printf("g") for _, n := range names { fmt.Printf(" %s", n) } fmt.Printf("\n") return nil } func (builder) S(group int) error { fmt.Printf("s %d\n", group) return nil } func (builder) LOD(level int) error { fmt.Printf("lod %d\n", level) return nil } func (builder) V(coords ...float32) error { fmt.Printf("v") for _, v := range coords { fmt.Printf(" %f", v) } fmt.Printf("\n") return nil } func (builder) VT(coords ...float32) error { fmt.Printf("vt") for _, v := range coords { fmt.Printf(" %f", v) } fmt.Printf("\n") return nil } func (builder) VN(coords ...float32) error { fmt.Printf("vn") for _, v := range coords { fmt.Printf(" %f", v) } fmt.Printf("\n") return nil } func (builder) F(verts ...obj.Indices) error { fmt.Printf("f") for _, v := range verts { switch { case v.TexCoord != 0 && v.Normal != 0: fmt.Printf(" %d/%d/%d", v.Vertex, v.TexCoord, v.Normal) case v.TexCoord != 0: fmt.Printf(" %d/%d", v.Vertex, v.TexCoord) case v.Normal != 0: fmt.Printf(" %d//%d", v.Vertex, v.Normal) default: fmt.Printf(" %d", v.Vertex) } } fmt.Printf("\n") return nil } func (builder) P(verts ...obj.Indices) error { fmt.Printf("p") for _, v := range verts { switch { case v.TexCoord != 0 && v.Normal != 0: fmt.Printf(" %d/%d/%d", v.Vertex, v.TexCoord, v.Normal) case v.TexCoord != 0: fmt.Printf(" %d/%d", v.Vertex, v.TexCoord) case v.Normal != 0: fmt.Printf(" %d//%d", v.Vertex, v.Normal) default: fmt.Printf(" %d", v.Vertex) } } fmt.Printf("\n") return nil } func (builder) L(verts ...obj.Indices) error { fmt.Printf("l") for _, v := range verts { switch { case v.TexCoord != 0 && v.Normal != 0: fmt.Printf(" %d/%d/%d", v.Vertex, v.TexCoord, v.Normal) case v.TexCoord != 0: fmt.Printf(" %d/%d", v.Vertex, v.TexCoord) case v.Normal != 0: fmt.Printf(" %d//%d", v.Vertex, v.Normal) default: fmt.Printf(" %d", v.Vertex) } } fmt.Printf("\n") return nil } func (builder) MtlLib(names ...string) error { fmt.Printf("mtllib") for _, n := range names { fmt.Printf(" %s", n) } fmt.Printf("\n") return nil } func (builder) UseMtl(name string) error { fmt.Printf("usemtl %s\n", name) return nil } func (builder) MapLib(names ...string) error { fmt.Printf("maplib") for _, n := range names { fmt.Printf(" %s", n) } fmt.Printf("\n") return nil } func (builder) UseMap(name string) error { fmt.Printf("usemap %s\n", name) return nil } func (builder) NotSupported(txt string) error { fmt.Printf("NOT SUPPORTED: %s\n", txt) return nil }
Output: # Blender v2.78 (sub 0) OBJ File: '' # www.blender.org o cube v -1.000000 -1.000000 1.000000 v -1.000000 1.000000 1.000000 v -1.000000 -1.000000 -1.000000 v -1.000000 1.000000 -1.000000 v 1.000000 -1.000000 1.000000 v 1.000000 1.000000 1.000000 v 1.000000 -1.000000 -1.000000 v 1.000000 1.000000 -1.000000 usemtl 0 s 0 f 5 6 2 1 usemtl 1 f 3 4 8 7 usemtl 2 f 8 4 2 6 usemtl 3 f 3 7 5 1 usemtl 4 f 1 2 4 3 usemtl 5 f 7 8 6 5
Index ¶
- func Parse(r io.Reader, b Builder)
- type Builder
- type DefaultBuilder
- func (DefaultBuilder) Comment(txt string) error
- func (DefaultBuilder) F(verts ...Indices) error
- func (DefaultBuilder) G(names ...string) error
- func (DefaultBuilder) L(verts ...Indices) error
- func (DefaultBuilder) LOD(level int) error
- func (DefaultBuilder) MapLib(name ...string) error
- func (DefaultBuilder) MtlLib(name ...string) error
- func (DefaultBuilder) NotSupported(txt string) error
- func (DefaultBuilder) O(name string) error
- func (DefaultBuilder) P(verts ...Indices) error
- func (DefaultBuilder) S(group int) error
- func (DefaultBuilder) UseMap(name string) error
- func (DefaultBuilder) UseMtl(name string) error
- func (DefaultBuilder) V(coords ...float32) error
- func (DefaultBuilder) VN(coords ...float32) error
- func (DefaultBuilder) VT(coords ...float32) error
- type Indices
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
Types ¶
type Builder ¶
type Builder interface { Comment(txt string) error O(name string) error G(names ...string) error V(coords ...float32) error VT(coords ...float32) error VN(coords ...float32) error P(verts ...Indices) error L(verts ...Indices) error F(verts ...Indices) error S(group int) error LOD(level int) error MtlLib(names ...string) error UseMtl(name string) error MapLib(names ...string) error UseMap(name string) error NotSupported(txt string) error }
A Builder is used when parsing a ".obj" file. The methods are called each time a statement is encountered, in the order they appear in the file.
type DefaultBuilder ¶
type DefaultBuilder struct{}
func (DefaultBuilder) Comment ¶
func (DefaultBuilder) Comment(txt string) error
func (DefaultBuilder) F ¶
func (DefaultBuilder) F(verts ...Indices) error
func (DefaultBuilder) G ¶
func (DefaultBuilder) G(names ...string) error
func (DefaultBuilder) L ¶
func (DefaultBuilder) L(verts ...Indices) error
func (DefaultBuilder) LOD ¶
func (DefaultBuilder) LOD(level int) error
func (DefaultBuilder) MapLib ¶
func (DefaultBuilder) MapLib(name ...string) error
func (DefaultBuilder) MtlLib ¶
func (DefaultBuilder) MtlLib(name ...string) error
func (DefaultBuilder) NotSupported ¶
func (DefaultBuilder) NotSupported(txt string) error
func (DefaultBuilder) O ¶
func (DefaultBuilder) O(name string) error
func (DefaultBuilder) P ¶
func (DefaultBuilder) P(verts ...Indices) error
func (DefaultBuilder) S ¶
func (DefaultBuilder) S(group int) error
func (DefaultBuilder) UseMap ¶
func (DefaultBuilder) UseMap(name string) error
func (DefaultBuilder) UseMtl ¶
func (DefaultBuilder) UseMtl(name string) error
func (DefaultBuilder) V ¶
func (DefaultBuilder) V(coords ...float32) error
func (DefaultBuilder) VN ¶
func (DefaultBuilder) VN(coords ...float32) error
func (DefaultBuilder) VT ¶
func (DefaultBuilder) VT(coords ...float32) error
type Indices ¶
Indices regroups the indices of the vertex position, texture coordinates and normal. They follow the convention of ".obj" files: counting start at 1, and negative numbers reference backward from the current position (i.e. -1 is the last defined vertex). When TexCoord or Normal weren't specified in the file, thay are set to 0 in the struct.
Click to show internal directories.
Click to hide internal directories.