github.com/mojzesh/linmath@v0.0.0-20220615094601-759643be23c3/util.go (about) 1 package linmath 2 3 import ( 4 "bytes" 5 "fmt" 6 "unsafe" 7 ) 8 9 func (m *Mat4x4) Data() []byte { 10 const mm = 0x7fffffff 11 return (*[mm]byte)(unsafe.Pointer(m))[:SizeofMat4x4] 12 } 13 14 func DumpMatrix(m *Mat4x4, note string) string { 15 buf := new(bytes.Buffer) 16 fmt.Fprintf(buf, "[mat4x4] %s: \n", note) 17 for i := 0; i < 4; i++ { 18 fmt.Fprintf(buf, "%.3f, %.3f, %.3f, %.3f\n", m[i][0], m[i][1], m[i][2], m[i][3]) 19 } 20 return buf.String() 21 } 22 23 func DumpVec4(v *Vec4, note string) string { 24 buf := new(bytes.Buffer) 25 fmt.Fprintf(buf, "[vec4] %s: \n", note) 26 fmt.Fprintf(buf, "%.3f, %.3f, %.3f, %.3f\n", v[0], v[1], v[2], v[3]) 27 return buf.String() 28 } 29 30 func DumpQuat(q *Quat, note string) string { 31 buf := new(bytes.Buffer) 32 fmt.Fprintf(buf, "[quat] %s: \n", note) 33 fmt.Fprintf(buf, "%.3f, %.3f, %.3f, %.3f\n", q[0], q[1], q[2], q[3]) 34 return buf.String() 35 } 36 37 const ( 38 SizeofMat4x4 = int(unsafe.Sizeof(Mat4x4{})) 39 SizeofVec4 = int(unsafe.Sizeof(Vec4{})) 40 SizeofVec3 = int(unsafe.Sizeof(Vec3{})) 41 SizeofVec2 = int(unsafe.Sizeof(Vec2{})) 42 ) 43 44 type ArrayVec4 []Vec4 45 46 func (a ArrayVec4) Sizeof() int { 47 return len(a) * SizeofVec4 48 } 49 50 func (a ArrayVec4) Data() []byte { 51 const m = 0x7fffffff 52 return (*[m]byte)(unsafe.Pointer((*sliceHeader)(unsafe.Pointer(&a)).Data))[:len(a)*SizeofVec4] 53 } 54 55 type ArrayVec3 []Vec3 56 57 func (a ArrayVec3) Sizeof() int { 58 return len(a) * SizeofVec3 59 } 60 61 func (a ArrayVec3) Data() []byte { 62 const m = 0x7fffffff 63 return (*[m]byte)(unsafe.Pointer((*sliceHeader)(unsafe.Pointer(&a)).Data))[:len(a)*SizeofVec3] 64 } 65 66 type ArrayVec2 []Vec2 67 68 func (a ArrayVec2) Sizeof() int { 69 return len(a) * SizeofVec2 70 } 71 72 func (a ArrayVec2) Data() []byte { 73 const m = 0x7fffffff 74 return (*[m]byte)(unsafe.Pointer((*sliceHeader)(unsafe.Pointer(&a)).Data))[:len(a)*SizeofVec2] 75 } 76 77 type ArrayUint16 []uint16 78 79 func (a ArrayUint16) Sizeof() int { 80 return len(a) * 2 81 } 82 83 func (a ArrayUint16) Data() []byte { 84 const m = 0x7fffffff 85 return (*[m]byte)(unsafe.Pointer((*sliceHeader)(unsafe.Pointer(&a)).Data))[:len(a)*2] 86 } 87 88 type ArrayFloat32 []float32 89 90 func (a ArrayFloat32) Sizeof() int { 91 return len(a) * 4 92 } 93 94 func (a ArrayFloat32) Data() []byte { 95 const m = 0x7fffffff 96 return (*[m]byte)(unsafe.Pointer((*sliceHeader)(unsafe.Pointer(&a)).Data))[:len(a)*4] 97 } 98 99 type sliceHeader struct { 100 Data uintptr 101 Len int 102 Cap int 103 }