-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgrid_transform.go
More file actions
92 lines (74 loc) · 2.11 KB
/
Copy pathgrid_transform.go
File metadata and controls
92 lines (74 loc) · 2.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package vdb
// #include <stdlib.h>
// #include "voxelizer_api.h"
// #cgo CFLAGS: -I ./lib
// #cgo CXXFLAGS: -I ./lib
import "C"
import (
"reflect"
"unsafe"
vec3d "github.com/flywave/go3d/float64/vec3"
)
type GridTransform interface {
IsAffine() bool
IsIdentity() bool
Transform(pt vec3d.T) *vec3d.T
InvTransform(pt vec3d.T) *vec3d.T
}
type GridTransformAdapter struct {
m *C.struct__voxel_grid_transform_t
f GridTransform
}
func NewGridTransformAdapter(f GridTransform) *GridTransformAdapter {
ctx := new(GridTransformAdapter)
ctx.f = f
inptr := uintptr(unsafe.Pointer(ctx))
ctx.m = C.voxel_grid_transform_create(unsafe.Pointer(&inptr))
return ctx
}
func (m *GridTransformAdapter) Free() {
C.voxel_grid_transform_free(m.m)
m.m = nil
}
//export isAffine
func isAffine(ctx unsafe.Pointer) C.bool {
return C.bool((*(**GridTransformAdapter)(ctx)).f.IsAffine())
}
//export isIdentity
func isIdentity(ctx unsafe.Pointer) C.bool {
return C.bool((*(**GridTransformAdapter)(ctx)).f.IsIdentity())
}
//export gridTransform
func gridTransform(ctx unsafe.Pointer, pt *C.double, out *C.double) {
var aSlice []float64
aHeader := (*reflect.SliceHeader)((unsafe.Pointer(&aSlice)))
aHeader.Cap = int(3)
aHeader.Len = int(3)
aHeader.Data = uintptr(unsafe.Pointer(pt))
var bSlice []float64
bHeader := (*reflect.SliceHeader)((unsafe.Pointer(&bSlice)))
bHeader.Cap = int(3)
bHeader.Len = int(3)
bHeader.Data = uintptr(unsafe.Pointer(out))
var avec vec3d.T
copy(avec[:], aSlice)
bvec := (*(**GridTransformAdapter)(ctx)).f.Transform(avec)
copy(bSlice, bvec[:])
}
//export gridInvTransform
func gridInvTransform(ctx unsafe.Pointer, pt *C.double, out *C.double) {
var aSlice []float64
aHeader := (*reflect.SliceHeader)((unsafe.Pointer(&aSlice)))
aHeader.Cap = int(3)
aHeader.Len = int(3)
aHeader.Data = uintptr(unsafe.Pointer(pt))
var bSlice []float64
bHeader := (*reflect.SliceHeader)((unsafe.Pointer(&bSlice)))
bHeader.Cap = int(3)
bHeader.Len = int(3)
bHeader.Data = uintptr(unsafe.Pointer(out))
var avec vec3d.T
copy(avec[:], aSlice)
bvec := (*(**GridTransformAdapter)(ctx)).f.InvTransform(avec)
copy(bSlice, bvec[:])
}