Skip to content

Commit 9e807c4

Browse files
author
hj
committed
update
1 parent f643a6f commit 9e807c4

File tree

7 files changed

+70
-29
lines changed

7 files changed

+70
-29
lines changed

b3dm.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,15 @@ func (h *B3dmHeader) SetBatchTableBinaryByteLength(n uint32) {
6868

6969
type B3dmFeatureTableView struct {
7070
BatchLength int
71-
RtcCenter []float32
71+
RtcCenter []float64
7272
}
7373

7474
func B3dmFeatureTableDecode(header map[string]interface{}, buff []byte) map[string]interface{} {
75-
return make(map[string]interface{})
75+
ret := make(map[string]interface{})
76+
l := getIntegerScalarFeatureValue(header, buff, B3DM_PROP_BATCH_LENGTH)
77+
ret[B3DM_PROP_BATCH_LENGTH] = l
78+
ret[B3DM_PROP_RTC_CENTER] = getFloat64Vec3FeatureValue(header, buff, B3DM_PROP_RTC_CENTER)
79+
return ret
7680
}
7781

7882
func B3dmFeatureTableEncode(header map[string]interface{}, data map[string]interface{}) []byte {
@@ -112,7 +116,7 @@ func (m *B3dm) GetFeatureTableView() B3dmFeatureTableView {
112116
ret := B3dmFeatureTableView{}
113117
ret.BatchLength = m.FeatureTable.Header[B3DM_PROP_BATCH_LENGTH].(int)
114118
if m.FeatureTable.Header[B3DM_PROP_RTC_CENTER] != nil {
115-
ret.RtcCenter = m.FeatureTable.Header[B3DM_PROP_RTC_CENTER].([]float32)
119+
ret.RtcCenter = m.FeatureTable.Header[B3DM_PROP_RTC_CENTER].([]float64)
116120
}
117121
return ret
118122
}

feature_util.go

+31
Original file line numberDiff line numberDiff line change
@@ -266,10 +266,35 @@ func getFloatVec3FeatureValue(header map[string]interface{}, buff []byte, propNa
266266
ret[i] = float32(oref[i])
267267
}
268268
return ret
269+
case []interface{}:
270+
ret := [3]float32{}
271+
for i := 0; i < 3; i++ {
272+
ret[i] = float32(oref[i].(float64))
273+
}
274+
return ret
269275
}
270276
return [3]float32{0, 0, 0}
271277
}
272278

