obj

package
v0.0.0-...-d322e89 Latest Latest
Warning

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

Go to latest
Published: Oct 14, 2018 License: BSD-2-Clause Imports: 4 Imported by: 0

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

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Parse

func Parse(r io.Reader, b Builder)

Parse reads r as a ".obj" file and calls b for each statement recognized.

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

type Indices struct {
	Vertex   int
	TexCoord int
	Normal   int
}

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.

Jump to

Keyboard shortcuts

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