| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 The Go Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style | |
| 3 // license that can be found in the LICENSE file. | |
| 4 | |
| 5 //go:generate go run gen.go -output table.go | |
| 6 | |
| 7 // Package f32 implements some linear algebra and GL helpers for float32s. | |
| 8 // | |
| 9 // Types defined in this package have methods implementing common | |
| 10 // mathematical operations. The common form for these functions is | |
| 11 // | |
| 12 // func (dst *T) Op(lhs, rhs *T) | |
| 13 // | |
| 14 // which reads in traditional mathematical notation as | |
| 15 // | |
| 16 // dst = lhs op rhs. | |
| 17 // | |
| 18 // It is safe to use the destination address as the left-hand side, | |
| 19 // that is, dst *= rhs is dst.Mul(dst, rhs). | |
| 20 // | |
| 21 // WARNING | |
| 22 // | |
| 23 // The interface to this package is not stable. It will change considerably. | |
| 24 // Only use functions that provide package documentation. Semantics are | |
| 25 // non-obvious. Be prepared for the package name to change. | |
| 26 package f32 // import "golang.org/x/mobile/f32" | |
| 27 | |
| 28 import ( | |
| 29 "encoding/binary" | |
| 30 "fmt" | |
| 31 "math" | |
| 32 ) | |
| 33 | |
| 34 type Radian float32 | |
| 35 | |
| 36 func Cos(x float32) float32 { | |
| 37 const n = sinTableLen | |
| 38 i := uint32(int32(x * (n / math.Pi))) | |
| 39 i += n / 2 | |
| 40 i &= 2*n - 1 | |
| 41 if i >= n { | |
| 42 return -sinTable[i&(n-1)] | |
| 43 } | |
| 44 return sinTable[i&(n-1)] | |
| 45 } | |
| 46 | |
| 47 func Sin(x float32) float32 { | |
| 48 const n = sinTableLen | |
| 49 i := uint32(int32(x * (n / math.Pi))) | |
| 50 i &= 2*n - 1 | |
| 51 if i >= n { | |
| 52 return -sinTable[i&(n-1)] | |
| 53 } | |
| 54 return sinTable[i&(n-1)] | |
| 55 } | |
| 56 | |
| 57 func Sqrt(x float32) float32 { | |
| 58 return float32(math.Sqrt(float64(x))) // TODO(crawshaw): implement | |
| 59 } | |
| 60 | |
| 61 func Tan(x float32) float32 { | |
| 62 return float32(math.Tan(float64(x))) // TODO(crawshaw): fast version | |
| 63 } | |
| 64 | |
| 65 // Bytes returns the byte representation of float32 values in the given byte | |
| 66 // order. byteOrder must be either binary.BigEndian or binary.LittleEndian. | |
| 67 func Bytes(byteOrder binary.ByteOrder, values ...float32) []byte { | |
| 68 le := false | |
| 69 switch byteOrder { | |
| 70 case binary.BigEndian: | |
| 71 case binary.LittleEndian: | |
| 72 le = true | |
| 73 default: | |
| 74 panic(fmt.Sprintf("invalid byte order %v", byteOrder)) | |
| 75 } | |
| 76 | |
| 77 b := make([]byte, 4*len(values)) | |
| 78 for i, v := range values { | |
| 79 u := math.Float32bits(v) | |
| 80 if le { | |
| 81 b[4*i+0] = byte(u >> 0) | |
| 82 b[4*i+1] = byte(u >> 8) | |
| 83 b[4*i+2] = byte(u >> 16) | |
| 84 b[4*i+3] = byte(u >> 24) | |
| 85 } else { | |
| 86 b[4*i+0] = byte(u >> 24) | |
| 87 b[4*i+1] = byte(u >> 16) | |
| 88 b[4*i+2] = byte(u >> 8) | |
| 89 b[4*i+3] = byte(u >> 0) | |
| 90 } | |
| 91 } | |
| 92 return b | |
| 93 } | |
| OLD | NEW |