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  }