Skip to content

Commit 3863f13

Browse files
author
hj
committed
update
1 parent 166daa3 commit 3863f13

File tree

5 files changed

+212
-7
lines changed

5 files changed

+212
-7
lines changed

batch_table.go

+7-6
Original file line numberDiff line numberDiff line change
@@ -106,18 +106,19 @@ func (h *BatchTable) Read(reader io.ReadSeeker, header Header, batchLength int)
106106
if header.GetBatchTableJSONByteLength() <= 0 {
107107
return nil
108108
}
109-
jsonb := make([]byte, header.GetBatchTableJSONByteLength())
109+
jsonLen := header.GetBatchTableJSONByteLength()
110110

111-
if _, err := reader.Read(jsonb); err != nil {
112-
return err
113-
}
114-
115-
if batchLength == 0 {
111+
if jsonLen == 0 {
116112
h.Data = make(map[string]interface{})
117113
h.Header = make(map[string]interface{})
118114
return nil
119115
}
120116

117+
jsonb := make([]byte, jsonLen)
118+
if _, err := reader.Read(jsonb); err != nil {
119+
return err
120+
}
121+
121122
jsonr := bytes.NewReader(jsonb)
122123
if err := h.readJSONHeader(jsonr); err != nil {
123124
return err

go.mod

+4-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,7 @@ module github.com/flywave/go-3dtile
22

33
go 1.16
44

5-
require github.com/qmuntal/gltf v0.20.3
5+
require (
6+
github.com/flywave/go3d v0.0.0-20211208020909-d2697502845a
7+
github.com/qmuntal/gltf v0.20.3
8+
)

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
github.com/flywave/go3d v0.0.0-20211208020909-d2697502845a h1:H6CwqyMjCgfXULAIG2zhCdkOgkeqluBuafjEuemuVJY=
2+
github.com/flywave/go3d v0.0.0-20211208020909-d2697502845a/go.mod h1:0/K6WtaMwhhVJb84xWStt+ALQl2EdvzW2oJqz+330GU=
13
github.com/go-test/deep v1.0.1 h1:UQhStjbkDClarlmv0am7OXXO4/GaPdCGiUiMTvi28sg=
24
github.com/go-test/deep v1.0.1/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
35
github.com/qmuntal/gltf v0.20.3 h1:9oW6IAgHROZjwBcEVgkBhH1SR/7TLlVfSn6VDr/2h3E=

oct_encoded_normal.go

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package tile3d
2+
3+
import "math"
4+
5+
func clamp(val float32, minVal float32, maxVal float32) float32 {
6+
if val < minVal {
7+
return minVal
8+
}
9+
10+
if val > maxVal {
11+
return maxVal
12+
}
13+
14+
return val
15+
}
16+
17+
func clampUint8(val float32) uint16 {
18+
return roundUint16(0.5 + float64(clamp(val, -1, 1)*0.5+0.5)*255.0)
19+
}
20+
21+
func roundUint16(val float64) uint16 {
22+
return uint16(val)
23+
}
24+
25+
func signNotZero(val float32) float32 {
26+
if val < 0.0 {
27+
return -1.0
28+
}
29+
return 1.0
30+
}
31+
32+
type OctEncodedNormal struct {
33+
value uint16
34+
}
35+
36+
func NewOctEncodedNormal(v [3]float32) *OctEncodedNormal {
37+
return &OctEncodedNormal{value: encodeXYZ(v[0], v[1], v[2])}
38+
}
39+
40+
func (n *OctEncodedNormal) Decode() [3]float32 {
41+
return decodeValue(n.value)
42+
}
43+
44+
func encodeXYZ(nx float32, ny float32, nz float32) uint16 {
45+
denom := float32(math.Abs(float64(nx)) + math.Abs(float64(ny)) + math.Abs(float64(nz)))
46+
rx := nx / denom
47+
ry := ny / denom
48+
if nz < 0 {
49+
x := rx
50+
y := ry
51+
rx = (1 - float32(math.Abs(float64(y)))) * signNotZero(x)
52+
ry = (1 - float32(math.Abs(float64(x)))) * signNotZero(y)
53+
}
54+
return clampUint8(rx) | clampUint8(ry)<<8
55+
}
56+
57+
func decodeValue(val uint16) [3]float32 {
58+
ex := float32(val & 0xff)
59+
ey := float32(val >> 8)
60+
ex = ex/255.0*2.0 - 1.0
61+
ey = ey/255.0*2.0 - 1.0
62+
ez := 1 - float32(math.Abs(float64(ex))+math.Abs(float64(ey)))
63+
var n [3]float32
64+
65+
n[0] = ex
66+
n[1] = ey
67+
n[2] = ez
68+
69+
if n[2] < 0 {
70+
x := n[0]
71+
y := n[1]
72+
73+
n[0] = (1 - float32(math.Abs(float64(y)))) * signNotZero(x)
74+
n[1] = (1 - float32(math.Abs(float64(x)))) * signNotZero(y)
75+
}
76+
77+
n = normalizeInPlace(n)
78+
79+
return n
80+
}
81+
82+
const smallMetricDistance = 1.0e-6
83+
84+
func inverseMetricDistance(a float64) *float64 {
85+
if math.Abs(a) <= smallMetricDistance {
86+
return nil
87+
}
88+
dist := 1.0 / a
89+
return &dist
90+
}
91+
92+
func normalizeInPlace(n [3]float32) [3]float32 {
93+
magnitude := math.Sqrt(float64(n[0]*n[0] + n[1]*n[1] + n[2]*n[2]))
94+
a := inverseMetricDistance(magnitude)
95+
if a == nil {
96+
return n
97+
}
98+
n[0] *= float32(*a)
99+
n[1] *= float32(*a)
100+
n[2] *= float32(*a)
101+
return n
102+
}

quantization.go

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package tile3d
2+
3+
import (
4+
"math"
5+
6+
"github.com/flywave/go3d/vec3"
7+
)
8+
9+
const rangeScale16 = 0xffff
10+
const rangeScale8 = 0xff
11+
12+
func computeScale(extent float32, rangeScale uint16) float32 {
13+
if 0.0 == extent {
14+
return extent
15+
}
16+
return float32(rangeScale) / extent
17+
}
18+
19+
func isInRange(qpos uint16, rangeScale uint16) bool {
20+
return qpos >= 0 && qpos < rangeScale+1
21+
}
22+
23+
func Quantize(pos float32, origin float32, scale float32, rangeScale uint16) uint16 {
24+
return uint16(math.Floor(math.Max(0.0, math.Min(float64(rangeScale), float64(0.5+(pos-origin)*scale)))))
25+
}
26+
27+
func IsQuantizable(pos float32, origin float32, scale float32, rangeScale uint16) bool {
28+
return isInRange(Quantize(pos, origin, scale, rangeScale), rangeScale16)
29+
}
30+
31+
func UnQuantize(qpos uint16, origin float32, scale float32) float32 {
32+
if 0.0 == scale {
33+
return origin
34+
}
35+
return origin + float32(qpos)/scale
36+
}
37+
38+
func IsQuantized(qpos uint16) bool {
39+
return isInRange(qpos, rangeScale16) && qpos == uint16(math.Floor(float64(qpos)))
40+
}
41+
42+
type QParams3d struct {
43+
Origin [3]float32
44+
Scale [3]float32
45+
}
46+
47+
func (p *QParams3d) SetFromRange(range_ *vec3.Box, rangeScale uint16) {
48+
p.Origin[0] = range_.Min[0]
49+
p.Origin[1] = range_.Min[1]
50+
p.Origin[2] = range_.Min[2]
51+
52+
p.Scale[0] = computeScale(range_.Max[0]-range_.Min[0], rangeScale)
53+
p.Scale[1] = computeScale(range_.Max[1]-range_.Min[1], rangeScale)
54+
p.Scale[2] = computeScale(range_.Max[2]-range_.Min[2], rangeScale)
55+
}
56+
57+
func (p *QParams3d) rangeDiagonal() [3]float32 {
58+
var x float32
59+
var y float32
60+
var z float32
61+
62+
if p.Scale[0] == 0 {
63+
x = 0
64+
} else {
65+
x = rangeScale16 / p.Scale[0]
66+
}
67+
68+
if p.Scale[1] == 0 {
69+
y = 0
70+
} else {
71+
y = rangeScale16 / p.Scale[1]
72+
}
73+
74+
if p.Scale[2] == 0 {
75+
z = 0
76+
} else {
77+
z = rangeScale16 / p.Scale[2]
78+
}
79+
80+
return [3]float32{x, y, z}
81+
}
82+
83+
func QuantizePoint3d(pos [3]float32, params *QParams3d) [3]uint16 {
84+
var out [3]uint16
85+
out[0] = Quantize(pos[0], params.Origin[0], params.Scale[0], rangeScale16)
86+
out[1] = Quantize(pos[1], params.Origin[1], params.Scale[1], rangeScale16)
87+
out[2] = Quantize(pos[2], params.Origin[2], params.Scale[2], rangeScale16)
88+
return out
89+
}
90+
91+
func UnQuantizePoint3d(qpos [3]uint16, params *QParams3d) [3]float32 {
92+
var out [3]float32
93+
out[0] = UnQuantize(qpos[0], params.Origin[0], params.Scale[0])
94+
out[1] = UnQuantize(qpos[1], params.Origin[1], params.Scale[1])
95+
out[2] = UnQuantize(qpos[2], params.Origin[2], params.Scale[2])
96+
return out
97+
}

0 commit comments

Comments
 (0)