raylib-go/raylib/raylib.go
Palessan f529bc2897 Adding gif and sprite animation examples.
-Added new UpdateTextureUnsafe method to support it.
2024-06-28 12:50:30 +03:00

1217 lines
32 KiB
Go

/*
Package raylib - Go bindings for raylib, a simple and easy-to-use library to enjoy videogames programming.
raylib is highly inspired by Borland BGI graphics lib and by XNA framework.
raylib could be useful for prototyping, tools development, graphic applications, embedded systems and education.
NOTE for ADVENTURERS: raylib is a programming library to learn videogames programming; no fancy interface, no visual helpers, no auto-debugging... just coding in the most pure spartan-programmers way.
*/
package rl
import (
"image/color"
"io"
"runtime"
"unsafe"
)
func init() {
// Make sure the main goroutine is bound to the main thread.
runtime.LockOSThread()
}
// Wave type, defines audio wave data
type Wave struct {
// Number of samples
FrameCount uint32
// Frequency (samples per second)
SampleRate uint32
// Bit depth (bits per sample): 8, 16, 32 (24 not supported)
SampleSize uint32
// Number of channels (1-mono, 2-stereo)
Channels uint32
// Buffer data pointer
data unsafe.Pointer
}
// NewWave - Returns new Wave
func NewWave(sampleCount, sampleRate, sampleSize, channels uint32, data []byte) Wave {
d := unsafe.Pointer(&data[0])
return Wave{sampleCount, sampleRate, sampleSize, channels, d}
}
// AudioCallback function.
type AudioCallback func(data []float32, frames int)
// Sound source type
type Sound struct {
Stream AudioStream
FrameCount uint32
_ [4]byte
}
// Music type (file streaming from memory)
// NOTE: Anything longer than ~10 seconds should be streamed
type Music struct {
Stream AudioStream
FrameCount uint32
Looping bool
CtxType int32
CtxData unsafe.Pointer
}
// AudioStream type
// NOTE: Useful to create custom audio streams not bound to a specific file
type AudioStream struct {
// Buffer
Buffer *AudioBuffer
// Processor
Processor *AudioProcessor
// Frequency (samples per second)
SampleRate uint32
// Bit depth (bits per sample): 8, 16, 32 (24 not supported)
SampleSize uint32
// Number of channels (1-mono, 2-stereo)
Channels uint32
_ [4]byte
}
type maDataConverter struct {
FormatIn uint32
FormatOut uint32
ChannelsIn uint32
ChannelsOut uint32
SampleRateIn uint32
SampleRateOut uint32
DitherMode uint32
ExecutionPath uint32
ChannelConverter maChannelConverter
Resampler maResampler
HasPreFormatConversion uint8
HasPostFormatConversion uint8
HasChannelConverter uint8
HasResampler uint8
IsPassthrough uint8
X_ownsHeap uint8
X_pHeap *byte
}
type maChannelConverter struct {
Format uint32
ChannelsIn uint32
ChannelsOut uint32
MixingMode uint32
ConversionPath uint32
PChannelMapIn *uint8
PChannelMapOut *uint8
PShuffleTable *uint8
Weights [8]byte
X_pHeap *byte
X_ownsHeap uint32
Pad_cgo_0 [4]byte
}
type maResampler struct {
PBackend *byte
PBackendVTable *maResamplingBackendVtable
PBackendUserData *byte
Format uint32
Channels uint32
SampleRateIn uint32
SampleRateOut uint32
State [136]byte
X_pHeap *byte
X_ownsHeap uint32
Pad_cgo_0 [4]byte
}
type maResamplingBackendVtable struct {
OnGetHeapSize *[0]byte
OnInit *[0]byte
OnUninit *[0]byte
OnProcess *[0]byte
OnSetRate *[0]byte
OnGetInputLatency *[0]byte
OnGetOutputLatency *[0]byte
OnGetRequiredInputFrameCount *[0]byte
OnGetExpectedOutputFrameCount *[0]byte
OnReset *[0]byte
}
type AudioBuffer struct {
Converter maDataConverter
Callback *[0]byte
Processor *AudioProcessor
Volume float32
Pitch float32
Pan float32
Playing bool
Paused bool
Looping bool
Usage int32
IsSubBufferProcessed [2]bool
SizeInFrames uint32
FrameCursorPos uint32
FramesProcessed uint32
Data *uint8
Next *AudioBuffer
Prev *AudioBuffer
}
type AudioProcessor struct {
Process *[0]byte
Next *AudioProcessor
Prev *AudioProcessor
}
// AutomationEvent - Automation event
type AutomationEvent struct {
Frame uint32
Type uint32
Params [4]int32
}
// AutomationEventList - Automation event list
type AutomationEventList struct {
Capacity uint32
Count uint32
Events *AutomationEvent
}
// CameraMode type
type CameraMode int32
// Camera system modes
const (
CameraCustom CameraMode = iota
CameraFree
CameraOrbital
CameraFirstPerson
CameraThirdPerson
)
// CameraProjection type
type CameraProjection int32
// Camera projection modes
const (
CameraPerspective CameraProjection = iota
CameraOrthographic
)
// Some basic Defines
const (
Pi = 3.1415927
Deg2rad = 0.017453292
Rad2deg = 57.295776
// Raylib Config Flags
// Set to try enabling V-Sync on GPU
FlagVsyncHint = 0x00000040
// Set to run program in fullscreen
FlagFullscreenMode = 0x00000002
// Set to allow resizable window
FlagWindowResizable = 0x00000004
// Set to disable window decoration (frame and buttons)
FlagWindowUndecorated = 0x00000008
// Set to hide window
FlagWindowHidden = 0x00000080
// Set to minimize window (iconify)
FlagWindowMinimized = 0x00000200
// Set to maximize window (expanded to monitor)
FlagWindowMaximized = 0x00000400
// Set to window non focused
FlagWindowUnfocused = 0x00000800
// Set to window always on top
FlagWindowTopmost = 0x00001000
// Set to allow windows running while minimized
FlagWindowAlwaysRun = 0x00000100
// Set to allow transparent window
FlagWindowTransparent = 0x00000010
// Set to support HighDPI
FlagWindowHighdpi = 0x00002000
// Set to support mouse passthrough, only supported when FLAG_WINDOW_UNDECORATED
FlagWindowMousePassthrough = 0x00004000
// Set to run program in borderless windowed mode
FlagBorderlessWindowedMode = 0x00008000
// Set to try enabling MSAA 4X
FlagMsaa4xHint = 0x00000020
// Set to try enabling interlaced video format (for V3D)
FlagInterlacedHint = 0x00010000
// KeyNull is used for no key pressed
KeyNull = 0
// Keyboard Function Keys
KeySpace = 32
KeyEscape = 256
KeyEnter = 257
KeyTab = 258
KeyBackspace = 259
KeyInsert = 260
KeyDelete = 261
KeyRight = 262
KeyLeft = 263
KeyDown = 264
KeyUp = 265
KeyPageUp = 266
KeyPageDown = 267
KeyHome = 268
KeyEnd = 269
KeyCapsLock = 280
KeyScrollLock = 281
KeyNumLock = 282
KeyPrintScreen = 283
KeyPause = 284
KeyF1 = 290
KeyF2 = 291
KeyF3 = 292
KeyF4 = 293
KeyF5 = 294
KeyF6 = 295
KeyF7 = 296
KeyF8 = 297
KeyF9 = 298
KeyF10 = 299
KeyF11 = 300
KeyF12 = 301
KeyLeftShift = 340
KeyLeftControl = 341
KeyLeftAlt = 342
KeyLeftSuper = 343
KeyRightShift = 344
KeyRightControl = 345
KeyRightAlt = 346
KeyRightSuper = 347
KeyKbMenu = 348
KeyLeftBracket = 91
KeyBackSlash = 92
KeyRightBracket = 93
KeyGrave = 96
// Keyboard Number Pad Keys
KeyKp0 = 320
KeyKp1 = 321
KeyKp2 = 322
KeyKp3 = 323
KeyKp4 = 324
KeyKp5 = 325
KeyKp6 = 326
KeyKp7 = 327
KeyKp8 = 328
KeyKp9 = 329
KeyKpDecimal = 330
KeyKpDivide = 331
KeyKpMultiply = 332
KeyKpSubtract = 333
KeyKpAdd = 334
KeyKpEnter = 335
KeyKpEqual = 336
// Keyboard Alpha Numeric Keys
KeyApostrophe = 39
KeyComma = 44
KeyMinus = 45
KeyPeriod = 46
KeySlash = 47
KeyZero = 48
KeyOne = 49
KeyTwo = 50
KeyThree = 51
KeyFour = 52
KeyFive = 53
KeySix = 54
KeySeven = 55
KeyEight = 56
KeyNine = 57
KeySemicolon = 59
KeyEqual = 61
KeyA = 65
KeyB = 66
KeyC = 67
KeyD = 68
KeyE = 69
KeyF = 70
KeyG = 71
KeyH = 72
KeyI = 73
KeyJ = 74
KeyK = 75
KeyL = 76
KeyM = 77
KeyN = 78
KeyO = 79
KeyP = 80
KeyQ = 81
KeyR = 82
KeyS = 83
KeyT = 84
KeyU = 85
KeyV = 86
KeyW = 87
KeyX = 88
KeyY = 89
KeyZ = 90
// Android keys
KeyBack = 4
KeyMenu = 82
KeyVolumeUp = 24
KeyVolumeDown = 25
MouseLeftButton = MouseButtonLeft
MouseRightButton = MouseButtonRight
MouseMiddleButton = MouseButtonMiddle
)
// Mouse Buttons
const (
MouseButtonLeft = iota
MouseButtonRight
MouseButtonMiddle
MouseButtonSide
MouseButtonExtra
MouseButtonForward
MouseButtonBack
)
// Mouse cursor
type MouseCursor = int32
const (
MouseCursorDefault MouseCursor = iota // Default pointer shape
MouseCursorArrow // Arrow shape
MouseCursorIBeam // Text writing cursor shape
MouseCursorCrosshair // Cross shape
MouseCursorPointingHand // Pointing hand cursor
MouseCursorResizeEW // Horizontal resize/move arrow shape
MouseCursorResizeNS // Vertical resize/move arrow shape
MouseCursorResizeNWSE // Top-left to bottom-right diagonal resize/move arrow shape
MouseCursorResizeNESW // The top-right to bottom-left diagonal resize/move arrow shape
MouseCursorResizeAll // The omni-directional resize/move cursor shape
MouseCursorNotAllowed // The operation-not-allowed shape
)
// Gamepad Buttons
const (
GamepadButtonUnknown = iota // Unknown button, just for error checking
GamepadButtonLeftFaceUp // Gamepad left DPAD up button
GamepadButtonLeftFaceRight // Gamepad left DPAD right button
GamepadButtonLeftFaceDown // Gamepad left DPAD down button
GamepadButtonLeftFaceLeft // Gamepad left DPAD left button
GamepadButtonRightFaceUp // Gamepad right button up (i.e. PS3: Triangle, Xbox: Y)
GamepadButtonRightFaceRight // Gamepad right button right (i.e. PS3: Square, Xbox: X)
GamepadButtonRightFaceDown // Gamepad right button down (i.e. PS3: Cross, Xbox: A)
GamepadButtonRightFaceLeft // Gamepad right button left (i.e. PS3: Circle, Xbox: B)
GamepadButtonLeftTrigger1 // Gamepad top/back trigger left (first), it could be a trailing button
GamepadButtonLeftTrigger2 // Gamepad top/back trigger left (second), it could be a trailing button
GamepadButtonRightTrigger1 // Gamepad top/back trigger right (one), it could be a trailing button
GamepadButtonRightTrigger2 // Gamepad top/back trigger right (second), it could be a trailing button
GamepadButtonMiddleLeft // Gamepad center buttons, left one (i.e. PS3: Select)
GamepadButtonMiddle // Gamepad center buttons, middle one (i.e. PS3: PS, Xbox: XBOX)
GamepadButtonMiddleRight // Gamepad center buttons, right one (i.e. PS3: Start)
GamepadButtonLeftThumb // Gamepad joystick pressed button left
GamepadButtonRightThumb // Gamepad joystick pressed button right
)
// Gamepad Axis
const (
GamepadAxisLeftX = iota // Gamepad left stick X axis
GamepadAxisLeftY // Gamepad left stick Y axis
GamepadAxisRightX // Gamepad right stick X axis
GamepadAxisRightY // Gamepad right stick Y axis
GamepadAxisLeftTrigger // Gamepad back trigger left, pressure level: [1..-1]
GamepadAxisRightTrigger // Gamepad back trigger right, pressure level: [1..-1]
)
// Some Basic Colors
// NOTE: Custom raylib color palette for amazing visuals on WHITE background
var (
// Light Gray
LightGray = NewColor(200, 200, 200, 255)
// Gray
Gray = NewColor(130, 130, 130, 255)
// Dark Gray
DarkGray = NewColor(80, 80, 80, 255)
// Yellow
Yellow = NewColor(253, 249, 0, 255)
// Gold
Gold = NewColor(255, 203, 0, 255)
// Orange
Orange = NewColor(255, 161, 0, 255)
// Pink
Pink = NewColor(255, 109, 194, 255)
// Red
Red = NewColor(230, 41, 55, 255)
// Maroon
Maroon = NewColor(190, 33, 55, 255)
// Green
Green = NewColor(0, 228, 48, 255)
// Lime
Lime = NewColor(0, 158, 47, 255)
// Dark Green
DarkGreen = NewColor(0, 117, 44, 255)
// Sky Blue
SkyBlue = NewColor(102, 191, 255, 255)
// Blue
Blue = NewColor(0, 121, 241, 255)
// Dark Blue
DarkBlue = NewColor(0, 82, 172, 255)
// Purple
Purple = NewColor(200, 122, 255, 255)
// Violet
Violet = NewColor(135, 60, 190, 255)
// Dark Purple
DarkPurple = NewColor(112, 31, 126, 255)
// Beige
Beige = NewColor(211, 176, 131, 255)
// Brown
Brown = NewColor(127, 106, 79, 255)
// Dark Brown
DarkBrown = NewColor(76, 63, 47, 255)
// White
White = NewColor(255, 255, 255, 255)
// Black
Black = NewColor(0, 0, 0, 255)
// Blank (Transparent)
Blank = NewColor(0, 0, 0, 0)
// Magenta
Magenta = NewColor(255, 0, 255, 255)
// Ray White (RayLib Logo White)
RayWhite = NewColor(245, 245, 245, 255)
)
// Vector2 type
type Vector2 struct {
X float32
Y float32
}
// NewVector2 - Returns new Vector2
func NewVector2(x, y float32) Vector2 {
return Vector2{x, y}
}
// Vector3 type
type Vector3 struct {
X float32
Y float32
Z float32
}
// NewVector3 - Returns new Vector3
func NewVector3(x, y, z float32) Vector3 {
return Vector3{x, y, z}
}
// Vector4 type
type Vector4 struct {
X float32
Y float32
Z float32
W float32
}
// NewVector4 - Returns new Vector4
func NewVector4(x, y, z, w float32) Vector4 {
return Vector4{x, y, z, w}
}
// Matrix type (OpenGL style 4x4 - right handed, column major)
type Matrix struct {
M0, M4, M8, M12 float32
M1, M5, M9, M13 float32
M2, M6, M10, M14 float32
M3, M7, M11, M15 float32
}
// NewMatrix - Returns new Matrix
func NewMatrix(m0, m4, m8, m12, m1, m5, m9, m13, m2, m6, m10, m14, m3, m7, m11, m15 float32) Matrix {
return Matrix{m0, m4, m8, m12, m1, m5, m9, m13, m2, m6, m10, m14, m3, m7, m11, m15}
}
// Mat2 type (used for polygon shape rotation matrix)
type Mat2 struct {
M00 float32
M01 float32
M10 float32
M11 float32
}
// NewMat2 - Returns new Mat2
func NewMat2(m0, m1, m10, m11 float32) Mat2 {
return Mat2{m0, m1, m10, m11}
}
// Quaternion, 4 components (Vector4 alias)
type Quaternion = Vector4
// NewQuaternion - Returns new Quaternion
func NewQuaternion(x, y, z, w float32) Quaternion {
return Quaternion{x, y, z, w}
}
// Color type, RGBA (32bit)
// TODO remove later, keep type for now to not break code
type Color = color.RGBA
// NewColor - Returns new Color
func NewColor(r, g, b, a uint8) color.RGBA {
return color.RGBA{r, g, b, a}
}
// Rectangle type
type Rectangle struct {
X float32
Y float32
Width float32
Height float32
}
// NewRectangle - Returns new Rectangle
func NewRectangle(x, y, width, height float32) Rectangle {
return Rectangle{x, y, width, height}
}
// ToInt32 converts rectangle to int32 variant
func (r *Rectangle) ToInt32() RectangleInt32 {
rect := RectangleInt32{}
rect.X = int32(r.X)
rect.Y = int32(r.Y)
rect.Width = int32(r.Width)
rect.Height = int32(r.Height)
return rect
}
// RectangleInt32 type
type RectangleInt32 struct {
X int32
Y int32
Width int32
Height int32
}
// ToFloat32 converts rectangle to float32 variant
func (r *RectangleInt32) ToFloat32() Rectangle {
rect := Rectangle{}
rect.X = float32(r.X)
rect.Y = float32(r.Y)
rect.Width = float32(r.Width)
rect.Height = float32(r.Height)
return rect
}
// Camera3D type, defines a camera position/orientation in 3d space
type Camera3D struct {
// Camera position
Position Vector3
// Camera target it looks-at
Target Vector3
// Camera up vector (rotation over its axis)
Up Vector3
// Camera field-of-view apperture in Y (degrees) in perspective, used as near plane width in orthographic
Fovy float32
// Camera type, controlling projection type, either CameraPerspective or CameraOrthographic.
Projection CameraProjection
}
// Camera type fallback, defaults to Camera3D
type Camera = Camera3D
// NewCamera3D - Returns new Camera3D
func NewCamera3D(pos, target, up Vector3, fovy float32, ct CameraProjection) Camera3D {
return Camera3D{pos, target, up, fovy, ct}
}
// Camera2D type, defines a 2d camera
type Camera2D struct {
// Camera offset (displacement from target)
Offset Vector2
// Camera target (rotation and zoom origin)
Target Vector2
// Camera rotation in degrees
Rotation float32
// Camera zoom (scaling), should be 1.0f by default
Zoom float32
}
// NewCamera2D - Returns new Camera2D
func NewCamera2D(offset, target Vector2, rotation, zoom float32) Camera2D {
return Camera2D{offset, target, rotation, zoom}
}
// BoundingBox type
type BoundingBox struct {
// Minimum vertex box-corner
Min Vector3
// Maximum vertex box-corner
Max Vector3
}
// NewBoundingBox - Returns new BoundingBox
func NewBoundingBox(min, max Vector3) BoundingBox {
return BoundingBox{min, max}
}
// Asset file
type Asset interface {
io.ReadSeeker
io.Closer
}
// Gestures type
type Gestures int32
// Gestures types
// NOTE: It could be used as flags to enable only some gestures
const (
GestureNone Gestures = 0
GestureTap Gestures = 1
GestureDoubletap Gestures = 2
GestureHold Gestures = 4
GestureDrag Gestures = 8
GestureSwipeRight Gestures = 16
GestureSwipeLeft Gestures = 32
GestureSwipeUp Gestures = 64
GestureSwipeDown Gestures = 128
GesturePinchIn Gestures = 256
GesturePinchOut Gestures = 512
)
// Shader location point type
const (
ShaderLocVertexPosition = iota
ShaderLocVertexTexcoord01
ShaderLocVertexTexcoord02
ShaderLocVertexNormal
ShaderLocVertexTangent
ShaderLocVertexColor
ShaderLocMatrixMvp
ShaderLocMatrixView
ShaderLocMatrixProjection
ShaderLocMatrixModel
ShaderLocMatrixNormal
ShaderLocVectorView
ShaderLocColorDiffuse
ShaderLocColorSpecular
ShaderLocColorAmbient
ShaderLocMapAlbedo
ShaderLocMapMetalness
ShaderLocMapNormal
ShaderLocMapRoughness
ShaderLocMapOcclusion
ShaderLocMapEmission
ShaderLocMapHeight
ShaderLocMapCubemap
ShaderLocMapIrradiance
ShaderLocMapPrefilter
ShaderLocMapBrdf
ShaderLocMapDiffuse = ShaderLocMapAlbedo
ShaderLocMapSpecular = ShaderLocMapMetalness
)
// ShaderUniformDataType type
type ShaderUniformDataType int32
// ShaderUniformDataType enumeration
const (
ShaderUniformFloat ShaderUniformDataType = iota
ShaderUniformVec2
ShaderUniformVec3
ShaderUniformVec4
ShaderUniformInt
ShaderUniformIvec2
ShaderUniformIvec3
ShaderUniformIvec4
ShaderUniformSampler2d
)
// Material map index
const (
MapAlbedo = iota
MapMetalness
MapNormal
MapRoughness
MapOcclusion
MapEmission
MapHeight
MapBrdg
MapCubemap
MapIrradiance
MapPrefilter
MapBrdf
MapDiffuse = MapAlbedo
MapSpecular = MapMetalness
)
// Shader and material limits
const (
// Maximum number of predefined locations stored in shader struct
MaxShaderLocations = 32
// Maximum number of texture maps stored in shader struct
MaxMaterialMaps = 12
)
// Mesh - Vertex data definning a mesh
type Mesh struct {
// Number of vertices stored in arrays
VertexCount int32
// Number of triangles stored (indexed or not)
TriangleCount int32
// Vertex position (XYZ - 3 components per vertex) (shader-location = 0)
Vertices *float32
// Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1)
Texcoords *float32
// Vertex second texture coordinates (useful for lightmaps) (shader-location = 5)
Texcoords2 *float32
// Vertex normals (XYZ - 3 components per vertex) (shader-location = 2)
Normals *float32
// Vertex tangents (XYZ - 3 components per vertex) (shader-location = 4)
Tangents *float32
// Vertex colors (RGBA - 4 components per vertex) (shader-location = 3)
Colors *uint8
// Vertex indices (in case vertex data comes indexed)
Indices *uint16
// AnimVertices
AnimVertices *float32
// AnimNormals
AnimNormals *float32
// BoneIds
BoneIds *int32
// BoneWeights
BoneWeights *float32
// OpenGL Vertex Array Object id
VaoID uint32
// OpenGL Vertex Buffer Objects id (7 types of vertex data)
VboID *uint32
}
// Material type
type Material struct {
// Shader
Shader Shader
// Maps
Maps *MaterialMap
// Generic parameters (if required)
Params [4]float32
}
// GetMap - Get pointer to MaterialMap by map type
func (mt Material) GetMap(index int32) *MaterialMap {
return (*MaterialMap)(unsafe.Pointer(uintptr(unsafe.Pointer(mt.Maps)) + uintptr(index)*unsafe.Sizeof(MaterialMap{})))
}
// MaterialMap type
type MaterialMap struct {
// Texture
Texture Texture2D
// Color
Color color.RGBA
// Value
Value float32
}
// Model is struct of model, meshes, materials and animation data
type Model struct {
// Local transform matrix
Transform Matrix
// Number of meshes
MeshCount int32
// Number of materials
MaterialCount int32
// Meshes array (c array)
//
// Use Model.GetMeshes instead (go slice)
Meshes *Mesh
// Materials array (c array)
//
// Use Model.GetMaterials instead (go slice)
Materials *Material
// Mesh material number
MeshMaterial *int32
// Number of bones
BoneCount int32
// Bones information (skeleton) (c array)
//
// Use Model.GetBones instead (go slice)
Bones *BoneInfo
// Bones base transformation (pose) (c array)
//
// Use Model.GetBindPose instead (go slice)
BindPose *Transform
}
// GetMeshes returns the meshes of a model as go slice
func (m Model) GetMeshes() []Mesh {
return unsafe.Slice(m.Meshes, m.MeshCount)
}
// GetMaterials returns the materials of a model as go slice
func (m Model) GetMaterials() []Material {
return unsafe.Slice(m.Materials, m.MaterialCount)
}
// GetBones returns the bones information (skeleton) of a model as go slice
func (m Model) GetBones() []BoneInfo {
return unsafe.Slice(m.Bones, m.BoneCount)
}
// GetBindPose returns the bones base transformation of a model as go slice
func (m Model) GetBindPose() []Transform {
return unsafe.Slice(m.BindPose, m.BoneCount)
}
// BoneInfo type
type BoneInfo struct {
Name [32]int8
Parent int32
}
// Transform type
type Transform struct {
Translation Vector3
Rotation Vector4
Scale Vector3
}
// Ray type (useful for raycast)
type Ray struct {
// Ray position (origin)
Position Vector3
// Ray direction
Direction Vector3
}
// NewRay - Returns new Ray
func NewRay(position, direction Vector3) Ray {
return Ray{position, direction}
}
// ModelAnimation type
type ModelAnimation struct {
BoneCount int32
FrameCount int32
Bones *BoneInfo
FramePoses **Transform
Name [32]int8
}
// RayCollision type - ray hit information
type RayCollision struct {
Hit bool
Distance float32
Point Vector3
Normal Vector3
}
// NewRayCollision - Returns new RayCollision
func NewRayCollision(hit bool, distance float32, point, normal Vector3) RayCollision {
return RayCollision{hit, distance, point, normal}
}
// BlendMode type
type BlendMode int32
// Color blending modes (pre-defined)
const (
BlendAlpha BlendMode = iota // Blend textures considering alpha (default)
BlendAdditive // Blend textures adding colors
BlendMultiplied // Blend textures multiplying colors
BlendAddColors // Blend textures adding colors (alternative)
BlendSubtractColors // Blend textures subtracting colors (alternative)
BlendAlphaPremultiply // Blend premultiplied textures considering alpha
BlendCustom // Blend textures using custom src/dst factors
BlendCustomSeparate // Blend textures using custom rgb/alpha separate src/dst factors
)
// Shader type (generic shader)
type Shader struct {
// Shader program id
ID uint32
// Shader locations array
Locs *int32
}
// NewShader - Returns new Shader
func NewShader(id uint32, locs *int32) Shader {
return Shader{id, locs}
}
// GetLocation - Get shader value's location
func (sh Shader) GetLocation(index int32) int32 {
return *(*int32)(unsafe.Pointer(uintptr(unsafe.Pointer(sh.Locs)) + uintptr(index*4)))
}
// UpdateLocation - Update shader value's location
func (sh Shader) UpdateLocation(index int32, loc int32) {
*(*int32)(unsafe.Pointer(uintptr(unsafe.Pointer(sh.Locs)) + uintptr(index*4))) = loc
}
// GlyphInfo - Font character info
type GlyphInfo struct {
// Character value (Unicode)
Value int32
// Character offset X when drawing
OffsetX int32
// Character offset Y when drawing
OffsetY int32
// Character advance position X
AdvanceX int32
// Character image data
Image Image
}
// NewGlyphInfo - Returns new CharInfo
func NewGlyphInfo(value int32, offsetX, offsetY, advanceX int32, image Image) GlyphInfo {
return GlyphInfo{value, offsetX, offsetY, advanceX, image}
}
// Font type, includes texture and charSet array data
type Font struct {
// Base size (default chars height)
BaseSize int32
// Number of characters
CharsCount int32
// Padding around the chars
CharsPadding int32
// Characters texture atlas
Texture Texture2D
// Characters rectangles in texture
Recs *Rectangle
// Characters info data
Chars *GlyphInfo
}
// Font type, defines generation method
const (
FontDefault = iota // Default font generation, anti-aliased
FontBitmap // Bitmap font generation, no anti-aliasing
FontSdf // SDF font generation, requires external shader
)
// PixelFormat - Texture format
type PixelFormat int32
// Texture formats
// NOTE: Support depends on OpenGL version and platform
const (
// 8 bit per pixel (no alpha)
UncompressedGrayscale PixelFormat = iota + 1
// 8*2 bpp (2 channels)
UncompressedGrayAlpha
// 16 bpp
UncompressedR5g6b5
// 24 bpp
UncompressedR8g8b8
// 16 bpp (1 bit alpha)
UncompressedR5g5b5a1
// 16 bpp (4 bit alpha)
UncompressedR4g4b4a4
// 32 bpp
UncompressedR8g8b8a8
// 32 bpp (1 channel - float)
UncompressedR32
// 32*3 bpp (3 channels - float)
UncompressedR32g32b32
// 32*4 bpp (4 channels - float)
UncompressedR32g32b32a32
// 4 bpp (no alpha)
CompressedDxt1Rgb
// 4 bpp (1 bit alpha)
CompressedDxt1Rgba
// 8 bpp
CompressedDxt3Rgba
// 8 bpp
CompressedDxt5Rgba
// 4 bpp
CompressedEtc1Rgb
// 4 bpp
CompressedEtc2Rgb
// 8 bpp
CompressedEtc2EacRgba
// 4 bpp
CompressedPvrtRgb
// 4 bpp
CompressedPvrtRgba
// 8 bpp
CompressedAstc4x4Rgba
// 2 bpp
CompressedAstc8x8Rgba
)
// TextureFilterMode - Texture filter mode
type TextureFilterMode int32
// Texture parameters: filter mode
// NOTE 1: Filtering considers mipmaps if available in the texture
// NOTE 2: Filter is accordingly set for minification and magnification
const (
// No filter, just pixel aproximation
FilterPoint TextureFilterMode = iota
// Linear filtering
FilterBilinear
// Trilinear filtering (linear with mipmaps)
FilterTrilinear
// Anisotropic filtering 4x
FilterAnisotropic4x
// Anisotropic filtering 8x
FilterAnisotropic8x
// Anisotropic filtering 16x
FilterAnisotropic16x
)
// TextureWrapMode - Texture wrap mode
type TextureWrapMode int32
// Texture parameters: wrap mode
const (
WrapRepeat TextureWrapMode = iota
WrapClamp
WrapMirrorRepeat
WrapMirrorClamp
)
// Cubemap layouts
const (
CubemapLayoutAutoDetect = iota // Automatically detect layout type
CubemapLayoutLineVertical // Layout is defined by a vertical line with faces
CubemapLayoutLineHorizontal // Layout is defined by a horizontal line with faces
CubemapLayoutCrossThreeByFour // Layout is defined by a 3x4 cross with cubemap faces
CubemapLayoutCrossFourByThree // Layout is defined by a 4x3 cross with cubemap faces
CubemapLayoutPanorama // Layout is defined by a panorama image (equirrectangular map)
)
// Image type, bpp always RGBA (32bit)
// NOTE: Data stored in CPU memory (RAM)
type Image struct {
// Image raw Data
Data unsafe.Pointer
// Image base width
Width int32
// Image base height
Height int32
// Mipmap levels, 1 by default
Mipmaps int32
// Data format (PixelFormat)
Format PixelFormat
}
// NewImage - Returns new Image
func NewImage(data []byte, width, height, mipmaps int32, format PixelFormat) *Image {
d := unsafe.Pointer(&data[0])
return &Image{d, width, height, mipmaps, format}
}
// Texture2D type, bpp always RGBA (32bit)
// NOTE: Data stored in GPU memory
type Texture2D struct {
// OpenGL texture id
ID uint32
// Texture base width
Width int32
// Texture base height
Height int32
// Mipmap levels, 1 by default
Mipmaps int32
// Data format (PixelFormat)
Format PixelFormat
}
// NewTexture2D - Returns new Texture2D
func NewTexture2D(id uint32, width, height, mipmaps int32, format PixelFormat) Texture2D {
return Texture2D{id, width, height, mipmaps, format}
}
// RenderTexture2D type, for texture rendering
type RenderTexture2D struct {
// Render texture (fbo) id
ID uint32
// Color buffer attachment texture
Texture Texture2D
// Depth buffer attachment texture
Depth Texture2D
}
// NewRenderTexture2D - Returns new RenderTexture2D
func NewRenderTexture2D(id uint32, texture, depth Texture2D) RenderTexture2D {
return RenderTexture2D{id, texture, depth}
}
// TraceLogCallbackFun - function that will recive the trace log messages
type TraceLogCallbackFun func(int, string)
// TraceLogLevel parameter of trace log message
type TraceLogLevel int
// Trace log level
// NOTE: Organized by priority level
const (
// Display all logs
LogAll TraceLogLevel = iota
// Trace logging, intended for internal use only
LogTrace
// Debug logging, used for internal debugging, it should be disabled on release builds
LogDebug
// Info logging, used for program execution info
LogInfo
// Warning logging, used on recoverable failures
LogWarning
// Error logging, used on unrecoverable failures
LogError
// Fatal logging, used to abort program: exit(EXIT_FAILURE)
LogFatal
// Disable logging
LogNone
)
// N-patch layout
type NPatchLayout int32
const (
NPatchNinePatch NPatchLayout = iota // Npatch layout: 3x3 tiles
NPatchThreePatchVertical // Npatch layout: 1x3 tiles
NPatchThreePatchHorizontal // Npatch layout: 3x1 tiles
)
// NPatchInfo type, n-patch layout info
type NPatchInfo struct {
Source Rectangle // Texture source rectangle
Left int32 // Left border offset
Top int32 // Top border offset
Right int32 // Right border offset
Bottom int32 // Bottom border offset
Layout NPatchLayout // Layout of the n-patch: 3x3, 1x3 or 3x1
}
// VrStereoConfig, VR stereo rendering configuration for simulator
type VrStereoConfig struct {
Projection [2]Matrix // VR projection matrices (per eye)
ViewOffset [2]Matrix // VR view offset matrices (per eye)
LeftLensCenter [2]float32 // VR left lens center
RightLensCenter [2]float32 // VR right lens center
LeftScreenCenter [2]float32 // VR left screen center
RightScreenCenter [2]float32 // VR right screen center
Scale [2]float32 // VR distortion scale
ScaleIn [2]float32 // VR distortion scale in
}
// VrDeviceInfo, Head-Mounted-Display device parameters
type VrDeviceInfo struct {
HResolution int32 // Horizontal resolution in pixels
VResolution int32 // Vertical resolution in pixels
HScreenSize float32 // Horizontal size in meters
VScreenSize float32 // Vertical size in meters
VScreenCenter float32 // Screen center in meters
EyeToScreenDistance float32 // Distance between eye and display in meters
LensSeparationDistance float32 // Lens separation distance in meters
InterpupillaryDistance float32 // IPD (distance between pupils) in meters
LensDistortionValues [4]float32 // Lens distortion constant parameters
ChromaAbCorrection [4]float32 // Chromatic aberration correction parameters
}