view pkg/octree/loader.go @ 729:b0bd242ff821

Removed vertex duplicate.
author Sascha L. Teichmann <teichmann@intevation.de>
date Sat, 22 Sep 2018 22:14:31 +0200
parents 41c8dc61f38f
children a244b18cb916
line wrap: on
line source

package octree

import (
	"bufio"
	"bytes"
	"encoding/binary"
	"log"
	"os"

	"github.com/golang/snappy"
)

func loadReader(r *bufio.Reader) (*Tree, error) {
	tree := new(Tree)

	if err := binary.Read(r, binary.LittleEndian, &tree.EPSG); err != nil {
		return nil, err
	}

	log.Printf("EPSG: %d\n", tree.EPSG)

	if err := tree.Min.Read(r); err != nil {
		return nil, err
	}

	if err := tree.Max.Read(r); err != nil {
		return nil, err
	}

	log.Printf("BBOX: [[%f, %f, %f], [%f, %f, %f]]\n",
		tree.Min.X, tree.Min.Y, tree.Min.Z,
		tree.Max.X, tree.Max.Y, tree.Max.Z)

	var numVertices uint32
	if err := binary.Read(r, binary.LittleEndian, &numVertices); err != nil {
		return nil, err
	}

	log.Printf("vertices: %d\n", numVertices)

	vertices := make([]Vertex, numVertices)
	tree.vertices = vertices

	for i := range vertices {
		if err := vertices[i].Read(r); err != nil {
			return nil, err
		}
	}

	var numTriangles uint32
	if err := binary.Read(r, binary.LittleEndian, &numTriangles); err != nil {
		return nil, err
	}

	log.Printf("triangles: %d\n", numTriangles)

	indices := make([]int32, 3*numTriangles)
	triangles := make([][]int32, numTriangles)
	tree.triangles = triangles

	var last int32

	for i := range triangles {
		tri := indices[:3]
		indices = indices[3:]
		triangles[i] = tri
		for j := range tri {
			v, err := binary.ReadVarint(r)
			if err != nil {
				return nil, err
			}
			value := int32(v) + last
			tri[j] = value
			last = value
		}
	}

	var numNodes uint32
	if err := binary.Read(r, binary.LittleEndian, &numNodes); err != nil {
		return nil, err
	}

	log.Printf("num nodes: %d\n", numNodes)

	tree.index = make([]int32, numNodes)
	entries := tree.index[1:]

	last = 0
	for i := range entries {
		v, err := binary.ReadVarint(r)
		if err != nil {
			return nil, err
		}
		value := int32(v) + last
		entries[i] = value
		last = value
	}

	return tree, nil
}

func LoadTree(fname string) (*Tree, error) {

	f, err := os.Open(fname)
	if err != nil {
		return nil, err
	}
	defer f.Close()
	return loadReader(
		bufio.NewReader(
			snappy.NewReader(f)))
}

func Deserialize(data []byte) (*Tree, error) {
	return loadReader(
		bufio.NewReader(
			snappy.NewReader(
				bytes.NewReader(data))))
}