279+
func getFloat64Vec3FeatureValue(header map[string]interface{}, buff []byte, propName string) [3]float64 {
280+
objValue := header[propName]
281+
switch oref := objValue.(type) {
282+
case []float64:
283+
ret := [3]float64{}
284+
for i := 0; i < 3; i++ {
285+
ret[i] = oref[i]
286+
}
287+
return ret
288+
case []interface{}:
289+
ret := [3]float64{}
290+
for i := 0; i < 3; i++ {
291+
ret[i] = oref[i].(float64)
292+
}
293+
return ret
294+
}
295+
return [3]float64{0, 0, 0}
296+
}
297+
273298
func getFloatVec4FeatureValue(header map[string]interface{}, buff []byte, propName string) [4]float32 {
274299
objValue := header[propName]
275300
switch oref := objValue.(type) {
@@ -300,6 +325,12 @@ func getFloatArrayFeatureValue(header map[string]interface{}, buff []byte, propN
300325
ret[i] = float32(oref[i])
301326
}
302327
return ret
328+
case []interface{}:
329+
ret := make([]float32, length)
330+
for i := 0; i < length; i++ {
331+
ret[i] = float32(oref[i].(float64))
332+
}
333+
return ret
303334
case float64:
304335
ret := make([]float32, 1)
305336
ret[0] = float32(oref)

geom.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ type GeomFeatureTableView struct {
9393
EllipsoidBatchId interface{}
9494
Spheres []GeomSphere
9595
SphereBatchId interface{}
96-
RtcCenter [3]float32
96+
RtcCenter [3]float64
9797
}
9898

9999
func GeomFeatureTableDecode(header map[string]interface{}, buff []byte) map[string]interface{} {
@@ -277,7 +277,7 @@ func (m *Geom) GetFeatureTableView() GeomFeatureTableView {
277277
ret := GeomFeatureTableView{}
278278

279279
if t := m.FeatureTable.Data[GEOM_PROP_RTC_CENTER]; t != nil {
280-
copy(ret.RtcCenter[:], t.([]float32))
280+
copy(ret.RtcCenter[:], t.([]float64))
281281
}
282282

283283
if t := m.FeatureTable.Data[GEOM_PROP_BOXES_LENGTH]; t != nil {

gltf_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,25 @@ func TestLoadGlb(t *testing.T) {
1212
// f, _ := os.Open("./data/100.glb")
1313
// bt, _ := ioutil.ReadAll(f)
1414
// fmt.Println(len(bt))
15-
g := openGltf("./data/0.glb")
15+
g := openGltf("./data/0-0.glb")
1616
if g == nil {
1717
t.Error("error")
1818
}
1919
}
2020

2121
func TestReadB3dm(t *testing.T) {
22-
f1, _ := os.Open("./data/0-8.i3dm")
22+
f1, _ := os.Open("./data/0-7.i3dm")
2323
// bt := make([]byte, 69)
2424
// f1.Read(bt)
2525
// fmt.Println(string(bt))
2626
cp1 := &I3dm{}
2727
cp1.Read(f1)
2828
bts, _ := mst.GetGltfBinary(cp1.Model, 8)
29-
ioutil.WriteFile("./data/0.glb", bts, 0755)
29+
ioutil.WriteFile("./data/0-0.glb", bts, 0755)
3030
}
3131

3232
func TestReadi3dm(t *testing.T) {
33-
f, _ := os.Open("data/6-290.b3dm")
33+
f, _ := os.Open("data/7-20.b3dm")
3434
// bt := make([]byte, 267)
3535
// f.Read(bt)
3636
// fmt.Println(string(bt))

i3dm.go

+16-16
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ type I3dmFeatureTableView struct {
9393
ScaleNONUniform [][3]float32
9494
BatchId interface{}
9595
InstanceLength int
96-
RtcCenter []float32
96+
RtcCenter []float64
9797
QuantizedVolumeOffset []float32
9898
QuantizedVolumeScale []float32
9999
EastNorthUp *bool
@@ -103,23 +103,23 @@ func I3dmFeatureTableDecode(header map[string]interface{}, buff []byte) map[stri
103103
ret := make(map[string]interface{})
104104
instanceLength := getIntegerScalarFeatureValue(header, buff, I3DM_PROP_INSTANCES_LENGTH)
105105
ret[I3DM_PROP_INSTANCES_LENGTH] = instanceLength
106-
ret[I3DM_PROP_RTC_CENTER] = getFloatVec3FeatureValue(header, buff, I3DM_PROP_RTC_CENTER)
107-
ret[I3DM_PROP_QUANTIZED_VOLUME_OFFSET] = getFloatVec3FeatureValue(header, buff, I3DM_PROP_QUANTIZED_VOLUME_OFFSET)
108-
ret[I3DM_PROP_QUANTIZED_VOLUME_SCALE] = getFloatVec3FeatureValue(header, buff, I3DM_PROP_QUANTIZED_VOLUME_SCALE)
109-
110-
floatArrayValue := getFloatArrayFeatureValue(header, buff, I3DM_PROP_POSITION, int(instanceLength)*3)
106+
ret[I3DM_PROP_RTC_CENTER] = getFloat64Vec3FeatureValue(header, buff, I3DM_PROP_RTC_CENTER)
107+
floatArrayValue := getFloatVec3ArrayFeatureValue(header, buff, I3DM_PROP_POSITION, int(instanceLength))
111108
if floatArrayValue != nil {
112109
ret[I3DM_PROP_POSITION] = floatArrayValue
113110
}
114111
unsignedShortArrayValue := getUnsignedShortVec3ArrayFeatureValue(header, buff, I3DM_PROP_POSITION_QUANTIZED, int(instanceLength))
115112
if unsignedShortArrayValue != nil {
116113
ret[I3DM_PROP_POSITION_QUANTIZED] = unsignedShortArrayValue
114+
ret[I3DM_PROP_QUANTIZED_VOLUME_OFFSET] = getFloatVec3FeatureValue(header, buff, I3DM_PROP_QUANTIZED_VOLUME_OFFSET)
115+
ret[I3DM_PROP_QUANTIZED_VOLUME_SCALE] = getFloatVec3FeatureValue(header, buff, I3DM_PROP_QUANTIZED_VOLUME_SCALE)
117116
}
118-
floatArrayValue = getFloatArrayFeatureValue(header, buff, I3DM_PROP_NORMAL_UP, int(instanceLength)*3)
117+
118+
floatArrayValue = getFloatVec3ArrayFeatureValue(header, buff, I3DM_PROP_NORMAL_UP, int(instanceLength))
119119
if floatArrayValue != nil {
120120
ret[I3DM_PROP_NORMAL_UP] = floatArrayValue
121121
}
122-
floatArrayValue = getFloatArrayFeatureValue(header, buff, I3DM_PROP_NORMAL_RIGHT, int(instanceLength)*3)
122+
floatArrayValue = getFloatVec3ArrayFeatureValue(header, buff, I3DM_PROP_NORMAL_RIGHT, int(instanceLength))
123123
if floatArrayValue != nil {
124124
ret[I3DM_PROP_NORMAL_RIGHT] = floatArrayValue
125125
}
@@ -131,11 +131,11 @@ func I3dmFeatureTableDecode(header map[string]interface{}, buff []byte) map[stri
131131
if unsignedShortArrayValue != nil {
132132
ret[I3DM_PROP_NORMAL_RIGHT_OCT32P] = unsignedShortArrayValue
133133
}
134-
floatArrayValue = getFloatArrayFeatureValue(header, buff, I3DM_PROP_SCALE, int(instanceLength))
135-
if floatArrayValue != nil {
136-
ret[I3DM_PROP_SCALE] = floatArrayValue
134+
floatArrayValue1 := getFloatArrayFeatureValue(header, buff, I3DM_PROP_SCALE, int(instanceLength))
135+
if floatArrayValue1 != nil {
136+
ret[I3DM_PROP_SCALE] = floatArrayValue1
137137
}
138-
floatArrayValue = getFloatArrayFeatureValue(header, buff, I3DM_PROP_SCALE_NON_UNIFORM, int(instanceLength)*3)
138+
floatArrayValue = getFloatVec3ArrayFeatureValue(header, buff, I3DM_PROP_SCALE_NON_UNIFORM, int(instanceLength))
139139
if floatArrayValue != nil {
140140
ret[I3DM_PROP_SCALE_NON_UNIFORM] = floatArrayValue
141141
}
@@ -221,15 +221,15 @@ func I3dmFeatureTableEncode(header map[string]interface{}, data map[string]inter
221221
switch dt := data[I3DM_PROP_BATCH_ID].(type) {
222222
case []uint8:
223223
binary.Write(buf, littleEndian, dt)
224-
header[PNTS_PROP_BATCH_ID] = BinaryBodyReference{ByteOffset: uint32(offset), ComponentType: COMPONENT_TYPE_UNSIGNED_BYTE}
224+
header[I3DM_PROP_BATCH_ID] = BinaryBodyReference{ByteOffset: uint32(offset), ComponentType: COMPONENT_TYPE_UNSIGNED_BYTE}
225225
offset += len(dt)
226226
case []uint16:
227227
binary.Write(buf, littleEndian, dt)
228-
header[PNTS_PROP_BATCH_ID] = BinaryBodyReference{ByteOffset: uint32(offset), ComponentType: COMPONENT_TYPE_UNSIGNED_SHORT}
228+
header[I3DM_PROP_BATCH_ID] = BinaryBodyReference{ByteOffset: uint32(offset), ComponentType: COMPONENT_TYPE_UNSIGNED_SHORT}
229229
offset += (len(dt) * 2)
230230
case []uint32:
231231
binary.Write(buf, littleEndian, dt)
232-
header[PNTS_PROP_BATCH_ID] = BinaryBodyReference{ByteOffset: uint32(offset), ComponentType: COMPONENT_TYPE_UNSIGNED_INT}
232+
header[I3DM_PROP_BATCH_ID] = BinaryBodyReference{ByteOffset: uint32(offset), ComponentType: COMPONENT_TYPE_UNSIGNED_INT}
233233
offset += (len(dt) * 4)
234234
}
235235
pad := createPaddingBytes([]byte{}, uint32(offset), 4, 0x20)
@@ -396,7 +396,7 @@ func (m *I3dm) GetFeatureTableView() I3dmFeatureTableView {
396396
ret.InstanceLength = m.FeatureTable.Header[I3DM_PROP_INSTANCES_LENGTH].(int)
397397

398398
if m.FeatureTable.Header[I3DM_PROP_RTC_CENTER] != nil {
399-
ret.RtcCenter = m.FeatureTable.Header[I3DM_PROP_RTC_CENTER].([]float32)
399+
ret.RtcCenter = m.FeatureTable.Header[I3DM_PROP_RTC_CENTER].([]float64)
400400
}
401401

402402
if m.FeatureTable.Header[I3DM_PROP_QUANTIZED_VOLUME_OFFSET] != nil {

pnts.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ type PntsFeatureTableView struct {
9494
NormalOCT16P [][2]uint8
9595
BatchId interface{}
9696
PointsLength uint32
97-
RtcCenter []float32
97+
RtcCenter []float64
9898
QuantizedVolumeOffset []float32
9999
QuantizedVolumeScale []float32
100100
ConstantRGBA []uint8
@@ -131,6 +131,8 @@ func PntsFeatureTableDecode(header map[string]interface{}, buff []byte) map[stri
131131
unsignedShortArrayValue := getUnsignedShortArrayFeatureValue(header, buff, PNTS_PROP_POSITION_QUANTIZED, int(pointsLength*3))
132132
if unsignedShortArrayValue != nil {
133133
ret[PNTS_PROP_POSITION_QUANTIZED] = unsignedShortArrayValue
134+
ret[PNTS_PROP_QUANTIZED_VOLUME_OFFSET] = getFloatVec3FeatureValue(header, buff, I3DM_PROP_QUANTIZED_VOLUME_OFFSET)
135+
ret[PNTS_PROP_QUANTIZED_VOLUME_SCALE] = getFloatVec3FeatureValue(header, buff, I3DM_PROP_QUANTIZED_VOLUME_SCALE)
134136
}
135137
if _, ok := header[PNTS_PROP_QUANTIZED_VOLUME_OFFSET]; ok {
136138
ret[PNTS_PROP_QUANTIZED_VOLUME_OFFSET] = getFloatVec3FeatureValue(header, buff, PNTS_PROP_QUANTIZED_VOLUME_OFFSET)
@@ -139,6 +141,10 @@ func PntsFeatureTableDecode(header map[string]interface{}, buff []byte) map[stri
139141
ret[PNTS_PROP_QUANTIZED_VOLUME_SCALE] = getFloatVec3FeatureValue(header, buff, PNTS_PROP_QUANTIZED_VOLUME_SCALE)
140142
}
141143

144+
if _, ok := header[PNTS_PROP_RTC_CENTER]; ok {
145+
ret[PNTS_PROP_RTC_CENTER] = getFloat64Vec3FeatureValue(header, buff, PNTS_PROP_QUANTIZED_VOLUME_SCALE)
146+
}
147+
142148
reference := getBinaryBodyReference(header, PNTS_PROP_RGBA)
143149
if reference != nil {
144150
buf := bytes.NewBuffer(buff[reference.ByteOffset:])
@@ -414,7 +420,7 @@ func (m *Pnts) GetFeatureTableView() PntsFeatureTableView {
414420
ret.PointsLength = m.FeatureTable.Header[PNTS_PROP_POINTS_LENGTH].(uint32)
415421

416422
if m.FeatureTable.Header[PNTS_PROP_RTC_CENTER] != nil {
417-
ret.RtcCenter = m.FeatureTable.Header[PNTS_PROP_RTC_CENTER].([]float32)
423+
ret.RtcCenter = m.FeatureTable.Header[PNTS_PROP_RTC_CENTER].([]float64)
418424
}
419425

420426
if m.FeatureTable.Header[PNTS_PROP_QUANTIZED_VOLUME_OFFSET] != nil {

vctr.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ func (h *VctrHeader) SetPointPositionsByteLength(n uint32) {
121121

122122
type VctrFeatureTableView struct {
123123
Region *[6]float32
124-
RtcCenter [3]float32
124+
RtcCenter [3]float64
125125
PointsLength uint32
126126
PointBatchId interface{}
127127
PolygonsLength uint32
@@ -551,7 +551,7 @@ func (m *Vctr) GetFeatureTableView() VctrFeatureTableView {
551551
}
552552

553553
if t := m.FeatureTable.Data[VCTR_PROP_RTC_CENTER]; t != nil {
554-
copy(ret.RtcCenter[:], t.([]float32))
554+
copy(ret.RtcCenter[:], t.([]float64))
555555
}
556556

557557
if t := m.FeatureTable.Data[VCTR_PROP_REGION]; t != nil {

0 commit comments

Comments
 (0)