From f217da2961d468d6230a4dca861a8d9abe06ec26 Mon Sep 17 00:00:00 2001 From: BrownNPC Date: Tue, 21 Apr 2026 15:58:11 +0500 Subject: [PATCH 1/9] raygui bindings intitial commit --- raygui/go.mod | 5 + wasm-runtime/api/rlapi.go | 76 + wasm-runtime/api/rlapi.json | 12463 ++++++++++++++++ wasm-runtime/api/stringyvalue.go | 28 + wasm-runtime/codegen.go | 70 + wasm-runtime/funcimport.go | 58 + wasm-runtime/go.mod | 5 + wasm-runtime/go.sum | 2 + wasm-runtime/rl/.gitkeep | 0 wasm-runtime/rl/aliases_gen_formatted.go | 20 + wasm-runtime/rl/defines_gen_formatted.go | 121 + wasm-runtime/rl/enums_gen_formatted.go | 741 + wasm-runtime/rl/funcimport_gen_unformatted.go | 4589 ++++++ wasm-runtime/rl/go.mod | 4 + wasm-runtime/rl/structs_gen_formatted.go | 307 + wasm-runtime/rl/wasm.go | 150 + wasm-runtime/templates/aliases.go.gotmpl | 16 + wasm-runtime/templates/defines.go.gotmpl | 30 + wasm-runtime/templates/enums.go.gotmpl | 23 + wasm-runtime/templates/funcimport.go.gotmpl | 20 + wasm-runtime/templates/structs.go.gotmpl | 22 + wasm-runtime/templates/templates.go | 57 + wasm-runtime/util.go | 124 + 23 files changed, 18931 insertions(+) create mode 100644 raygui/go.mod create mode 100644 wasm-runtime/api/rlapi.go create mode 100644 wasm-runtime/api/rlapi.json create mode 100644 wasm-runtime/api/stringyvalue.go create mode 100644 wasm-runtime/codegen.go create mode 100644 wasm-runtime/funcimport.go create mode 100644 wasm-runtime/go.mod create mode 100644 wasm-runtime/go.sum create mode 100644 wasm-runtime/rl/.gitkeep create mode 100644 wasm-runtime/rl/aliases_gen_formatted.go create mode 100644 wasm-runtime/rl/defines_gen_formatted.go create mode 100644 wasm-runtime/rl/enums_gen_formatted.go create mode 100644 wasm-runtime/rl/funcimport_gen_unformatted.go create mode 100644 wasm-runtime/rl/go.mod create mode 100644 wasm-runtime/rl/structs_gen_formatted.go create mode 100644 wasm-runtime/rl/wasm.go create mode 100644 wasm-runtime/templates/aliases.go.gotmpl create mode 100644 wasm-runtime/templates/defines.go.gotmpl create mode 100644 wasm-runtime/templates/enums.go.gotmpl create mode 100644 wasm-runtime/templates/funcimport.go.gotmpl create mode 100644 wasm-runtime/templates/structs.go.gotmpl create mode 100644 wasm-runtime/templates/templates.go create mode 100644 wasm-runtime/util.go diff --git a/raygui/go.mod b/raygui/go.mod new file mode 100644 index 0000000..ff9fc9c --- /dev/null +++ b/raygui/go.mod @@ -0,0 +1,5 @@ +module github.com/BrownNPC/Raylib-Go-Wasm/raygui + +require github.com/BrownNPC/wasm-ffi-go v1.2.0 + +go 1.24.1 diff --git a/wasm-runtime/api/rlapi.go b/wasm-runtime/api/rlapi.go new file mode 100644 index 0000000..be1fefd --- /dev/null +++ b/wasm-runtime/api/rlapi.go @@ -0,0 +1,76 @@ +package api + +import ( + _ "embed" + "encoding/json" +) + +var Api RlApi + +//go:embed rlapi.json +var rlApiJson []byte + +func init() { + err := json.Unmarshal(rlApiJson, &Api) + if err != nil { + panic(err) + } +} + +type RlDefine struct { + Name string `json:"name"` + Type string `json:"type"` + Value StringyValue `json:"value"` + Description string `json:"description"` +} + + +type RlField struct { + Type string `json:"type"` + Name string `json:"name"` + Description string `json:"description"` +} +type RlStruct struct { + Name string `json:"name"` + Description string `json:"description"` + Fields []RlField `json:"fields"` +} +type RlAlias struct { + Type string `json:"type"` + Name string `json:"name"` + Description string `json:"description"` +} +type RlValue struct { + Name string `json:"name"` + Value int `json:"value"` + Description string `json:"description"` +} +type RlEnum struct { + Name string `json:"name"` + Description string `json:"description"` + Values []RlValue `json:"values"` +} +type RlParam struct { + Type string `json:"type"` + Name string `json:"name"` +} +type RlCallback struct { + Name string `json:"name"` + Description string `json:"description"` + ReturnType string `json:"returnType"` + Params []RlParam `json:"params"` +} +type RlFunction struct { + Name string `json:"name"` + Description string `json:"description"` + ReturnType string `json:"returnType"` + Params []RlParam `json:"params,omitempty"` +} +type RlApi struct { + Defines []RlDefine `json:"defines"` + Structs []RlStruct `json:"structs"` + Aliases []RlAlias `json:"aliases"` + Enums []RlEnum `json:"enums"` + Callbacks []RlCallback `json:"callbacks"` + Functions []RlFunction `json:"functions"` +} diff --git a/wasm-runtime/api/rlapi.json b/wasm-runtime/api/rlapi.json new file mode 100644 index 0000000..d4c059c --- /dev/null +++ b/wasm-runtime/api/rlapi.json @@ -0,0 +1,12463 @@ +{ + "defines": [ + { + "name": "RAYLIB_H", + "type": "GUARD", + "value": "", + "description": "" + }, + { + "name": "RAYLIB_VERSION_MAJOR", + "type": "INT", + "value": 5, + "description": "" + }, + { + "name": "RAYLIB_VERSION_MINOR", + "type": "INT", + "value": 6, + "description": "" + }, + { + "name": "RAYLIB_VERSION_PATCH", + "type": "INT", + "value": 0, + "description": "" + }, + { + "name": "RAYLIB_VERSION", + "type": "STRING", + "value": "5.6-dev", + "description": "" + }, + { + "name": "__declspec(x)", + "type": "MACRO", + "value": "__attribute__((x))", + "description": "" + }, + { + "name": "RLAPI", + "type": "UNKNOWN", + "value": "__declspec(dllexport)", + "description": "Building the library as a Win32 shared library (.dll)" + }, + { + "name": "PI", + "type": "FLOAT", + "value": 3.14159265358979323846, + "description": "" + }, + { + "name": "DEG2RAD", + "type": "FLOAT_MATH", + "value": "(PI/180.0f)", + "description": "" + }, + { + "name": "RAD2DEG", + "type": "FLOAT_MATH", + "value": "(180.0f/PI)", + "description": "" + }, + { + "name": "RL_MALLOC(sz)", + "type": "MACRO", + "value": "malloc(sz)", + "description": "" + }, + { + "name": "RL_CALLOC(n,sz)", + "type": "MACRO", + "value": "calloc(n,sz)", + "description": "" + }, + { + "name": "RL_REALLOC(ptr,sz)", + "type": "MACRO", + "value": "realloc(ptr,sz)", + "description": "" + }, + { + "name": "RL_FREE(ptr)", + "type": "MACRO", + "value": "free(ptr)", + "description": "" + }, + { + "name": "CLITERAL(type)", + "type": "MACRO", + "value": "type", + "description": "" + }, + { + "name": "RL_COLOR_TYPE", + "type": "GUARD", + "value": "", + "description": "" + }, + { + "name": "RL_RECTANGLE_TYPE", + "type": "GUARD", + "value": "", + "description": "" + }, + { + "name": "RL_VECTOR2_TYPE", + "type": "GUARD", + "value": "", + "description": "" + }, + { + "name": "RL_VECTOR3_TYPE", + "type": "GUARD", + "value": "", + "description": "" + }, + { + "name": "RL_VECTOR4_TYPE", + "type": "GUARD", + "value": "", + "description": "" + }, + { + "name": "RL_QUATERNION_TYPE", + "type": "GUARD", + "value": "", + "description": "" + }, + { + "name": "RL_MATRIX_TYPE", + "type": "GUARD", + "value": "", + "description": "" + }, + { + "name": "LIGHTGRAY", + "type": "COLOR", + "value": "CLITERAL(Color){ 200, 200, 200, 255 }", + "description": "Light Gray" + }, + { + "name": "GRAY", + "type": "COLOR", + "value": "CLITERAL(Color){ 130, 130, 130, 255 }", + "description": "Gray" + }, + { + "name": "DARKGRAY", + "type": "COLOR", + "value": "CLITERAL(Color){ 80, 80, 80, 255 }", + "description": "Dark Gray" + }, + { + "name": "YELLOW", + "type": "COLOR", + "value": "CLITERAL(Color){ 253, 249, 0, 255 }", + "description": "Yellow" + }, + { + "name": "GOLD", + "type": "COLOR", + "value": "CLITERAL(Color){ 255, 203, 0, 255 }", + "description": "Gold" + }, + { + "name": "ORANGE", + "type": "COLOR", + "value": "CLITERAL(Color){ 255, 161, 0, 255 }", + "description": "Orange" + }, + { + "name": "PINK", + "type": "COLOR", + "value": "CLITERAL(Color){ 255, 109, 194, 255 }", + "description": "Pink" + }, + { + "name": "RED", + "type": "COLOR", + "value": "CLITERAL(Color){ 230, 41, 55, 255 }", + "description": "Red" + }, + { + "name": "MAROON", + "type": "COLOR", + "value": "CLITERAL(Color){ 190, 33, 55, 255 }", + "description": "Maroon" + }, + { + "name": "GREEN", + "type": "COLOR", + "value": "CLITERAL(Color){ 0, 228, 48, 255 }", + "description": "Green" + }, + { + "name": "LIME", + "type": "COLOR", + "value": "CLITERAL(Color){ 0, 158, 47, 255 }", + "description": "Lime" + }, + { + "name": "DARKGREEN", + "type": "COLOR", + "value": "CLITERAL(Color){ 0, 117, 44, 255 }", + "description": "Dark Green" + }, + { + "name": "SKYBLUE", + "type": "COLOR", + "value": "CLITERAL(Color){ 102, 191, 255, 255 }", + "description": "Sky Blue" + }, + { + "name": "BLUE", + "type": "COLOR", + "value": "CLITERAL(Color){ 0, 121, 241, 255 }", + "description": "Blue" + }, + { + "name": "DARKBLUE", + "type": "COLOR", + "value": "CLITERAL(Color){ 0, 82, 172, 255 }", + "description": "Dark Blue" + }, + { + "name": "PURPLE", + "type": "COLOR", + "value": "CLITERAL(Color){ 200, 122, 255, 255 }", + "description": "Purple" + }, + { + "name": "VIOLET", + "type": "COLOR", + "value": "CLITERAL(Color){ 135, 60, 190, 255 }", + "description": "Violet" + }, + { + "name": "DARKPURPLE", + "type": "COLOR", + "value": "CLITERAL(Color){ 112, 31, 126, 255 }", + "description": "Dark Purple" + }, + { + "name": "BEIGE", + "type": "COLOR", + "value": "CLITERAL(Color){ 211, 176, 131, 255 }", + "description": "Beige" + }, + { + "name": "BROWN", + "type": "COLOR", + "value": "CLITERAL(Color){ 127, 106, 79, 255 }", + "description": "Brown" + }, + { + "name": "DARKBROWN", + "type": "COLOR", + "value": "CLITERAL(Color){ 76, 63, 47, 255 }", + "description": "Dark Brown" + }, + { + "name": "WHITE", + "type": "COLOR", + "value": "CLITERAL(Color){ 255, 255, 255, 255 }", + "description": "White" + }, + { + "name": "BLACK", + "type": "COLOR", + "value": "CLITERAL(Color){ 0, 0, 0, 255 }", + "description": "Black" + }, + { + "name": "BLANK", + "type": "COLOR", + "value": "CLITERAL(Color){ 0, 0, 0, 0 }", + "description": "Blank (Transparent)" + }, + { + "name": "MAGENTA", + "type": "COLOR", + "value": "CLITERAL(Color){ 255, 0, 255, 255 }", + "description": "Magenta" + }, + { + "name": "RAYWHITE", + "type": "COLOR", + "value": "CLITERAL(Color){ 245, 245, 245, 255 }", + "description": "My own White (raylib logo)" + }, + { + "name": "RL_BOOL_TYPE", + "type": "GUARD", + "value": "", + "description": "" + }, + { + "name": "MOUSE_LEFT_BUTTON", + "type": "UNKNOWN", + "value": "MOUSE_BUTTON_LEFT", + "description": "" + }, + { + "name": "MOUSE_RIGHT_BUTTON", + "type": "UNKNOWN", + "value": "MOUSE_BUTTON_RIGHT", + "description": "" + }, + { + "name": "MOUSE_MIDDLE_BUTTON", + "type": "UNKNOWN", + "value": "MOUSE_BUTTON_MIDDLE", + "description": "" + }, + { + "name": "MATERIAL_MAP_DIFFUSE", + "type": "UNKNOWN", + "value": "MATERIAL_MAP_ALBEDO", + "description": "" + }, + { + "name": "MATERIAL_MAP_SPECULAR", + "type": "UNKNOWN", + "value": "MATERIAL_MAP_METALNESS", + "description": "" + }, + { + "name": "SHADER_LOC_MAP_DIFFUSE", + "type": "UNKNOWN", + "value": "SHADER_LOC_MAP_ALBEDO", + "description": "" + }, + { + "name": "SHADER_LOC_MAP_SPECULAR", + "type": "UNKNOWN", + "value": "SHADER_LOC_MAP_METALNESS", + "description": "" + }, + { + "name": "GetMouseRay", + "type": "UNKNOWN", + "value": "GetScreenToWorldRay", + "description": "Compatibility hack for previous raylib versions" + } + ], + "structs": [ + { + "name": "Vector2", + "description": "Vector2, 2 components", + "fields": [ + { + "type": "float", + "name": "x", + "description": "Vector x component" + }, + { + "type": "float", + "name": "y", + "description": "Vector y component" + } + ] + }, + { + "name": "Vector3", + "description": "Vector3, 3 components", + "fields": [ + { + "type": "float", + "name": "x", + "description": "Vector x component" + }, + { + "type": "float", + "name": "y", + "description": "Vector y component" + }, + { + "type": "float", + "name": "z", + "description": "Vector z component" + } + ] + }, + { + "name": "Vector4", + "description": "Vector4, 4 components", + "fields": [ + { + "type": "float", + "name": "x", + "description": "Vector x component" + }, + { + "type": "float", + "name": "y", + "description": "Vector y component" + }, + { + "type": "float", + "name": "z", + "description": "Vector z component" + }, + { + "type": "float", + "name": "w", + "description": "Vector w component" + } + ] + }, + { + "name": "Matrix", + "description": "Matrix, 4x4 components, column major, OpenGL style, right-handed", + "fields": [ + { + "type": "float", + "name": "m0", + "description": "Matrix first row (4 components)" + }, + { + "type": "float", + "name": "m4", + "description": "Matrix first row (4 components)" + }, + { + "type": "float", + "name": "m8", + "description": "Matrix first row (4 components)" + }, + { + "type": "float", + "name": "m12", + "description": "Matrix first row (4 components)" + }, + { + "type": "float", + "name": "m1", + "description": "Matrix second row (4 components)" + }, + { + "type": "float", + "name": "m5", + "description": "Matrix second row (4 components)" + }, + { + "type": "float", + "name": "m9", + "description": "Matrix second row (4 components)" + }, + { + "type": "float", + "name": "m13", + "description": "Matrix second row (4 components)" + }, + { + "type": "float", + "name": "m2", + "description": "Matrix third row (4 components)" + }, + { + "type": "float", + "name": "m6", + "description": "Matrix third row (4 components)" + }, + { + "type": "float", + "name": "m10", + "description": "Matrix third row (4 components)" + }, + { + "type": "float", + "name": "m14", + "description": "Matrix third row (4 components)" + }, + { + "type": "float", + "name": "m3", + "description": "Matrix fourth row (4 components)" + }, + { + "type": "float", + "name": "m7", + "description": "Matrix fourth row (4 components)" + }, + { + "type": "float", + "name": "m11", + "description": "Matrix fourth row (4 components)" + }, + { + "type": "float", + "name": "m15", + "description": "Matrix fourth row (4 components)" + } + ] + }, + { + "name": "Color", + "description": "Color, 4 components, R8G8B8A8 (32bit)", + "fields": [ + { + "type": "unsigned char", + "name": "r", + "description": "Color red value" + }, + { + "type": "unsigned char", + "name": "g", + "description": "Color green value" + }, + { + "type": "unsigned char", + "name": "b", + "description": "Color blue value" + }, + { + "type": "unsigned char", + "name": "a", + "description": "Color alpha value" + } + ] + }, + { + "name": "Rectangle", + "description": "Rectangle, 4 components", + "fields": [ + { + "type": "float", + "name": "x", + "description": "Rectangle top-left corner position x" + }, + { + "type": "float", + "name": "y", + "description": "Rectangle top-left corner position y" + }, + { + "type": "float", + "name": "width", + "description": "Rectangle width" + }, + { + "type": "float", + "name": "height", + "description": "Rectangle height" + } + ] + }, + { + "name": "Image", + "description": "Image, pixel data stored in CPU memory (RAM)", + "fields": [ + { + "type": "void *", + "name": "data", + "description": "Image raw data" + }, + { + "type": "int", + "name": "width", + "description": "Image base width" + }, + { + "type": "int", + "name": "height", + "description": "Image base height" + }, + { + "type": "int", + "name": "mipmaps", + "description": "Mipmap levels, 1 by default" + }, + { + "type": "int", + "name": "format", + "description": "Data format (PixelFormat type)" + } + ] + }, + { + "name": "Texture", + "description": "Texture, tex data stored in GPU memory (VRAM)", + "fields": [ + { + "type": "unsigned int", + "name": "id", + "description": "OpenGL texture id" + }, + { + "type": "int", + "name": "width", + "description": "Texture base width" + }, + { + "type": "int", + "name": "height", + "description": "Texture base height" + }, + { + "type": "int", + "name": "mipmaps", + "description": "Mipmap levels, 1 by default" + }, + { + "type": "int", + "name": "format", + "description": "Data format (PixelFormat type)" + } + ] + }, + { + "name": "RenderTexture", + "description": "RenderTexture, fbo for texture rendering", + "fields": [ + { + "type": "unsigned int", + "name": "id", + "description": "OpenGL framebuffer object id" + }, + { + "type": "Texture", + "name": "texture", + "description": "Color buffer attachment texture" + }, + { + "type": "Texture", + "name": "depth", + "description": "Depth buffer attachment texture" + } + ] + }, + { + "name": "NPatchInfo", + "description": "NPatchInfo, n-patch layout info", + "fields": [ + { + "type": "Rectangle", + "name": "source", + "description": "Texture source rectangle" + }, + { + "type": "int", + "name": "left", + "description": "Left border offset" + }, + { + "type": "int", + "name": "top", + "description": "Top border offset" + }, + { + "type": "int", + "name": "right", + "description": "Right border offset" + }, + { + "type": "int", + "name": "bottom", + "description": "Bottom border offset" + }, + { + "type": "int", + "name": "layout", + "description": "Layout of the n-patch: 3x3, 1x3 or 3x1" + } + ] + }, + { + "name": "GlyphInfo", + "description": "GlyphInfo, font characters glyphs info", + "fields": [ + { + "type": "int", + "name": "value", + "description": "Character value (Unicode)" + }, + { + "type": "int", + "name": "offsetX", + "description": "Character offset X when drawing" + }, + { + "type": "int", + "name": "offsetY", + "description": "Character offset Y when drawing" + }, + { + "type": "int", + "name": "advanceX", + "description": "Character advance position X" + }, + { + "type": "Image", + "name": "image", + "description": "Character image data" + } + ] + }, + { + "name": "Font", + "description": "Font, font texture and GlyphInfo array data", + "fields": [ + { + "type": "int", + "name": "baseSize", + "description": "Base size (default chars height)" + }, + { + "type": "int", + "name": "glyphCount", + "description": "Number of glyph characters" + }, + { + "type": "int", + "name": "glyphPadding", + "description": "Padding around the glyph characters" + }, + { + "type": "Texture2D", + "name": "texture", + "description": "Texture atlas containing the glyphs" + }, + { + "type": "Rectangle *", + "name": "recs", + "description": "Rectangles in texture for the glyphs" + }, + { + "type": "GlyphInfo *", + "name": "glyphs", + "description": "Glyphs info data" + } + ] + }, + { + "name": "Camera3D", + "description": "Camera, defines position/orientation in 3d space", + "fields": [ + { + "type": "Vector3", + "name": "position", + "description": "Camera position" + }, + { + "type": "Vector3", + "name": "target", + "description": "Camera target it looks-at" + }, + { + "type": "Vector3", + "name": "up", + "description": "Camera up vector (rotation over its axis)" + }, + { + "type": "float", + "name": "fovy", + "description": "Camera field-of-view aperture in Y (degrees) in perspective, used as near plane height in world units in orthographic" + }, + { + "type": "int", + "name": "projection", + "description": "Camera projection: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC" + } + ] + }, + { + "name": "Camera2D", + "description": "Camera2D, defines position/orientation in 2d space", + "fields": [ + { + "type": "Vector2", + "name": "offset", + "description": "Camera offset (screen space offset from window origin)" + }, + { + "type": "Vector2", + "name": "target", + "description": "Camera target (world space target point that is mapped to screen space offset)" + }, + { + "type": "float", + "name": "rotation", + "description": "Camera rotation in degrees (pivots around target)" + }, + { + "type": "float", + "name": "zoom", + "description": "Camera zoom (scaling around target), must not be set to 0, set to 1.0f for no scale" + } + ] + }, + { + "name": "Mesh", + "description": "Mesh, vertex data and vao/vbo", + "fields": [ + { + "type": "int", + "name": "vertexCount", + "description": "Number of vertices stored in arrays" + }, + { + "type": "int", + "name": "triangleCount", + "description": "Number of triangles stored (indexed or not)" + }, + { + "type": "float *", + "name": "vertices", + "description": "Vertex position (XYZ - 3 components per vertex) (shader-location = 0)" + }, + { + "type": "float *", + "name": "texcoords", + "description": "Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1)" + }, + { + "type": "float *", + "name": "texcoords2", + "description": "Vertex texture second coordinates (UV - 2 components per vertex) (shader-location = 5)" + }, + { + "type": "float *", + "name": "normals", + "description": "Vertex normals (XYZ - 3 components per vertex) (shader-location = 2)" + }, + { + "type": "float *", + "name": "tangents", + "description": "Vertex tangents (XYZW - 4 components per vertex) (shader-location = 4)" + }, + { + "type": "unsigned char *", + "name": "colors", + "description": "Vertex colors (RGBA - 4 components per vertex) (shader-location = 3)" + }, + { + "type": "unsigned short *", + "name": "indices", + "description": "Vertex indices (in case vertex data comes indexed)" + }, + { + "type": "float *", + "name": "animVertices", + "description": "Animated vertex positions (after bones transformations)" + }, + { + "type": "float *", + "name": "animNormals", + "description": "Animated normals (after bones transformations)" + }, + { + "type": "unsigned char *", + "name": "boneIds", + "description": "Vertex bone ids, max 255 bone ids, up to 4 bones influence by vertex (skinning) (shader-location = 6)" + }, + { + "type": "float *", + "name": "boneWeights", + "description": "Vertex bone weight, up to 4 bones influence by vertex (skinning) (shader-location = 7)" + }, + { + "type": "Matrix *", + "name": "boneMatrices", + "description": "Bones animated transformation matrices" + }, + { + "type": "int", + "name": "boneCount", + "description": "Number of bones" + }, + { + "type": "unsigned int", + "name": "vaoId", + "description": "OpenGL Vertex Array Object id" + }, + { + "type": "unsigned int *", + "name": "vboId", + "description": "OpenGL Vertex Buffer Objects id (default vertex data)" + } + ] + }, + { + "name": "Shader", + "description": "Shader", + "fields": [ + { + "type": "unsigned int", + "name": "id", + "description": "Shader program id" + }, + { + "type": "int *", + "name": "locs", + "description": "Shader locations array (RL_MAX_SHADER_LOCATIONS)" + } + ] + }, + { + "name": "MaterialMap", + "description": "MaterialMap", + "fields": [ + { + "type": "Texture2D", + "name": "texture", + "description": "Material map texture" + }, + { + "type": "Color", + "name": "color", + "description": "Material map color" + }, + { + "type": "float", + "name": "value", + "description": "Material map value" + } + ] + }, + { + "name": "Material", + "description": "Material, includes shader and maps", + "fields": [ + { + "type": "Shader", + "name": "shader", + "description": "Material shader" + }, + { + "type": "MaterialMap *", + "name": "maps", + "description": "Material maps array (MAX_MATERIAL_MAPS)" + }, + { + "type": "float[4]", + "name": "params", + "description": "Material generic parameters (if required)" + } + ] + }, + { + "name": "Transform", + "description": "Transform, vertex transformation data", + "fields": [ + { + "type": "Vector3", + "name": "translation", + "description": "Translation" + }, + { + "type": "Quaternion", + "name": "rotation", + "description": "Rotation" + }, + { + "type": "Vector3", + "name": "scale", + "description": "Scale" + } + ] + }, + { + "name": "BoneInfo", + "description": "Bone, skeletal animation bone", + "fields": [ + { + "type": "char[32]", + "name": "name", + "description": "Bone name" + }, + { + "type": "int", + "name": "parent", + "description": "Bone parent" + } + ] + }, + { + "name": "Model", + "description": "Model, meshes, materials and animation data", + "fields": [ + { + "type": "Matrix", + "name": "transform", + "description": "Local transform matrix" + }, + { + "type": "int", + "name": "meshCount", + "description": "Number of meshes" + }, + { + "type": "int", + "name": "materialCount", + "description": "Number of materials" + }, + { + "type": "Mesh *", + "name": "meshes", + "description": "Meshes array" + }, + { + "type": "Material *", + "name": "materials", + "description": "Materials array" + }, + { + "type": "int *", + "name": "meshMaterial", + "description": "Mesh material number" + }, + { + "type": "int", + "name": "boneCount", + "description": "Number of bones" + }, + { + "type": "BoneInfo *", + "name": "bones", + "description": "Bones information (skeleton)" + }, + { + "type": "Transform *", + "name": "bindPose", + "description": "Bones base transformation (pose)" + } + ] + }, + { + "name": "ModelAnimation", + "description": "ModelAnimation", + "fields": [ + { + "type": "int", + "name": "boneCount", + "description": "Number of bones" + }, + { + "type": "int", + "name": "frameCount", + "description": "Number of animation frames" + }, + { + "type": "BoneInfo *", + "name": "bones", + "description": "Bones information (skeleton)" + }, + { + "type": "Transform **", + "name": "framePoses", + "description": "Poses array by frame" + }, + { + "type": "char[32]", + "name": "name", + "description": "Animation name" + } + ] + }, + { + "name": "Ray", + "description": "Ray, ray for raycasting", + "fields": [ + { + "type": "Vector3", + "name": "position", + "description": "Ray position (origin)" + }, + { + "type": "Vector3", + "name": "direction", + "description": "Ray direction (normalized)" + } + ] + }, + { + "name": "RayCollision", + "description": "RayCollision, ray hit information", + "fields": [ + { + "type": "bool", + "name": "hit", + "description": "Did the ray hit something?" + }, + { + "type": "float", + "name": "distance", + "description": "Distance to the nearest hit" + }, + { + "type": "Vector3", + "name": "point", + "description": "Point of the nearest hit" + }, + { + "type": "Vector3", + "name": "normal", + "description": "Surface normal of hit" + } + ] + }, + { + "name": "BoundingBox", + "description": "BoundingBox", + "fields": [ + { + "type": "Vector3", + "name": "min", + "description": "Minimum vertex box-corner" + }, + { + "type": "Vector3", + "name": "max", + "description": "Maximum vertex box-corner" + } + ] + }, + { + "name": "Wave", + "description": "Wave, audio wave data", + "fields": [ + { + "type": "unsigned int", + "name": "frameCount", + "description": "Total number of frames (considering channels)" + }, + { + "type": "unsigned int", + "name": "sampleRate", + "description": "Frequency (samples per second)" + }, + { + "type": "unsigned int", + "name": "sampleSize", + "description": "Bit depth (bits per sample): 8, 16, 32 (24 not supported)" + }, + { + "type": "unsigned int", + "name": "channels", + "description": "Number of channels (1-mono, 2-stereo, ...)" + }, + { + "type": "void *", + "name": "data", + "description": "Buffer data pointer" + } + ] + }, + { + "name": "AudioStream", + "description": "AudioStream, custom audio stream", + "fields": [ + { + "type": "rAudioBuffer *", + "name": "buffer", + "description": "Pointer to internal data used by the audio system" + }, + { + "type": "rAudioProcessor *", + "name": "processor", + "description": "Pointer to internal data processor, useful for audio effects" + }, + { + "type": "unsigned int", + "name": "sampleRate", + "description": "Frequency (samples per second)" + }, + { + "type": "unsigned int", + "name": "sampleSize", + "description": "Bit depth (bits per sample): 8, 16, 32 (24 not supported)" + }, + { + "type": "unsigned int", + "name": "channels", + "description": "Number of channels (1-mono, 2-stereo, ...)" + } + ] + }, + { + "name": "Sound", + "description": "Sound", + "fields": [ + { + "type": "AudioStream", + "name": "stream", + "description": "Audio stream" + }, + { + "type": "unsigned int", + "name": "frameCount", + "description": "Total number of frames (considering channels)" + } + ] + }, + { + "name": "Music", + "description": "Music, audio stream, anything longer than ~10 seconds should be streamed", + "fields": [ + { + "type": "AudioStream", + "name": "stream", + "description": "Audio stream" + }, + { + "type": "unsigned int", + "name": "frameCount", + "description": "Total number of frames (considering channels)" + }, + { + "type": "bool", + "name": "looping", + "description": "Music looping enable" + }, + { + "type": "int", + "name": "ctxType", + "description": "Type of music context (audio filetype)" + }, + { + "type": "void *", + "name": "ctxData", + "description": "Audio context data, depends on type" + } + ] + }, + { + "name": "VrDeviceInfo", + "description": "VrDeviceInfo, Head-Mounted-Display device parameters", + "fields": [ + { + "type": "int", + "name": "hResolution", + "description": "Horizontal resolution in pixels" + }, + { + "type": "int", + "name": "vResolution", + "description": "Vertical resolution in pixels" + }, + { + "type": "float", + "name": "hScreenSize", + "description": "Horizontal size in meters" + }, + { + "type": "float", + "name": "vScreenSize", + "description": "Vertical size in meters" + }, + { + "type": "float", + "name": "eyeToScreenDistance", + "description": "Distance between eye and display in meters" + }, + { + "type": "float", + "name": "lensSeparationDistance", + "description": "Lens separation distance in meters" + }, + { + "type": "float", + "name": "interpupillaryDistance", + "description": "IPD (distance between pupils) in meters" + }, + { + "type": "float[4]", + "name": "lensDistortionValues", + "description": "Lens distortion constant parameters" + }, + { + "type": "float[4]", + "name": "chromaAbCorrection", + "description": "Chromatic aberration correction parameters" + } + ] + }, + { + "name": "VrStereoConfig", + "description": "VrStereoConfig, VR stereo rendering configuration for simulator", + "fields": [ + { + "type": "Matrix[2]", + "name": "projection", + "description": "VR projection matrices (per eye)" + }, + { + "type": "Matrix[2]", + "name": "viewOffset", + "description": "VR view offset matrices (per eye)" + }, + { + "type": "float[2]", + "name": "leftLensCenter", + "description": "VR left lens center" + }, + { + "type": "float[2]", + "name": "rightLensCenter", + "description": "VR right lens center" + }, + { + "type": "float[2]", + "name": "leftScreenCenter", + "description": "VR left screen center" + }, + { + "type": "float[2]", + "name": "rightScreenCenter", + "description": "VR right screen center" + }, + { + "type": "float[2]", + "name": "scale", + "description": "VR distortion scale" + }, + { + "type": "float[2]", + "name": "scaleIn", + "description": "VR distortion scale in" + } + ] + }, + { + "name": "FilePathList", + "description": "File path list", + "fields": [ + { + "type": "unsigned int", + "name": "count", + "description": "Filepaths entries count" + }, + { + "type": "char **", + "name": "paths", + "description": "Filepaths entries" + } + ] + }, + { + "name": "AutomationEvent", + "description": "Automation event", + "fields": [ + { + "type": "unsigned int", + "name": "frame", + "description": "Event frame" + }, + { + "type": "unsigned int", + "name": "type", + "description": "Event type (AutomationEventType)" + }, + { + "type": "int[4]", + "name": "params", + "description": "Event parameters (if required)" + } + ] + }, + { + "name": "AutomationEventList", + "description": "Automation event list", + "fields": [ + { + "type": "unsigned int", + "name": "capacity", + "description": "Events max entries (MAX_AUTOMATION_EVENTS)" + }, + { + "type": "unsigned int", + "name": "count", + "description": "Events entries count" + }, + { + "type": "AutomationEvent *", + "name": "events", + "description": "Events entries" + } + ] + } + ], + "aliases": [ + { + "type": "Vector4", + "name": "Quaternion", + "description": "Quaternion, 4 components (Vector4 alias)" + }, + { + "type": "Texture", + "name": "Texture2D", + "description": "Texture2D, same as Texture" + }, + { + "type": "Texture", + "name": "TextureCubemap", + "description": "TextureCubemap, same as Texture" + }, + { + "type": "RenderTexture", + "name": "RenderTexture2D", + "description": "RenderTexture2D, same as RenderTexture" + }, + { + "type": "Camera3D", + "name": "Camera", + "description": "Camera type fallback, defaults to Camera3D" + } + ], + "enums": [ + { + "name": "ConfigFlags", + "description": "System/Window config flags", + "values": [ + { + "name": "FLAG_VSYNC_HINT", + "value": 64, + "description": "Set to try enabling V-Sync on GPU" + }, + { + "name": "FLAG_FULLSCREEN_MODE", + "value": 2, + "description": "Set to run program in fullscreen" + }, + { + "name": "FLAG_WINDOW_RESIZABLE", + "value": 4, + "description": "Set to allow resizable window" + }, + { + "name": "FLAG_WINDOW_UNDECORATED", + "value": 8, + "description": "Set to disable window decoration (frame and buttons)" + }, + { + "name": "FLAG_WINDOW_HIDDEN", + "value": 128, + "description": "Set to hide window" + }, + { + "name": "FLAG_WINDOW_MINIMIZED", + "value": 512, + "description": "Set to minimize window (iconify)" + }, + { + "name": "FLAG_WINDOW_MAXIMIZED", + "value": 1024, + "description": "Set to maximize window (expanded to monitor)" + }, + { + "name": "FLAG_WINDOW_UNFOCUSED", + "value": 2048, + "description": "Set to window non focused" + }, + { + "name": "FLAG_WINDOW_TOPMOST", + "value": 4096, + "description": "Set to window always on top" + }, + { + "name": "FLAG_WINDOW_ALWAYS_RUN", + "value": 256, + "description": "Set to allow windows running while minimized" + }, + { + "name": "FLAG_WINDOW_TRANSPARENT", + "value": 16, + "description": "Set to allow transparent framebuffer" + }, + { + "name": "FLAG_WINDOW_HIGHDPI", + "value": 8192, + "description": "Set to support HighDPI" + }, + { + "name": "FLAG_WINDOW_MOUSE_PASSTHROUGH", + "value": 16384, + "description": "Set to support mouse passthrough, only supported when FLAG_WINDOW_UNDECORATED" + }, + { + "name": "FLAG_BORDERLESS_WINDOWED_MODE", + "value": 32768, + "description": "Set to run program in borderless windowed mode" + }, + { + "name": "FLAG_MSAA_4X_HINT", + "value": 32, + "description": "Set to try enabling MSAA 4X" + }, + { + "name": "FLAG_INTERLACED_HINT", + "value": 65536, + "description": "Set to try enabling interlaced video format (for V3D)" + } + ] + }, + { + "name": "TraceLogLevel", + "description": "Trace log level", + "values": [ + { + "name": "LOG_ALL", + "value": 0, + "description": "Display all logs" + }, + { + "name": "LOG_TRACE", + "value": 1, + "description": "Trace logging, intended for internal use only" + }, + { + "name": "LOG_DEBUG", + "value": 2, + "description": "Debug logging, used for internal debugging, it should be disabled on release builds" + }, + { + "name": "LOG_INFO", + "value": 3, + "description": "Info logging, used for program execution info" + }, + { + "name": "LOG_WARNING", + "value": 4, + "description": "Warning logging, used on recoverable failures" + }, + { + "name": "LOG_ERROR", + "value": 5, + "description": "Error logging, used on unrecoverable failures" + }, + { + "name": "LOG_FATAL", + "value": 6, + "description": "Fatal logging, used to abort program: exit(EXIT_FAILURE)" + }, + { + "name": "LOG_NONE", + "value": 7, + "description": "Disable logging" + } + ] + }, + { + "name": "KeyboardKey", + "description": "Keyboard keys (US keyboard layout)", + "values": [ + { + "name": "KEY_NULL", + "value": 0, + "description": "Key: NULL, used for no key pressed" + }, + { + "name": "KEY_APOSTROPHE", + "value": 39, + "description": "Key: '" + }, + { + "name": "KEY_COMMA", + "value": 44, + "description": "Key: ," + }, + { + "name": "KEY_MINUS", + "value": 45, + "description": "Key: -" + }, + { + "name": "KEY_PERIOD", + "value": 46, + "description": "Key: ." + }, + { + "name": "KEY_SLASH", + "value": 47, + "description": "Key: /" + }, + { + "name": "KEY_ZERO", + "value": 48, + "description": "Key: 0" + }, + { + "name": "KEY_ONE", + "value": 49, + "description": "Key: 1" + }, + { + "name": "KEY_TWO", + "value": 50, + "description": "Key: 2" + }, + { + "name": "KEY_THREE", + "value": 51, + "description": "Key: 3" + }, + { + "name": "KEY_FOUR", + "value": 52, + "description": "Key: 4" + }, + { + "name": "KEY_FIVE", + "value": 53, + "description": "Key: 5" + }, + { + "name": "KEY_SIX", + "value": 54, + "description": "Key: 6" + }, + { + "name": "KEY_SEVEN", + "value": 55, + "description": "Key: 7" + }, + { + "name": "KEY_EIGHT", + "value": 56, + "description": "Key: 8" + }, + { + "name": "KEY_NINE", + "value": 57, + "description": "Key: 9" + }, + { + "name": "KEY_SEMICOLON", + "value": 59, + "description": "Key: ;" + }, + { + "name": "KEY_EQUAL", + "value": 61, + "description": "Key: =" + }, + { + "name": "KEY_A", + "value": 65, + "description": "Key: A | a" + }, + { + "name": "KEY_B", + "value": 66, + "description": "Key: B | b" + }, + { + "name": "KEY_C", + "value": 67, + "description": "Key: C | c" + }, + { + "name": "KEY_D", + "value": 68, + "description": "Key: D | d" + }, + { + "name": "KEY_E", + "value": 69, + "description": "Key: E | e" + }, + { + "name": "KEY_F", + "value": 70, + "description": "Key: F | f" + }, + { + "name": "KEY_G", + "value": 71, + "description": "Key: G | g" + }, + { + "name": "KEY_H", + "value": 72, + "description": "Key: H | h" + }, + { + "name": "KEY_I", + "value": 73, + "description": "Key: I | i" + }, + { + "name": "KEY_J", + "value": 74, + "description": "Key: J | j" + }, + { + "name": "KEY_K", + "value": 75, + "description": "Key: K | k" + }, + { + "name": "KEY_L", + "value": 76, + "description": "Key: L | l" + }, + { + "name": "KEY_M", + "value": 77, + "description": "Key: M | m" + }, + { + "name": "KEY_N", + "value": 78, + "description": "Key: N | n" + }, + { + "name": "KEY_O", + "value": 79, + "description": "Key: O | o" + }, + { + "name": "KEY_P", + "value": 80, + "description": "Key: P | p" + }, + { + "name": "KEY_Q", + "value": 81, + "description": "Key: Q | q" + }, + { + "name": "KEY_R", + "value": 82, + "description": "Key: R | r" + }, + { + "name": "KEY_S", + "value": 83, + "description": "Key: S | s" + }, + { + "name": "KEY_T", + "value": 84, + "description": "Key: T | t" + }, + { + "name": "KEY_U", + "value": 85, + "description": "Key: U | u" + }, + { + "name": "KEY_V", + "value": 86, + "description": "Key: V | v" + }, + { + "name": "KEY_W", + "value": 87, + "description": "Key: W | w" + }, + { + "name": "KEY_X", + "value": 88, + "description": "Key: X | x" + }, + { + "name": "KEY_Y", + "value": 89, + "description": "Key: Y | y" + }, + { + "name": "KEY_Z", + "value": 90, + "description": "Key: Z | z" + }, + { + "name": "KEY_LEFT_BRACKET", + "value": 91, + "description": "Key: [" + }, + { + "name": "KEY_BACKSLASH", + "value": 92, + "description": "Key: '\\'" + }, + { + "name": "KEY_RIGHT_BRACKET", + "value": 93, + "description": "Key: ]" + }, + { + "name": "KEY_GRAVE", + "value": 96, + "description": "Key: `" + }, + { + "name": "KEY_SPACE", + "value": 32, + "description": "Key: Space" + }, + { + "name": "KEY_ESCAPE", + "value": 256, + "description": "Key: Esc" + }, + { + "name": "KEY_ENTER", + "value": 257, + "description": "Key: Enter" + }, + { + "name": "KEY_TAB", + "value": 258, + "description": "Key: Tab" + }, + { + "name": "KEY_BACKSPACE", + "value": 259, + "description": "Key: Backspace" + }, + { + "name": "KEY_INSERT", + "value": 260, + "description": "Key: Ins" + }, + { + "name": "KEY_DELETE", + "value": 261, + "description": "Key: Del" + }, + { + "name": "KEY_RIGHT", + "value": 262, + "description": "Key: Cursor right" + }, + { + "name": "KEY_LEFT", + "value": 263, + "description": "Key: Cursor left" + }, + { + "name": "KEY_DOWN", + "value": 264, + "description": "Key: Cursor down" + }, + { + "name": "KEY_UP", + "value": 265, + "description": "Key: Cursor up" + }, + { + "name": "KEY_PAGE_UP", + "value": 266, + "description": "Key: Page up" + }, + { + "name": "KEY_PAGE_DOWN", + "value": 267, + "description": "Key: Page down" + }, + { + "name": "KEY_HOME", + "value": 268, + "description": "Key: Home" + }, + { + "name": "KEY_END", + "value": 269, + "description": "Key: End" + }, + { + "name": "KEY_CAPS_LOCK", + "value": 280, + "description": "Key: Caps lock" + }, + { + "name": "KEY_SCROLL_LOCK", + "value": 281, + "description": "Key: Scroll down" + }, + { + "name": "KEY_NUM_LOCK", + "value": 282, + "description": "Key: Num lock" + }, + { + "name": "KEY_PRINT_SCREEN", + "value": 283, + "description": "Key: Print screen" + }, + { + "name": "KEY_PAUSE", + "value": 284, + "description": "Key: Pause" + }, + { + "name": "KEY_F1", + "value": 290, + "description": "Key: F1" + }, + { + "name": "KEY_F2", + "value": 291, + "description": "Key: F2" + }, + { + "name": "KEY_F3", + "value": 292, + "description": "Key: F3" + }, + { + "name": "KEY_F4", + "value": 293, + "description": "Key: F4" + }, + { + "name": "KEY_F5", + "value": 294, + "description": "Key: F5" + }, + { + "name": "KEY_F6", + "value": 295, + "description": "Key: F6" + }, + { + "name": "KEY_F7", + "value": 296, + "description": "Key: F7" + }, + { + "name": "KEY_F8", + "value": 297, + "description": "Key: F8" + }, + { + "name": "KEY_F9", + "value": 298, + "description": "Key: F9" + }, + { + "name": "KEY_F10", + "value": 299, + "description": "Key: F10" + }, + { + "name": "KEY_F11", + "value": 300, + "description": "Key: F11" + }, + { + "name": "KEY_F12", + "value": 301, + "description": "Key: F12" + }, + { + "name": "KEY_LEFT_SHIFT", + "value": 340, + "description": "Key: Shift left" + }, + { + "name": "KEY_LEFT_CONTROL", + "value": 341, + "description": "Key: Control left" + }, + { + "name": "KEY_LEFT_ALT", + "value": 342, + "description": "Key: Alt left" + }, + { + "name": "KEY_LEFT_SUPER", + "value": 343, + "description": "Key: Super left" + }, + { + "name": "KEY_RIGHT_SHIFT", + "value": 344, + "description": "Key: Shift right" + }, + { + "name": "KEY_RIGHT_CONTROL", + "value": 345, + "description": "Key: Control right" + }, + { + "name": "KEY_RIGHT_ALT", + "value": 346, + "description": "Key: Alt right" + }, + { + "name": "KEY_RIGHT_SUPER", + "value": 347, + "description": "Key: Super right" + }, + { + "name": "KEY_KB_MENU", + "value": 348, + "description": "Key: KB menu" + }, + { + "name": "KEY_KP_0", + "value": 320, + "description": "Key: Keypad 0" + }, + { + "name": "KEY_KP_1", + "value": 321, + "description": "Key: Keypad 1" + }, + { + "name": "KEY_KP_2", + "value": 322, + "description": "Key: Keypad 2" + }, + { + "name": "KEY_KP_3", + "value": 323, + "description": "Key: Keypad 3" + }, + { + "name": "KEY_KP_4", + "value": 324, + "description": "Key: Keypad 4" + }, + { + "name": "KEY_KP_5", + "value": 325, + "description": "Key: Keypad 5" + }, + { + "name": "KEY_KP_6", + "value": 326, + "description": "Key: Keypad 6" + }, + { + "name": "KEY_KP_7", + "value": 327, + "description": "Key: Keypad 7" + }, + { + "name": "KEY_KP_8", + "value": 328, + "description": "Key: Keypad 8" + }, + { + "name": "KEY_KP_9", + "value": 329, + "description": "Key: Keypad 9" + }, + { + "name": "KEY_KP_DECIMAL", + "value": 330, + "description": "Key: Keypad ." + }, + { + "name": "KEY_KP_DIVIDE", + "value": 331, + "description": "Key: Keypad /" + }, + { + "name": "KEY_KP_MULTIPLY", + "value": 332, + "description": "Key: Keypad *" + }, + { + "name": "KEY_KP_SUBTRACT", + "value": 333, + "description": "Key: Keypad -" + }, + { + "name": "KEY_KP_ADD", + "value": 334, + "description": "Key: Keypad +" + }, + { + "name": "KEY_KP_ENTER", + "value": 335, + "description": "Key: Keypad Enter" + }, + { + "name": "KEY_KP_EQUAL", + "value": 336, + "description": "Key: Keypad =" + }, + { + "name": "KEY_BACK", + "value": 4, + "description": "Key: Android back button" + }, + { + "name": "KEY_MENU", + "value": 5, + "description": "Key: Android menu button" + }, + { + "name": "KEY_VOLUME_UP", + "value": 24, + "description": "Key: Android volume up button" + }, + { + "name": "KEY_VOLUME_DOWN", + "value": 25, + "description": "Key: Android volume down button" + } + ] + }, + { + "name": "MouseButton", + "description": "Mouse buttons", + "values": [ + { + "name": "MOUSE_BUTTON_LEFT", + "value": 0, + "description": "Mouse button left" + }, + { + "name": "MOUSE_BUTTON_RIGHT", + "value": 1, + "description": "Mouse button right" + }, + { + "name": "MOUSE_BUTTON_MIDDLE", + "value": 2, + "description": "Mouse button middle (pressed wheel)" + }, + { + "name": "MOUSE_BUTTON_SIDE", + "value": 3, + "description": "Mouse button side (advanced mouse device)" + }, + { + "name": "MOUSE_BUTTON_EXTRA", + "value": 4, + "description": "Mouse button extra (advanced mouse device)" + }, + { + "name": "MOUSE_BUTTON_FORWARD", + "value": 5, + "description": "Mouse button forward (advanced mouse device)" + }, + { + "name": "MOUSE_BUTTON_BACK", + "value": 6, + "description": "Mouse button back (advanced mouse device)" + } + ] + }, + { + "name": "MouseCursor", + "description": "Mouse cursor", + "values": [ + { + "name": "MOUSE_CURSOR_DEFAULT", + "value": 0, + "description": "Default pointer shape" + }, + { + "name": "MOUSE_CURSOR_ARROW", + "value": 1, + "description": "Arrow shape" + }, + { + "name": "MOUSE_CURSOR_IBEAM", + "value": 2, + "description": "Text writing cursor shape" + }, + { + "name": "MOUSE_CURSOR_CROSSHAIR", + "value": 3, + "description": "Cross shape" + }, + { + "name": "MOUSE_CURSOR_POINTING_HAND", + "value": 4, + "description": "Pointing hand cursor" + }, + { + "name": "MOUSE_CURSOR_RESIZE_EW", + "value": 5, + "description": "Horizontal resize/move arrow shape" + }, + { + "name": "MOUSE_CURSOR_RESIZE_NS", + "value": 6, + "description": "Vertical resize/move arrow shape" + }, + { + "name": "MOUSE_CURSOR_RESIZE_NWSE", + "value": 7, + "description": "Top-left to bottom-right diagonal resize/move arrow shape" + }, + { + "name": "MOUSE_CURSOR_RESIZE_NESW", + "value": 8, + "description": "The top-right to bottom-left diagonal resize/move arrow shape" + }, + { + "name": "MOUSE_CURSOR_RESIZE_ALL", + "value": 9, + "description": "The omnidirectional resize/move cursor shape" + }, + { + "name": "MOUSE_CURSOR_NOT_ALLOWED", + "value": 10, + "description": "The operation-not-allowed shape" + } + ] + }, + { + "name": "GamepadButton", + "description": "Gamepad buttons", + "values": [ + { + "name": "GAMEPAD_BUTTON_UNKNOWN", + "value": 0, + "description": "Unknown button, just for error checking" + }, + { + "name": "GAMEPAD_BUTTON_LEFT_FACE_UP", + "value": 1, + "description": "Gamepad left DPAD up button" + }, + { + "name": "GAMEPAD_BUTTON_LEFT_FACE_RIGHT", + "value": 2, + "description": "Gamepad left DPAD right button" + }, + { + "name": "GAMEPAD_BUTTON_LEFT_FACE_DOWN", + "value": 3, + "description": "Gamepad left DPAD down button" + }, + { + "name": "GAMEPAD_BUTTON_LEFT_FACE_LEFT", + "value": 4, + "description": "Gamepad left DPAD left button" + }, + { + "name": "GAMEPAD_BUTTON_RIGHT_FACE_UP", + "value": 5, + "description": "Gamepad right button up (i.e. PS3: Triangle, Xbox: Y)" + }, + { + "name": "GAMEPAD_BUTTON_RIGHT_FACE_RIGHT", + "value": 6, + "description": "Gamepad right button right (i.e. PS3: Circle, Xbox: B)" + }, + { + "name": "GAMEPAD_BUTTON_RIGHT_FACE_DOWN", + "value": 7, + "description": "Gamepad right button down (i.e. PS3: Cross, Xbox: A)" + }, + { + "name": "GAMEPAD_BUTTON_RIGHT_FACE_LEFT", + "value": 8, + "description": "Gamepad right button left (i.e. PS3: Square, Xbox: X)" + }, + { + "name": "GAMEPAD_BUTTON_LEFT_TRIGGER_1", + "value": 9, + "description": "Gamepad top/back trigger left (first), it could be a trailing button" + }, + { + "name": "GAMEPAD_BUTTON_LEFT_TRIGGER_2", + "value": 10, + "description": "Gamepad top/back trigger left (second), it could be a trailing button" + }, + { + "name": "GAMEPAD_BUTTON_RIGHT_TRIGGER_1", + "value": 11, + "description": "Gamepad top/back trigger right (first), it could be a trailing button" + }, + { + "name": "GAMEPAD_BUTTON_RIGHT_TRIGGER_2", + "value": 12, + "description": "Gamepad top/back trigger right (second), it could be a trailing button" + }, + { + "name": "GAMEPAD_BUTTON_MIDDLE_LEFT", + "value": 13, + "description": "Gamepad center buttons, left one (i.e. PS3: Select)" + }, + { + "name": "GAMEPAD_BUTTON_MIDDLE", + "value": 14, + "description": "Gamepad center buttons, middle one (i.e. PS3: PS, Xbox: XBOX)" + }, + { + "name": "GAMEPAD_BUTTON_MIDDLE_RIGHT", + "value": 15, + "description": "Gamepad center buttons, right one (i.e. PS3: Start)" + }, + { + "name": "GAMEPAD_BUTTON_LEFT_THUMB", + "value": 16, + "description": "Gamepad joystick pressed button left" + }, + { + "name": "GAMEPAD_BUTTON_RIGHT_THUMB", + "value": 17, + "description": "Gamepad joystick pressed button right" + } + ] + }, + { + "name": "GamepadAxis", + "description": "Gamepad axes", + "values": [ + { + "name": "GAMEPAD_AXIS_LEFT_X", + "value": 0, + "description": "Gamepad left stick X axis" + }, + { + "name": "GAMEPAD_AXIS_LEFT_Y", + "value": 1, + "description": "Gamepad left stick Y axis" + }, + { + "name": "GAMEPAD_AXIS_RIGHT_X", + "value": 2, + "description": "Gamepad right stick X axis" + }, + { + "name": "GAMEPAD_AXIS_RIGHT_Y", + "value": 3, + "description": "Gamepad right stick Y axis" + }, + { + "name": "GAMEPAD_AXIS_LEFT_TRIGGER", + "value": 4, + "description": "Gamepad back trigger left, pressure level: [1..-1]" + }, + { + "name": "GAMEPAD_AXIS_RIGHT_TRIGGER", + "value": 5, + "description": "Gamepad back trigger right, pressure level: [1..-1]" + } + ] + }, + { + "name": "MaterialMapIndex", + "description": "Material map index", + "values": [ + { + "name": "MATERIAL_MAP_ALBEDO", + "value": 0, + "description": "Albedo material (same as: MATERIAL_MAP_DIFFUSE)" + }, + { + "name": "MATERIAL_MAP_METALNESS", + "value": 1, + "description": "Metalness material (same as: MATERIAL_MAP_SPECULAR)" + }, + { + "name": "MATERIAL_MAP_NORMAL", + "value": 2, + "description": "Normal material" + }, + { + "name": "MATERIAL_MAP_ROUGHNESS", + "value": 3, + "description": "Roughness material" + }, + { + "name": "MATERIAL_MAP_OCCLUSION", + "value": 4, + "description": "Ambient occlusion material" + }, + { + "name": "MATERIAL_MAP_EMISSION", + "value": 5, + "description": "Emission material" + }, + { + "name": "MATERIAL_MAP_HEIGHT", + "value": 6, + "description": "Heightmap material" + }, + { + "name": "MATERIAL_MAP_CUBEMAP", + "value": 7, + "description": "Cubemap material (NOTE: Uses GL_TEXTURE_CUBE_MAP)" + }, + { + "name": "MATERIAL_MAP_IRRADIANCE", + "value": 8, + "description": "Irradiance material (NOTE: Uses GL_TEXTURE_CUBE_MAP)" + }, + { + "name": "MATERIAL_MAP_PREFILTER", + "value": 9, + "description": "Prefilter material (NOTE: Uses GL_TEXTURE_CUBE_MAP)" + }, + { + "name": "MATERIAL_MAP_BRDF", + "value": 10, + "description": "Brdf material" + } + ] + }, + { + "name": "ShaderLocationIndex", + "description": "Shader location index", + "values": [ + { + "name": "SHADER_LOC_VERTEX_POSITION", + "value": 0, + "description": "Shader location: vertex attribute: position" + }, + { + "name": "SHADER_LOC_VERTEX_TEXCOORD01", + "value": 1, + "description": "Shader location: vertex attribute: texcoord01" + }, + { + "name": "SHADER_LOC_VERTEX_TEXCOORD02", + "value": 2, + "description": "Shader location: vertex attribute: texcoord02" + }, + { + "name": "SHADER_LOC_VERTEX_NORMAL", + "value": 3, + "description": "Shader location: vertex attribute: normal" + }, + { + "name": "SHADER_LOC_VERTEX_TANGENT", + "value": 4, + "description": "Shader location: vertex attribute: tangent" + }, + { + "name": "SHADER_LOC_VERTEX_COLOR", + "value": 5, + "description": "Shader location: vertex attribute: color" + }, + { + "name": "SHADER_LOC_MATRIX_MVP", + "value": 6, + "description": "Shader location: matrix uniform: model-view-projection" + }, + { + "name": "SHADER_LOC_MATRIX_VIEW", + "value": 7, + "description": "Shader location: matrix uniform: view (camera transform)" + }, + { + "name": "SHADER_LOC_MATRIX_PROJECTION", + "value": 8, + "description": "Shader location: matrix uniform: projection" + }, + { + "name": "SHADER_LOC_MATRIX_MODEL", + "value": 9, + "description": "Shader location: matrix uniform: model (transform)" + }, + { + "name": "SHADER_LOC_MATRIX_NORMAL", + "value": 10, + "description": "Shader location: matrix uniform: normal" + }, + { + "name": "SHADER_LOC_VECTOR_VIEW", + "value": 11, + "description": "Shader location: vector uniform: view" + }, + { + "name": "SHADER_LOC_COLOR_DIFFUSE", + "value": 12, + "description": "Shader location: vector uniform: diffuse color" + }, + { + "name": "SHADER_LOC_COLOR_SPECULAR", + "value": 13, + "description": "Shader location: vector uniform: specular color" + }, + { + "name": "SHADER_LOC_COLOR_AMBIENT", + "value": 14, + "description": "Shader location: vector uniform: ambient color" + }, + { + "name": "SHADER_LOC_MAP_ALBEDO", + "value": 15, + "description": "Shader location: sampler2d texture: albedo (same as: SHADER_LOC_MAP_DIFFUSE)" + }, + { + "name": "SHADER_LOC_MAP_METALNESS", + "value": 16, + "description": "Shader location: sampler2d texture: metalness (same as: SHADER_LOC_MAP_SPECULAR)" + }, + { + "name": "SHADER_LOC_MAP_NORMAL", + "value": 17, + "description": "Shader location: sampler2d texture: normal" + }, + { + "name": "SHADER_LOC_MAP_ROUGHNESS", + "value": 18, + "description": "Shader location: sampler2d texture: roughness" + }, + { + "name": "SHADER_LOC_MAP_OCCLUSION", + "value": 19, + "description": "Shader location: sampler2d texture: occlusion" + }, + { + "name": "SHADER_LOC_MAP_EMISSION", + "value": 20, + "description": "Shader location: sampler2d texture: emission" + }, + { + "name": "SHADER_LOC_MAP_HEIGHT", + "value": 21, + "description": "Shader location: sampler2d texture: height" + }, + { + "name": "SHADER_LOC_MAP_CUBEMAP", + "value": 22, + "description": "Shader location: samplerCube texture: cubemap" + }, + { + "name": "SHADER_LOC_MAP_IRRADIANCE", + "value": 23, + "description": "Shader location: samplerCube texture: irradiance" + }, + { + "name": "SHADER_LOC_MAP_PREFILTER", + "value": 24, + "description": "Shader location: samplerCube texture: prefilter" + }, + { + "name": "SHADER_LOC_MAP_BRDF", + "value": 25, + "description": "Shader location: sampler2d texture: brdf" + }, + { + "name": "SHADER_LOC_VERTEX_BONEIDS", + "value": 26, + "description": "Shader location: vertex attribute: boneIds" + }, + { + "name": "SHADER_LOC_VERTEX_BONEWEIGHTS", + "value": 27, + "description": "Shader location: vertex attribute: boneWeights" + }, + { + "name": "SHADER_LOC_BONE_MATRICES", + "value": 28, + "description": "Shader location: array of matrices uniform: boneMatrices" + }, + { + "name": "SHADER_LOC_VERTEX_INSTANCE_TX", + "value": 29, + "description": "Shader location: vertex attribute: instanceTransform" + } + ] + }, + { + "name": "ShaderUniformDataType", + "description": "Shader uniform data type", + "values": [ + { + "name": "SHADER_UNIFORM_FLOAT", + "value": 0, + "description": "Shader uniform type: float" + }, + { + "name": "SHADER_UNIFORM_VEC2", + "value": 1, + "description": "Shader uniform type: vec2 (2 float)" + }, + { + "name": "SHADER_UNIFORM_VEC3", + "value": 2, + "description": "Shader uniform type: vec3 (3 float)" + }, + { + "name": "SHADER_UNIFORM_VEC4", + "value": 3, + "description": "Shader uniform type: vec4 (4 float)" + }, + { + "name": "SHADER_UNIFORM_INT", + "value": 4, + "description": "Shader uniform type: int" + }, + { + "name": "SHADER_UNIFORM_IVEC2", + "value": 5, + "description": "Shader uniform type: ivec2 (2 int)" + }, + { + "name": "SHADER_UNIFORM_IVEC3", + "value": 6, + "description": "Shader uniform type: ivec3 (3 int)" + }, + { + "name": "SHADER_UNIFORM_IVEC4", + "value": 7, + "description": "Shader uniform type: ivec4 (4 int)" + }, + { + "name": "SHADER_UNIFORM_UINT", + "value": 8, + "description": "Shader uniform type: unsigned int" + }, + { + "name": "SHADER_UNIFORM_UIVEC2", + "value": 9, + "description": "Shader uniform type: uivec2 (2 unsigned int)" + }, + { + "name": "SHADER_UNIFORM_UIVEC3", + "value": 10, + "description": "Shader uniform type: uivec3 (3 unsigned int)" + }, + { + "name": "SHADER_UNIFORM_UIVEC4", + "value": 11, + "description": "Shader uniform type: uivec4 (4 unsigned int)" + }, + { + "name": "SHADER_UNIFORM_SAMPLER2D", + "value": 12, + "description": "Shader uniform type: sampler2d" + } + ] + }, + { + "name": "ShaderAttributeDataType", + "description": "Shader attribute data types", + "values": [ + { + "name": "SHADER_ATTRIB_FLOAT", + "value": 0, + "description": "Shader attribute type: float" + }, + { + "name": "SHADER_ATTRIB_VEC2", + "value": 1, + "description": "Shader attribute type: vec2 (2 float)" + }, + { + "name": "SHADER_ATTRIB_VEC3", + "value": 2, + "description": "Shader attribute type: vec3 (3 float)" + }, + { + "name": "SHADER_ATTRIB_VEC4", + "value": 3, + "description": "Shader attribute type: vec4 (4 float)" + } + ] + }, + { + "name": "PixelFormat", + "description": "Pixel formats", + "values": [ + { + "name": "PIXELFORMAT_UNCOMPRESSED_GRAYSCALE", + "value": 1, + "description": "8 bit per pixel (no alpha)" + }, + { + "name": "PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA", + "value": 2, + "description": "8*2 bpp (2 channels)" + }, + { + "name": "PIXELFORMAT_UNCOMPRESSED_R5G6B5", + "value": 3, + "description": "16 bpp" + }, + { + "name": "PIXELFORMAT_UNCOMPRESSED_R8G8B8", + "value": 4, + "description": "24 bpp" + }, + { + "name": "PIXELFORMAT_UNCOMPRESSED_R5G5B5A1", + "value": 5, + "description": "16 bpp (1 bit alpha)" + }, + { + "name": "PIXELFORMAT_UNCOMPRESSED_R4G4B4A4", + "value": 6, + "description": "16 bpp (4 bit alpha)" + }, + { + "name": "PIXELFORMAT_UNCOMPRESSED_R8G8B8A8", + "value": 7, + "description": "32 bpp" + }, + { + "name": "PIXELFORMAT_UNCOMPRESSED_R32", + "value": 8, + "description": "32 bpp (1 channel - float)" + }, + { + "name": "PIXELFORMAT_UNCOMPRESSED_R32G32B32", + "value": 9, + "description": "32*3 bpp (3 channels - float)" + }, + { + "name": "PIXELFORMAT_UNCOMPRESSED_R32G32B32A32", + "value": 10, + "description": "32*4 bpp (4 channels - float)" + }, + { + "name": "PIXELFORMAT_UNCOMPRESSED_R16", + "value": 11, + "description": "16 bpp (1 channel - half float)" + }, + { + "name": "PIXELFORMAT_UNCOMPRESSED_R16G16B16", + "value": 12, + "description": "16*3 bpp (3 channels - half float)" + }, + { + "name": "PIXELFORMAT_UNCOMPRESSED_R16G16B16A16", + "value": 13, + "description": "16*4 bpp (4 channels - half float)" + }, + { + "name": "PIXELFORMAT_COMPRESSED_DXT1_RGB", + "value": 14, + "description": "4 bpp (no alpha)" + }, + { + "name": "PIXELFORMAT_COMPRESSED_DXT1_RGBA", + "value": 15, + "description": "4 bpp (1 bit alpha)" + }, + { + "name": "PIXELFORMAT_COMPRESSED_DXT3_RGBA", + "value": 16, + "description": "8 bpp" + }, + { + "name": "PIXELFORMAT_COMPRESSED_DXT5_RGBA", + "value": 17, + "description": "8 bpp" + }, + { + "name": "PIXELFORMAT_COMPRESSED_ETC1_RGB", + "value": 18, + "description": "4 bpp" + }, + { + "name": "PIXELFORMAT_COMPRESSED_ETC2_RGB", + "value": 19, + "description": "4 bpp" + }, + { + "name": "PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA", + "value": 20, + "description": "8 bpp" + }, + { + "name": "PIXELFORMAT_COMPRESSED_PVRT_RGB", + "value": 21, + "description": "4 bpp" + }, + { + "name": "PIXELFORMAT_COMPRESSED_PVRT_RGBA", + "value": 22, + "description": "4 bpp" + }, + { + "name": "PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA", + "value": 23, + "description": "8 bpp" + }, + { + "name": "PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA", + "value": 24, + "description": "2 bpp" + } + ] + }, + { + "name": "TextureFilter", + "description": "Texture parameters: filter mode", + "values": [ + { + "name": "TEXTURE_FILTER_POINT", + "value": 0, + "description": "No filter, just pixel approximation" + }, + { + "name": "TEXTURE_FILTER_BILINEAR", + "value": 1, + "description": "Linear filtering" + }, + { + "name": "TEXTURE_FILTER_TRILINEAR", + "value": 2, + "description": "Trilinear filtering (linear with mipmaps)" + }, + { + "name": "TEXTURE_FILTER_ANISOTROPIC_4X", + "value": 3, + "description": "Anisotropic filtering 4x" + }, + { + "name": "TEXTURE_FILTER_ANISOTROPIC_8X", + "value": 4, + "description": "Anisotropic filtering 8x" + }, + { + "name": "TEXTURE_FILTER_ANISOTROPIC_16X", + "value": 5, + "description": "Anisotropic filtering 16x" + } + ] + }, + { + "name": "TextureWrap", + "description": "Texture parameters: wrap mode", + "values": [ + { + "name": "TEXTURE_WRAP_REPEAT", + "value": 0, + "description": "Repeats texture in tiled mode" + }, + { + "name": "TEXTURE_WRAP_CLAMP", + "value": 1, + "description": "Clamps texture to edge pixel in tiled mode" + }, + { + "name": "TEXTURE_WRAP_MIRROR_REPEAT", + "value": 2, + "description": "Mirrors and repeats the texture in tiled mode" + }, + { + "name": "TEXTURE_WRAP_MIRROR_CLAMP", + "value": 3, + "description": "Mirrors and clamps to border the texture in tiled mode" + } + ] + }, + { + "name": "CubemapLayout", + "description": "Cubemap layouts", + "values": [ + { + "name": "CUBEMAP_LAYOUT_AUTO_DETECT", + "value": 0, + "description": "Automatically detect layout type" + }, + { + "name": "CUBEMAP_LAYOUT_LINE_VERTICAL", + "value": 1, + "description": "Layout is defined by a vertical line with faces" + }, + { + "name": "CUBEMAP_LAYOUT_LINE_HORIZONTAL", + "value": 2, + "description": "Layout is defined by a horizontal line with faces" + }, + { + "name": "CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR", + "value": 3, + "description": "Layout is defined by a 3x4 cross with cubemap faces" + }, + { + "name": "CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE", + "value": 4, + "description": "Layout is defined by a 4x3 cross with cubemap faces" + } + ] + }, + { + "name": "FontType", + "description": "Font type, defines generation method", + "values": [ + { + "name": "FONT_DEFAULT", + "value": 0, + "description": "Default font generation, anti-aliased" + }, + { + "name": "FONT_BITMAP", + "value": 1, + "description": "Bitmap font generation, no anti-aliasing" + }, + { + "name": "FONT_SDF", + "value": 2, + "description": "SDF font generation, requires external shader" + } + ] + }, + { + "name": "BlendMode", + "description": "Color blending modes (pre-defined)", + "values": [ + { + "name": "BLEND_ALPHA", + "value": 0, + "description": "Blend textures considering alpha (default)" + }, + { + "name": "BLEND_ADDITIVE", + "value": 1, + "description": "Blend textures adding colors" + }, + { + "name": "BLEND_MULTIPLIED", + "value": 2, + "description": "Blend textures multiplying colors" + }, + { + "name": "BLEND_ADD_COLORS", + "value": 3, + "description": "Blend textures adding colors (alternative)" + }, + { + "name": "BLEND_SUBTRACT_COLORS", + "value": 4, + "description": "Blend textures subtracting colors (alternative)" + }, + { + "name": "BLEND_ALPHA_PREMULTIPLY", + "value": 5, + "description": "Blend premultiplied textures considering alpha" + }, + { + "name": "BLEND_CUSTOM", + "value": 6, + "description": "Blend textures using custom src/dst factors (use rlSetBlendFactors())" + }, + { + "name": "BLEND_CUSTOM_SEPARATE", + "value": 7, + "description": "Blend textures using custom rgb/alpha separate src/dst factors (use rlSetBlendFactorsSeparate())" + } + ] + }, + { + "name": "Gesture", + "description": "Gesture", + "values": [ + { + "name": "GESTURE_NONE", + "value": 0, + "description": "No gesture" + }, + { + "name": "GESTURE_TAP", + "value": 1, + "description": "Tap gesture" + }, + { + "name": "GESTURE_DOUBLETAP", + "value": 2, + "description": "Double tap gesture" + }, + { + "name": "GESTURE_HOLD", + "value": 4, + "description": "Hold gesture" + }, + { + "name": "GESTURE_DRAG", + "value": 8, + "description": "Drag gesture" + }, + { + "name": "GESTURE_SWIPE_RIGHT", + "value": 16, + "description": "Swipe right gesture" + }, + { + "name": "GESTURE_SWIPE_LEFT", + "value": 32, + "description": "Swipe left gesture" + }, + { + "name": "GESTURE_SWIPE_UP", + "value": 64, + "description": "Swipe up gesture" + }, + { + "name": "GESTURE_SWIPE_DOWN", + "value": 128, + "description": "Swipe down gesture" + }, + { + "name": "GESTURE_PINCH_IN", + "value": 256, + "description": "Pinch in gesture" + }, + { + "name": "GESTURE_PINCH_OUT", + "value": 512, + "description": "Pinch out gesture" + } + ] + }, + { + "name": "CameraMode", + "description": "Camera system modes", + "values": [ + { + "name": "CAMERA_CUSTOM", + "value": 0, + "description": "Camera custom, controlled by user (UpdateCamera() does nothing)" + }, + { + "name": "CAMERA_FREE", + "value": 1, + "description": "Camera free mode" + }, + { + "name": "CAMERA_ORBITAL", + "value": 2, + "description": "Camera orbital, around target, zoom supported" + }, + { + "name": "CAMERA_FIRST_PERSON", + "value": 3, + "description": "Camera first person" + }, + { + "name": "CAMERA_THIRD_PERSON", + "value": 4, + "description": "Camera third person" + } + ] + }, + { + "name": "CameraProjection", + "description": "Camera projection", + "values": [ + { + "name": "CAMERA_PERSPECTIVE", + "value": 0, + "description": "Perspective projection" + }, + { + "name": "CAMERA_ORTHOGRAPHIC", + "value": 1, + "description": "Orthographic projection" + } + ] + }, + { + "name": "NPatchLayout", + "description": "N-patch layout", + "values": [ + { + "name": "NPATCH_NINE_PATCH", + "value": 0, + "description": "Npatch layout: 3x3 tiles" + }, + { + "name": "NPATCH_THREE_PATCH_VERTICAL", + "value": 1, + "description": "Npatch layout: 1x3 tiles" + }, + { + "name": "NPATCH_THREE_PATCH_HORIZONTAL", + "value": 2, + "description": "Npatch layout: 3x1 tiles" + } + ] + } + ], + "callbacks": [ + { + "name": "TraceLogCallback", + "description": "Logging: Redirect trace log messages", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "logLevel" + }, + { + "type": "const char *", + "name": "text" + }, + { + "type": "va_list", + "name": "args" + } + ] + }, + { + "name": "LoadFileDataCallback", + "description": "FileIO: Load binary data", + "returnType": "unsigned char *", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "int *", + "name": "dataSize" + } + ] + }, + { + "name": "SaveFileDataCallback", + "description": "FileIO: Save binary data", + "returnType": "bool", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "void *", + "name": "data" + }, + { + "type": "int", + "name": "dataSize" + } + ] + }, + { + "name": "LoadFileTextCallback", + "description": "FileIO: Load text data", + "returnType": "char *", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "SaveFileTextCallback", + "description": "FileIO: Save text data", + "returnType": "bool", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "const char *", + "name": "text" + } + ] + }, + { + "name": "AudioCallback", + "description": "", + "returnType": "void", + "params": [ + { + "type": "void *", + "name": "bufferData" + }, + { + "type": "unsigned int", + "name": "frames" + } + ] + } + ], + "functions": [ + { + "name": "InitWindow", + "description": "Initialize window and OpenGL context", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + }, + { + "type": "const char *", + "name": "title" + } + ] + }, + { + "name": "CloseWindow", + "description": "Close window and unload OpenGL context", + "returnType": "void" + }, + { + "name": "WindowShouldClose", + "description": "Check if application should close (KEY_ESCAPE pressed or windows close icon clicked)", + "returnType": "bool" + }, + { + "name": "IsWindowReady", + "description": "Check if window has been initialized successfully", + "returnType": "bool" + }, + { + "name": "IsWindowFullscreen", + "description": "Check if window is currently fullscreen", + "returnType": "bool" + }, + { + "name": "IsWindowHidden", + "description": "Check if window is currently hidden", + "returnType": "bool" + }, + { + "name": "IsWindowMinimized", + "description": "Check if window is currently minimized", + "returnType": "bool" + }, + { + "name": "IsWindowMaximized", + "description": "Check if window is currently maximized", + "returnType": "bool" + }, + { + "name": "IsWindowFocused", + "description": "Check if window is currently focused", + "returnType": "bool" + }, + { + "name": "IsWindowResized", + "description": "Check if window has been resized last frame", + "returnType": "bool" + }, + { + "name": "IsWindowState", + "description": "Check if one specific window flag is enabled", + "returnType": "bool", + "params": [ + { + "type": "unsigned int", + "name": "flag" + } + ] + }, + { + "name": "SetWindowState", + "description": "Set window configuration state using flags", + "returnType": "void", + "params": [ + { + "type": "unsigned int", + "name": "flags" + } + ] + }, + { + "name": "ClearWindowState", + "description": "Clear window configuration state flags", + "returnType": "void", + "params": [ + { + "type": "unsigned int", + "name": "flags" + } + ] + }, + { + "name": "ToggleFullscreen", + "description": "Toggle window state: fullscreen/windowed, resizes monitor to match window resolution", + "returnType": "void" + }, + { + "name": "ToggleBorderlessWindowed", + "description": "Toggle window state: borderless windowed, resizes window to match monitor resolution", + "returnType": "void" + }, + { + "name": "MaximizeWindow", + "description": "Set window state: maximized, if resizable", + "returnType": "void" + }, + { + "name": "MinimizeWindow", + "description": "Set window state: minimized, if resizable", + "returnType": "void" + }, + { + "name": "RestoreWindow", + "description": "Restore window from being minimized/maximized", + "returnType": "void" + }, + { + "name": "SetWindowIcon", + "description": "Set icon for window (single image, RGBA 32bit)", + "returnType": "void", + "params": [ + { + "type": "Image", + "name": "image" + } + ] + }, + { + "name": "SetWindowIcons", + "description": "Set icon for window (multiple images, RGBA 32bit)", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "images" + }, + { + "type": "int", + "name": "count" + } + ] + }, + { + "name": "SetWindowTitle", + "description": "Set title for window", + "returnType": "void", + "params": [ + { + "type": "const char *", + "name": "title" + } + ] + }, + { + "name": "SetWindowPosition", + "description": "Set window position on screen", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "x" + }, + { + "type": "int", + "name": "y" + } + ] + }, + { + "name": "SetWindowMonitor", + "description": "Set monitor for the current window", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "monitor" + } + ] + }, + { + "name": "SetWindowMinSize", + "description": "Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE)", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + } + ] + }, + { + "name": "SetWindowMaxSize", + "description": "Set window maximum dimensions (for FLAG_WINDOW_RESIZABLE)", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + } + ] + }, + { + "name": "SetWindowSize", + "description": "Set window dimensions", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + } + ] + }, + { + "name": "SetWindowOpacity", + "description": "Set window opacity [0.0f..1.0f]", + "returnType": "void", + "params": [ + { + "type": "float", + "name": "opacity" + } + ] + }, + { + "name": "SetWindowFocused", + "description": "Set window focused", + "returnType": "void" + }, + { + "name": "GetWindowHandle", + "description": "Get native window handle", + "returnType": "void *" + }, + { + "name": "GetScreenWidth", + "description": "Get current screen width", + "returnType": "int" + }, + { + "name": "GetScreenHeight", + "description": "Get current screen height", + "returnType": "int" + }, + { + "name": "GetRenderWidth", + "description": "Get current render width (it considers HiDPI)", + "returnType": "int" + }, + { + "name": "GetRenderHeight", + "description": "Get current render height (it considers HiDPI)", + "returnType": "int" + }, + { + "name": "GetMonitorCount", + "description": "Get number of connected monitors", + "returnType": "int" + }, + { + "name": "GetCurrentMonitor", + "description": "Get current monitor where window is placed", + "returnType": "int" + }, + { + "name": "GetMonitorPosition", + "description": "Get specified monitor position", + "returnType": "Vector2", + "params": [ + { + "type": "int", + "name": "monitor" + } + ] + }, + { + "name": "GetMonitorWidth", + "description": "Get specified monitor width (current video mode used by monitor)", + "returnType": "int", + "params": [ + { + "type": "int", + "name": "monitor" + } + ] + }, + { + "name": "GetMonitorHeight", + "description": "Get specified monitor height (current video mode used by monitor)", + "returnType": "int", + "params": [ + { + "type": "int", + "name": "monitor" + } + ] + }, + { + "name": "GetMonitorPhysicalWidth", + "description": "Get specified monitor physical width in millimetres", + "returnType": "int", + "params": [ + { + "type": "int", + "name": "monitor" + } + ] + }, + { + "name": "GetMonitorPhysicalHeight", + "description": "Get specified monitor physical height in millimetres", + "returnType": "int", + "params": [ + { + "type": "int", + "name": "monitor" + } + ] + }, + { + "name": "GetMonitorRefreshRate", + "description": "Get specified monitor refresh rate", + "returnType": "int", + "params": [ + { + "type": "int", + "name": "monitor" + } + ] + }, + { + "name": "GetWindowPosition", + "description": "Get window position XY on monitor", + "returnType": "Vector2" + }, + { + "name": "GetWindowScaleDPI", + "description": "Get window scale DPI factor", + "returnType": "Vector2" + }, + { + "name": "GetMonitorName", + "description": "Get the human-readable, UTF-8 encoded name of the specified monitor", + "returnType": "const char *", + "params": [ + { + "type": "int", + "name": "monitor" + } + ] + }, + { + "name": "SetClipboardText", + "description": "Set clipboard text content", + "returnType": "void", + "params": [ + { + "type": "const char *", + "name": "text" + } + ] + }, + { + "name": "GetClipboardText", + "description": "Get clipboard text content", + "returnType": "const char *" + }, + { + "name": "GetClipboardImage", + "description": "Get clipboard image content", + "returnType": "Image" + }, + { + "name": "EnableEventWaiting", + "description": "Enable waiting for events on EndDrawing(), no automatic event polling", + "returnType": "void" + }, + { + "name": "DisableEventWaiting", + "description": "Disable waiting for events on EndDrawing(), automatic events polling", + "returnType": "void" + }, + { + "name": "ShowCursor", + "description": "Shows cursor", + "returnType": "void" + }, + { + "name": "HideCursor", + "description": "Hides cursor", + "returnType": "void" + }, + { + "name": "IsCursorHidden", + "description": "Check if cursor is not visible", + "returnType": "bool" + }, + { + "name": "EnableCursor", + "description": "Enables cursor (unlock cursor)", + "returnType": "void" + }, + { + "name": "DisableCursor", + "description": "Disables cursor (lock cursor)", + "returnType": "void" + }, + { + "name": "IsCursorOnScreen", + "description": "Check if cursor is on the screen", + "returnType": "bool" + }, + { + "name": "ClearBackground", + "description": "Set background color (framebuffer clear color)", + "returnType": "void", + "params": [ + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "BeginDrawing", + "description": "Setup canvas (framebuffer) to start drawing", + "returnType": "void" + }, + { + "name": "EndDrawing", + "description": "End canvas drawing and swap buffers (double buffering)", + "returnType": "void" + }, + { + "name": "BeginMode2D", + "description": "Begin 2D mode with custom camera (2D)", + "returnType": "void", + "params": [ + { + "type": "Camera2D", + "name": "camera" + } + ] + }, + { + "name": "EndMode2D", + "description": "Ends 2D mode with custom camera", + "returnType": "void" + }, + { + "name": "BeginMode3D", + "description": "Begin 3D mode with custom camera (3D)", + "returnType": "void", + "params": [ + { + "type": "Camera3D", + "name": "camera" + } + ] + }, + { + "name": "EndMode3D", + "description": "Ends 3D mode and returns to default 2D orthographic mode", + "returnType": "void" + }, + { + "name": "BeginTextureMode", + "description": "Begin drawing to render texture", + "returnType": "void", + "params": [ + { + "type": "RenderTexture2D", + "name": "target" + } + ] + }, + { + "name": "EndTextureMode", + "description": "Ends drawing to render texture", + "returnType": "void" + }, + { + "name": "BeginShaderMode", + "description": "Begin custom shader drawing", + "returnType": "void", + "params": [ + { + "type": "Shader", + "name": "shader" + } + ] + }, + { + "name": "EndShaderMode", + "description": "End custom shader drawing (use default shader)", + "returnType": "void" + }, + { + "name": "BeginBlendMode", + "description": "Begin blending mode (alpha, additive, multiplied, subtract, custom)", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "mode" + } + ] + }, + { + "name": "EndBlendMode", + "description": "End blending mode (reset to default: alpha blending)", + "returnType": "void" + }, + { + "name": "BeginScissorMode", + "description": "Begin scissor mode (define screen area for following drawing)", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "x" + }, + { + "type": "int", + "name": "y" + }, + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + } + ] + }, + { + "name": "EndScissorMode", + "description": "End scissor mode", + "returnType": "void" + }, + { + "name": "BeginVrStereoMode", + "description": "Begin stereo rendering (requires VR simulator)", + "returnType": "void", + "params": [ + { + "type": "VrStereoConfig", + "name": "config" + } + ] + }, + { + "name": "EndVrStereoMode", + "description": "End stereo rendering (requires VR simulator)", + "returnType": "void" + }, + { + "name": "LoadVrStereoConfig", + "description": "Load VR stereo config for VR simulator device parameters", + "returnType": "VrStereoConfig", + "params": [ + { + "type": "VrDeviceInfo", + "name": "device" + } + ] + }, + { + "name": "UnloadVrStereoConfig", + "description": "Unload VR stereo config", + "returnType": "void", + "params": [ + { + "type": "VrStereoConfig", + "name": "config" + } + ] + }, + { + "name": "LoadShader", + "description": "Load shader from files and bind default locations", + "returnType": "Shader", + "params": [ + { + "type": "const char *", + "name": "vsFileName" + }, + { + "type": "const char *", + "name": "fsFileName" + } + ] + }, + { + "name": "LoadShaderFromMemory", + "description": "Load shader from code strings and bind default locations", + "returnType": "Shader", + "params": [ + { + "type": "const char *", + "name": "vsCode" + }, + { + "type": "const char *", + "name": "fsCode" + } + ] + }, + { + "name": "IsShaderValid", + "description": "Check if a shader is valid (loaded on GPU)", + "returnType": "bool", + "params": [ + { + "type": "Shader", + "name": "shader" + } + ] + }, + { + "name": "GetShaderLocation", + "description": "Get shader uniform location", + "returnType": "int", + "params": [ + { + "type": "Shader", + "name": "shader" + }, + { + "type": "const char *", + "name": "uniformName" + } + ] + }, + { + "name": "GetShaderLocationAttrib", + "description": "Get shader attribute location", + "returnType": "int", + "params": [ + { + "type": "Shader", + "name": "shader" + }, + { + "type": "const char *", + "name": "attribName" + } + ] + }, + { + "name": "SetShaderValue", + "description": "Set shader uniform value", + "returnType": "void", + "params": [ + { + "type": "Shader", + "name": "shader" + }, + { + "type": "int", + "name": "locIndex" + }, + { + "type": "const void *", + "name": "value" + }, + { + "type": "int", + "name": "uniformType" + } + ] + }, + { + "name": "SetShaderValueV", + "description": "Set shader uniform value vector", + "returnType": "void", + "params": [ + { + "type": "Shader", + "name": "shader" + }, + { + "type": "int", + "name": "locIndex" + }, + { + "type": "const void *", + "name": "value" + }, + { + "type": "int", + "name": "uniformType" + }, + { + "type": "int", + "name": "count" + } + ] + }, + { + "name": "SetShaderValueMatrix", + "description": "Set shader uniform value (matrix 4x4)", + "returnType": "void", + "params": [ + { + "type": "Shader", + "name": "shader" + }, + { + "type": "int", + "name": "locIndex" + }, + { + "type": "Matrix", + "name": "mat" + } + ] + }, + { + "name": "SetShaderValueTexture", + "description": "Set shader uniform value and bind the texture (sampler2d)", + "returnType": "void", + "params": [ + { + "type": "Shader", + "name": "shader" + }, + { + "type": "int", + "name": "locIndex" + }, + { + "type": "Texture2D", + "name": "texture" + } + ] + }, + { + "name": "UnloadShader", + "description": "Unload shader from GPU memory (VRAM)", + "returnType": "void", + "params": [ + { + "type": "Shader", + "name": "shader" + } + ] + }, + { + "name": "GetScreenToWorldRay", + "description": "Get a ray trace from screen position (i.e mouse)", + "returnType": "Ray", + "params": [ + { + "type": "Vector2", + "name": "position" + }, + { + "type": "Camera", + "name": "camera" + } + ] + }, + { + "name": "GetScreenToWorldRayEx", + "description": "Get a ray trace from screen position (i.e mouse) in a viewport", + "returnType": "Ray", + "params": [ + { + "type": "Vector2", + "name": "position" + }, + { + "type": "Camera", + "name": "camera" + }, + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + } + ] + }, + { + "name": "GetWorldToScreen", + "description": "Get the screen space position for a 3d world space position", + "returnType": "Vector2", + "params": [ + { + "type": "Vector3", + "name": "position" + }, + { + "type": "Camera", + "name": "camera" + } + ] + }, + { + "name": "GetWorldToScreenEx", + "description": "Get size position for a 3d world space position", + "returnType": "Vector2", + "params": [ + { + "type": "Vector3", + "name": "position" + }, + { + "type": "Camera", + "name": "camera" + }, + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + } + ] + }, + { + "name": "GetWorldToScreen2D", + "description": "Get the screen space position for a 2d camera world space position", + "returnType": "Vector2", + "params": [ + { + "type": "Vector2", + "name": "position" + }, + { + "type": "Camera2D", + "name": "camera" + } + ] + }, + { + "name": "GetScreenToWorld2D", + "description": "Get the world space position for a 2d camera screen space position", + "returnType": "Vector2", + "params": [ + { + "type": "Vector2", + "name": "position" + }, + { + "type": "Camera2D", + "name": "camera" + } + ] + }, + { + "name": "GetCameraMatrix", + "description": "Get camera transform matrix (view matrix)", + "returnType": "Matrix", + "params": [ + { + "type": "Camera", + "name": "camera" + } + ] + }, + { + "name": "GetCameraMatrix2D", + "description": "Get camera 2d transform matrix", + "returnType": "Matrix", + "params": [ + { + "type": "Camera2D", + "name": "camera" + } + ] + }, + { + "name": "SetTargetFPS", + "description": "Set target FPS (maximum)", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "fps" + } + ] + }, + { + "name": "GetFrameTime", + "description": "Get time in seconds for last frame drawn (delta time)", + "returnType": "float" + }, + { + "name": "GetTime", + "description": "Get elapsed time in seconds since InitWindow()", + "returnType": "double" + }, + { + "name": "GetFPS", + "description": "Get current FPS", + "returnType": "int" + }, + { + "name": "SwapScreenBuffer", + "description": "Swap back buffer with front buffer (screen drawing)", + "returnType": "void" + }, + { + "name": "PollInputEvents", + "description": "Register all input events", + "returnType": "void" + }, + { + "name": "WaitTime", + "description": "Wait for some time (halt program execution)", + "returnType": "void", + "params": [ + { + "type": "double", + "name": "seconds" + } + ] + }, + { + "name": "SetRandomSeed", + "description": "Set the seed for the random number generator", + "returnType": "void", + "params": [ + { + "type": "unsigned int", + "name": "seed" + } + ] + }, + { + "name": "GetRandomValue", + "description": "Get a random value between min and max (both included)", + "returnType": "int", + "params": [ + { + "type": "int", + "name": "min" + }, + { + "type": "int", + "name": "max" + } + ] + }, + { + "name": "LoadRandomSequence", + "description": "Load random values sequence, no values repeated", + "returnType": "int *", + "params": [ + { + "type": "unsigned int", + "name": "count" + }, + { + "type": "int", + "name": "min" + }, + { + "type": "int", + "name": "max" + } + ] + }, + { + "name": "UnloadRandomSequence", + "description": "Unload random values sequence", + "returnType": "void", + "params": [ + { + "type": "int *", + "name": "sequence" + } + ] + }, + { + "name": "TakeScreenshot", + "description": "Takes a screenshot of current screen (filename extension defines format)", + "returnType": "void", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "SetConfigFlags", + "description": "Setup init configuration flags (view FLAGS)", + "returnType": "void", + "params": [ + { + "type": "unsigned int", + "name": "flags" + } + ] + }, + { + "name": "OpenURL", + "description": "Open URL with default system browser (if available)", + "returnType": "void", + "params": [ + { + "type": "const char *", + "name": "url" + } + ] + }, + { + "name": "SetTraceLogLevel", + "description": "Set the current threshold (minimum) log level", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "logLevel" + } + ] + }, + { + "name": "TraceLog", + "description": "Show trace log messages (LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR...)", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "logLevel" + }, + { + "type": "const char *", + "name": "text" + }, + { + "type": "...", + "name": "args" + } + ] + }, + { + "name": "SetTraceLogCallback", + "description": "Set custom trace log", + "returnType": "void", + "params": [ + { + "type": "TraceLogCallback", + "name": "callback" + } + ] + }, + { + "name": "MemAlloc", + "description": "Internal memory allocator", + "returnType": "void *", + "params": [ + { + "type": "unsigned int", + "name": "size" + } + ] + }, + { + "name": "MemRealloc", + "description": "Internal memory reallocator", + "returnType": "void *", + "params": [ + { + "type": "void *", + "name": "ptr" + }, + { + "type": "unsigned int", + "name": "size" + } + ] + }, + { + "name": "MemFree", + "description": "Internal memory free", + "returnType": "void", + "params": [ + { + "type": "void *", + "name": "ptr" + } + ] + }, + { + "name": "LoadFileData", + "description": "Load file data as byte array (read)", + "returnType": "unsigned char *", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "int *", + "name": "dataSize" + } + ] + }, + { + "name": "UnloadFileData", + "description": "Unload file data allocated by LoadFileData()", + "returnType": "void", + "params": [ + { + "type": "unsigned char *", + "name": "data" + } + ] + }, + { + "name": "SaveFileData", + "description": "Save data to file from byte array (write), returns true on success", + "returnType": "bool", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "void *", + "name": "data" + }, + { + "type": "int", + "name": "dataSize" + } + ] + }, + { + "name": "ExportDataAsCode", + "description": "Export data to code (.h), returns true on success", + "returnType": "bool", + "params": [ + { + "type": "const unsigned char *", + "name": "data" + }, + { + "type": "int", + "name": "dataSize" + }, + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "LoadFileText", + "description": "Load text data from file (read), returns a '\\0' terminated string", + "returnType": "char *", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "UnloadFileText", + "description": "Unload file text data allocated by LoadFileText()", + "returnType": "void", + "params": [ + { + "type": "char *", + "name": "text" + } + ] + }, + { + "name": "SaveFileText", + "description": "Save text data to file (write), string must be '\\0' terminated, returns true on success", + "returnType": "bool", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "const char *", + "name": "text" + } + ] + }, + { + "name": "SetLoadFileDataCallback", + "description": "Set custom file binary data loader", + "returnType": "void", + "params": [ + { + "type": "LoadFileDataCallback", + "name": "callback" + } + ] + }, + { + "name": "SetSaveFileDataCallback", + "description": "Set custom file binary data saver", + "returnType": "void", + "params": [ + { + "type": "SaveFileDataCallback", + "name": "callback" + } + ] + }, + { + "name": "SetLoadFileTextCallback", + "description": "Set custom file text data loader", + "returnType": "void", + "params": [ + { + "type": "LoadFileTextCallback", + "name": "callback" + } + ] + }, + { + "name": "SetSaveFileTextCallback", + "description": "Set custom file text data saver", + "returnType": "void", + "params": [ + { + "type": "SaveFileTextCallback", + "name": "callback" + } + ] + }, + { + "name": "FileRename", + "description": "Rename file (if exists)", + "returnType": "int", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "const char *", + "name": "fileRename" + } + ] + }, + { + "name": "FileRemove", + "description": "Remove file (if exists)", + "returnType": "int", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "FileCopy", + "description": "Copy file from one path to another, dstPath created if it doesn't exist", + "returnType": "int", + "params": [ + { + "type": "const char *", + "name": "srcPath" + }, + { + "type": "const char *", + "name": "dstPath" + } + ] + }, + { + "name": "FileMove", + "description": "Move file from one directory to another, dstPath created if it doesn't exist", + "returnType": "int", + "params": [ + { + "type": "const char *", + "name": "srcPath" + }, + { + "type": "const char *", + "name": "dstPath" + } + ] + }, + { + "name": "FileTextReplace", + "description": "Replace text in an existing file", + "returnType": "int", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "const char *", + "name": "search" + }, + { + "type": "const char *", + "name": "replacement" + } + ] + }, + { + "name": "FileTextFindIndex", + "description": "Find text in existing file", + "returnType": "int", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "const char *", + "name": "search" + } + ] + }, + { + "name": "FileExists", + "description": "Check if file exists", + "returnType": "bool", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "DirectoryExists", + "description": "Check if a directory path exists", + "returnType": "bool", + "params": [ + { + "type": "const char *", + "name": "dirPath" + } + ] + }, + { + "name": "IsFileExtension", + "description": "Check file extension (recommended include point: .png, .wav)", + "returnType": "bool", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "const char *", + "name": "ext" + } + ] + }, + { + "name": "GetFileLength", + "description": "Get file length in bytes (NOTE: GetFileSize() conflicts with windows.h)", + "returnType": "int", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "GetFileModTime", + "description": "Get file modification time (last write time)", + "returnType": "long", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "GetFileExtension", + "description": "Get pointer to extension for a filename string (includes dot: '.png')", + "returnType": "const char *", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "GetFileName", + "description": "Get pointer to filename for a path string", + "returnType": "const char *", + "params": [ + { + "type": "const char *", + "name": "filePath" + } + ] + }, + { + "name": "GetFileNameWithoutExt", + "description": "Get filename string without extension (uses static string)", + "returnType": "const char *", + "params": [ + { + "type": "const char *", + "name": "filePath" + } + ] + }, + { + "name": "GetDirectoryPath", + "description": "Get full path for a given fileName with path (uses static string)", + "returnType": "const char *", + "params": [ + { + "type": "const char *", + "name": "filePath" + } + ] + }, + { + "name": "GetPrevDirectoryPath", + "description": "Get previous directory path for a given path (uses static string)", + "returnType": "const char *", + "params": [ + { + "type": "const char *", + "name": "dirPath" + } + ] + }, + { + "name": "GetWorkingDirectory", + "description": "Get current working directory (uses static string)", + "returnType": "const char *" + }, + { + "name": "GetApplicationDirectory", + "description": "Get the directory of the running application (uses static string)", + "returnType": "const char *" + }, + { + "name": "MakeDirectory", + "description": "Create directories (including full path requested), returns 0 on success", + "returnType": "int", + "params": [ + { + "type": "const char *", + "name": "dirPath" + } + ] + }, + { + "name": "ChangeDirectory", + "description": "Change working directory, return true on success", + "returnType": "bool", + "params": [ + { + "type": "const char *", + "name": "dirPath" + } + ] + }, + { + "name": "IsPathFile", + "description": "Check if a given path is a file or a directory", + "returnType": "bool", + "params": [ + { + "type": "const char *", + "name": "path" + } + ] + }, + { + "name": "IsFileNameValid", + "description": "Check if fileName is valid for the platform/OS", + "returnType": "bool", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "LoadDirectoryFiles", + "description": "Load directory filepaths", + "returnType": "FilePathList", + "params": [ + { + "type": "const char *", + "name": "dirPath" + } + ] + }, + { + "name": "LoadDirectoryFilesEx", + "description": "Load directory filepaths with extension filtering and recursive directory scan. Use 'DIR' in the filter string to include directories in the result", + "returnType": "FilePathList", + "params": [ + { + "type": "const char *", + "name": "basePath" + }, + { + "type": "const char *", + "name": "filter" + }, + { + "type": "bool", + "name": "scanSubdirs" + } + ] + }, + { + "name": "UnloadDirectoryFiles", + "description": "Unload filepaths", + "returnType": "void", + "params": [ + { + "type": "FilePathList", + "name": "files" + } + ] + }, + { + "name": "IsFileDropped", + "description": "Check if a file has been dropped into window", + "returnType": "bool" + }, + { + "name": "LoadDroppedFiles", + "description": "Load dropped filepaths", + "returnType": "FilePathList" + }, + { + "name": "UnloadDroppedFiles", + "description": "Unload dropped filepaths", + "returnType": "void", + "params": [ + { + "type": "FilePathList", + "name": "files" + } + ] + }, + { + "name": "GetDirectoryFileCount", + "description": "Get the file count in a directory", + "returnType": "unsigned int", + "params": [ + { + "type": "const char *", + "name": "dirPath" + } + ] + }, + { + "name": "GetDirectoryFileCountEx", + "description": "Get the file count in a directory with extension filtering and recursive directory scan. Use 'DIR' in the filter string to include directories in the result", + "returnType": "unsigned int", + "params": [ + { + "type": "const char *", + "name": "basePath" + }, + { + "type": "const char *", + "name": "filter" + }, + { + "type": "bool", + "name": "scanSubdirs" + } + ] + }, + { + "name": "CompressData", + "description": "Compress data (DEFLATE algorithm), memory must be MemFree()", + "returnType": "unsigned char *", + "params": [ + { + "type": "const unsigned char *", + "name": "data" + }, + { + "type": "int", + "name": "dataSize" + }, + { + "type": "int *", + "name": "compDataSize" + } + ] + }, + { + "name": "DecompressData", + "description": "Decompress data (DEFLATE algorithm), memory must be MemFree()", + "returnType": "unsigned char *", + "params": [ + { + "type": "const unsigned char *", + "name": "compData" + }, + { + "type": "int", + "name": "compDataSize" + }, + { + "type": "int *", + "name": "dataSize" + } + ] + }, + { + "name": "EncodeDataBase64", + "description": "Encode data to Base64 string (includes NULL terminator), memory must be MemFree()", + "returnType": "char *", + "params": [ + { + "type": "const unsigned char *", + "name": "data" + }, + { + "type": "int", + "name": "dataSize" + }, + { + "type": "int *", + "name": "outputSize" + } + ] + }, + { + "name": "DecodeDataBase64", + "description": "Decode Base64 string (expected NULL terminated), memory must be MemFree()", + "returnType": "unsigned char *", + "params": [ + { + "type": "const char *", + "name": "text" + }, + { + "type": "int *", + "name": "outputSize" + } + ] + }, + { + "name": "ComputeCRC32", + "description": "Compute CRC32 hash code", + "returnType": "unsigned int", + "params": [ + { + "type": "unsigned char *", + "name": "data" + }, + { + "type": "int", + "name": "dataSize" + } + ] + }, + { + "name": "ComputeMD5", + "description": "Compute MD5 hash code, returns static int[4] (16 bytes)", + "returnType": "unsigned int *", + "params": [ + { + "type": "unsigned char *", + "name": "data" + }, + { + "type": "int", + "name": "dataSize" + } + ] + }, + { + "name": "ComputeSHA1", + "description": "Compute SHA1 hash code, returns static int[5] (20 bytes)", + "returnType": "unsigned int *", + "params": [ + { + "type": "unsigned char *", + "name": "data" + }, + { + "type": "int", + "name": "dataSize" + } + ] + }, + { + "name": "ComputeSHA256", + "description": "Compute SHA256 hash code, returns static int[8] (32 bytes)", + "returnType": "unsigned int *", + "params": [ + { + "type": "unsigned char *", + "name": "data" + }, + { + "type": "int", + "name": "dataSize" + } + ] + }, + { + "name": "LoadAutomationEventList", + "description": "Load automation events list from file, NULL for empty list, capacity = MAX_AUTOMATION_EVENTS", + "returnType": "AutomationEventList", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "UnloadAutomationEventList", + "description": "Unload automation events list from file", + "returnType": "void", + "params": [ + { + "type": "AutomationEventList", + "name": "list" + } + ] + }, + { + "name": "ExportAutomationEventList", + "description": "Export automation events list as text file", + "returnType": "bool", + "params": [ + { + "type": "AutomationEventList", + "name": "list" + }, + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "SetAutomationEventList", + "description": "Set automation event list to record to", + "returnType": "void", + "params": [ + { + "type": "AutomationEventList *", + "name": "list" + } + ] + }, + { + "name": "SetAutomationEventBaseFrame", + "description": "Set automation event internal base frame to start recording", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "frame" + } + ] + }, + { + "name": "StartAutomationEventRecording", + "description": "Start recording automation events (AutomationEventList must be set)", + "returnType": "void" + }, + { + "name": "StopAutomationEventRecording", + "description": "Stop recording automation events", + "returnType": "void" + }, + { + "name": "PlayAutomationEvent", + "description": "Play a recorded automation event", + "returnType": "void", + "params": [ + { + "type": "AutomationEvent", + "name": "event" + } + ] + }, + { + "name": "IsKeyPressed", + "description": "Check if a key has been pressed once", + "returnType": "bool", + "params": [ + { + "type": "int", + "name": "key" + } + ] + }, + { + "name": "IsKeyPressedRepeat", + "description": "Check if a key has been pressed again", + "returnType": "bool", + "params": [ + { + "type": "int", + "name": "key" + } + ] + }, + { + "name": "IsKeyDown", + "description": "Check if a key is being pressed", + "returnType": "bool", + "params": [ + { + "type": "int", + "name": "key" + } + ] + }, + { + "name": "IsKeyReleased", + "description": "Check if a key has been released once", + "returnType": "bool", + "params": [ + { + "type": "int", + "name": "key" + } + ] + }, + { + "name": "IsKeyUp", + "description": "Check if a key is NOT being pressed", + "returnType": "bool", + "params": [ + { + "type": "int", + "name": "key" + } + ] + }, + { + "name": "GetKeyPressed", + "description": "Get key pressed (keycode), call it multiple times for keys queued, returns 0 when the queue is empty", + "returnType": "int" + }, + { + "name": "GetCharPressed", + "description": "Get char pressed (unicode), call it multiple times for chars queued, returns 0 when the queue is empty", + "returnType": "int" + }, + { + "name": "GetKeyName", + "description": "Get name of a QWERTY key on the current keyboard layout (eg returns string 'q' for KEY_A on an AZERTY keyboard)", + "returnType": "const char *", + "params": [ + { + "type": "int", + "name": "key" + } + ] + }, + { + "name": "SetExitKey", + "description": "Set a custom key to exit program (default is ESC)", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "key" + } + ] + }, + { + "name": "IsGamepadAvailable", + "description": "Check if a gamepad is available", + "returnType": "bool", + "params": [ + { + "type": "int", + "name": "gamepad" + } + ] + }, + { + "name": "GetGamepadName", + "description": "Get gamepad internal name id", + "returnType": "const char *", + "params": [ + { + "type": "int", + "name": "gamepad" + } + ] + }, + { + "name": "IsGamepadButtonPressed", + "description": "Check if a gamepad button has been pressed once", + "returnType": "bool", + "params": [ + { + "type": "int", + "name": "gamepad" + }, + { + "type": "int", + "name": "button" + } + ] + }, + { + "name": "IsGamepadButtonDown", + "description": "Check if a gamepad button is being pressed", + "returnType": "bool", + "params": [ + { + "type": "int", + "name": "gamepad" + }, + { + "type": "int", + "name": "button" + } + ] + }, + { + "name": "IsGamepadButtonReleased", + "description": "Check if a gamepad button has been released once", + "returnType": "bool", + "params": [ + { + "type": "int", + "name": "gamepad" + }, + { + "type": "int", + "name": "button" + } + ] + }, + { + "name": "IsGamepadButtonUp", + "description": "Check if a gamepad button is NOT being pressed", + "returnType": "bool", + "params": [ + { + "type": "int", + "name": "gamepad" + }, + { + "type": "int", + "name": "button" + } + ] + }, + { + "name": "GetGamepadButtonPressed", + "description": "Get the last gamepad button pressed", + "returnType": "int" + }, + { + "name": "GetGamepadAxisCount", + "description": "Get axis count for a gamepad", + "returnType": "int", + "params": [ + { + "type": "int", + "name": "gamepad" + } + ] + }, + { + "name": "GetGamepadAxisMovement", + "description": "Get movement value for a gamepad axis", + "returnType": "float", + "params": [ + { + "type": "int", + "name": "gamepad" + }, + { + "type": "int", + "name": "axis" + } + ] + }, + { + "name": "SetGamepadMappings", + "description": "Set internal gamepad mappings (SDL_GameControllerDB)", + "returnType": "int", + "params": [ + { + "type": "const char *", + "name": "mappings" + } + ] + }, + { + "name": "SetGamepadVibration", + "description": "Set gamepad vibration for both motors (duration in seconds)", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "gamepad" + }, + { + "type": "float", + "name": "leftMotor" + }, + { + "type": "float", + "name": "rightMotor" + }, + { + "type": "float", + "name": "duration" + } + ] + }, + { + "name": "IsMouseButtonPressed", + "description": "Check if a mouse button has been pressed once", + "returnType": "bool", + "params": [ + { + "type": "int", + "name": "button" + } + ] + }, + { + "name": "IsMouseButtonDown", + "description": "Check if a mouse button is being pressed", + "returnType": "bool", + "params": [ + { + "type": "int", + "name": "button" + } + ] + }, + { + "name": "IsMouseButtonReleased", + "description": "Check if a mouse button has been released once", + "returnType": "bool", + "params": [ + { + "type": "int", + "name": "button" + } + ] + }, + { + "name": "IsMouseButtonUp", + "description": "Check if a mouse button is NOT being pressed", + "returnType": "bool", + "params": [ + { + "type": "int", + "name": "button" + } + ] + }, + { + "name": "GetMouseX", + "description": "Get mouse position X", + "returnType": "int" + }, + { + "name": "GetMouseY", + "description": "Get mouse position Y", + "returnType": "int" + }, + { + "name": "GetMousePosition", + "description": "Get mouse position XY", + "returnType": "Vector2" + }, + { + "name": "GetMouseDelta", + "description": "Get mouse delta between frames", + "returnType": "Vector2" + }, + { + "name": "SetMousePosition", + "description": "Set mouse position XY", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "x" + }, + { + "type": "int", + "name": "y" + } + ] + }, + { + "name": "SetMouseOffset", + "description": "Set mouse offset", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "offsetX" + }, + { + "type": "int", + "name": "offsetY" + } + ] + }, + { + "name": "SetMouseScale", + "description": "Set mouse scaling", + "returnType": "void", + "params": [ + { + "type": "float", + "name": "scaleX" + }, + { + "type": "float", + "name": "scaleY" + } + ] + }, + { + "name": "GetMouseWheelMove", + "description": "Get mouse wheel movement for X or Y, whichever is larger", + "returnType": "float" + }, + { + "name": "GetMouseWheelMoveV", + "description": "Get mouse wheel movement for both X and Y", + "returnType": "Vector2" + }, + { + "name": "SetMouseCursor", + "description": "Set mouse cursor", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "cursor" + } + ] + }, + { + "name": "GetTouchX", + "description": "Get touch position X for touch point 0 (relative to screen size)", + "returnType": "int" + }, + { + "name": "GetTouchY", + "description": "Get touch position Y for touch point 0 (relative to screen size)", + "returnType": "int" + }, + { + "name": "GetTouchPosition", + "description": "Get touch position XY for a touch point index (relative to screen size)", + "returnType": "Vector2", + "params": [ + { + "type": "int", + "name": "index" + } + ] + }, + { + "name": "GetTouchPointId", + "description": "Get touch point identifier for given index", + "returnType": "int", + "params": [ + { + "type": "int", + "name": "index" + } + ] + }, + { + "name": "GetTouchPointCount", + "description": "Get number of touch points", + "returnType": "int" + }, + { + "name": "SetGesturesEnabled", + "description": "Enable a set of gestures using flags", + "returnType": "void", + "params": [ + { + "type": "unsigned int", + "name": "flags" + } + ] + }, + { + "name": "IsGestureDetected", + "description": "Check if a gesture have been detected", + "returnType": "bool", + "params": [ + { + "type": "unsigned int", + "name": "gesture" + } + ] + }, + { + "name": "GetGestureDetected", + "description": "Get latest detected gesture", + "returnType": "int" + }, + { + "name": "GetGestureHoldDuration", + "description": "Get gesture hold time in seconds", + "returnType": "float" + }, + { + "name": "GetGestureDragVector", + "description": "Get gesture drag vector", + "returnType": "Vector2" + }, + { + "name": "GetGestureDragAngle", + "description": "Get gesture drag angle", + "returnType": "float" + }, + { + "name": "GetGesturePinchVector", + "description": "Get gesture pinch delta", + "returnType": "Vector2" + }, + { + "name": "GetGesturePinchAngle", + "description": "Get gesture pinch angle", + "returnType": "float" + }, + { + "name": "UpdateCamera", + "description": "Update camera position for selected mode", + "returnType": "void", + "params": [ + { + "type": "Camera *", + "name": "camera" + }, + { + "type": "int", + "name": "mode" + } + ] + }, + { + "name": "UpdateCameraPro", + "description": "Update camera movement/rotation", + "returnType": "void", + "params": [ + { + "type": "Camera *", + "name": "camera" + }, + { + "type": "Vector3", + "name": "movement" + }, + { + "type": "Vector3", + "name": "rotation" + }, + { + "type": "float", + "name": "zoom" + } + ] + }, + { + "name": "SetShapesTexture", + "description": "Set texture and rectangle to be used on shapes drawing", + "returnType": "void", + "params": [ + { + "type": "Texture2D", + "name": "texture" + }, + { + "type": "Rectangle", + "name": "source" + } + ] + }, + { + "name": "GetShapesTexture", + "description": "Get texture that is used for shapes drawing", + "returnType": "Texture2D" + }, + { + "name": "GetShapesTextureRectangle", + "description": "Get texture source rectangle that is used for shapes drawing", + "returnType": "Rectangle" + }, + { + "name": "DrawPixel", + "description": "Draw a pixel using geometry [Can be slow, use with care]", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "posX" + }, + { + "type": "int", + "name": "posY" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawPixelV", + "description": "Draw a pixel using geometry (Vector version) [Can be slow, use with care]", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "position" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawLine", + "description": "Draw a line", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "startPosX" + }, + { + "type": "int", + "name": "startPosY" + }, + { + "type": "int", + "name": "endPosX" + }, + { + "type": "int", + "name": "endPosY" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawLineV", + "description": "Draw a line (using gl lines)", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "startPos" + }, + { + "type": "Vector2", + "name": "endPos" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawLineEx", + "description": "Draw a line (using triangles/quads)", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "startPos" + }, + { + "type": "Vector2", + "name": "endPos" + }, + { + "type": "float", + "name": "thick" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawLineStrip", + "description": "Draw lines sequence (using gl lines)", + "returnType": "void", + "params": [ + { + "type": "const Vector2 *", + "name": "points" + }, + { + "type": "int", + "name": "pointCount" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawLineBezier", + "description": "Draw line segment cubic-bezier in-out interpolation", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "startPos" + }, + { + "type": "Vector2", + "name": "endPos" + }, + { + "type": "float", + "name": "thick" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawLineDashed", + "description": "Draw a dashed line", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "startPos" + }, + { + "type": "Vector2", + "name": "endPos" + }, + { + "type": "int", + "name": "dashSize" + }, + { + "type": "int", + "name": "spaceSize" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawCircle", + "description": "Draw a color-filled circle", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "centerX" + }, + { + "type": "int", + "name": "centerY" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawCircleSector", + "description": "Draw a piece of a circle", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "center" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "float", + "name": "startAngle" + }, + { + "type": "float", + "name": "endAngle" + }, + { + "type": "int", + "name": "segments" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawCircleSectorLines", + "description": "Draw circle sector outline", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "center" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "float", + "name": "startAngle" + }, + { + "type": "float", + "name": "endAngle" + }, + { + "type": "int", + "name": "segments" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawCircleGradient", + "description": "Draw a gradient-filled circle", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "centerX" + }, + { + "type": "int", + "name": "centerY" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "Color", + "name": "inner" + }, + { + "type": "Color", + "name": "outer" + } + ] + }, + { + "name": "DrawCircleV", + "description": "Draw a color-filled circle (Vector version)", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "center" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawCircleLines", + "description": "Draw circle outline", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "centerX" + }, + { + "type": "int", + "name": "centerY" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawCircleLinesV", + "description": "Draw circle outline (Vector version)", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "center" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawEllipse", + "description": "Draw ellipse", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "centerX" + }, + { + "type": "int", + "name": "centerY" + }, + { + "type": "float", + "name": "radiusH" + }, + { + "type": "float", + "name": "radiusV" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawEllipseV", + "description": "Draw ellipse (Vector version)", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "center" + }, + { + "type": "float", + "name": "radiusH" + }, + { + "type": "float", + "name": "radiusV" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawEllipseLines", + "description": "Draw ellipse outline", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "centerX" + }, + { + "type": "int", + "name": "centerY" + }, + { + "type": "float", + "name": "radiusH" + }, + { + "type": "float", + "name": "radiusV" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawEllipseLinesV", + "description": "Draw ellipse outline (Vector version)", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "center" + }, + { + "type": "float", + "name": "radiusH" + }, + { + "type": "float", + "name": "radiusV" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawRing", + "description": "Draw ring", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "center" + }, + { + "type": "float", + "name": "innerRadius" + }, + { + "type": "float", + "name": "outerRadius" + }, + { + "type": "float", + "name": "startAngle" + }, + { + "type": "float", + "name": "endAngle" + }, + { + "type": "int", + "name": "segments" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawRingLines", + "description": "Draw ring outline", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "center" + }, + { + "type": "float", + "name": "innerRadius" + }, + { + "type": "float", + "name": "outerRadius" + }, + { + "type": "float", + "name": "startAngle" + }, + { + "type": "float", + "name": "endAngle" + }, + { + "type": "int", + "name": "segments" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawRectangle", + "description": "Draw a color-filled rectangle", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "posX" + }, + { + "type": "int", + "name": "posY" + }, + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawRectangleV", + "description": "Draw a color-filled rectangle (Vector version)", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "position" + }, + { + "type": "Vector2", + "name": "size" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawRectangleRec", + "description": "Draw a color-filled rectangle", + "returnType": "void", + "params": [ + { + "type": "Rectangle", + "name": "rec" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawRectanglePro", + "description": "Draw a color-filled rectangle with pro parameters", + "returnType": "void", + "params": [ + { + "type": "Rectangle", + "name": "rec" + }, + { + "type": "Vector2", + "name": "origin" + }, + { + "type": "float", + "name": "rotation" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawRectangleGradientV", + "description": "Draw a vertical-gradient-filled rectangle", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "posX" + }, + { + "type": "int", + "name": "posY" + }, + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + }, + { + "type": "Color", + "name": "top" + }, + { + "type": "Color", + "name": "bottom" + } + ] + }, + { + "name": "DrawRectangleGradientH", + "description": "Draw a horizontal-gradient-filled rectangle", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "posX" + }, + { + "type": "int", + "name": "posY" + }, + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + }, + { + "type": "Color", + "name": "left" + }, + { + "type": "Color", + "name": "right" + } + ] + }, + { + "name": "DrawRectangleGradientEx", + "description": "Draw a gradient-filled rectangle with custom vertex colors", + "returnType": "void", + "params": [ + { + "type": "Rectangle", + "name": "rec" + }, + { + "type": "Color", + "name": "topLeft" + }, + { + "type": "Color", + "name": "bottomLeft" + }, + { + "type": "Color", + "name": "bottomRight" + }, + { + "type": "Color", + "name": "topRight" + } + ] + }, + { + "name": "DrawRectangleLines", + "description": "Draw rectangle outline", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "posX" + }, + { + "type": "int", + "name": "posY" + }, + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawRectangleLinesEx", + "description": "Draw rectangle outline with extended parameters", + "returnType": "void", + "params": [ + { + "type": "Rectangle", + "name": "rec" + }, + { + "type": "float", + "name": "lineThick" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawRectangleRounded", + "description": "Draw rectangle with rounded edges", + "returnType": "void", + "params": [ + { + "type": "Rectangle", + "name": "rec" + }, + { + "type": "float", + "name": "roundness" + }, + { + "type": "int", + "name": "segments" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawRectangleRoundedLines", + "description": "Draw rectangle lines with rounded edges", + "returnType": "void", + "params": [ + { + "type": "Rectangle", + "name": "rec" + }, + { + "type": "float", + "name": "roundness" + }, + { + "type": "int", + "name": "segments" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawRectangleRoundedLinesEx", + "description": "Draw rectangle with rounded edges outline", + "returnType": "void", + "params": [ + { + "type": "Rectangle", + "name": "rec" + }, + { + "type": "float", + "name": "roundness" + }, + { + "type": "int", + "name": "segments" + }, + { + "type": "float", + "name": "lineThick" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawTriangle", + "description": "Draw a color-filled triangle (vertex in counter-clockwise order!)", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "v1" + }, + { + "type": "Vector2", + "name": "v2" + }, + { + "type": "Vector2", + "name": "v3" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawTriangleLines", + "description": "Draw triangle outline (vertex in counter-clockwise order!)", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "v1" + }, + { + "type": "Vector2", + "name": "v2" + }, + { + "type": "Vector2", + "name": "v3" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawTriangleFan", + "description": "Draw a triangle fan defined by points (first vertex is the center)", + "returnType": "void", + "params": [ + { + "type": "const Vector2 *", + "name": "points" + }, + { + "type": "int", + "name": "pointCount" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawTriangleStrip", + "description": "Draw a triangle strip defined by points", + "returnType": "void", + "params": [ + { + "type": "const Vector2 *", + "name": "points" + }, + { + "type": "int", + "name": "pointCount" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawPoly", + "description": "Draw a regular polygon (Vector version)", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "center" + }, + { + "type": "int", + "name": "sides" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "float", + "name": "rotation" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawPolyLines", + "description": "Draw a polygon outline of n sides", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "center" + }, + { + "type": "int", + "name": "sides" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "float", + "name": "rotation" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawPolyLinesEx", + "description": "Draw a polygon outline of n sides with extended parameters", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "center" + }, + { + "type": "int", + "name": "sides" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "float", + "name": "rotation" + }, + { + "type": "float", + "name": "lineThick" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawSplineLinear", + "description": "Draw spline: Linear, minimum 2 points", + "returnType": "void", + "params": [ + { + "type": "const Vector2 *", + "name": "points" + }, + { + "type": "int", + "name": "pointCount" + }, + { + "type": "float", + "name": "thick" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawSplineBasis", + "description": "Draw spline: B-Spline, minimum 4 points", + "returnType": "void", + "params": [ + { + "type": "const Vector2 *", + "name": "points" + }, + { + "type": "int", + "name": "pointCount" + }, + { + "type": "float", + "name": "thick" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawSplineCatmullRom", + "description": "Draw spline: Catmull-Rom, minimum 4 points", + "returnType": "void", + "params": [ + { + "type": "const Vector2 *", + "name": "points" + }, + { + "type": "int", + "name": "pointCount" + }, + { + "type": "float", + "name": "thick" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawSplineBezierQuadratic", + "description": "Draw spline: Quadratic Bezier, minimum 3 points (1 control point): [p1, c2, p3, c4...]", + "returnType": "void", + "params": [ + { + "type": "const Vector2 *", + "name": "points" + }, + { + "type": "int", + "name": "pointCount" + }, + { + "type": "float", + "name": "thick" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawSplineBezierCubic", + "description": "Draw spline: Cubic Bezier, minimum 4 points (2 control points): [p1, c2, c3, p4, c5, c6...]", + "returnType": "void", + "params": [ + { + "type": "const Vector2 *", + "name": "points" + }, + { + "type": "int", + "name": "pointCount" + }, + { + "type": "float", + "name": "thick" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawSplineSegmentLinear", + "description": "Draw spline segment: Linear, 2 points", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "p1" + }, + { + "type": "Vector2", + "name": "p2" + }, + { + "type": "float", + "name": "thick" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawSplineSegmentBasis", + "description": "Draw spline segment: B-Spline, 4 points", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "p1" + }, + { + "type": "Vector2", + "name": "p2" + }, + { + "type": "Vector2", + "name": "p3" + }, + { + "type": "Vector2", + "name": "p4" + }, + { + "type": "float", + "name": "thick" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawSplineSegmentCatmullRom", + "description": "Draw spline segment: Catmull-Rom, 4 points", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "p1" + }, + { + "type": "Vector2", + "name": "p2" + }, + { + "type": "Vector2", + "name": "p3" + }, + { + "type": "Vector2", + "name": "p4" + }, + { + "type": "float", + "name": "thick" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawSplineSegmentBezierQuadratic", + "description": "Draw spline segment: Quadratic Bezier, 2 points, 1 control point", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "p1" + }, + { + "type": "Vector2", + "name": "c2" + }, + { + "type": "Vector2", + "name": "p3" + }, + { + "type": "float", + "name": "thick" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawSplineSegmentBezierCubic", + "description": "Draw spline segment: Cubic Bezier, 2 points, 2 control points", + "returnType": "void", + "params": [ + { + "type": "Vector2", + "name": "p1" + }, + { + "type": "Vector2", + "name": "c2" + }, + { + "type": "Vector2", + "name": "c3" + }, + { + "type": "Vector2", + "name": "p4" + }, + { + "type": "float", + "name": "thick" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "GetSplinePointLinear", + "description": "Get (evaluate) spline point: Linear", + "returnType": "Vector2", + "params": [ + { + "type": "Vector2", + "name": "startPos" + }, + { + "type": "Vector2", + "name": "endPos" + }, + { + "type": "float", + "name": "t" + } + ] + }, + { + "name": "GetSplinePointBasis", + "description": "Get (evaluate) spline point: B-Spline", + "returnType": "Vector2", + "params": [ + { + "type": "Vector2", + "name": "p1" + }, + { + "type": "Vector2", + "name": "p2" + }, + { + "type": "Vector2", + "name": "p3" + }, + { + "type": "Vector2", + "name": "p4" + }, + { + "type": "float", + "name": "t" + } + ] + }, + { + "name": "GetSplinePointCatmullRom", + "description": "Get (evaluate) spline point: Catmull-Rom", + "returnType": "Vector2", + "params": [ + { + "type": "Vector2", + "name": "p1" + }, + { + "type": "Vector2", + "name": "p2" + }, + { + "type": "Vector2", + "name": "p3" + }, + { + "type": "Vector2", + "name": "p4" + }, + { + "type": "float", + "name": "t" + } + ] + }, + { + "name": "GetSplinePointBezierQuad", + "description": "Get (evaluate) spline point: Quadratic Bezier", + "returnType": "Vector2", + "params": [ + { + "type": "Vector2", + "name": "p1" + }, + { + "type": "Vector2", + "name": "c2" + }, + { + "type": "Vector2", + "name": "p3" + }, + { + "type": "float", + "name": "t" + } + ] + }, + { + "name": "GetSplinePointBezierCubic", + "description": "Get (evaluate) spline point: Cubic Bezier", + "returnType": "Vector2", + "params": [ + { + "type": "Vector2", + "name": "p1" + }, + { + "type": "Vector2", + "name": "c2" + }, + { + "type": "Vector2", + "name": "c3" + }, + { + "type": "Vector2", + "name": "p4" + }, + { + "type": "float", + "name": "t" + } + ] + }, + { + "name": "CheckCollisionRecs", + "description": "Check collision between two rectangles", + "returnType": "bool", + "params": [ + { + "type": "Rectangle", + "name": "rec1" + }, + { + "type": "Rectangle", + "name": "rec2" + } + ] + }, + { + "name": "CheckCollisionCircles", + "description": "Check collision between two circles", + "returnType": "bool", + "params": [ + { + "type": "Vector2", + "name": "center1" + }, + { + "type": "float", + "name": "radius1" + }, + { + "type": "Vector2", + "name": "center2" + }, + { + "type": "float", + "name": "radius2" + } + ] + }, + { + "name": "CheckCollisionCircleRec", + "description": "Check collision between circle and rectangle", + "returnType": "bool", + "params": [ + { + "type": "Vector2", + "name": "center" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "Rectangle", + "name": "rec" + } + ] + }, + { + "name": "CheckCollisionCircleLine", + "description": "Check if circle collides with a line created betweeen two points [p1] and [p2]", + "returnType": "bool", + "params": [ + { + "type": "Vector2", + "name": "center" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "Vector2", + "name": "p1" + }, + { + "type": "Vector2", + "name": "p2" + } + ] + }, + { + "name": "CheckCollisionPointRec", + "description": "Check if point is inside rectangle", + "returnType": "bool", + "params": [ + { + "type": "Vector2", + "name": "point" + }, + { + "type": "Rectangle", + "name": "rec" + } + ] + }, + { + "name": "CheckCollisionPointCircle", + "description": "Check if point is inside circle", + "returnType": "bool", + "params": [ + { + "type": "Vector2", + "name": "point" + }, + { + "type": "Vector2", + "name": "center" + }, + { + "type": "float", + "name": "radius" + } + ] + }, + { + "name": "CheckCollisionPointTriangle", + "description": "Check if point is inside a triangle", + "returnType": "bool", + "params": [ + { + "type": "Vector2", + "name": "point" + }, + { + "type": "Vector2", + "name": "p1" + }, + { + "type": "Vector2", + "name": "p2" + }, + { + "type": "Vector2", + "name": "p3" + } + ] + }, + { + "name": "CheckCollisionPointLine", + "description": "Check if point belongs to line created between two points [p1] and [p2] with defined margin in pixels [threshold]", + "returnType": "bool", + "params": [ + { + "type": "Vector2", + "name": "point" + }, + { + "type": "Vector2", + "name": "p1" + }, + { + "type": "Vector2", + "name": "p2" + }, + { + "type": "int", + "name": "threshold" + } + ] + }, + { + "name": "CheckCollisionPointPoly", + "description": "Check if point is within a polygon described by array of vertices", + "returnType": "bool", + "params": [ + { + "type": "Vector2", + "name": "point" + }, + { + "type": "const Vector2 *", + "name": "points" + }, + { + "type": "int", + "name": "pointCount" + } + ] + }, + { + "name": "CheckCollisionLines", + "description": "Check the collision between two lines defined by two points each, returns collision point by reference", + "returnType": "bool", + "params": [ + { + "type": "Vector2", + "name": "startPos1" + }, + { + "type": "Vector2", + "name": "endPos1" + }, + { + "type": "Vector2", + "name": "startPos2" + }, + { + "type": "Vector2", + "name": "endPos2" + }, + { + "type": "Vector2 *", + "name": "collisionPoint" + } + ] + }, + { + "name": "GetCollisionRec", + "description": "Get collision rectangle for two rectangles collision", + "returnType": "Rectangle", + "params": [ + { + "type": "Rectangle", + "name": "rec1" + }, + { + "type": "Rectangle", + "name": "rec2" + } + ] + }, + { + "name": "LoadImage", + "description": "Load image from file into CPU memory (RAM)", + "returnType": "Image", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "LoadImageRaw", + "description": "Load image from RAW file data", + "returnType": "Image", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + }, + { + "type": "int", + "name": "format" + }, + { + "type": "int", + "name": "headerSize" + } + ] + }, + { + "name": "LoadImageAnim", + "description": "Load image sequence from file (frames appended to image.data)", + "returnType": "Image", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "int *", + "name": "frames" + } + ] + }, + { + "name": "LoadImageAnimFromMemory", + "description": "Load image sequence from memory buffer", + "returnType": "Image", + "params": [ + { + "type": "const char *", + "name": "fileType" + }, + { + "type": "const unsigned char *", + "name": "fileData" + }, + { + "type": "int", + "name": "dataSize" + }, + { + "type": "int *", + "name": "frames" + } + ] + }, + { + "name": "LoadImageFromMemory", + "description": "Load image from memory buffer, fileType refers to extension: i.e. '.png'", + "returnType": "Image", + "params": [ + { + "type": "const char *", + "name": "fileType" + }, + { + "type": "const unsigned char *", + "name": "fileData" + }, + { + "type": "int", + "name": "dataSize" + } + ] + }, + { + "name": "LoadImageFromTexture", + "description": "Load image from GPU texture data", + "returnType": "Image", + "params": [ + { + "type": "Texture2D", + "name": "texture" + } + ] + }, + { + "name": "LoadImageFromScreen", + "description": "Load image from screen buffer and (screenshot)", + "returnType": "Image" + }, + { + "name": "IsImageValid", + "description": "Check if an image is valid (data and parameters)", + "returnType": "bool", + "params": [ + { + "type": "Image", + "name": "image" + } + ] + }, + { + "name": "UnloadImage", + "description": "Unload image from CPU memory (RAM)", + "returnType": "void", + "params": [ + { + "type": "Image", + "name": "image" + } + ] + }, + { + "name": "ExportImage", + "description": "Export image data to file, returns true on success", + "returnType": "bool", + "params": [ + { + "type": "Image", + "name": "image" + }, + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "ExportImageToMemory", + "description": "Export image to memory buffer", + "returnType": "unsigned char *", + "params": [ + { + "type": "Image", + "name": "image" + }, + { + "type": "const char *", + "name": "fileType" + }, + { + "type": "int *", + "name": "fileSize" + } + ] + }, + { + "name": "ExportImageAsCode", + "description": "Export image as code file defining an array of bytes, returns true on success", + "returnType": "bool", + "params": [ + { + "type": "Image", + "name": "image" + }, + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "GenImageColor", + "description": "Generate image: plain color", + "returnType": "Image", + "params": [ + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "GenImageGradientLinear", + "description": "Generate image: linear gradient, direction in degrees [0..360], 0=Vertical gradient", + "returnType": "Image", + "params": [ + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + }, + { + "type": "int", + "name": "direction" + }, + { + "type": "Color", + "name": "start" + }, + { + "type": "Color", + "name": "end" + } + ] + }, + { + "name": "GenImageGradientRadial", + "description": "Generate image: radial gradient", + "returnType": "Image", + "params": [ + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + }, + { + "type": "float", + "name": "density" + }, + { + "type": "Color", + "name": "inner" + }, + { + "type": "Color", + "name": "outer" + } + ] + }, + { + "name": "GenImageGradientSquare", + "description": "Generate image: square gradient", + "returnType": "Image", + "params": [ + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + }, + { + "type": "float", + "name": "density" + }, + { + "type": "Color", + "name": "inner" + }, + { + "type": "Color", + "name": "outer" + } + ] + }, + { + "name": "GenImageChecked", + "description": "Generate image: checked", + "returnType": "Image", + "params": [ + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + }, + { + "type": "int", + "name": "checksX" + }, + { + "type": "int", + "name": "checksY" + }, + { + "type": "Color", + "name": "col1" + }, + { + "type": "Color", + "name": "col2" + } + ] + }, + { + "name": "GenImageWhiteNoise", + "description": "Generate image: white noise", + "returnType": "Image", + "params": [ + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + }, + { + "type": "float", + "name": "factor" + } + ] + }, + { + "name": "GenImagePerlinNoise", + "description": "Generate image: perlin noise", + "returnType": "Image", + "params": [ + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + }, + { + "type": "int", + "name": "offsetX" + }, + { + "type": "int", + "name": "offsetY" + }, + { + "type": "float", + "name": "scale" + } + ] + }, + { + "name": "GenImageCellular", + "description": "Generate image: cellular algorithm, bigger tileSize means bigger cells", + "returnType": "Image", + "params": [ + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + }, + { + "type": "int", + "name": "tileSize" + } + ] + }, + { + "name": "GenImageText", + "description": "Generate image: grayscale image from text data", + "returnType": "Image", + "params": [ + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + }, + { + "type": "const char *", + "name": "text" + } + ] + }, + { + "name": "ImageCopy", + "description": "Create an image duplicate (useful for transformations)", + "returnType": "Image", + "params": [ + { + "type": "Image", + "name": "image" + } + ] + }, + { + "name": "ImageFromImage", + "description": "Create an image from another image piece", + "returnType": "Image", + "params": [ + { + "type": "Image", + "name": "image" + }, + { + "type": "Rectangle", + "name": "rec" + } + ] + }, + { + "name": "ImageFromChannel", + "description": "Create an image from a selected channel of another image (GRAYSCALE)", + "returnType": "Image", + "params": [ + { + "type": "Image", + "name": "image" + }, + { + "type": "int", + "name": "selectedChannel" + } + ] + }, + { + "name": "ImageText", + "description": "Create an image from text (default font)", + "returnType": "Image", + "params": [ + { + "type": "const char *", + "name": "text" + }, + { + "type": "int", + "name": "fontSize" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageTextEx", + "description": "Create an image from text (custom sprite font)", + "returnType": "Image", + "params": [ + { + "type": "Font", + "name": "font" + }, + { + "type": "const char *", + "name": "text" + }, + { + "type": "float", + "name": "fontSize" + }, + { + "type": "float", + "name": "spacing" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "ImageFormat", + "description": "Convert image data to desired format", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + }, + { + "type": "int", + "name": "newFormat" + } + ] + }, + { + "name": "ImageToPOT", + "description": "Convert image to POT (power-of-two)", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + }, + { + "type": "Color", + "name": "fill" + } + ] + }, + { + "name": "ImageCrop", + "description": "Crop an image to a defined rectangle", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + }, + { + "type": "Rectangle", + "name": "crop" + } + ] + }, + { + "name": "ImageAlphaCrop", + "description": "Crop image depending on alpha value", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + }, + { + "type": "float", + "name": "threshold" + } + ] + }, + { + "name": "ImageAlphaClear", + "description": "Clear alpha channel to desired color", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + }, + { + "type": "Color", + "name": "color" + }, + { + "type": "float", + "name": "threshold" + } + ] + }, + { + "name": "ImageAlphaMask", + "description": "Apply alpha mask to image", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + }, + { + "type": "Image", + "name": "alphaMask" + } + ] + }, + { + "name": "ImageAlphaPremultiply", + "description": "Premultiply alpha channel", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + } + ] + }, + { + "name": "ImageBlurGaussian", + "description": "Apply Gaussian blur using a box blur approximation", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + }, + { + "type": "int", + "name": "blurSize" + } + ] + }, + { + "name": "ImageKernelConvolution", + "description": "Apply custom square convolution kernel to image", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + }, + { + "type": "const float *", + "name": "kernel" + }, + { + "type": "int", + "name": "kernelSize" + } + ] + }, + { + "name": "ImageResize", + "description": "Resize image (Bicubic scaling algorithm)", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + }, + { + "type": "int", + "name": "newWidth" + }, + { + "type": "int", + "name": "newHeight" + } + ] + }, + { + "name": "ImageResizeNN", + "description": "Resize image (Nearest-Neighbor scaling algorithm)", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + }, + { + "type": "int", + "name": "newWidth" + }, + { + "type": "int", + "name": "newHeight" + } + ] + }, + { + "name": "ImageResizeCanvas", + "description": "Resize canvas and fill with color", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + }, + { + "type": "int", + "name": "newWidth" + }, + { + "type": "int", + "name": "newHeight" + }, + { + "type": "int", + "name": "offsetX" + }, + { + "type": "int", + "name": "offsetY" + }, + { + "type": "Color", + "name": "fill" + } + ] + }, + { + "name": "ImageMipmaps", + "description": "Compute all mipmap levels for a provided image", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + } + ] + }, + { + "name": "ImageDither", + "description": "Dither image data to 16bpp or lower (Floyd-Steinberg dithering)", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + }, + { + "type": "int", + "name": "rBpp" + }, + { + "type": "int", + "name": "gBpp" + }, + { + "type": "int", + "name": "bBpp" + }, + { + "type": "int", + "name": "aBpp" + } + ] + }, + { + "name": "ImageFlipVertical", + "description": "Flip image vertically", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + } + ] + }, + { + "name": "ImageFlipHorizontal", + "description": "Flip image horizontally", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + } + ] + }, + { + "name": "ImageRotate", + "description": "Rotate image by input angle in degrees (-359 to 359)", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + }, + { + "type": "int", + "name": "degrees" + } + ] + }, + { + "name": "ImageRotateCW", + "description": "Rotate image clockwise 90deg", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + } + ] + }, + { + "name": "ImageRotateCCW", + "description": "Rotate image counter-clockwise 90deg", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + } + ] + }, + { + "name": "ImageColorTint", + "description": "Modify image color: tint", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageColorInvert", + "description": "Modify image color: invert", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + } + ] + }, + { + "name": "ImageColorGrayscale", + "description": "Modify image color: grayscale", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + } + ] + }, + { + "name": "ImageColorContrast", + "description": "Modify image color: contrast (-100 to 100)", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + }, + { + "type": "float", + "name": "contrast" + } + ] + }, + { + "name": "ImageColorBrightness", + "description": "Modify image color: brightness (-255 to 255)", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + }, + { + "type": "int", + "name": "brightness" + } + ] + }, + { + "name": "ImageColorReplace", + "description": "Modify image color: replace color", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "image" + }, + { + "type": "Color", + "name": "color" + }, + { + "type": "Color", + "name": "replace" + } + ] + }, + { + "name": "LoadImageColors", + "description": "Load color data from image as a Color array (RGBA - 32bit)", + "returnType": "Color *", + "params": [ + { + "type": "Image", + "name": "image" + } + ] + }, + { + "name": "LoadImagePalette", + "description": "Load colors palette from image as a Color array (RGBA - 32bit)", + "returnType": "Color *", + "params": [ + { + "type": "Image", + "name": "image" + }, + { + "type": "int", + "name": "maxPaletteSize" + }, + { + "type": "int *", + "name": "colorCount" + } + ] + }, + { + "name": "UnloadImageColors", + "description": "Unload color data loaded with LoadImageColors()", + "returnType": "void", + "params": [ + { + "type": "Color *", + "name": "colors" + } + ] + }, + { + "name": "UnloadImagePalette", + "description": "Unload colors palette loaded with LoadImagePalette()", + "returnType": "void", + "params": [ + { + "type": "Color *", + "name": "colors" + } + ] + }, + { + "name": "GetImageAlphaBorder", + "description": "Get image alpha border rectangle", + "returnType": "Rectangle", + "params": [ + { + "type": "Image", + "name": "image" + }, + { + "type": "float", + "name": "threshold" + } + ] + }, + { + "name": "GetImageColor", + "description": "Get image pixel color at (x, y) position", + "returnType": "Color", + "params": [ + { + "type": "Image", + "name": "image" + }, + { + "type": "int", + "name": "x" + }, + { + "type": "int", + "name": "y" + } + ] + }, + { + "name": "ImageClearBackground", + "description": "Clear image background with given color", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawPixel", + "description": "Draw pixel within an image", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "int", + "name": "posX" + }, + { + "type": "int", + "name": "posY" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawPixelV", + "description": "Draw pixel within an image (Vector version)", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "Vector2", + "name": "position" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawLine", + "description": "Draw line within an image", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "int", + "name": "startPosX" + }, + { + "type": "int", + "name": "startPosY" + }, + { + "type": "int", + "name": "endPosX" + }, + { + "type": "int", + "name": "endPosY" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawLineV", + "description": "Draw line within an image (Vector version)", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "Vector2", + "name": "start" + }, + { + "type": "Vector2", + "name": "end" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawLineEx", + "description": "Draw a line defining thickness within an image", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "Vector2", + "name": "start" + }, + { + "type": "Vector2", + "name": "end" + }, + { + "type": "int", + "name": "thick" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawCircle", + "description": "Draw a filled circle within an image", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "int", + "name": "centerX" + }, + { + "type": "int", + "name": "centerY" + }, + { + "type": "int", + "name": "radius" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawCircleV", + "description": "Draw a filled circle within an image (Vector version)", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "Vector2", + "name": "center" + }, + { + "type": "int", + "name": "radius" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawCircleLines", + "description": "Draw circle outline within an image", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "int", + "name": "centerX" + }, + { + "type": "int", + "name": "centerY" + }, + { + "type": "int", + "name": "radius" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawCircleLinesV", + "description": "Draw circle outline within an image (Vector version)", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "Vector2", + "name": "center" + }, + { + "type": "int", + "name": "radius" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawRectangle", + "description": "Draw rectangle within an image", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "int", + "name": "posX" + }, + { + "type": "int", + "name": "posY" + }, + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawRectangleV", + "description": "Draw rectangle within an image (Vector version)", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "Vector2", + "name": "position" + }, + { + "type": "Vector2", + "name": "size" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawRectangleRec", + "description": "Draw rectangle within an image", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "Rectangle", + "name": "rec" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawRectangleLines", + "description": "Draw rectangle lines within an image", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "Rectangle", + "name": "rec" + }, + { + "type": "int", + "name": "thick" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawTriangle", + "description": "Draw triangle within an image", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "Vector2", + "name": "v1" + }, + { + "type": "Vector2", + "name": "v2" + }, + { + "type": "Vector2", + "name": "v3" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawTriangleEx", + "description": "Draw triangle with interpolated colors within an image", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "Vector2", + "name": "v1" + }, + { + "type": "Vector2", + "name": "v2" + }, + { + "type": "Vector2", + "name": "v3" + }, + { + "type": "Color", + "name": "c1" + }, + { + "type": "Color", + "name": "c2" + }, + { + "type": "Color", + "name": "c3" + } + ] + }, + { + "name": "ImageDrawTriangleLines", + "description": "Draw triangle outline within an image", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "Vector2", + "name": "v1" + }, + { + "type": "Vector2", + "name": "v2" + }, + { + "type": "Vector2", + "name": "v3" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawTriangleFan", + "description": "Draw a triangle fan defined by points within an image (first vertex is the center)", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "const Vector2 *", + "name": "points" + }, + { + "type": "int", + "name": "pointCount" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawTriangleStrip", + "description": "Draw a triangle strip defined by points within an image", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "const Vector2 *", + "name": "points" + }, + { + "type": "int", + "name": "pointCount" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDraw", + "description": "Draw a source image within a destination image (tint applied to source)", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "Image", + "name": "src" + }, + { + "type": "Rectangle", + "name": "srcRec" + }, + { + "type": "Rectangle", + "name": "dstRec" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "ImageDrawText", + "description": "Draw text (using default font) within an image (destination)", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "const char *", + "name": "text" + }, + { + "type": "int", + "name": "posX" + }, + { + "type": "int", + "name": "posY" + }, + { + "type": "int", + "name": "fontSize" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ImageDrawTextEx", + "description": "Draw text (custom sprite font) within an image (destination)", + "returnType": "void", + "params": [ + { + "type": "Image *", + "name": "dst" + }, + { + "type": "Font", + "name": "font" + }, + { + "type": "const char *", + "name": "text" + }, + { + "type": "Vector2", + "name": "position" + }, + { + "type": "float", + "name": "fontSize" + }, + { + "type": "float", + "name": "spacing" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "LoadTexture", + "description": "Load texture from file into GPU memory (VRAM)", + "returnType": "Texture2D", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "LoadTextureFromImage", + "description": "Load texture from image data", + "returnType": "Texture2D", + "params": [ + { + "type": "Image", + "name": "image" + } + ] + }, + { + "name": "LoadTextureCubemap", + "description": "Load cubemap from image, multiple image cubemap layouts supported", + "returnType": "TextureCubemap", + "params": [ + { + "type": "Image", + "name": "image" + }, + { + "type": "int", + "name": "layout" + } + ] + }, + { + "name": "LoadRenderTexture", + "description": "Load texture for rendering (framebuffer)", + "returnType": "RenderTexture2D", + "params": [ + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + } + ] + }, + { + "name": "IsTextureValid", + "description": "Check if a texture is valid (loaded in GPU)", + "returnType": "bool", + "params": [ + { + "type": "Texture2D", + "name": "texture" + } + ] + }, + { + "name": "UnloadTexture", + "description": "Unload texture from GPU memory (VRAM)", + "returnType": "void", + "params": [ + { + "type": "Texture2D", + "name": "texture" + } + ] + }, + { + "name": "IsRenderTextureValid", + "description": "Check if a render texture is valid (loaded in GPU)", + "returnType": "bool", + "params": [ + { + "type": "RenderTexture2D", + "name": "target" + } + ] + }, + { + "name": "UnloadRenderTexture", + "description": "Unload render texture from GPU memory (VRAM)", + "returnType": "void", + "params": [ + { + "type": "RenderTexture2D", + "name": "target" + } + ] + }, + { + "name": "UpdateTexture", + "description": "Update GPU texture with new data (pixels should be able to fill texture)", + "returnType": "void", + "params": [ + { + "type": "Texture2D", + "name": "texture" + }, + { + "type": "const void *", + "name": "pixels" + } + ] + }, + { + "name": "UpdateTextureRec", + "description": "Update GPU texture rectangle with new data (pixels and rec should fit in texture)", + "returnType": "void", + "params": [ + { + "type": "Texture2D", + "name": "texture" + }, + { + "type": "Rectangle", + "name": "rec" + }, + { + "type": "const void *", + "name": "pixels" + } + ] + }, + { + "name": "GenTextureMipmaps", + "description": "Generate GPU mipmaps for a texture", + "returnType": "void", + "params": [ + { + "type": "Texture2D *", + "name": "texture" + } + ] + }, + { + "name": "SetTextureFilter", + "description": "Set texture scaling filter mode", + "returnType": "void", + "params": [ + { + "type": "Texture2D", + "name": "texture" + }, + { + "type": "int", + "name": "filter" + } + ] + }, + { + "name": "SetTextureWrap", + "description": "Set texture wrapping mode", + "returnType": "void", + "params": [ + { + "type": "Texture2D", + "name": "texture" + }, + { + "type": "int", + "name": "wrap" + } + ] + }, + { + "name": "DrawTexture", + "description": "Draw a Texture2D", + "returnType": "void", + "params": [ + { + "type": "Texture2D", + "name": "texture" + }, + { + "type": "int", + "name": "posX" + }, + { + "type": "int", + "name": "posY" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "DrawTextureV", + "description": "Draw a Texture2D with position defined as Vector2", + "returnType": "void", + "params": [ + { + "type": "Texture2D", + "name": "texture" + }, + { + "type": "Vector2", + "name": "position" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "DrawTextureEx", + "description": "Draw a Texture2D with extended parameters", + "returnType": "void", + "params": [ + { + "type": "Texture2D", + "name": "texture" + }, + { + "type": "Vector2", + "name": "position" + }, + { + "type": "float", + "name": "rotation" + }, + { + "type": "float", + "name": "scale" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "DrawTextureRec", + "description": "Draw a part of a texture defined by a rectangle", + "returnType": "void", + "params": [ + { + "type": "Texture2D", + "name": "texture" + }, + { + "type": "Rectangle", + "name": "source" + }, + { + "type": "Vector2", + "name": "position" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "DrawTexturePro", + "description": "Draw a part of a texture defined by a rectangle with 'pro' parameters", + "returnType": "void", + "params": [ + { + "type": "Texture2D", + "name": "texture" + }, + { + "type": "Rectangle", + "name": "source" + }, + { + "type": "Rectangle", + "name": "dest" + }, + { + "type": "Vector2", + "name": "origin" + }, + { + "type": "float", + "name": "rotation" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "DrawTextureNPatch", + "description": "Draws a texture (or part of it) that stretches or shrinks nicely", + "returnType": "void", + "params": [ + { + "type": "Texture2D", + "name": "texture" + }, + { + "type": "NPatchInfo", + "name": "nPatchInfo" + }, + { + "type": "Rectangle", + "name": "dest" + }, + { + "type": "Vector2", + "name": "origin" + }, + { + "type": "float", + "name": "rotation" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "ColorIsEqual", + "description": "Check if two colors are equal", + "returnType": "bool", + "params": [ + { + "type": "Color", + "name": "col1" + }, + { + "type": "Color", + "name": "col2" + } + ] + }, + { + "name": "Fade", + "description": "Get color with alpha applied, alpha goes from 0.0f to 1.0f", + "returnType": "Color", + "params": [ + { + "type": "Color", + "name": "color" + }, + { + "type": "float", + "name": "alpha" + } + ] + }, + { + "name": "ColorToInt", + "description": "Get hexadecimal value for a Color (0xRRGGBBAA)", + "returnType": "int", + "params": [ + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ColorNormalize", + "description": "Get Color normalized as float [0..1]", + "returnType": "Vector4", + "params": [ + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ColorFromNormalized", + "description": "Get Color from normalized values [0..1]", + "returnType": "Color", + "params": [ + { + "type": "Vector4", + "name": "normalized" + } + ] + }, + { + "name": "ColorToHSV", + "description": "Get HSV values for a Color, hue [0..360], saturation/value [0..1]", + "returnType": "Vector3", + "params": [ + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "ColorFromHSV", + "description": "Get a Color from HSV values, hue [0..360], saturation/value [0..1]", + "returnType": "Color", + "params": [ + { + "type": "float", + "name": "hue" + }, + { + "type": "float", + "name": "saturation" + }, + { + "type": "float", + "name": "value" + } + ] + }, + { + "name": "ColorTint", + "description": "Get color multiplied with another color", + "returnType": "Color", + "params": [ + { + "type": "Color", + "name": "color" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "ColorBrightness", + "description": "Get color with brightness correction, brightness factor goes from -1.0f to 1.0f", + "returnType": "Color", + "params": [ + { + "type": "Color", + "name": "color" + }, + { + "type": "float", + "name": "factor" + } + ] + }, + { + "name": "ColorContrast", + "description": "Get color with contrast correction, contrast values between -1.0f and 1.0f", + "returnType": "Color", + "params": [ + { + "type": "Color", + "name": "color" + }, + { + "type": "float", + "name": "contrast" + } + ] + }, + { + "name": "ColorAlpha", + "description": "Get color with alpha applied, alpha goes from 0.0f to 1.0f", + "returnType": "Color", + "params": [ + { + "type": "Color", + "name": "color" + }, + { + "type": "float", + "name": "alpha" + } + ] + }, + { + "name": "ColorAlphaBlend", + "description": "Get src alpha-blended into dst color with tint", + "returnType": "Color", + "params": [ + { + "type": "Color", + "name": "dst" + }, + { + "type": "Color", + "name": "src" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "ColorLerp", + "description": "Get color lerp interpolation between two colors, factor [0.0f..1.0f]", + "returnType": "Color", + "params": [ + { + "type": "Color", + "name": "color1" + }, + { + "type": "Color", + "name": "color2" + }, + { + "type": "float", + "name": "factor" + } + ] + }, + { + "name": "GetColor", + "description": "Get Color structure from hexadecimal value", + "returnType": "Color", + "params": [ + { + "type": "unsigned int", + "name": "hexValue" + } + ] + }, + { + "name": "GetPixelColor", + "description": "Get Color from a source pixel pointer of certain format", + "returnType": "Color", + "params": [ + { + "type": "void *", + "name": "srcPtr" + }, + { + "type": "int", + "name": "format" + } + ] + }, + { + "name": "SetPixelColor", + "description": "Set color formatted into destination pixel pointer", + "returnType": "void", + "params": [ + { + "type": "void *", + "name": "dstPtr" + }, + { + "type": "Color", + "name": "color" + }, + { + "type": "int", + "name": "format" + } + ] + }, + { + "name": "GetPixelDataSize", + "description": "Get pixel data size in bytes for certain format", + "returnType": "int", + "params": [ + { + "type": "int", + "name": "width" + }, + { + "type": "int", + "name": "height" + }, + { + "type": "int", + "name": "format" + } + ] + }, + { + "name": "GetFontDefault", + "description": "Get the default Font", + "returnType": "Font" + }, + { + "name": "LoadFont", + "description": "Load font from file into GPU memory (VRAM)", + "returnType": "Font", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "LoadFontEx", + "description": "Load font from file with extended parameters, use NULL for codepoints and 0 for codepointCount to load the default character set, font size is provided in pixels height", + "returnType": "Font", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "int", + "name": "fontSize" + }, + { + "type": "const int *", + "name": "codepoints" + }, + { + "type": "int", + "name": "codepointCount" + } + ] + }, + { + "name": "LoadFontFromImage", + "description": "Load font from Image (XNA style)", + "returnType": "Font", + "params": [ + { + "type": "Image", + "name": "image" + }, + { + "type": "Color", + "name": "key" + }, + { + "type": "int", + "name": "firstChar" + } + ] + }, + { + "name": "LoadFontFromMemory", + "description": "Load font from memory buffer, fileType refers to extension: i.e. '.ttf'", + "returnType": "Font", + "params": [ + { + "type": "const char *", + "name": "fileType" + }, + { + "type": "const unsigned char *", + "name": "fileData" + }, + { + "type": "int", + "name": "dataSize" + }, + { + "type": "int", + "name": "fontSize" + }, + { + "type": "const int *", + "name": "codepoints" + }, + { + "type": "int", + "name": "codepointCount" + } + ] + }, + { + "name": "IsFontValid", + "description": "Check if a font is valid (font data loaded, WARNING: GPU texture not checked)", + "returnType": "bool", + "params": [ + { + "type": "Font", + "name": "font" + } + ] + }, + { + "name": "LoadFontData", + "description": "Load font data for further use", + "returnType": "GlyphInfo *", + "params": [ + { + "type": "const unsigned char *", + "name": "fileData" + }, + { + "type": "int", + "name": "dataSize" + }, + { + "type": "int", + "name": "fontSize" + }, + { + "type": "const int *", + "name": "codepoints" + }, + { + "type": "int", + "name": "codepointCount" + }, + { + "type": "int", + "name": "type" + }, + { + "type": "int *", + "name": "glyphCount" + } + ] + }, + { + "name": "GenImageFontAtlas", + "description": "Generate image font atlas using chars info", + "returnType": "Image", + "params": [ + { + "type": "const GlyphInfo *", + "name": "glyphs" + }, + { + "type": "Rectangle **", + "name": "glyphRecs" + }, + { + "type": "int", + "name": "glyphCount" + }, + { + "type": "int", + "name": "fontSize" + }, + { + "type": "int", + "name": "padding" + }, + { + "type": "int", + "name": "packMethod" + } + ] + }, + { + "name": "UnloadFontData", + "description": "Unload font chars info data (RAM)", + "returnType": "void", + "params": [ + { + "type": "GlyphInfo *", + "name": "glyphs" + }, + { + "type": "int", + "name": "glyphCount" + } + ] + }, + { + "name": "UnloadFont", + "description": "Unload font from GPU memory (VRAM)", + "returnType": "void", + "params": [ + { + "type": "Font", + "name": "font" + } + ] + }, + { + "name": "ExportFontAsCode", + "description": "Export font as code file, returns true on success", + "returnType": "bool", + "params": [ + { + "type": "Font", + "name": "font" + }, + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "DrawFPS", + "description": "Draw current FPS", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "posX" + }, + { + "type": "int", + "name": "posY" + } + ] + }, + { + "name": "DrawText", + "description": "Draw text (using default font)", + "returnType": "void", + "params": [ + { + "type": "const char *", + "name": "text" + }, + { + "type": "int", + "name": "posX" + }, + { + "type": "int", + "name": "posY" + }, + { + "type": "int", + "name": "fontSize" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawTextEx", + "description": "Draw text using font and additional parameters", + "returnType": "void", + "params": [ + { + "type": "Font", + "name": "font" + }, + { + "type": "const char *", + "name": "text" + }, + { + "type": "Vector2", + "name": "position" + }, + { + "type": "float", + "name": "fontSize" + }, + { + "type": "float", + "name": "spacing" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "DrawTextPro", + "description": "Draw text using Font and pro parameters (rotation)", + "returnType": "void", + "params": [ + { + "type": "Font", + "name": "font" + }, + { + "type": "const char *", + "name": "text" + }, + { + "type": "Vector2", + "name": "position" + }, + { + "type": "Vector2", + "name": "origin" + }, + { + "type": "float", + "name": "rotation" + }, + { + "type": "float", + "name": "fontSize" + }, + { + "type": "float", + "name": "spacing" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "DrawTextCodepoint", + "description": "Draw one character (codepoint)", + "returnType": "void", + "params": [ + { + "type": "Font", + "name": "font" + }, + { + "type": "int", + "name": "codepoint" + }, + { + "type": "Vector2", + "name": "position" + }, + { + "type": "float", + "name": "fontSize" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "DrawTextCodepoints", + "description": "Draw multiple character (codepoint)", + "returnType": "void", + "params": [ + { + "type": "Font", + "name": "font" + }, + { + "type": "const int *", + "name": "codepoints" + }, + { + "type": "int", + "name": "codepointCount" + }, + { + "type": "Vector2", + "name": "position" + }, + { + "type": "float", + "name": "fontSize" + }, + { + "type": "float", + "name": "spacing" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "SetTextLineSpacing", + "description": "Set vertical line spacing when drawing with line-breaks", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "spacing" + } + ] + }, + { + "name": "MeasureText", + "description": "Measure string width for default font", + "returnType": "int", + "params": [ + { + "type": "const char *", + "name": "text" + }, + { + "type": "int", + "name": "fontSize" + } + ] + }, + { + "name": "MeasureTextEx", + "description": "Measure string size for Font", + "returnType": "Vector2", + "params": [ + { + "type": "Font", + "name": "font" + }, + { + "type": "const char *", + "name": "text" + }, + { + "type": "float", + "name": "fontSize" + }, + { + "type": "float", + "name": "spacing" + } + ] + }, + { + "name": "GetGlyphIndex", + "description": "Get glyph index position in font for a codepoint (unicode character), fallback to '?' if not found", + "returnType": "int", + "params": [ + { + "type": "Font", + "name": "font" + }, + { + "type": "int", + "name": "codepoint" + } + ] + }, + { + "name": "GetGlyphInfo", + "description": "Get glyph font info data for a codepoint (unicode character), fallback to '?' if not found", + "returnType": "GlyphInfo", + "params": [ + { + "type": "Font", + "name": "font" + }, + { + "type": "int", + "name": "codepoint" + } + ] + }, + { + "name": "GetGlyphAtlasRec", + "description": "Get glyph rectangle in font atlas for a codepoint (unicode character), fallback to '?' if not found", + "returnType": "Rectangle", + "params": [ + { + "type": "Font", + "name": "font" + }, + { + "type": "int", + "name": "codepoint" + } + ] + }, + { + "name": "LoadUTF8", + "description": "Load UTF-8 text encoded from codepoints array", + "returnType": "char *", + "params": [ + { + "type": "const int *", + "name": "codepoints" + }, + { + "type": "int", + "name": "length" + } + ] + }, + { + "name": "UnloadUTF8", + "description": "Unload UTF-8 text encoded from codepoints array", + "returnType": "void", + "params": [ + { + "type": "char *", + "name": "text" + } + ] + }, + { + "name": "LoadCodepoints", + "description": "Load all codepoints from a UTF-8 text string, codepoints count returned by parameter", + "returnType": "int *", + "params": [ + { + "type": "const char *", + "name": "text" + }, + { + "type": "int *", + "name": "count" + } + ] + }, + { + "name": "UnloadCodepoints", + "description": "Unload codepoints data from memory", + "returnType": "void", + "params": [ + { + "type": "int *", + "name": "codepoints" + } + ] + }, + { + "name": "GetCodepointCount", + "description": "Get total number of codepoints in a UTF-8 encoded string", + "returnType": "int", + "params": [ + { + "type": "const char *", + "name": "text" + } + ] + }, + { + "name": "GetCodepoint", + "description": "Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure", + "returnType": "int", + "params": [ + { + "type": "const char *", + "name": "text" + }, + { + "type": "int *", + "name": "codepointSize" + } + ] + }, + { + "name": "GetCodepointNext", + "description": "Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure", + "returnType": "int", + "params": [ + { + "type": "const char *", + "name": "text" + }, + { + "type": "int *", + "name": "codepointSize" + } + ] + }, + { + "name": "GetCodepointPrevious", + "description": "Get previous codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure", + "returnType": "int", + "params": [ + { + "type": "const char *", + "name": "text" + }, + { + "type": "int *", + "name": "codepointSize" + } + ] + }, + { + "name": "CodepointToUTF8", + "description": "Encode one codepoint into UTF-8 byte array (array length returned as parameter)", + "returnType": "const char *", + "params": [ + { + "type": "int", + "name": "codepoint" + }, + { + "type": "int *", + "name": "utf8Size" + } + ] + }, + { + "name": "LoadTextLines", + "description": "Load text as separate lines ('\\n')", + "returnType": "char **", + "params": [ + { + "type": "const char *", + "name": "text" + }, + { + "type": "int *", + "name": "count" + } + ] + }, + { + "name": "UnloadTextLines", + "description": "Unload text lines", + "returnType": "void", + "params": [ + { + "type": "char **", + "name": "text" + }, + { + "type": "int", + "name": "lineCount" + } + ] + }, + { + "name": "TextCopy", + "description": "Copy one string to another, returns bytes copied", + "returnType": "int", + "params": [ + { + "type": "char *", + "name": "dst" + }, + { + "type": "const char *", + "name": "src" + } + ] + }, + { + "name": "TextIsEqual", + "description": "Check if two text string are equal", + "returnType": "bool", + "params": [ + { + "type": "const char *", + "name": "text1" + }, + { + "type": "const char *", + "name": "text2" + } + ] + }, + { + "name": "TextLength", + "description": "Get text length, checks for '\\0' ending", + "returnType": "unsigned int", + "params": [ + { + "type": "const char *", + "name": "text" + } + ] + }, + { + "name": "TextFormat", + "description": "Text formatting with variables (sprintf() style)", + "returnType": "const char *", + "params": [ + { + "type": "const char *", + "name": "text" + }, + { + "type": "...", + "name": "args" + } + ] + }, + { + "name": "TextSubtext", + "description": "Get a piece of a text string", + "returnType": "const char *", + "params": [ + { + "type": "const char *", + "name": "text" + }, + { + "type": "int", + "name": "position" + }, + { + "type": "int", + "name": "length" + } + ] + }, + { + "name": "TextRemoveSpaces", + "description": "Remove text spaces, concat words", + "returnType": "const char *", + "params": [ + { + "type": "const char *", + "name": "text" + } + ] + }, + { + "name": "GetTextBetween", + "description": "Get text between two strings", + "returnType": "char *", + "params": [ + { + "type": "const char *", + "name": "text" + }, + { + "type": "const char *", + "name": "begin" + }, + { + "type": "const char *", + "name": "end" + } + ] + }, + { + "name": "TextReplace", + "description": "Replace text string (WARNING: memory must be freed!)", + "returnType": "char *", + "params": [ + { + "type": "const char *", + "name": "text" + }, + { + "type": "const char *", + "name": "search" + }, + { + "type": "const char *", + "name": "replacement" + } + ] + }, + { + "name": "TextReplaceBetween", + "description": "Replace text between two specific strings (WARNING: memory must be freed!)", + "returnType": "char *", + "params": [ + { + "type": "const char *", + "name": "text" + }, + { + "type": "const char *", + "name": "begin" + }, + { + "type": "const char *", + "name": "end" + }, + { + "type": "const char *", + "name": "replacement" + } + ] + }, + { + "name": "TextInsert", + "description": "Insert text in a position (WARNING: memory must be freed!)", + "returnType": "char *", + "params": [ + { + "type": "const char *", + "name": "text" + }, + { + "type": "const char *", + "name": "insert" + }, + { + "type": "int", + "name": "position" + } + ] + }, + { + "name": "TextJoin", + "description": "Join text strings with delimiter", + "returnType": "char *", + "params": [ + { + "type": "char **", + "name": "textList" + }, + { + "type": "int", + "name": "count" + }, + { + "type": "const char *", + "name": "delimiter" + } + ] + }, + { + "name": "TextSplit", + "description": "Split text into multiple strings, using MAX_TEXTSPLIT_COUNT static strings", + "returnType": "char **", + "params": [ + { + "type": "const char *", + "name": "text" + }, + { + "type": "char", + "name": "delimiter" + }, + { + "type": "int *", + "name": "count" + } + ] + }, + { + "name": "TextAppend", + "description": "Append text at specific position and move cursor", + "returnType": "void", + "params": [ + { + "type": "char *", + "name": "text" + }, + { + "type": "const char *", + "name": "append" + }, + { + "type": "int *", + "name": "position" + } + ] + }, + { + "name": "TextFindIndex", + "description": "Find first text occurrence within a string, -1 if not found", + "returnType": "int", + "params": [ + { + "type": "const char *", + "name": "text" + }, + { + "type": "const char *", + "name": "search" + } + ] + }, + { + "name": "TextToUpper", + "description": "Get upper case version of provided string", + "returnType": "char *", + "params": [ + { + "type": "const char *", + "name": "text" + } + ] + }, + { + "name": "TextToLower", + "description": "Get lower case version of provided string", + "returnType": "char *", + "params": [ + { + "type": "const char *", + "name": "text" + } + ] + }, + { + "name": "TextToPascal", + "description": "Get Pascal case notation version of provided string", + "returnType": "char *", + "params": [ + { + "type": "const char *", + "name": "text" + } + ] + }, + { + "name": "TextToSnake", + "description": "Get Snake case notation version of provided string", + "returnType": "char *", + "params": [ + { + "type": "const char *", + "name": "text" + } + ] + }, + { + "name": "TextToCamel", + "description": "Get Camel case notation version of provided string", + "returnType": "char *", + "params": [ + { + "type": "const char *", + "name": "text" + } + ] + }, + { + "name": "TextToInteger", + "description": "Get integer value from text", + "returnType": "int", + "params": [ + { + "type": "const char *", + "name": "text" + } + ] + }, + { + "name": "TextToFloat", + "description": "Get float value from text", + "returnType": "float", + "params": [ + { + "type": "const char *", + "name": "text" + } + ] + }, + { + "name": "DrawLine3D", + "description": "Draw a line in 3D world space", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "startPos" + }, + { + "type": "Vector3", + "name": "endPos" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawPoint3D", + "description": "Draw a point in 3D space, actually a small line", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "position" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawCircle3D", + "description": "Draw a circle in 3D world space", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "center" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "Vector3", + "name": "rotationAxis" + }, + { + "type": "float", + "name": "rotationAngle" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawTriangle3D", + "description": "Draw a color-filled triangle (vertex in counter-clockwise order!)", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "v1" + }, + { + "type": "Vector3", + "name": "v2" + }, + { + "type": "Vector3", + "name": "v3" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawTriangleStrip3D", + "description": "Draw a triangle strip defined by points", + "returnType": "void", + "params": [ + { + "type": "const Vector3 *", + "name": "points" + }, + { + "type": "int", + "name": "pointCount" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawCube", + "description": "Draw cube", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "position" + }, + { + "type": "float", + "name": "width" + }, + { + "type": "float", + "name": "height" + }, + { + "type": "float", + "name": "length" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawCubeV", + "description": "Draw cube (Vector version)", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "position" + }, + { + "type": "Vector3", + "name": "size" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawCubeWires", + "description": "Draw cube wires", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "position" + }, + { + "type": "float", + "name": "width" + }, + { + "type": "float", + "name": "height" + }, + { + "type": "float", + "name": "length" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawCubeWiresV", + "description": "Draw cube wires (Vector version)", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "position" + }, + { + "type": "Vector3", + "name": "size" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawSphere", + "description": "Draw sphere", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "centerPos" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawSphereEx", + "description": "Draw sphere with extended parameters", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "centerPos" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "int", + "name": "rings" + }, + { + "type": "int", + "name": "slices" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawSphereWires", + "description": "Draw sphere wires", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "centerPos" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "int", + "name": "rings" + }, + { + "type": "int", + "name": "slices" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawCylinder", + "description": "Draw a cylinder/cone", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "position" + }, + { + "type": "float", + "name": "radiusTop" + }, + { + "type": "float", + "name": "radiusBottom" + }, + { + "type": "float", + "name": "height" + }, + { + "type": "int", + "name": "slices" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawCylinderEx", + "description": "Draw a cylinder with base at startPos and top at endPos", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "startPos" + }, + { + "type": "Vector3", + "name": "endPos" + }, + { + "type": "float", + "name": "startRadius" + }, + { + "type": "float", + "name": "endRadius" + }, + { + "type": "int", + "name": "sides" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawCylinderWires", + "description": "Draw a cylinder/cone wires", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "position" + }, + { + "type": "float", + "name": "radiusTop" + }, + { + "type": "float", + "name": "radiusBottom" + }, + { + "type": "float", + "name": "height" + }, + { + "type": "int", + "name": "slices" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawCylinderWiresEx", + "description": "Draw a cylinder wires with base at startPos and top at endPos", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "startPos" + }, + { + "type": "Vector3", + "name": "endPos" + }, + { + "type": "float", + "name": "startRadius" + }, + { + "type": "float", + "name": "endRadius" + }, + { + "type": "int", + "name": "sides" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawCapsule", + "description": "Draw a capsule with the center of its sphere caps at startPos and endPos", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "startPos" + }, + { + "type": "Vector3", + "name": "endPos" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "int", + "name": "slices" + }, + { + "type": "int", + "name": "rings" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawCapsuleWires", + "description": "Draw capsule wireframe with the center of its sphere caps at startPos and endPos", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "startPos" + }, + { + "type": "Vector3", + "name": "endPos" + }, + { + "type": "float", + "name": "radius" + }, + { + "type": "int", + "name": "slices" + }, + { + "type": "int", + "name": "rings" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawPlane", + "description": "Draw a plane XZ", + "returnType": "void", + "params": [ + { + "type": "Vector3", + "name": "centerPos" + }, + { + "type": "Vector2", + "name": "size" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawRay", + "description": "Draw a ray line", + "returnType": "void", + "params": [ + { + "type": "Ray", + "name": "ray" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawGrid", + "description": "Draw a grid (centered at (0, 0, 0))", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "slices" + }, + { + "type": "float", + "name": "spacing" + } + ] + }, + { + "name": "LoadModel", + "description": "Load model from files (meshes and materials)", + "returnType": "Model", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "LoadModelFromMesh", + "description": "Load model from generated mesh (default material)", + "returnType": "Model", + "params": [ + { + "type": "Mesh", + "name": "mesh" + } + ] + }, + { + "name": "IsModelValid", + "description": "Check if a model is valid (loaded in GPU, VAO/VBOs)", + "returnType": "bool", + "params": [ + { + "type": "Model", + "name": "model" + } + ] + }, + { + "name": "UnloadModel", + "description": "Unload model (including meshes) from memory (RAM and/or VRAM)", + "returnType": "void", + "params": [ + { + "type": "Model", + "name": "model" + } + ] + }, + { + "name": "GetModelBoundingBox", + "description": "Compute model bounding box limits (considers all meshes)", + "returnType": "BoundingBox", + "params": [ + { + "type": "Model", + "name": "model" + } + ] + }, + { + "name": "DrawModel", + "description": "Draw a model (with texture if set)", + "returnType": "void", + "params": [ + { + "type": "Model", + "name": "model" + }, + { + "type": "Vector3", + "name": "position" + }, + { + "type": "float", + "name": "scale" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "DrawModelEx", + "description": "Draw a model with extended parameters", + "returnType": "void", + "params": [ + { + "type": "Model", + "name": "model" + }, + { + "type": "Vector3", + "name": "position" + }, + { + "type": "Vector3", + "name": "rotationAxis" + }, + { + "type": "float", + "name": "rotationAngle" + }, + { + "type": "Vector3", + "name": "scale" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "DrawModelWires", + "description": "Draw a model wires (with texture if set)", + "returnType": "void", + "params": [ + { + "type": "Model", + "name": "model" + }, + { + "type": "Vector3", + "name": "position" + }, + { + "type": "float", + "name": "scale" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "DrawModelWiresEx", + "description": "Draw a model wires (with texture if set) with extended parameters", + "returnType": "void", + "params": [ + { + "type": "Model", + "name": "model" + }, + { + "type": "Vector3", + "name": "position" + }, + { + "type": "Vector3", + "name": "rotationAxis" + }, + { + "type": "float", + "name": "rotationAngle" + }, + { + "type": "Vector3", + "name": "scale" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "DrawModelPoints", + "description": "Draw a model as points", + "returnType": "void", + "params": [ + { + "type": "Model", + "name": "model" + }, + { + "type": "Vector3", + "name": "position" + }, + { + "type": "float", + "name": "scale" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "DrawModelPointsEx", + "description": "Draw a model as points with extended parameters", + "returnType": "void", + "params": [ + { + "type": "Model", + "name": "model" + }, + { + "type": "Vector3", + "name": "position" + }, + { + "type": "Vector3", + "name": "rotationAxis" + }, + { + "type": "float", + "name": "rotationAngle" + }, + { + "type": "Vector3", + "name": "scale" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "DrawBoundingBox", + "description": "Draw bounding box (wires)", + "returnType": "void", + "params": [ + { + "type": "BoundingBox", + "name": "box" + }, + { + "type": "Color", + "name": "color" + } + ] + }, + { + "name": "DrawBillboard", + "description": "Draw a billboard texture", + "returnType": "void", + "params": [ + { + "type": "Camera", + "name": "camera" + }, + { + "type": "Texture2D", + "name": "texture" + }, + { + "type": "Vector3", + "name": "position" + }, + { + "type": "float", + "name": "scale" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "DrawBillboardRec", + "description": "Draw a billboard texture defined by source", + "returnType": "void", + "params": [ + { + "type": "Camera", + "name": "camera" + }, + { + "type": "Texture2D", + "name": "texture" + }, + { + "type": "Rectangle", + "name": "source" + }, + { + "type": "Vector3", + "name": "position" + }, + { + "type": "Vector2", + "name": "size" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "DrawBillboardPro", + "description": "Draw a billboard texture defined by source and rotation", + "returnType": "void", + "params": [ + { + "type": "Camera", + "name": "camera" + }, + { + "type": "Texture2D", + "name": "texture" + }, + { + "type": "Rectangle", + "name": "source" + }, + { + "type": "Vector3", + "name": "position" + }, + { + "type": "Vector3", + "name": "up" + }, + { + "type": "Vector2", + "name": "size" + }, + { + "type": "Vector2", + "name": "origin" + }, + { + "type": "float", + "name": "rotation" + }, + { + "type": "Color", + "name": "tint" + } + ] + }, + { + "name": "UploadMesh", + "description": "Upload mesh vertex data in GPU and provide VAO/VBO ids", + "returnType": "void", + "params": [ + { + "type": "Mesh *", + "name": "mesh" + }, + { + "type": "bool", + "name": "dynamic" + } + ] + }, + { + "name": "UpdateMeshBuffer", + "description": "Update mesh vertex data in GPU for a specific buffer index", + "returnType": "void", + "params": [ + { + "type": "Mesh", + "name": "mesh" + }, + { + "type": "int", + "name": "index" + }, + { + "type": "const void *", + "name": "data" + }, + { + "type": "int", + "name": "dataSize" + }, + { + "type": "int", + "name": "offset" + } + ] + }, + { + "name": "UnloadMesh", + "description": "Unload mesh data from CPU and GPU", + "returnType": "void", + "params": [ + { + "type": "Mesh", + "name": "mesh" + } + ] + }, + { + "name": "DrawMesh", + "description": "Draw a 3d mesh with material and transform", + "returnType": "void", + "params": [ + { + "type": "Mesh", + "name": "mesh" + }, + { + "type": "Material", + "name": "material" + }, + { + "type": "Matrix", + "name": "transform" + } + ] + }, + { + "name": "DrawMeshInstanced", + "description": "Draw multiple mesh instances with material and different transforms", + "returnType": "void", + "params": [ + { + "type": "Mesh", + "name": "mesh" + }, + { + "type": "Material", + "name": "material" + }, + { + "type": "const Matrix *", + "name": "transforms" + }, + { + "type": "int", + "name": "instances" + } + ] + }, + { + "name": "GetMeshBoundingBox", + "description": "Compute mesh bounding box limits", + "returnType": "BoundingBox", + "params": [ + { + "type": "Mesh", + "name": "mesh" + } + ] + }, + { + "name": "GenMeshTangents", + "description": "Compute mesh tangents", + "returnType": "void", + "params": [ + { + "type": "Mesh *", + "name": "mesh" + } + ] + }, + { + "name": "ExportMesh", + "description": "Export mesh data to file, returns true on success", + "returnType": "bool", + "params": [ + { + "type": "Mesh", + "name": "mesh" + }, + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "ExportMeshAsCode", + "description": "Export mesh as code file (.h) defining multiple arrays of vertex attributes", + "returnType": "bool", + "params": [ + { + "type": "Mesh", + "name": "mesh" + }, + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "GenMeshPoly", + "description": "Generate polygonal mesh", + "returnType": "Mesh", + "params": [ + { + "type": "int", + "name": "sides" + }, + { + "type": "float", + "name": "radius" + } + ] + }, + { + "name": "GenMeshPlane", + "description": "Generate plane mesh (with subdivisions)", + "returnType": "Mesh", + "params": [ + { + "type": "float", + "name": "width" + }, + { + "type": "float", + "name": "length" + }, + { + "type": "int", + "name": "resX" + }, + { + "type": "int", + "name": "resZ" + } + ] + }, + { + "name": "GenMeshCube", + "description": "Generate cuboid mesh", + "returnType": "Mesh", + "params": [ + { + "type": "float", + "name": "width" + }, + { + "type": "float", + "name": "height" + }, + { + "type": "float", + "name": "length" + } + ] + }, + { + "name": "GenMeshSphere", + "description": "Generate sphere mesh (standard sphere)", + "returnType": "Mesh", + "params": [ + { + "type": "float", + "name": "radius" + }, + { + "type": "int", + "name": "rings" + }, + { + "type": "int", + "name": "slices" + } + ] + }, + { + "name": "GenMeshHemiSphere", + "description": "Generate half-sphere mesh (no bottom cap)", + "returnType": "Mesh", + "params": [ + { + "type": "float", + "name": "radius" + }, + { + "type": "int", + "name": "rings" + }, + { + "type": "int", + "name": "slices" + } + ] + }, + { + "name": "GenMeshCylinder", + "description": "Generate cylinder mesh", + "returnType": "Mesh", + "params": [ + { + "type": "float", + "name": "radius" + }, + { + "type": "float", + "name": "height" + }, + { + "type": "int", + "name": "slices" + } + ] + }, + { + "name": "GenMeshCone", + "description": "Generate cone/pyramid mesh", + "returnType": "Mesh", + "params": [ + { + "type": "float", + "name": "radius" + }, + { + "type": "float", + "name": "height" + }, + { + "type": "int", + "name": "slices" + } + ] + }, + { + "name": "GenMeshTorus", + "description": "Generate torus mesh", + "returnType": "Mesh", + "params": [ + { + "type": "float", + "name": "radius" + }, + { + "type": "float", + "name": "size" + }, + { + "type": "int", + "name": "radSeg" + }, + { + "type": "int", + "name": "sides" + } + ] + }, + { + "name": "GenMeshKnot", + "description": "Generate trefoil knot mesh", + "returnType": "Mesh", + "params": [ + { + "type": "float", + "name": "radius" + }, + { + "type": "float", + "name": "size" + }, + { + "type": "int", + "name": "radSeg" + }, + { + "type": "int", + "name": "sides" + } + ] + }, + { + "name": "GenMeshHeightmap", + "description": "Generate heightmap mesh from image data", + "returnType": "Mesh", + "params": [ + { + "type": "Image", + "name": "heightmap" + }, + { + "type": "Vector3", + "name": "size" + } + ] + }, + { + "name": "GenMeshCubicmap", + "description": "Generate cubes-based map mesh from image data", + "returnType": "Mesh", + "params": [ + { + "type": "Image", + "name": "cubicmap" + }, + { + "type": "Vector3", + "name": "cubeSize" + } + ] + }, + { + "name": "LoadMaterials", + "description": "Load materials from model file", + "returnType": "Material *", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "int *", + "name": "materialCount" + } + ] + }, + { + "name": "LoadMaterialDefault", + "description": "Load default material (Supports: DIFFUSE, SPECULAR, NORMAL maps)", + "returnType": "Material" + }, + { + "name": "IsMaterialValid", + "description": "Check if a material is valid (shader assigned, map textures loaded in GPU)", + "returnType": "bool", + "params": [ + { + "type": "Material", + "name": "material" + } + ] + }, + { + "name": "UnloadMaterial", + "description": "Unload material from GPU memory (VRAM)", + "returnType": "void", + "params": [ + { + "type": "Material", + "name": "material" + } + ] + }, + { + "name": "SetMaterialTexture", + "description": "Set texture for a material map type (MATERIAL_MAP_DIFFUSE, MATERIAL_MAP_SPECULAR...)", + "returnType": "void", + "params": [ + { + "type": "Material *", + "name": "material" + }, + { + "type": "int", + "name": "mapType" + }, + { + "type": "Texture2D", + "name": "texture" + } + ] + }, + { + "name": "SetModelMeshMaterial", + "description": "Set material for a mesh", + "returnType": "void", + "params": [ + { + "type": "Model *", + "name": "model" + }, + { + "type": "int", + "name": "meshId" + }, + { + "type": "int", + "name": "materialId" + } + ] + }, + { + "name": "LoadModelAnimations", + "description": "Load model animations from file", + "returnType": "ModelAnimation *", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "int *", + "name": "animCount" + } + ] + }, + { + "name": "UpdateModelAnimation", + "description": "Update model animation pose (CPU)", + "returnType": "void", + "params": [ + { + "type": "Model", + "name": "model" + }, + { + "type": "ModelAnimation", + "name": "anim" + }, + { + "type": "int", + "name": "frame" + } + ] + }, + { + "name": "UpdateModelAnimationBones", + "description": "Update model animation mesh bone matrices (GPU skinning)", + "returnType": "void", + "params": [ + { + "type": "Model", + "name": "model" + }, + { + "type": "ModelAnimation", + "name": "anim" + }, + { + "type": "int", + "name": "frame" + } + ] + }, + { + "name": "UnloadModelAnimation", + "description": "Unload animation data", + "returnType": "void", + "params": [ + { + "type": "ModelAnimation", + "name": "anim" + } + ] + }, + { + "name": "UnloadModelAnimations", + "description": "Unload animation array data", + "returnType": "void", + "params": [ + { + "type": "ModelAnimation *", + "name": "animations" + }, + { + "type": "int", + "name": "animCount" + } + ] + }, + { + "name": "IsModelAnimationValid", + "description": "Check model animation skeleton match", + "returnType": "bool", + "params": [ + { + "type": "Model", + "name": "model" + }, + { + "type": "ModelAnimation", + "name": "anim" + } + ] + }, + { + "name": "CheckCollisionSpheres", + "description": "Check collision between two spheres", + "returnType": "bool", + "params": [ + { + "type": "Vector3", + "name": "center1" + }, + { + "type": "float", + "name": "radius1" + }, + { + "type": "Vector3", + "name": "center2" + }, + { + "type": "float", + "name": "radius2" + } + ] + }, + { + "name": "CheckCollisionBoxes", + "description": "Check collision between two bounding boxes", + "returnType": "bool", + "params": [ + { + "type": "BoundingBox", + "name": "box1" + }, + { + "type": "BoundingBox", + "name": "box2" + } + ] + }, + { + "name": "CheckCollisionBoxSphere", + "description": "Check collision between box and sphere", + "returnType": "bool", + "params": [ + { + "type": "BoundingBox", + "name": "box" + }, + { + "type": "Vector3", + "name": "center" + }, + { + "type": "float", + "name": "radius" + } + ] + }, + { + "name": "GetRayCollisionSphere", + "description": "Get collision info between ray and sphere", + "returnType": "RayCollision", + "params": [ + { + "type": "Ray", + "name": "ray" + }, + { + "type": "Vector3", + "name": "center" + }, + { + "type": "float", + "name": "radius" + } + ] + }, + { + "name": "GetRayCollisionBox", + "description": "Get collision info between ray and box", + "returnType": "RayCollision", + "params": [ + { + "type": "Ray", + "name": "ray" + }, + { + "type": "BoundingBox", + "name": "box" + } + ] + }, + { + "name": "GetRayCollisionMesh", + "description": "Get collision info between ray and mesh", + "returnType": "RayCollision", + "params": [ + { + "type": "Ray", + "name": "ray" + }, + { + "type": "Mesh", + "name": "mesh" + }, + { + "type": "Matrix", + "name": "transform" + } + ] + }, + { + "name": "GetRayCollisionTriangle", + "description": "Get collision info between ray and triangle", + "returnType": "RayCollision", + "params": [ + { + "type": "Ray", + "name": "ray" + }, + { + "type": "Vector3", + "name": "p1" + }, + { + "type": "Vector3", + "name": "p2" + }, + { + "type": "Vector3", + "name": "p3" + } + ] + }, + { + "name": "GetRayCollisionQuad", + "description": "Get collision info between ray and quad", + "returnType": "RayCollision", + "params": [ + { + "type": "Ray", + "name": "ray" + }, + { + "type": "Vector3", + "name": "p1" + }, + { + "type": "Vector3", + "name": "p2" + }, + { + "type": "Vector3", + "name": "p3" + }, + { + "type": "Vector3", + "name": "p4" + } + ] + }, + { + "name": "InitAudioDevice", + "description": "Initialize audio device and context", + "returnType": "void" + }, + { + "name": "CloseAudioDevice", + "description": "Close the audio device and context", + "returnType": "void" + }, + { + "name": "IsAudioDeviceReady", + "description": "Check if audio device has been initialized successfully", + "returnType": "bool" + }, + { + "name": "SetMasterVolume", + "description": "Set master volume (listener)", + "returnType": "void", + "params": [ + { + "type": "float", + "name": "volume" + } + ] + }, + { + "name": "GetMasterVolume", + "description": "Get master volume (listener)", + "returnType": "float" + }, + { + "name": "LoadWave", + "description": "Load wave data from file", + "returnType": "Wave", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "LoadWaveFromMemory", + "description": "Load wave from memory buffer, fileType refers to extension: i.e. '.wav'", + "returnType": "Wave", + "params": [ + { + "type": "const char *", + "name": "fileType" + }, + { + "type": "const unsigned char *", + "name": "fileData" + }, + { + "type": "int", + "name": "dataSize" + } + ] + }, + { + "name": "IsWaveValid", + "description": "Checks if wave data is valid (data loaded and parameters)", + "returnType": "bool", + "params": [ + { + "type": "Wave", + "name": "wave" + } + ] + }, + { + "name": "LoadSound", + "description": "Load sound from file", + "returnType": "Sound", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "LoadSoundFromWave", + "description": "Load sound from wave data", + "returnType": "Sound", + "params": [ + { + "type": "Wave", + "name": "wave" + } + ] + }, + { + "name": "LoadSoundAlias", + "description": "Create a new sound that shares the same sample data as the source sound, does not own the sound data", + "returnType": "Sound", + "params": [ + { + "type": "Sound", + "name": "source" + } + ] + }, + { + "name": "IsSoundValid", + "description": "Checks if a sound is valid (data loaded and buffers initialized)", + "returnType": "bool", + "params": [ + { + "type": "Sound", + "name": "sound" + } + ] + }, + { + "name": "UpdateSound", + "description": "Update sound buffer with new data (default data format: 32 bit float, stereo)", + "returnType": "void", + "params": [ + { + "type": "Sound", + "name": "sound" + }, + { + "type": "const void *", + "name": "data" + }, + { + "type": "int", + "name": "sampleCount" + } + ] + }, + { + "name": "UnloadWave", + "description": "Unload wave data", + "returnType": "void", + "params": [ + { + "type": "Wave", + "name": "wave" + } + ] + }, + { + "name": "UnloadSound", + "description": "Unload sound", + "returnType": "void", + "params": [ + { + "type": "Sound", + "name": "sound" + } + ] + }, + { + "name": "UnloadSoundAlias", + "description": "Unload a sound alias (does not deallocate sample data)", + "returnType": "void", + "params": [ + { + "type": "Sound", + "name": "alias" + } + ] + }, + { + "name": "ExportWave", + "description": "Export wave data to file, returns true on success", + "returnType": "bool", + "params": [ + { + "type": "Wave", + "name": "wave" + }, + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "ExportWaveAsCode", + "description": "Export wave sample data to code (.h), returns true on success", + "returnType": "bool", + "params": [ + { + "type": "Wave", + "name": "wave" + }, + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "PlaySound", + "description": "Play a sound", + "returnType": "void", + "params": [ + { + "type": "Sound", + "name": "sound" + } + ] + }, + { + "name": "StopSound", + "description": "Stop playing a sound", + "returnType": "void", + "params": [ + { + "type": "Sound", + "name": "sound" + } + ] + }, + { + "name": "PauseSound", + "description": "Pause a sound", + "returnType": "void", + "params": [ + { + "type": "Sound", + "name": "sound" + } + ] + }, + { + "name": "ResumeSound", + "description": "Resume a paused sound", + "returnType": "void", + "params": [ + { + "type": "Sound", + "name": "sound" + } + ] + }, + { + "name": "IsSoundPlaying", + "description": "Check if a sound is currently playing", + "returnType": "bool", + "params": [ + { + "type": "Sound", + "name": "sound" + } + ] + }, + { + "name": "SetSoundVolume", + "description": "Set volume for a sound (1.0 is max level)", + "returnType": "void", + "params": [ + { + "type": "Sound", + "name": "sound" + }, + { + "type": "float", + "name": "volume" + } + ] + }, + { + "name": "SetSoundPitch", + "description": "Set pitch for a sound (1.0 is base level)", + "returnType": "void", + "params": [ + { + "type": "Sound", + "name": "sound" + }, + { + "type": "float", + "name": "pitch" + } + ] + }, + { + "name": "SetSoundPan", + "description": "Set pan for a sound (-1.0 left, 0.0 center, 1.0 right)", + "returnType": "void", + "params": [ + { + "type": "Sound", + "name": "sound" + }, + { + "type": "float", + "name": "pan" + } + ] + }, + { + "name": "WaveCopy", + "description": "Copy a wave to a new wave", + "returnType": "Wave", + "params": [ + { + "type": "Wave", + "name": "wave" + } + ] + }, + { + "name": "WaveCrop", + "description": "Crop a wave to defined frames range", + "returnType": "void", + "params": [ + { + "type": "Wave *", + "name": "wave" + }, + { + "type": "int", + "name": "initFrame" + }, + { + "type": "int", + "name": "finalFrame" + } + ] + }, + { + "name": "WaveFormat", + "description": "Convert wave data to desired format", + "returnType": "void", + "params": [ + { + "type": "Wave *", + "name": "wave" + }, + { + "type": "int", + "name": "sampleRate" + }, + { + "type": "int", + "name": "sampleSize" + }, + { + "type": "int", + "name": "channels" + } + ] + }, + { + "name": "LoadWaveSamples", + "description": "Load samples data from wave as a 32bit float data array", + "returnType": "float *", + "params": [ + { + "type": "Wave", + "name": "wave" + } + ] + }, + { + "name": "UnloadWaveSamples", + "description": "Unload samples data loaded with LoadWaveSamples()", + "returnType": "void", + "params": [ + { + "type": "float *", + "name": "samples" + } + ] + }, + { + "name": "LoadMusicStream", + "description": "Load music stream from file", + "returnType": "Music", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "LoadMusicStreamFromMemory", + "description": "Load music stream from data", + "returnType": "Music", + "params": [ + { + "type": "const char *", + "name": "fileType" + }, + { + "type": "const unsigned char *", + "name": "data" + }, + { + "type": "int", + "name": "dataSize" + } + ] + }, + { + "name": "IsMusicValid", + "description": "Checks if a music stream is valid (context and buffers initialized)", + "returnType": "bool", + "params": [ + { + "type": "Music", + "name": "music" + } + ] + }, + { + "name": "UnloadMusicStream", + "description": "Unload music stream", + "returnType": "void", + "params": [ + { + "type": "Music", + "name": "music" + } + ] + }, + { + "name": "PlayMusicStream", + "description": "Start music playing", + "returnType": "void", + "params": [ + { + "type": "Music", + "name": "music" + } + ] + }, + { + "name": "IsMusicStreamPlaying", + "description": "Check if music is playing", + "returnType": "bool", + "params": [ + { + "type": "Music", + "name": "music" + } + ] + }, + { + "name": "UpdateMusicStream", + "description": "Updates buffers for music streaming", + "returnType": "void", + "params": [ + { + "type": "Music", + "name": "music" + } + ] + }, + { + "name": "StopMusicStream", + "description": "Stop music playing", + "returnType": "void", + "params": [ + { + "type": "Music", + "name": "music" + } + ] + }, + { + "name": "PauseMusicStream", + "description": "Pause music playing", + "returnType": "void", + "params": [ + { + "type": "Music", + "name": "music" + } + ] + }, + { + "name": "ResumeMusicStream", + "description": "Resume playing paused music", + "returnType": "void", + "params": [ + { + "type": "Music", + "name": "music" + } + ] + }, + { + "name": "SeekMusicStream", + "description": "Seek music to a position (in seconds)", + "returnType": "void", + "params": [ + { + "type": "Music", + "name": "music" + }, + { + "type": "float", + "name": "position" + } + ] + }, + { + "name": "SetMusicVolume", + "description": "Set volume for music (1.0 is max level)", + "returnType": "void", + "params": [ + { + "type": "Music", + "name": "music" + }, + { + "type": "float", + "name": "volume" + } + ] + }, + { + "name": "SetMusicPitch", + "description": "Set pitch for a music (1.0 is base level)", + "returnType": "void", + "params": [ + { + "type": "Music", + "name": "music" + }, + { + "type": "float", + "name": "pitch" + } + ] + }, + { + "name": "SetMusicPan", + "description": "Set pan for a music (-1.0 left, 0.0 center, 1.0 right)", + "returnType": "void", + "params": [ + { + "type": "Music", + "name": "music" + }, + { + "type": "float", + "name": "pan" + } + ] + }, + { + "name": "GetMusicTimeLength", + "description": "Get music time length (in seconds)", + "returnType": "float", + "params": [ + { + "type": "Music", + "name": "music" + } + ] + }, + { + "name": "GetMusicTimePlayed", + "description": "Get current music time played (in seconds)", + "returnType": "float", + "params": [ + { + "type": "Music", + "name": "music" + } + ] + }, + { + "name": "LoadAudioStream", + "description": "Load audio stream (to stream raw audio pcm data)", + "returnType": "AudioStream", + "params": [ + { + "type": "unsigned int", + "name": "sampleRate" + }, + { + "type": "unsigned int", + "name": "sampleSize" + }, + { + "type": "unsigned int", + "name": "channels" + } + ] + }, + { + "name": "IsAudioStreamValid", + "description": "Checks if an audio stream is valid (buffers initialized)", + "returnType": "bool", + "params": [ + { + "type": "AudioStream", + "name": "stream" + } + ] + }, + { + "name": "UnloadAudioStream", + "description": "Unload audio stream and free memory", + "returnType": "void", + "params": [ + { + "type": "AudioStream", + "name": "stream" + } + ] + }, + { + "name": "UpdateAudioStream", + "description": "Update audio stream buffers with data", + "returnType": "void", + "params": [ + { + "type": "AudioStream", + "name": "stream" + }, + { + "type": "const void *", + "name": "data" + }, + { + "type": "int", + "name": "frameCount" + } + ] + }, + { + "name": "IsAudioStreamProcessed", + "description": "Check if any audio stream buffers requires refill", + "returnType": "bool", + "params": [ + { + "type": "AudioStream", + "name": "stream" + } + ] + }, + { + "name": "PlayAudioStream", + "description": "Play audio stream", + "returnType": "void", + "params": [ + { + "type": "AudioStream", + "name": "stream" + } + ] + }, + { + "name": "PauseAudioStream", + "description": "Pause audio stream", + "returnType": "void", + "params": [ + { + "type": "AudioStream", + "name": "stream" + } + ] + }, + { + "name": "ResumeAudioStream", + "description": "Resume audio stream", + "returnType": "void", + "params": [ + { + "type": "AudioStream", + "name": "stream" + } + ] + }, + { + "name": "IsAudioStreamPlaying", + "description": "Check if audio stream is playing", + "returnType": "bool", + "params": [ + { + "type": "AudioStream", + "name": "stream" + } + ] + }, + { + "name": "StopAudioStream", + "description": "Stop audio stream", + "returnType": "void", + "params": [ + { + "type": "AudioStream", + "name": "stream" + } + ] + }, + { + "name": "SetAudioStreamVolume", + "description": "Set volume for audio stream (1.0 is max level)", + "returnType": "void", + "params": [ + { + "type": "AudioStream", + "name": "stream" + }, + { + "type": "float", + "name": "volume" + } + ] + }, + { + "name": "SetAudioStreamPitch", + "description": "Set pitch for audio stream (1.0 is base level)", + "returnType": "void", + "params": [ + { + "type": "AudioStream", + "name": "stream" + }, + { + "type": "float", + "name": "pitch" + } + ] + }, + { + "name": "SetAudioStreamPan", + "description": "Set pan for audio stream (0.5 is centered)", + "returnType": "void", + "params": [ + { + "type": "AudioStream", + "name": "stream" + }, + { + "type": "float", + "name": "pan" + } + ] + }, + { + "name": "SetAudioStreamBufferSizeDefault", + "description": "Default size for new audio streams", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "size" + } + ] + }, + { + "name": "SetAudioStreamCallback", + "description": "Audio thread callback to request new data", + "returnType": "void", + "params": [ + { + "type": "AudioStream", + "name": "stream" + }, + { + "type": "AudioCallback", + "name": "callback" + } + ] + }, + { + "name": "AttachAudioStreamProcessor", + "description": "Attach audio stream processor to stream, receives frames x 2 samples as 'float' (stereo)", + "returnType": "void", + "params": [ + { + "type": "AudioStream", + "name": "stream" + }, + { + "type": "AudioCallback", + "name": "processor" + } + ] + }, + { + "name": "DetachAudioStreamProcessor", + "description": "Detach audio stream processor from stream", + "returnType": "void", + "params": [ + { + "type": "AudioStream", + "name": "stream" + }, + { + "type": "AudioCallback", + "name": "processor" + } + ] + }, + { + "name": "AttachAudioMixedProcessor", + "description": "Attach audio stream processor to the entire audio pipeline, receives frames x 2 samples as 'float' (stereo)", + "returnType": "void", + "params": [ + { + "type": "AudioCallback", + "name": "processor" + } + ] + }, + { + "name": "DetachAudioMixedProcessor", + "description": "Detach audio stream processor from the entire audio pipeline", + "returnType": "void", + "params": [ + { + "type": "AudioCallback", + "name": "processor" + } + ] + } + ] +} diff --git a/wasm-runtime/api/stringyvalue.go b/wasm-runtime/api/stringyvalue.go new file mode 100644 index 0000000..4176fec --- /dev/null +++ b/wasm-runtime/api/stringyvalue.go @@ -0,0 +1,28 @@ +package api + +import "encoding/json" + +type StringyValue string + +// convert the json type to a string. +func (s *StringyValue) UnmarshalJSON(b []byte) error { + // null + if string(b) == "null" { + *s = "" + return nil + } + + // quoted string + if len(b) > 0 && b[0] == '"' { + var v string + if err := json.Unmarshal(b, &v); err != nil { + return err + } + *s = StringyValue(v) + return nil + } + + // number / bare token → keep textual form + *s = StringyValue(b) + return nil +} diff --git a/wasm-runtime/codegen.go b/wasm-runtime/codegen.go new file mode 100644 index 0000000..7891585 --- /dev/null +++ b/wasm-runtime/codegen.go @@ -0,0 +1,70 @@ +package main + +import ( + "codegen/api" + "codegen/templates" + _ "embed" + "slices" + "text/template" +) + +//go:embed templates/structs.go.gotmpl +var structsTempl string + +//go:embed templates/defines.go.gotmpl +var definesTempl string + +//go:embed templates/enums.go.gotmpl +var enumsTempl string + +//go:embed templates/aliases.go.gotmpl +var aliasesTempl string + +//go:embed templates/funcimport.go.gotmpl +var funcImportTempl string + +type Model struct { + BuildTags string + Imports []string + Structs []api.RlStruct + Defines []api.RlDefine + Enums []api.RlEnum + Aliases []api.RlAlias + // go:wasmimport based function imports + FuncImports []FuncDef +} + +func main() { + m := Model{ + BuildTags: "js", + Imports: []string{}, + Structs: slices.Clone(api.Api.Structs), + // C #define macros need special parsing. And Names need to be PascalCase. + Defines: slices.Clone(api.Api.Defines), + Enums: slices.Clone(api.Api.Enums), + Aliases: slices.Clone(api.Api.Aliases), + FuncImports: slices.Clone(api.Api.Functions), + } + RegisterPascalCaseAcronym("DARKGREEN", "DarkGreen") + ParseDefines(m.Defines) + // convert C types to Go and use PascalCase for field names. + for _, s := range m.Structs { + ProcessStructFields(s.Fields) + } + for i, f := range m.FuncImports { + m.FuncImports[i] = TransformIntoWasmImport(f) + } + + // Use PascalCase for enum names. + PascalCaseEnums(m.Enums) + funcs := template.FuncMap{ + "eq": func(a, b any) bool { return a == b }, + "contains": func(a any, b ...any) bool { return slices.Contains(b, a) }, + } + templates.GenerateCodeFormatted(m, structsTempl, "structs", nil) + templates.GenerateCodeFormatted(m, enumsTempl, "enums", nil) + templates.GenerateCodeFormatted(m, definesTempl, "defines", funcs) + templates.GenerateCodeFormatted(m, aliasesTempl, "aliases", funcs) + templates.GenerateCodeFormatted(m, aliasesTempl, "aliases", funcs) + templates.GenerateCode(m, funcImportTempl, "funcimport", funcs) +} diff --git a/wasm-runtime/funcimport.go b/wasm-runtime/funcimport.go new file mode 100644 index 0000000..ce7a91b --- /dev/null +++ b/wasm-runtime/funcimport.go @@ -0,0 +1,58 @@ +package main + +import ( + "codegen/api" + "fmt" + "slices" + "strings" +) + +// FuncImport defines a go:wasmimport function import +type FuncDef = api.RlFunction /* + Name string + Description string + ReturnType string + Params []FuncArg +*/ +type FuncParam = api.RlParam /* + Type string + Name string +*/ + +// Takes in a raw C function definition from raylib's json. +// and produces a //go:wasmimport _raylib +// func (args) +func TransformIntoWasmImport(f FuncDef) FuncDef { + importStatement := fmt.Sprintf("//go:wasmimport _raylib _%s\n", f.Name) + + var comment strings.Builder + comment.WriteString(importStatement) + comment.WriteString("//go:noescape") + + for i, p := range f.Params { + p.Name = firstLetterUpper(p.Name) + // if the type does not map one to one, then it's a cptr. + p.Type = mapGoTypeOneToOne(p.Type) + f.Params[i] = p + } + if f.ReturnType != "void" { + p := FuncParam{Name: "ret", Type: mapGoTypeOneToOne(f.ReturnType)} + f.Params = slices.Concat([]FuncParam{p}, f.Params) + } + final := FuncDef{ + Name: firstLetterLower(f.Name), + Description: comment.String(), + ReturnType: f.ReturnType, + Params: f.Params, + } + return final +} + +// If the C type maps directly to a Go type. Return that, otherwise return cptr. +func mapGoTypeOneToOne(t string) string { + if t, isOneToOne := oneToOneTypes[t]; !isOneToOne { + return "cptr" + } else { + return t + } +} diff --git a/wasm-runtime/go.mod b/wasm-runtime/go.mod new file mode 100644 index 0000000..ce211ca --- /dev/null +++ b/wasm-runtime/go.mod @@ -0,0 +1,5 @@ +module codegen + +go 1.25.6 + +require github.com/iancoleman/strcase v0.3.0 // indirect diff --git a/wasm-runtime/go.sum b/wasm-runtime/go.sum new file mode 100644 index 0000000..6261b6a --- /dev/null +++ b/wasm-runtime/go.sum @@ -0,0 +1,2 @@ +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= diff --git a/wasm-runtime/rl/.gitkeep b/wasm-runtime/rl/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/wasm-runtime/rl/aliases_gen_formatted.go b/wasm-runtime/rl/aliases_gen_formatted.go new file mode 100644 index 0000000..85f4693 --- /dev/null +++ b/wasm-runtime/rl/aliases_gen_formatted.go @@ -0,0 +1,20 @@ +// AUTOGENERATED FILE. DO NOT EDIT + +//go:build js + +package rl + +// Quaternion, 4 components (Vector4 alias) +type Quaternion = Vector4 + +// Texture2D, same as Texture +type Texture2D = Texture + +// TextureCubemap, same as Texture +type TextureCubemap = Texture + +// RenderTexture2D, same as RenderTexture +type RenderTexture2D = RenderTexture + +// Camera type fallback, defaults to Camera3D +type Camera = Camera3D diff --git a/wasm-runtime/rl/defines_gen_formatted.go b/wasm-runtime/rl/defines_gen_formatted.go new file mode 100644 index 0000000..5005057 --- /dev/null +++ b/wasm-runtime/rl/defines_gen_formatted.go @@ -0,0 +1,121 @@ +// AUTOGENERATED FILE. DO NOT EDIT + +//go:build js + +package rl + +const RaylibVersionMajor = 5 + +const RaylibVersionMinor = 6 + +const RaylibVersionPatch = 0 + +const RaylibVersion = "5.6-dev" + +const Pi = 3.14159265358979323846 + +const Deg2Rad = (Pi / 180.0) + +const Rad2Deg = (180.0 / Pi) + +//Light Gray +var Lightgray = Color{200, 200, 200, 255} + +//Gray +var Gray = Color{130, 130, 130, 255} + +//Dark Gray +var Darkgray = Color{80, 80, 80, 255} + +//Yellow +var Yellow = Color{253, 249, 0, 255} + +//Gold +var Gold = Color{255, 203, 0, 255} + +//Orange +var Orange = Color{255, 161, 0, 255} + +//Pink +var Pink = Color{255, 109, 194, 255} + +//Red +var Red = Color{230, 41, 55, 255} + +//Maroon +var Maroon = Color{190, 33, 55, 255} + +//Green +var Green = Color{0, 228, 48, 255} + +//Lime +var Lime = Color{0, 158, 47, 255} + +//Dark Green +var DarkGreen = Color{0, 117, 44, 255} + +//Sky Blue +var Skyblue = Color{102, 191, 255, 255} + +//Blue +var Blue = Color{0, 121, 241, 255} + +//Dark Blue +var Darkblue = Color{0, 82, 172, 255} + +//Purple +var Purple = Color{200, 122, 255, 255} + +//Violet +var Violet = Color{135, 60, 190, 255} + +//Dark Purple +var Darkpurple = Color{112, 31, 126, 255} + +//Beige +var Beige = Color{211, 176, 131, 255} + +//Brown +var Brown = Color{127, 106, 79, 255} + +//Dark Brown +var Darkbrown = Color{76, 63, 47, 255} + +//White +var White = Color{255, 255, 255, 255} + +//Black +var Black = Color{0, 0, 0, 255} + +//Blank (Transparent) +var Blank = Color{0, 0, 0, 0} + +//Magenta +var Magenta = Color{255, 0, 255, 255} + +//My own White (raylib logo) +var Raywhite = Color{245, 245, 245, 255} + +// +const MouseLeftButton = MouseButtonLeft + +// +const MouseRightButton = MouseButtonRight + +// +const MouseMiddleButton = MouseButtonMiddle + +// +const MaterialMapDiffuse = MaterialMapAlbedo + +// +const MaterialMapSpecular = MaterialMapMetalness + +// +const ShaderLocMapDiffuse = ShaderLocMapAlbedo + +// +const ShaderLocMapSpecular = ShaderLocMapMetalness + +//Compatibility hack for previous raylib versions +var GetMouseRay = GetScreenToWorldRay diff --git a/wasm-runtime/rl/enums_gen_formatted.go b/wasm-runtime/rl/enums_gen_formatted.go new file mode 100644 index 0000000..303b8d2 --- /dev/null +++ b/wasm-runtime/rl/enums_gen_formatted.go @@ -0,0 +1,741 @@ +// AUTOGENERATED FILE. DO NOT EDIT + +//go:build js + +package rl + +// System/Window config flags +type ConfigFlags = int32 + +const ( + // Set to try enabling V-Sync on GPU + FlagVsyncHint = 64 + // Set to run program in fullscreen + FlagFullscreenMode = 2 + // Set to allow resizable window + FlagWindowResizable = 4 + // Set to disable window decoration (frame and buttons) + FlagWindowUndecorated = 8 + // Set to hide window + FlagWindowHidden = 128 + // Set to minimize window (iconify) + FlagWindowMinimized = 512 + // Set to maximize window (expanded to monitor) + FlagWindowMaximized = 1024 + // Set to window non focused + FlagWindowUnfocused = 2048 + // Set to window always on top + FlagWindowTopmost = 4096 + // Set to allow windows running while minimized + FlagWindowAlwaysRun = 256 + // Set to allow transparent framebuffer + FlagWindowTransparent = 16 + // Set to support HighDPI + FlagWindowHighdpi = 8192 + // Set to support mouse passthrough, only supported when FLAG_WINDOW_UNDECORATED + FlagWindowMousePassthrough = 16384 + // Set to run program in borderless windowed mode + FlagBorderlessWindowedMode = 32768 + // Set to try enabling MSAA 4X + FlagMsaa4XHint = 32 + // Set to try enabling interlaced video format (for V3D) + FlagInterlacedHint = 65536 +) + +// Trace log level +type TraceLogLevel = int32 + +const ( + // Display all logs + LogAll = 0 + // Trace logging, intended for internal use only + LogTrace = 1 + // Debug logging, used for internal debugging, it should be disabled on release builds + LogDebug = 2 + // Info logging, used for program execution info + LogInfo = 3 + // Warning logging, used on recoverable failures + LogWarning = 4 + // Error logging, used on unrecoverable failures + LogError = 5 + // Fatal logging, used to abort program: exit(EXIT_FAILURE) + LogFatal = 6 + // Disable logging + LogNone = 7 +) + +// Keyboard keys (US keyboard layout) +type KeyboardKey = int32 + +const ( + // Key: NULL, used for no key pressed + KeyNull = 0 + // Key: ' + KeyApostrophe = 39 + // Key: , + KeyComma = 44 + // Key: - + KeyMinus = 45 + // Key: . + KeyPeriod = 46 + // Key: / + KeySlash = 47 + // Key: 0 + KeyZero = 48 + // Key: 1 + KeyOne = 49 + // Key: 2 + KeyTwo = 50 + // Key: 3 + KeyThree = 51 + // Key: 4 + KeyFour = 52 + // Key: 5 + KeyFive = 53 + // Key: 6 + KeySix = 54 + // Key: 7 + KeySeven = 55 + // Key: 8 + KeyEight = 56 + // Key: 9 + KeyNine = 57 + // Key: ; + KeySemicolon = 59 + // Key: = + KeyEqual = 61 + // Key: A | a + KeyA = 65 + // Key: B | b + KeyB = 66 + // Key: C | c + KeyC = 67 + // Key: D | d + KeyD = 68 + // Key: E | e + KeyE = 69 + // Key: F | f + KeyF = 70 + // Key: G | g + KeyG = 71 + // Key: H | h + KeyH = 72 + // Key: I | i + KeyI = 73 + // Key: J | j + KeyJ = 74 + // Key: K | k + KeyK = 75 + // Key: L | l + KeyL = 76 + // Key: M | m + KeyM = 77 + // Key: N | n + KeyN = 78 + // Key: O | o + KeyO = 79 + // Key: P | p + KeyP = 80 + // Key: Q | q + KeyQ = 81 + // Key: R | r + KeyR = 82 + // Key: S | s + KeyS = 83 + // Key: T | t + KeyT = 84 + // Key: U | u + KeyU = 85 + // Key: V | v + KeyV = 86 + // Key: W | w + KeyW = 87 + // Key: X | x + KeyX = 88 + // Key: Y | y + KeyY = 89 + // Key: Z | z + KeyZ = 90 + // Key: [ + KeyLeftBracket = 91 + // Key: '\' + KeyBackslash = 92 + // Key: ] + KeyRightBracket = 93 + // Key: ` + KeyGrave = 96 + // Key: Space + KeySpace = 32 + // Key: Esc + KeyEscape = 256 + // Key: Enter + KeyEnter = 257 + // Key: Tab + KeyTab = 258 + // Key: Backspace + KeyBackspace = 259 + // Key: Ins + KeyInsert = 260 + // Key: Del + KeyDelete = 261 + // Key: Cursor right + KeyRight = 262 + // Key: Cursor left + KeyLeft = 263 + // Key: Cursor down + KeyDown = 264 + // Key: Cursor up + KeyUp = 265 + // Key: Page up + KeyPageUp = 266 + // Key: Page down + KeyPageDown = 267 + // Key: Home + KeyHome = 268 + // Key: End + KeyEnd = 269 + // Key: Caps lock + KeyCapsLock = 280 + // Key: Scroll down + KeyScrollLock = 281 + // Key: Num lock + KeyNumLock = 282 + // Key: Print screen + KeyPrintScreen = 283 + // Key: Pause + KeyPause = 284 + // Key: F1 + KeyF1 = 290 + // Key: F2 + KeyF2 = 291 + // Key: F3 + KeyF3 = 292 + // Key: F4 + KeyF4 = 293 + // Key: F5 + KeyF5 = 294 + // Key: F6 + KeyF6 = 295 + // Key: F7 + KeyF7 = 296 + // Key: F8 + KeyF8 = 297 + // Key: F9 + KeyF9 = 298 + // Key: F10 + KeyF10 = 299 + // Key: F11 + KeyF11 = 300 + // Key: F12 + KeyF12 = 301 + // Key: Shift left + KeyLeftShift = 340 + // Key: Control left + KeyLeftControl = 341 + // Key: Alt left + KeyLeftAlt = 342 + // Key: Super left + KeyLeftSuper = 343 + // Key: Shift right + KeyRightShift = 344 + // Key: Control right + KeyRightControl = 345 + // Key: Alt right + KeyRightAlt = 346 + // Key: Super right + KeyRightSuper = 347 + // Key: KB menu + KeyKbMenu = 348 + // Key: Keypad 0 + KeyKp0 = 320 + // Key: Keypad 1 + KeyKp1 = 321 + // Key: Keypad 2 + KeyKp2 = 322 + // Key: Keypad 3 + KeyKp3 = 323 + // Key: Keypad 4 + KeyKp4 = 324 + // Key: Keypad 5 + KeyKp5 = 325 + // Key: Keypad 6 + KeyKp6 = 326 + // Key: Keypad 7 + KeyKp7 = 327 + // Key: Keypad 8 + KeyKp8 = 328 + // Key: Keypad 9 + KeyKp9 = 329 + // Key: Keypad . + KeyKpDecimal = 330 + // Key: Keypad / + KeyKpDivide = 331 + // Key: Keypad * + KeyKpMultiply = 332 + // Key: Keypad - + KeyKpSubtract = 333 + // Key: Keypad + + KeyKpAdd = 334 + // Key: Keypad Enter + KeyKpEnter = 335 + // Key: Keypad = + KeyKpEqual = 336 + // Key: Android back button + KeyBack = 4 + // Key: Android menu button + KeyMenu = 5 + // Key: Android volume up button + KeyVolumeUp = 24 + // Key: Android volume down button + KeyVolumeDown = 25 +) + +// Mouse buttons +type MouseButton = int32 + +const ( + // Mouse button left + MouseButtonLeft = 0 + // Mouse button right + MouseButtonRight = 1 + // Mouse button middle (pressed wheel) + MouseButtonMiddle = 2 + // Mouse button side (advanced mouse device) + MouseButtonSide = 3 + // Mouse button extra (advanced mouse device) + MouseButtonExtra = 4 + // Mouse button forward (advanced mouse device) + MouseButtonForward = 5 + // Mouse button back (advanced mouse device) + MouseButtonBack = 6 +) + +// Mouse cursor +type MouseCursor = int32 + +const ( + // Default pointer shape + MouseCursorDefault = 0 + // Arrow shape + MouseCursorArrow = 1 + // Text writing cursor shape + MouseCursorIbeam = 2 + // Cross shape + MouseCursorCrosshair = 3 + // Pointing hand cursor + MouseCursorPointingHand = 4 + // Horizontal resize/move arrow shape + MouseCursorResizeEw = 5 + // Vertical resize/move arrow shape + MouseCursorResizeNs = 6 + // Top-left to bottom-right diagonal resize/move arrow shape + MouseCursorResizeNwse = 7 + // The top-right to bottom-left diagonal resize/move arrow shape + MouseCursorResizeNesw = 8 + // The omnidirectional resize/move cursor shape + MouseCursorResizeAll = 9 + // The operation-not-allowed shape + MouseCursorNotAllowed = 10 +) + +// Gamepad buttons +type GamepadButton = int32 + +const ( + // Unknown button, just for error checking + GamepadButtonUnknown = 0 + // Gamepad left DPAD up button + GamepadButtonLeftFaceUp = 1 + // Gamepad left DPAD right button + GamepadButtonLeftFaceRight = 2 + // Gamepad left DPAD down button + GamepadButtonLeftFaceDown = 3 + // Gamepad left DPAD left button + GamepadButtonLeftFaceLeft = 4 + // Gamepad right button up (i.e. PS3: Triangle, Xbox: Y) + GamepadButtonRightFaceUp = 5 + // Gamepad right button right (i.e. PS3: Circle, Xbox: B) + GamepadButtonRightFaceRight = 6 + // Gamepad right button down (i.e. PS3: Cross, Xbox: A) + GamepadButtonRightFaceDown = 7 + // Gamepad right button left (i.e. PS3: Square, Xbox: X) + GamepadButtonRightFaceLeft = 8 + // Gamepad top/back trigger left (first), it could be a trailing button + GamepadButtonLeftTrigger1 = 9 + // Gamepad top/back trigger left (second), it could be a trailing button + GamepadButtonLeftTrigger2 = 10 + // Gamepad top/back trigger right (first), it could be a trailing button + GamepadButtonRightTrigger1 = 11 + // Gamepad top/back trigger right (second), it could be a trailing button + GamepadButtonRightTrigger2 = 12 + // Gamepad center buttons, left one (i.e. PS3: Select) + GamepadButtonMiddleLeft = 13 + // Gamepad center buttons, middle one (i.e. PS3: PS, Xbox: XBOX) + GamepadButtonMiddle = 14 + // Gamepad center buttons, right one (i.e. PS3: Start) + GamepadButtonMiddleRight = 15 + // Gamepad joystick pressed button left + GamepadButtonLeftThumb = 16 + // Gamepad joystick pressed button right + GamepadButtonRightThumb = 17 +) + +// Gamepad axes +type GamepadAxis = int32 + +const ( + // Gamepad left stick X axis + GamepadAxisLeftX = 0 + // Gamepad left stick Y axis + GamepadAxisLeftY = 1 + // Gamepad right stick X axis + GamepadAxisRightX = 2 + // Gamepad right stick Y axis + GamepadAxisRightY = 3 + // Gamepad back trigger left, pressure level: [1..-1] + GamepadAxisLeftTrigger = 4 + // Gamepad back trigger right, pressure level: [1..-1] + GamepadAxisRightTrigger = 5 +) + +// Material map index +type MaterialMapIndex = int32 + +const ( + // Albedo material (same as: MATERIAL_MAP_DIFFUSE) + MaterialMapAlbedo = 0 + // Metalness material (same as: MATERIAL_MAP_SPECULAR) + MaterialMapMetalness = 1 + // Normal material + MaterialMapNormal = 2 + // Roughness material + MaterialMapRoughness = 3 + // Ambient occlusion material + MaterialMapOcclusion = 4 + // Emission material + MaterialMapEmission = 5 + // Heightmap material + MaterialMapHeight = 6 + // Cubemap material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MaterialMapCubemap = 7 + // Irradiance material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MaterialMapIrradiance = 8 + // Prefilter material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MaterialMapPrefilter = 9 + // Brdf material + MaterialMapBrdf = 10 +) + +// Shader location index +type ShaderLocationIndex = int32 + +const ( + // Shader location: vertex attribute: position + ShaderLocVertexPosition = 0 + // Shader location: vertex attribute: texcoord01 + ShaderLocVertexTexcoord01 = 1 + // Shader location: vertex attribute: texcoord02 + ShaderLocVertexTexcoord02 = 2 + // Shader location: vertex attribute: normal + ShaderLocVertexNormal = 3 + // Shader location: vertex attribute: tangent + ShaderLocVertexTangent = 4 + // Shader location: vertex attribute: color + ShaderLocVertexColor = 5 + // Shader location: matrix uniform: model-view-projection + ShaderLocMatrixMvp = 6 + // Shader location: matrix uniform: view (camera transform) + ShaderLocMatrixView = 7 + // Shader location: matrix uniform: projection + ShaderLocMatrixProjection = 8 + // Shader location: matrix uniform: model (transform) + ShaderLocMatrixModel = 9 + // Shader location: matrix uniform: normal + ShaderLocMatrixNormal = 10 + // Shader location: vector uniform: view + ShaderLocVectorView = 11 + // Shader location: vector uniform: diffuse color + ShaderLocColorDiffuse = 12 + // Shader location: vector uniform: specular color + ShaderLocColorSpecular = 13 + // Shader location: vector uniform: ambient color + ShaderLocColorAmbient = 14 + // Shader location: sampler2d texture: albedo (same as: SHADER_LOC_MAP_DIFFUSE) + ShaderLocMapAlbedo = 15 + // Shader location: sampler2d texture: metalness (same as: SHADER_LOC_MAP_SPECULAR) + ShaderLocMapMetalness = 16 + // Shader location: sampler2d texture: normal + ShaderLocMapNormal = 17 + // Shader location: sampler2d texture: roughness + ShaderLocMapRoughness = 18 + // Shader location: sampler2d texture: occlusion + ShaderLocMapOcclusion = 19 + // Shader location: sampler2d texture: emission + ShaderLocMapEmission = 20 + // Shader location: sampler2d texture: height + ShaderLocMapHeight = 21 + // Shader location: samplerCube texture: cubemap + ShaderLocMapCubemap = 22 + // Shader location: samplerCube texture: irradiance + ShaderLocMapIrradiance = 23 + // Shader location: samplerCube texture: prefilter + ShaderLocMapPrefilter = 24 + // Shader location: sampler2d texture: brdf + ShaderLocMapBrdf = 25 + // Shader location: vertex attribute: boneIds + ShaderLocVertexBoneids = 26 + // Shader location: vertex attribute: boneWeights + ShaderLocVertexBoneweights = 27 + // Shader location: array of matrices uniform: boneMatrices + ShaderLocBoneMatrices = 28 + // Shader location: vertex attribute: instanceTransform + ShaderLocVertexInstanceTx = 29 +) + +// Shader uniform data type +type ShaderUniformDataType = int32 + +const ( + // Shader uniform type: float + ShaderUniformFloat = 0 + // Shader uniform type: vec2 (2 float) + ShaderUniformVec2 = 1 + // Shader uniform type: vec3 (3 float) + ShaderUniformVec3 = 2 + // Shader uniform type: vec4 (4 float) + ShaderUniformVec4 = 3 + // Shader uniform type: int + ShaderUniformInt = 4 + // Shader uniform type: ivec2 (2 int) + ShaderUniformIvec2 = 5 + // Shader uniform type: ivec3 (3 int) + ShaderUniformIvec3 = 6 + // Shader uniform type: ivec4 (4 int) + ShaderUniformIvec4 = 7 + // Shader uniform type: unsigned int + ShaderUniformUint = 8 + // Shader uniform type: uivec2 (2 unsigned int) + ShaderUniformUivec2 = 9 + // Shader uniform type: uivec3 (3 unsigned int) + ShaderUniformUivec3 = 10 + // Shader uniform type: uivec4 (4 unsigned int) + ShaderUniformUivec4 = 11 + // Shader uniform type: sampler2d + ShaderUniformSampler2D = 12 +) + +// Shader attribute data types +type ShaderAttributeDataType = int32 + +const ( + // Shader attribute type: float + ShaderAttribFloat = 0 + // Shader attribute type: vec2 (2 float) + ShaderAttribVec2 = 1 + // Shader attribute type: vec3 (3 float) + ShaderAttribVec3 = 2 + // Shader attribute type: vec4 (4 float) + ShaderAttribVec4 = 3 +) + +// Pixel formats +type PixelFormat = int32 + +const ( + // 8 bit per pixel (no alpha) + PixelformatUncompressedGrayscale = 1 + // 8*2 bpp (2 channels) + PixelformatUncompressedGrayAlpha = 2 + // 16 bpp + PixelformatUncompressedR5G6B5 = 3 + // 24 bpp + PixelformatUncompressedR8G8B8 = 4 + // 16 bpp (1 bit alpha) + PixelformatUncompressedR5G5B5A1 = 5 + // 16 bpp (4 bit alpha) + PixelformatUncompressedR4G4B4A4 = 6 + // 32 bpp + PixelformatUncompressedR8G8B8A8 = 7 + // 32 bpp (1 channel - float) + PixelformatUncompressedR32 = 8 + // 32*3 bpp (3 channels - float) + PixelformatUncompressedR32G32B32 = 9 + // 32*4 bpp (4 channels - float) + PixelformatUncompressedR32G32B32A32 = 10 + // 16 bpp (1 channel - half float) + PixelformatUncompressedR16 = 11 + // 16*3 bpp (3 channels - half float) + PixelformatUncompressedR16G16B16 = 12 + // 16*4 bpp (4 channels - half float) + PixelformatUncompressedR16G16B16A16 = 13 + // 4 bpp (no alpha) + PixelformatCompressedDxt1Rgb = 14 + // 4 bpp (1 bit alpha) + PixelformatCompressedDxt1Rgba = 15 + // 8 bpp + PixelformatCompressedDxt3Rgba = 16 + // 8 bpp + PixelformatCompressedDxt5Rgba = 17 + // 4 bpp + PixelformatCompressedEtc1Rgb = 18 + // 4 bpp + PixelformatCompressedEtc2Rgb = 19 + // 8 bpp + PixelformatCompressedEtc2EacRgba = 20 + // 4 bpp + PixelformatCompressedPvrtRgb = 21 + // 4 bpp + PixelformatCompressedPvrtRgba = 22 + // 8 bpp + PixelformatCompressedAstc4X4Rgba = 23 + // 2 bpp + PixelformatCompressedAstc8X8Rgba = 24 +) + +// Texture parameters: filter mode +type TextureFilter = int32 + +const ( + // No filter, just pixel approximation + TextureFilterPoint = 0 + // Linear filtering + TextureFilterBilinear = 1 + // Trilinear filtering (linear with mipmaps) + TextureFilterTrilinear = 2 + // Anisotropic filtering 4x + TextureFilterAnisotropic4X = 3 + // Anisotropic filtering 8x + TextureFilterAnisotropic8X = 4 + // Anisotropic filtering 16x + TextureFilterAnisotropic16X = 5 +) + +// Texture parameters: wrap mode +type TextureWrap = int32 + +const ( + // Repeats texture in tiled mode + TextureWrapRepeat = 0 + // Clamps texture to edge pixel in tiled mode + TextureWrapClamp = 1 + // Mirrors and repeats the texture in tiled mode + TextureWrapMirrorRepeat = 2 + // Mirrors and clamps to border the texture in tiled mode + TextureWrapMirrorClamp = 3 +) + +// Cubemap layouts +type CubemapLayout = int32 + +const ( + // Automatically detect layout type + CubemapLayoutAutoDetect = 0 + // Layout is defined by a vertical line with faces + CubemapLayoutLineVertical = 1 + // Layout is defined by a horizontal line with faces + CubemapLayoutLineHorizontal = 2 + // Layout is defined by a 3x4 cross with cubemap faces + CubemapLayoutCrossThreeByFour = 3 + // Layout is defined by a 4x3 cross with cubemap faces + CubemapLayoutCrossFourByThree = 4 +) + +// Font type, defines generation method +type FontType = int32 + +const ( + // Default font generation, anti-aliased + FontDefault = 0 + // Bitmap font generation, no anti-aliasing + FontBitmap = 1 + // SDF font generation, requires external shader + FontSdf = 2 +) + +// Color blending modes (pre-defined) +type BlendMode = int32 + +const ( + // Blend textures considering alpha (default) + BlendAlpha = 0 + // Blend textures adding colors + BlendAdditive = 1 + // Blend textures multiplying colors + BlendMultiplied = 2 + // Blend textures adding colors (alternative) + BlendAddColors = 3 + // Blend textures subtracting colors (alternative) + BlendSubtractColors = 4 + // Blend premultiplied textures considering alpha + BlendAlphaPremultiply = 5 + // Blend textures using custom src/dst factors (use rlSetBlendFactors()) + BlendCustom = 6 + // Blend textures using custom rgb/alpha separate src/dst factors (use rlSetBlendFactorsSeparate()) + BlendCustomSeparate = 7 +) + +// Gesture +type Gesture = int32 + +const ( + // No gesture + GestureNone = 0 + // Tap gesture + GestureTap = 1 + // Double tap gesture + GestureDoubletap = 2 + // Hold gesture + GestureHold = 4 + // Drag gesture + GestureDrag = 8 + // Swipe right gesture + GestureSwipeRight = 16 + // Swipe left gesture + GestureSwipeLeft = 32 + // Swipe up gesture + GestureSwipeUp = 64 + // Swipe down gesture + GestureSwipeDown = 128 + // Pinch in gesture + GesturePinchIn = 256 + // Pinch out gesture + GesturePinchOut = 512 +) + +// Camera system modes +type CameraMode = int32 + +const ( + // Camera custom, controlled by user (UpdateCamera() does nothing) + CameraCustom = 0 + // Camera free mode + CameraFree = 1 + // Camera orbital, around target, zoom supported + CameraOrbital = 2 + // Camera first person + CameraFirstPerson = 3 + // Camera third person + CameraThirdPerson = 4 +) + +// Camera projection +type CameraProjection = int32 + +const ( + // Perspective projection + CameraPerspective = 0 + // Orthographic projection + CameraOrthographic = 1 +) + +// N-patch layout +type NPatchLayout = int32 + +const ( + // Npatch layout: 3x3 tiles + NpatchNinePatch = 0 + // Npatch layout: 1x3 tiles + NpatchThreePatchVertical = 1 + // Npatch layout: 3x1 tiles + NpatchThreePatchHorizontal = 2 +) diff --git a/wasm-runtime/rl/funcimport_gen_unformatted.go b/wasm-runtime/rl/funcimport_gen_unformatted.go new file mode 100644 index 0000000..a4e5b1a --- /dev/null +++ b/wasm-runtime/rl/funcimport_gen_unformatted.go @@ -0,0 +1,4589 @@ +// AUTOGENERATED FILE. DO NOT EDIT + +//go:build js + +package rl + +//go:wasmimport _raylib _InitWindow +//go:noescape +func initWindow( + Width int32, + Height int32, + Title cptr, +) + +//go:wasmimport _raylib _CloseWindow +//go:noescape +func closeWindow() + +//go:wasmimport _raylib _WindowShouldClose +//go:noescape +func windowShouldClose( + ret cptr, +) + +//go:wasmimport _raylib _IsWindowReady +//go:noescape +func isWindowReady( + ret cptr, +) + +//go:wasmimport _raylib _IsWindowFullscreen +//go:noescape +func isWindowFullscreen( + ret cptr, +) + +//go:wasmimport _raylib _IsWindowHidden +//go:noescape +func isWindowHidden( + ret cptr, +) + +//go:wasmimport _raylib _IsWindowMinimized +//go:noescape +func isWindowMinimized( + ret cptr, +) + +//go:wasmimport _raylib _IsWindowMaximized +//go:noescape +func isWindowMaximized( + ret cptr, +) + +//go:wasmimport _raylib _IsWindowFocused +//go:noescape +func isWindowFocused( + ret cptr, +) + +//go:wasmimport _raylib _IsWindowResized +//go:noescape +func isWindowResized( + ret cptr, +) + +//go:wasmimport _raylib _IsWindowState +//go:noescape +func isWindowState( + ret cptr, + Flag uint32, +) + +//go:wasmimport _raylib _SetWindowState +//go:noescape +func setWindowState( + Flags uint32, +) + +//go:wasmimport _raylib _ClearWindowState +//go:noescape +func clearWindowState( + Flags uint32, +) + +//go:wasmimport _raylib _ToggleFullscreen +//go:noescape +func toggleFullscreen() + +//go:wasmimport _raylib _ToggleBorderlessWindowed +//go:noescape +func toggleBorderlessWindowed() + +//go:wasmimport _raylib _MaximizeWindow +//go:noescape +func maximizeWindow() + +//go:wasmimport _raylib _MinimizeWindow +//go:noescape +func minimizeWindow() + +//go:wasmimport _raylib _RestoreWindow +//go:noescape +func restoreWindow() + +//go:wasmimport _raylib _SetWindowIcon +//go:noescape +func setWindowIcon( + Image cptr, +) + +//go:wasmimport _raylib _SetWindowIcons +//go:noescape +func setWindowIcons( + Images cptr, + Count int32, +) + +//go:wasmimport _raylib _SetWindowTitle +//go:noescape +func setWindowTitle( + Title cptr, +) + +//go:wasmimport _raylib _SetWindowPosition +//go:noescape +func setWindowPosition( + X int32, + Y int32, +) + +//go:wasmimport _raylib _SetWindowMonitor +//go:noescape +func setWindowMonitor( + Monitor int32, +) + +//go:wasmimport _raylib _SetWindowMinSize +//go:noescape +func setWindowMinSize( + Width int32, + Height int32, +) + +//go:wasmimport _raylib _SetWindowMaxSize +//go:noescape +func setWindowMaxSize( + Width int32, + Height int32, +) + +//go:wasmimport _raylib _SetWindowSize +//go:noescape +func setWindowSize( + Width int32, + Height int32, +) + +//go:wasmimport _raylib _SetWindowOpacity +//go:noescape +func setWindowOpacity( + Opacity float32, +) + +//go:wasmimport _raylib _SetWindowFocused +//go:noescape +func setWindowFocused() + +//go:wasmimport _raylib _GetWindowHandle +//go:noescape +func getWindowHandle( + ret cptr, +) + +//go:wasmimport _raylib _GetScreenWidth +//go:noescape +func getScreenWidth( + ret int32, +) + +//go:wasmimport _raylib _GetScreenHeight +//go:noescape +func getScreenHeight( + ret int32, +) + +//go:wasmimport _raylib _GetRenderWidth +//go:noescape +func getRenderWidth( + ret int32, +) + +//go:wasmimport _raylib _GetRenderHeight +//go:noescape +func getRenderHeight( + ret int32, +) + +//go:wasmimport _raylib _GetMonitorCount +//go:noescape +func getMonitorCount( + ret int32, +) + +//go:wasmimport _raylib _GetCurrentMonitor +//go:noescape +func getCurrentMonitor( + ret int32, +) + +//go:wasmimport _raylib _GetMonitorPosition +//go:noescape +func getMonitorPosition( + ret cptr, + Monitor int32, +) + +//go:wasmimport _raylib _GetMonitorWidth +//go:noescape +func getMonitorWidth( + ret int32, + Monitor int32, +) + +//go:wasmimport _raylib _GetMonitorHeight +//go:noescape +func getMonitorHeight( + ret int32, + Monitor int32, +) + +//go:wasmimport _raylib _GetMonitorPhysicalWidth +//go:noescape +func getMonitorPhysicalWidth( + ret int32, + Monitor int32, +) + +//go:wasmimport _raylib _GetMonitorPhysicalHeight +//go:noescape +func getMonitorPhysicalHeight( + ret int32, + Monitor int32, +) + +//go:wasmimport _raylib _GetMonitorRefreshRate +//go:noescape +func getMonitorRefreshRate( + ret int32, + Monitor int32, +) + +//go:wasmimport _raylib _GetWindowPosition +//go:noescape +func getWindowPosition( + ret cptr, +) + +//go:wasmimport _raylib _GetWindowScaleDPI +//go:noescape +func getWindowScaleDPI( + ret cptr, +) + +//go:wasmimport _raylib _GetMonitorName +//go:noescape +func getMonitorName( + ret cptr, + Monitor int32, +) + +//go:wasmimport _raylib _SetClipboardText +//go:noescape +func setClipboardText( + Text cptr, +) + +//go:wasmimport _raylib _GetClipboardText +//go:noescape +func getClipboardText( + ret cptr, +) + +//go:wasmimport _raylib _GetClipboardImage +//go:noescape +func getClipboardImage( + ret cptr, +) + +//go:wasmimport _raylib _EnableEventWaiting +//go:noescape +func enableEventWaiting() + +//go:wasmimport _raylib _DisableEventWaiting +//go:noescape +func disableEventWaiting() + +//go:wasmimport _raylib _ShowCursor +//go:noescape +func showCursor() + +//go:wasmimport _raylib _HideCursor +//go:noescape +func hideCursor() + +//go:wasmimport _raylib _IsCursorHidden +//go:noescape +func isCursorHidden( + ret cptr, +) + +//go:wasmimport _raylib _EnableCursor +//go:noescape +func enableCursor() + +//go:wasmimport _raylib _DisableCursor +//go:noescape +func disableCursor() + +//go:wasmimport _raylib _IsCursorOnScreen +//go:noescape +func isCursorOnScreen( + ret cptr, +) + +//go:wasmimport _raylib _ClearBackground +//go:noescape +func clearBackground( + Color cptr, +) + +//go:wasmimport _raylib _BeginDrawing +//go:noescape +func beginDrawing() + +//go:wasmimport _raylib _EndDrawing +//go:noescape +func endDrawing() + +//go:wasmimport _raylib _BeginMode2D +//go:noescape +func beginMode2D( + Camera cptr, +) + +//go:wasmimport _raylib _EndMode2D +//go:noescape +func endMode2D() + +//go:wasmimport _raylib _BeginMode3D +//go:noescape +func beginMode3D( + Camera cptr, +) + +//go:wasmimport _raylib _EndMode3D +//go:noescape +func endMode3D() + +//go:wasmimport _raylib _BeginTextureMode +//go:noescape +func beginTextureMode( + Target cptr, +) + +//go:wasmimport _raylib _EndTextureMode +//go:noescape +func endTextureMode() + +//go:wasmimport _raylib _BeginShaderMode +//go:noescape +func beginShaderMode( + Shader cptr, +) + +//go:wasmimport _raylib _EndShaderMode +//go:noescape +func endShaderMode() + +//go:wasmimport _raylib _BeginBlendMode +//go:noescape +func beginBlendMode( + Mode int32, +) + +//go:wasmimport _raylib _EndBlendMode +//go:noescape +func endBlendMode() + +//go:wasmimport _raylib _BeginScissorMode +//go:noescape +func beginScissorMode( + X int32, + Y int32, + Width int32, + Height int32, +) + +//go:wasmimport _raylib _EndScissorMode +//go:noescape +func endScissorMode() + +//go:wasmimport _raylib _BeginVrStereoMode +//go:noescape +func beginVrStereoMode( + Config cptr, +) + +//go:wasmimport _raylib _EndVrStereoMode +//go:noescape +func endVrStereoMode() + +//go:wasmimport _raylib _LoadVrStereoConfig +//go:noescape +func loadVrStereoConfig( + ret cptr, + Device cptr, +) + +//go:wasmimport _raylib _UnloadVrStereoConfig +//go:noescape +func unloadVrStereoConfig( + Config cptr, +) + +//go:wasmimport _raylib _LoadShader +//go:noescape +func loadShader( + ret cptr, + VsFileName cptr, + FsFileName cptr, +) + +//go:wasmimport _raylib _LoadShaderFromMemory +//go:noescape +func loadShaderFromMemory( + ret cptr, + VsCode cptr, + FsCode cptr, +) + +//go:wasmimport _raylib _IsShaderValid +//go:noescape +func isShaderValid( + ret cptr, + Shader cptr, +) + +//go:wasmimport _raylib _GetShaderLocation +//go:noescape +func getShaderLocation( + ret int32, + Shader cptr, + UniformName cptr, +) + +//go:wasmimport _raylib _GetShaderLocationAttrib +//go:noescape +func getShaderLocationAttrib( + ret int32, + Shader cptr, + AttribName cptr, +) + +//go:wasmimport _raylib _SetShaderValue +//go:noescape +func setShaderValue( + Shader cptr, + LocIndex int32, + Value cptr, + UniformType int32, +) + +//go:wasmimport _raylib _SetShaderValueV +//go:noescape +func setShaderValueV( + Shader cptr, + LocIndex int32, + Value cptr, + UniformType int32, + Count int32, +) + +//go:wasmimport _raylib _SetShaderValueMatrix +//go:noescape +func setShaderValueMatrix( + Shader cptr, + LocIndex int32, + Mat cptr, +) + +//go:wasmimport _raylib _SetShaderValueTexture +//go:noescape +func setShaderValueTexture( + Shader cptr, + LocIndex int32, + Texture cptr, +) + +//go:wasmimport _raylib _UnloadShader +//go:noescape +func unloadShader( + Shader cptr, +) + +//go:wasmimport _raylib _GetScreenToWorldRay +//go:noescape +func getScreenToWorldRay( + ret cptr, + Position cptr, + Camera cptr, +) + +//go:wasmimport _raylib _GetScreenToWorldRayEx +//go:noescape +func getScreenToWorldRayEx( + ret cptr, + Position cptr, + Camera cptr, + Width int32, + Height int32, +) + +//go:wasmimport _raylib _GetWorldToScreen +//go:noescape +func getWorldToScreen( + ret cptr, + Position cptr, + Camera cptr, +) + +//go:wasmimport _raylib _GetWorldToScreenEx +//go:noescape +func getWorldToScreenEx( + ret cptr, + Position cptr, + Camera cptr, + Width int32, + Height int32, +) + +//go:wasmimport _raylib _GetWorldToScreen2D +//go:noescape +func getWorldToScreen2D( + ret cptr, + Position cptr, + Camera cptr, +) + +//go:wasmimport _raylib _GetScreenToWorld2D +//go:noescape +func getScreenToWorld2D( + ret cptr, + Position cptr, + Camera cptr, +) + +//go:wasmimport _raylib _GetCameraMatrix +//go:noescape +func getCameraMatrix( + ret cptr, + Camera cptr, +) + +//go:wasmimport _raylib _GetCameraMatrix2D +//go:noescape +func getCameraMatrix2D( + ret cptr, + Camera cptr, +) + +//go:wasmimport _raylib _SetTargetFPS +//go:noescape +func setTargetFPS( + Fps int32, +) + +//go:wasmimport _raylib _GetFrameTime +//go:noescape +func getFrameTime( + ret float32, +) + +//go:wasmimport _raylib _GetTime +//go:noescape +func getTime( + ret float64, +) + +//go:wasmimport _raylib _GetFPS +//go:noescape +func getFPS( + ret int32, +) + +//go:wasmimport _raylib _SwapScreenBuffer +//go:noescape +func swapScreenBuffer() + +//go:wasmimport _raylib _PollInputEvents +//go:noescape +func pollInputEvents() + +//go:wasmimport _raylib _WaitTime +//go:noescape +func waitTime( + Seconds float64, +) + +//go:wasmimport _raylib _SetRandomSeed +//go:noescape +func setRandomSeed( + Seed uint32, +) + +//go:wasmimport _raylib _GetRandomValue +//go:noescape +func getRandomValue( + ret int32, + Min int32, + Max int32, +) + +//go:wasmimport _raylib _LoadRandomSequence +//go:noescape +func loadRandomSequence( + ret cptr, + Count uint32, + Min int32, + Max int32, +) + +//go:wasmimport _raylib _UnloadRandomSequence +//go:noescape +func unloadRandomSequence( + Sequence cptr, +) + +//go:wasmimport _raylib _TakeScreenshot +//go:noescape +func takeScreenshot( + FileName cptr, +) + +//go:wasmimport _raylib _SetConfigFlags +//go:noescape +func setConfigFlags( + Flags uint32, +) + +//go:wasmimport _raylib _OpenURL +//go:noescape +func openURL( + Url cptr, +) + +//go:wasmimport _raylib _SetTraceLogLevel +//go:noescape +func setTraceLogLevel( + LogLevel int32, +) + +//go:wasmimport _raylib _TraceLog +//go:noescape +func traceLog( + LogLevel int32, + Text cptr, + Args cptr, +) + +//go:wasmimport _raylib _SetTraceLogCallback +//go:noescape +func setTraceLogCallback( + Callback cptr, +) + +//go:wasmimport _raylib _MemAlloc +//go:noescape +func memAlloc( + ret cptr, + Size uint32, +) + +//go:wasmimport _raylib _MemRealloc +//go:noescape +func memRealloc( + ret cptr, + Ptr cptr, + Size uint32, +) + +//go:wasmimport _raylib _MemFree +//go:noescape +func memFree( + Ptr cptr, +) + +//go:wasmimport _raylib _LoadFileData +//go:noescape +func loadFileData( + ret cptr, + FileName cptr, + DataSize cptr, +) + +//go:wasmimport _raylib _UnloadFileData +//go:noescape +func unloadFileData( + Data cptr, +) + +//go:wasmimport _raylib _SaveFileData +//go:noescape +func saveFileData( + ret cptr, + FileName cptr, + Data cptr, + DataSize int32, +) + +//go:wasmimport _raylib _ExportDataAsCode +//go:noescape +func exportDataAsCode( + ret cptr, + Data cptr, + DataSize int32, + FileName cptr, +) + +//go:wasmimport _raylib _LoadFileText +//go:noescape +func loadFileText( + ret cptr, + FileName cptr, +) + +//go:wasmimport _raylib _UnloadFileText +//go:noescape +func unloadFileText( + Text cptr, +) + +//go:wasmimport _raylib _SaveFileText +//go:noescape +func saveFileText( + ret cptr, + FileName cptr, + Text cptr, +) + +//go:wasmimport _raylib _SetLoadFileDataCallback +//go:noescape +func setLoadFileDataCallback( + Callback cptr, +) + +//go:wasmimport _raylib _SetSaveFileDataCallback +//go:noescape +func setSaveFileDataCallback( + Callback cptr, +) + +//go:wasmimport _raylib _SetLoadFileTextCallback +//go:noescape +func setLoadFileTextCallback( + Callback cptr, +) + +//go:wasmimport _raylib _SetSaveFileTextCallback +//go:noescape +func setSaveFileTextCallback( + Callback cptr, +) + +//go:wasmimport _raylib _FileRename +//go:noescape +func fileRename( + ret int32, + FileName cptr, + FileRename cptr, +) + +//go:wasmimport _raylib _FileRemove +//go:noescape +func fileRemove( + ret int32, + FileName cptr, +) + +//go:wasmimport _raylib _FileCopy +//go:noescape +func fileCopy( + ret int32, + SrcPath cptr, + DstPath cptr, +) + +//go:wasmimport _raylib _FileMove +//go:noescape +func fileMove( + ret int32, + SrcPath cptr, + DstPath cptr, +) + +//go:wasmimport _raylib _FileTextReplace +//go:noescape +func fileTextReplace( + ret int32, + FileName cptr, + Search cptr, + Replacement cptr, +) + +//go:wasmimport _raylib _FileTextFindIndex +//go:noescape +func fileTextFindIndex( + ret int32, + FileName cptr, + Search cptr, +) + +//go:wasmimport _raylib _FileExists +//go:noescape +func fileExists( + ret cptr, + FileName cptr, +) + +//go:wasmimport _raylib _DirectoryExists +//go:noescape +func directoryExists( + ret cptr, + DirPath cptr, +) + +//go:wasmimport _raylib _IsFileExtension +//go:noescape +func isFileExtension( + ret cptr, + FileName cptr, + Ext cptr, +) + +//go:wasmimport _raylib _GetFileLength +//go:noescape +func getFileLength( + ret int32, + FileName cptr, +) + +//go:wasmimport _raylib _GetFileModTime +//go:noescape +func getFileModTime( + ret cptr, + FileName cptr, +) + +//go:wasmimport _raylib _GetFileExtension +//go:noescape +func getFileExtension( + ret cptr, + FileName cptr, +) + +//go:wasmimport _raylib _GetFileName +//go:noescape +func getFileName( + ret cptr, + FilePath cptr, +) + +//go:wasmimport _raylib _GetFileNameWithoutExt +//go:noescape +func getFileNameWithoutExt( + ret cptr, + FilePath cptr, +) + +//go:wasmimport _raylib _GetDirectoryPath +//go:noescape +func getDirectoryPath( + ret cptr, + FilePath cptr, +) + +//go:wasmimport _raylib _GetPrevDirectoryPath +//go:noescape +func getPrevDirectoryPath( + ret cptr, + DirPath cptr, +) + +//go:wasmimport _raylib _GetWorkingDirectory +//go:noescape +func getWorkingDirectory( + ret cptr, +) + +//go:wasmimport _raylib _GetApplicationDirectory +//go:noescape +func getApplicationDirectory( + ret cptr, +) + +//go:wasmimport _raylib _MakeDirectory +//go:noescape +func makeDirectory( + ret int32, + DirPath cptr, +) + +//go:wasmimport _raylib _ChangeDirectory +//go:noescape +func changeDirectory( + ret cptr, + DirPath cptr, +) + +//go:wasmimport _raylib _IsPathFile +//go:noescape +func isPathFile( + ret cptr, + Path cptr, +) + +//go:wasmimport _raylib _IsFileNameValid +//go:noescape +func isFileNameValid( + ret cptr, + FileName cptr, +) + +//go:wasmimport _raylib _LoadDirectoryFiles +//go:noescape +func loadDirectoryFiles( + ret cptr, + DirPath cptr, +) + +//go:wasmimport _raylib _LoadDirectoryFilesEx +//go:noescape +func loadDirectoryFilesEx( + ret cptr, + BasePath cptr, + Filter cptr, + ScanSubdirs cptr, +) + +//go:wasmimport _raylib _UnloadDirectoryFiles +//go:noescape +func unloadDirectoryFiles( + Files cptr, +) + +//go:wasmimport _raylib _IsFileDropped +//go:noescape +func isFileDropped( + ret cptr, +) + +//go:wasmimport _raylib _LoadDroppedFiles +//go:noescape +func loadDroppedFiles( + ret cptr, +) + +//go:wasmimport _raylib _UnloadDroppedFiles +//go:noescape +func unloadDroppedFiles( + Files cptr, +) + +//go:wasmimport _raylib _GetDirectoryFileCount +//go:noescape +func getDirectoryFileCount( + ret uint32, + DirPath cptr, +) + +//go:wasmimport _raylib _GetDirectoryFileCountEx +//go:noescape +func getDirectoryFileCountEx( + ret uint32, + BasePath cptr, + Filter cptr, + ScanSubdirs cptr, +) + +//go:wasmimport _raylib _CompressData +//go:noescape +func compressData( + ret cptr, + Data cptr, + DataSize int32, + CompDataSize cptr, +) + +//go:wasmimport _raylib _DecompressData +//go:noescape +func decompressData( + ret cptr, + CompData cptr, + CompDataSize int32, + DataSize cptr, +) + +//go:wasmimport _raylib _EncodeDataBase64 +//go:noescape +func encodeDataBase64( + ret cptr, + Data cptr, + DataSize int32, + OutputSize cptr, +) + +//go:wasmimport _raylib _DecodeDataBase64 +//go:noescape +func decodeDataBase64( + ret cptr, + Text cptr, + OutputSize cptr, +) + +//go:wasmimport _raylib _ComputeCRC32 +//go:noescape +func computeCRC32( + ret uint32, + Data cptr, + DataSize int32, +) + +//go:wasmimport _raylib _ComputeMD5 +//go:noescape +func computeMD5( + ret cptr, + Data cptr, + DataSize int32, +) + +//go:wasmimport _raylib _ComputeSHA1 +//go:noescape +func computeSHA1( + ret cptr, + Data cptr, + DataSize int32, +) + +//go:wasmimport _raylib _ComputeSHA256 +//go:noescape +func computeSHA256( + ret cptr, + Data cptr, + DataSize int32, +) + +//go:wasmimport _raylib _LoadAutomationEventList +//go:noescape +func loadAutomationEventList( + ret cptr, + FileName cptr, +) + +//go:wasmimport _raylib _UnloadAutomationEventList +//go:noescape +func unloadAutomationEventList( + List cptr, +) + +//go:wasmimport _raylib _ExportAutomationEventList +//go:noescape +func exportAutomationEventList( + ret cptr, + List cptr, + FileName cptr, +) + +//go:wasmimport _raylib _SetAutomationEventList +//go:noescape +func setAutomationEventList( + List cptr, +) + +//go:wasmimport _raylib _SetAutomationEventBaseFrame +//go:noescape +func setAutomationEventBaseFrame( + Frame int32, +) + +//go:wasmimport _raylib _StartAutomationEventRecording +//go:noescape +func startAutomationEventRecording() + +//go:wasmimport _raylib _StopAutomationEventRecording +//go:noescape +func stopAutomationEventRecording() + +//go:wasmimport _raylib _PlayAutomationEvent +//go:noescape +func playAutomationEvent( + Event cptr, +) + +//go:wasmimport _raylib _IsKeyPressed +//go:noescape +func isKeyPressed( + ret cptr, + Key int32, +) + +//go:wasmimport _raylib _IsKeyPressedRepeat +//go:noescape +func isKeyPressedRepeat( + ret cptr, + Key int32, +) + +//go:wasmimport _raylib _IsKeyDown +//go:noescape +func isKeyDown( + ret cptr, + Key int32, +) + +//go:wasmimport _raylib _IsKeyReleased +//go:noescape +func isKeyReleased( + ret cptr, + Key int32, +) + +//go:wasmimport _raylib _IsKeyUp +//go:noescape +func isKeyUp( + ret cptr, + Key int32, +) + +//go:wasmimport _raylib _GetKeyPressed +//go:noescape +func getKeyPressed( + ret int32, +) + +//go:wasmimport _raylib _GetCharPressed +//go:noescape +func getCharPressed( + ret int32, +) + +//go:wasmimport _raylib _GetKeyName +//go:noescape +func getKeyName( + ret cptr, + Key int32, +) + +//go:wasmimport _raylib _SetExitKey +//go:noescape +func setExitKey( + Key int32, +) + +//go:wasmimport _raylib _IsGamepadAvailable +//go:noescape +func isGamepadAvailable( + ret cptr, + Gamepad int32, +) + +//go:wasmimport _raylib _GetGamepadName +//go:noescape +func getGamepadName( + ret cptr, + Gamepad int32, +) + +//go:wasmimport _raylib _IsGamepadButtonPressed +//go:noescape +func isGamepadButtonPressed( + ret cptr, + Gamepad int32, + Button int32, +) + +//go:wasmimport _raylib _IsGamepadButtonDown +//go:noescape +func isGamepadButtonDown( + ret cptr, + Gamepad int32, + Button int32, +) + +//go:wasmimport _raylib _IsGamepadButtonReleased +//go:noescape +func isGamepadButtonReleased( + ret cptr, + Gamepad int32, + Button int32, +) + +//go:wasmimport _raylib _IsGamepadButtonUp +//go:noescape +func isGamepadButtonUp( + ret cptr, + Gamepad int32, + Button int32, +) + +//go:wasmimport _raylib _GetGamepadButtonPressed +//go:noescape +func getGamepadButtonPressed( + ret int32, +) + +//go:wasmimport _raylib _GetGamepadAxisCount +//go:noescape +func getGamepadAxisCount( + ret int32, + Gamepad int32, +) + +//go:wasmimport _raylib _GetGamepadAxisMovement +//go:noescape +func getGamepadAxisMovement( + ret float32, + Gamepad int32, + Axis int32, +) + +//go:wasmimport _raylib _SetGamepadMappings +//go:noescape +func setGamepadMappings( + ret int32, + Mappings cptr, +) + +//go:wasmimport _raylib _SetGamepadVibration +//go:noescape +func setGamepadVibration( + Gamepad int32, + LeftMotor float32, + RightMotor float32, + Duration float32, +) + +//go:wasmimport _raylib _IsMouseButtonPressed +//go:noescape +func isMouseButtonPressed( + ret cptr, + Button int32, +) + +//go:wasmimport _raylib _IsMouseButtonDown +//go:noescape +func isMouseButtonDown( + ret cptr, + Button int32, +) + +//go:wasmimport _raylib _IsMouseButtonReleased +//go:noescape +func isMouseButtonReleased( + ret cptr, + Button int32, +) + +//go:wasmimport _raylib _IsMouseButtonUp +//go:noescape +func isMouseButtonUp( + ret cptr, + Button int32, +) + +//go:wasmimport _raylib _GetMouseX +//go:noescape +func getMouseX( + ret int32, +) + +//go:wasmimport _raylib _GetMouseY +//go:noescape +func getMouseY( + ret int32, +) + +//go:wasmimport _raylib _GetMousePosition +//go:noescape +func getMousePosition( + ret cptr, +) + +//go:wasmimport _raylib _GetMouseDelta +//go:noescape +func getMouseDelta( + ret cptr, +) + +//go:wasmimport _raylib _SetMousePosition +//go:noescape +func setMousePosition( + X int32, + Y int32, +) + +//go:wasmimport _raylib _SetMouseOffset +//go:noescape +func setMouseOffset( + OffsetX int32, + OffsetY int32, +) + +//go:wasmimport _raylib _SetMouseScale +//go:noescape +func setMouseScale( + ScaleX float32, + ScaleY float32, +) + +//go:wasmimport _raylib _GetMouseWheelMove +//go:noescape +func getMouseWheelMove( + ret float32, +) + +//go:wasmimport _raylib _GetMouseWheelMoveV +//go:noescape +func getMouseWheelMoveV( + ret cptr, +) + +//go:wasmimport _raylib _SetMouseCursor +//go:noescape +func setMouseCursor( + Cursor int32, +) + +//go:wasmimport _raylib _GetTouchX +//go:noescape +func getTouchX( + ret int32, +) + +//go:wasmimport _raylib _GetTouchY +//go:noescape +func getTouchY( + ret int32, +) + +//go:wasmimport _raylib _GetTouchPosition +//go:noescape +func getTouchPosition( + ret cptr, + Index int32, +) + +//go:wasmimport _raylib _GetTouchPointId +//go:noescape +func getTouchPointId( + ret int32, + Index int32, +) + +//go:wasmimport _raylib _GetTouchPointCount +//go:noescape +func getTouchPointCount( + ret int32, +) + +//go:wasmimport _raylib _SetGesturesEnabled +//go:noescape +func setGesturesEnabled( + Flags uint32, +) + +//go:wasmimport _raylib _IsGestureDetected +//go:noescape +func isGestureDetected( + ret cptr, + Gesture uint32, +) + +//go:wasmimport _raylib _GetGestureDetected +//go:noescape +func getGestureDetected( + ret int32, +) + +//go:wasmimport _raylib _GetGestureHoldDuration +//go:noescape +func getGestureHoldDuration( + ret float32, +) + +//go:wasmimport _raylib _GetGestureDragVector +//go:noescape +func getGestureDragVector( + ret cptr, +) + +//go:wasmimport _raylib _GetGestureDragAngle +//go:noescape +func getGestureDragAngle( + ret float32, +) + +//go:wasmimport _raylib _GetGesturePinchVector +//go:noescape +func getGesturePinchVector( + ret cptr, +) + +//go:wasmimport _raylib _GetGesturePinchAngle +//go:noescape +func getGesturePinchAngle( + ret float32, +) + +//go:wasmimport _raylib _UpdateCamera +//go:noescape +func updateCamera( + Camera cptr, + Mode int32, +) + +//go:wasmimport _raylib _UpdateCameraPro +//go:noescape +func updateCameraPro( + Camera cptr, + Movement cptr, + Rotation cptr, + Zoom float32, +) + +//go:wasmimport _raylib _SetShapesTexture +//go:noescape +func setShapesTexture( + Texture cptr, + Source cptr, +) + +//go:wasmimport _raylib _GetShapesTexture +//go:noescape +func getShapesTexture( + ret cptr, +) + +//go:wasmimport _raylib _GetShapesTextureRectangle +//go:noescape +func getShapesTextureRectangle( + ret cptr, +) + +//go:wasmimport _raylib _DrawPixel +//go:noescape +func drawPixel( + PosX int32, + PosY int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawPixelV +//go:noescape +func drawPixelV( + Position cptr, + Color cptr, +) + +//go:wasmimport _raylib _DrawLine +//go:noescape +func drawLine( + StartPosX int32, + StartPosY int32, + EndPosX int32, + EndPosY int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawLineV +//go:noescape +func drawLineV( + StartPos cptr, + EndPos cptr, + Color cptr, +) + +//go:wasmimport _raylib _DrawLineEx +//go:noescape +func drawLineEx( + StartPos cptr, + EndPos cptr, + Thick float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawLineStrip +//go:noescape +func drawLineStrip( + Points cptr, + PointCount int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawLineBezier +//go:noescape +func drawLineBezier( + StartPos cptr, + EndPos cptr, + Thick float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawLineDashed +//go:noescape +func drawLineDashed( + StartPos cptr, + EndPos cptr, + DashSize int32, + SpaceSize int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawCircle +//go:noescape +func drawCircle( + CenterX int32, + CenterY int32, + Radius float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawCircleSector +//go:noescape +func drawCircleSector( + Center cptr, + Radius float32, + StartAngle float32, + EndAngle float32, + Segments int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawCircleSectorLines +//go:noescape +func drawCircleSectorLines( + Center cptr, + Radius float32, + StartAngle float32, + EndAngle float32, + Segments int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawCircleGradient +//go:noescape +func drawCircleGradient( + CenterX int32, + CenterY int32, + Radius float32, + Inner cptr, + Outer cptr, +) + +//go:wasmimport _raylib _DrawCircleV +//go:noescape +func drawCircleV( + Center cptr, + Radius float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawCircleLines +//go:noescape +func drawCircleLines( + CenterX int32, + CenterY int32, + Radius float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawCircleLinesV +//go:noescape +func drawCircleLinesV( + Center cptr, + Radius float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawEllipse +//go:noescape +func drawEllipse( + CenterX int32, + CenterY int32, + RadiusH float32, + RadiusV float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawEllipseV +//go:noescape +func drawEllipseV( + Center cptr, + RadiusH float32, + RadiusV float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawEllipseLines +//go:noescape +func drawEllipseLines( + CenterX int32, + CenterY int32, + RadiusH float32, + RadiusV float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawEllipseLinesV +//go:noescape +func drawEllipseLinesV( + Center cptr, + RadiusH float32, + RadiusV float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawRing +//go:noescape +func drawRing( + Center cptr, + InnerRadius float32, + OuterRadius float32, + StartAngle float32, + EndAngle float32, + Segments int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawRingLines +//go:noescape +func drawRingLines( + Center cptr, + InnerRadius float32, + OuterRadius float32, + StartAngle float32, + EndAngle float32, + Segments int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawRectangle +//go:noescape +func drawRectangle( + PosX int32, + PosY int32, + Width int32, + Height int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawRectangleV +//go:noescape +func drawRectangleV( + Position cptr, + Size cptr, + Color cptr, +) + +//go:wasmimport _raylib _DrawRectangleRec +//go:noescape +func drawRectangleRec( + Rec cptr, + Color cptr, +) + +//go:wasmimport _raylib _DrawRectanglePro +//go:noescape +func drawRectanglePro( + Rec cptr, + Origin cptr, + Rotation float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawRectangleGradientV +//go:noescape +func drawRectangleGradientV( + PosX int32, + PosY int32, + Width int32, + Height int32, + Top cptr, + Bottom cptr, +) + +//go:wasmimport _raylib _DrawRectangleGradientH +//go:noescape +func drawRectangleGradientH( + PosX int32, + PosY int32, + Width int32, + Height int32, + Left cptr, + Right cptr, +) + +//go:wasmimport _raylib _DrawRectangleGradientEx +//go:noescape +func drawRectangleGradientEx( + Rec cptr, + TopLeft cptr, + BottomLeft cptr, + BottomRight cptr, + TopRight cptr, +) + +//go:wasmimport _raylib _DrawRectangleLines +//go:noescape +func drawRectangleLines( + PosX int32, + PosY int32, + Width int32, + Height int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawRectangleLinesEx +//go:noescape +func drawRectangleLinesEx( + Rec cptr, + LineThick float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawRectangleRounded +//go:noescape +func drawRectangleRounded( + Rec cptr, + Roundness float32, + Segments int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawRectangleRoundedLines +//go:noescape +func drawRectangleRoundedLines( + Rec cptr, + Roundness float32, + Segments int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawRectangleRoundedLinesEx +//go:noescape +func drawRectangleRoundedLinesEx( + Rec cptr, + Roundness float32, + Segments int32, + LineThick float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawTriangle +//go:noescape +func drawTriangle( + V1 cptr, + V2 cptr, + V3 cptr, + Color cptr, +) + +//go:wasmimport _raylib _DrawTriangleLines +//go:noescape +func drawTriangleLines( + V1 cptr, + V2 cptr, + V3 cptr, + Color cptr, +) + +//go:wasmimport _raylib _DrawTriangleFan +//go:noescape +func drawTriangleFan( + Points cptr, + PointCount int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawTriangleStrip +//go:noescape +func drawTriangleStrip( + Points cptr, + PointCount int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawPoly +//go:noescape +func drawPoly( + Center cptr, + Sides int32, + Radius float32, + Rotation float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawPolyLines +//go:noescape +func drawPolyLines( + Center cptr, + Sides int32, + Radius float32, + Rotation float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawPolyLinesEx +//go:noescape +func drawPolyLinesEx( + Center cptr, + Sides int32, + Radius float32, + Rotation float32, + LineThick float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawSplineLinear +//go:noescape +func drawSplineLinear( + Points cptr, + PointCount int32, + Thick float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawSplineBasis +//go:noescape +func drawSplineBasis( + Points cptr, + PointCount int32, + Thick float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawSplineCatmullRom +//go:noescape +func drawSplineCatmullRom( + Points cptr, + PointCount int32, + Thick float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawSplineBezierQuadratic +//go:noescape +func drawSplineBezierQuadratic( + Points cptr, + PointCount int32, + Thick float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawSplineBezierCubic +//go:noescape +func drawSplineBezierCubic( + Points cptr, + PointCount int32, + Thick float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawSplineSegmentLinear +//go:noescape +func drawSplineSegmentLinear( + P1 cptr, + P2 cptr, + Thick float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawSplineSegmentBasis +//go:noescape +func drawSplineSegmentBasis( + P1 cptr, + P2 cptr, + P3 cptr, + P4 cptr, + Thick float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawSplineSegmentCatmullRom +//go:noescape +func drawSplineSegmentCatmullRom( + P1 cptr, + P2 cptr, + P3 cptr, + P4 cptr, + Thick float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawSplineSegmentBezierQuadratic +//go:noescape +func drawSplineSegmentBezierQuadratic( + P1 cptr, + C2 cptr, + P3 cptr, + Thick float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawSplineSegmentBezierCubic +//go:noescape +func drawSplineSegmentBezierCubic( + P1 cptr, + C2 cptr, + C3 cptr, + P4 cptr, + Thick float32, + Color cptr, +) + +//go:wasmimport _raylib _GetSplinePointLinear +//go:noescape +func getSplinePointLinear( + ret cptr, + StartPos cptr, + EndPos cptr, + T float32, +) + +//go:wasmimport _raylib _GetSplinePointBasis +//go:noescape +func getSplinePointBasis( + ret cptr, + P1 cptr, + P2 cptr, + P3 cptr, + P4 cptr, + T float32, +) + +//go:wasmimport _raylib _GetSplinePointCatmullRom +//go:noescape +func getSplinePointCatmullRom( + ret cptr, + P1 cptr, + P2 cptr, + P3 cptr, + P4 cptr, + T float32, +) + +//go:wasmimport _raylib _GetSplinePointBezierQuad +//go:noescape +func getSplinePointBezierQuad( + ret cptr, + P1 cptr, + C2 cptr, + P3 cptr, + T float32, +) + +//go:wasmimport _raylib _GetSplinePointBezierCubic +//go:noescape +func getSplinePointBezierCubic( + ret cptr, + P1 cptr, + C2 cptr, + C3 cptr, + P4 cptr, + T float32, +) + +//go:wasmimport _raylib _CheckCollisionRecs +//go:noescape +func checkCollisionRecs( + ret cptr, + Rec1 cptr, + Rec2 cptr, +) + +//go:wasmimport _raylib _CheckCollisionCircles +//go:noescape +func checkCollisionCircles( + ret cptr, + Center1 cptr, + Radius1 float32, + Center2 cptr, + Radius2 float32, +) + +//go:wasmimport _raylib _CheckCollisionCircleRec +//go:noescape +func checkCollisionCircleRec( + ret cptr, + Center cptr, + Radius float32, + Rec cptr, +) + +//go:wasmimport _raylib _CheckCollisionCircleLine +//go:noescape +func checkCollisionCircleLine( + ret cptr, + Center cptr, + Radius float32, + P1 cptr, + P2 cptr, +) + +//go:wasmimport _raylib _CheckCollisionPointRec +//go:noescape +func checkCollisionPointRec( + ret cptr, + Point cptr, + Rec cptr, +) + +//go:wasmimport _raylib _CheckCollisionPointCircle +//go:noescape +func checkCollisionPointCircle( + ret cptr, + Point cptr, + Center cptr, + Radius float32, +) + +//go:wasmimport _raylib _CheckCollisionPointTriangle +//go:noescape +func checkCollisionPointTriangle( + ret cptr, + Point cptr, + P1 cptr, + P2 cptr, + P3 cptr, +) + +//go:wasmimport _raylib _CheckCollisionPointLine +//go:noescape +func checkCollisionPointLine( + ret cptr, + Point cptr, + P1 cptr, + P2 cptr, + Threshold int32, +) + +//go:wasmimport _raylib _CheckCollisionPointPoly +//go:noescape +func checkCollisionPointPoly( + ret cptr, + Point cptr, + Points cptr, + PointCount int32, +) + +//go:wasmimport _raylib _CheckCollisionLines +//go:noescape +func checkCollisionLines( + ret cptr, + StartPos1 cptr, + EndPos1 cptr, + StartPos2 cptr, + EndPos2 cptr, + CollisionPoint cptr, +) + +//go:wasmimport _raylib _GetCollisionRec +//go:noescape +func getCollisionRec( + ret cptr, + Rec1 cptr, + Rec2 cptr, +) + +//go:wasmimport _raylib _LoadImage +//go:noescape +func loadImage( + ret cptr, + FileName cptr, +) + +//go:wasmimport _raylib _LoadImageRaw +//go:noescape +func loadImageRaw( + ret cptr, + FileName cptr, + Width int32, + Height int32, + Format int32, + HeaderSize int32, +) + +//go:wasmimport _raylib _LoadImageAnim +//go:noescape +func loadImageAnim( + ret cptr, + FileName cptr, + Frames cptr, +) + +//go:wasmimport _raylib _LoadImageAnimFromMemory +//go:noescape +func loadImageAnimFromMemory( + ret cptr, + FileType cptr, + FileData cptr, + DataSize int32, + Frames cptr, +) + +//go:wasmimport _raylib _LoadImageFromMemory +//go:noescape +func loadImageFromMemory( + ret cptr, + FileType cptr, + FileData cptr, + DataSize int32, +) + +//go:wasmimport _raylib _LoadImageFromTexture +//go:noescape +func loadImageFromTexture( + ret cptr, + Texture cptr, +) + +//go:wasmimport _raylib _LoadImageFromScreen +//go:noescape +func loadImageFromScreen( + ret cptr, +) + +//go:wasmimport _raylib _IsImageValid +//go:noescape +func isImageValid( + ret cptr, + Image cptr, +) + +//go:wasmimport _raylib _UnloadImage +//go:noescape +func unloadImage( + Image cptr, +) + +//go:wasmimport _raylib _ExportImage +//go:noescape +func exportImage( + ret cptr, + Image cptr, + FileName cptr, +) + +//go:wasmimport _raylib _ExportImageToMemory +//go:noescape +func exportImageToMemory( + ret cptr, + Image cptr, + FileType cptr, + FileSize cptr, +) + +//go:wasmimport _raylib _ExportImageAsCode +//go:noescape +func exportImageAsCode( + ret cptr, + Image cptr, + FileName cptr, +) + +//go:wasmimport _raylib _GenImageColor +//go:noescape +func genImageColor( + ret cptr, + Width int32, + Height int32, + Color cptr, +) + +//go:wasmimport _raylib _GenImageGradientLinear +//go:noescape +func genImageGradientLinear( + ret cptr, + Width int32, + Height int32, + Direction int32, + Start cptr, + End cptr, +) + +//go:wasmimport _raylib _GenImageGradientRadial +//go:noescape +func genImageGradientRadial( + ret cptr, + Width int32, + Height int32, + Density float32, + Inner cptr, + Outer cptr, +) + +//go:wasmimport _raylib _GenImageGradientSquare +//go:noescape +func genImageGradientSquare( + ret cptr, + Width int32, + Height int32, + Density float32, + Inner cptr, + Outer cptr, +) + +//go:wasmimport _raylib _GenImageChecked +//go:noescape +func genImageChecked( + ret cptr, + Width int32, + Height int32, + ChecksX int32, + ChecksY int32, + Col1 cptr, + Col2 cptr, +) + +//go:wasmimport _raylib _GenImageWhiteNoise +//go:noescape +func genImageWhiteNoise( + ret cptr, + Width int32, + Height int32, + Factor float32, +) + +//go:wasmimport _raylib _GenImagePerlinNoise +//go:noescape +func genImagePerlinNoise( + ret cptr, + Width int32, + Height int32, + OffsetX int32, + OffsetY int32, + Scale float32, +) + +//go:wasmimport _raylib _GenImageCellular +//go:noescape +func genImageCellular( + ret cptr, + Width int32, + Height int32, + TileSize int32, +) + +//go:wasmimport _raylib _GenImageText +//go:noescape +func genImageText( + ret cptr, + Width int32, + Height int32, + Text cptr, +) + +//go:wasmimport _raylib _ImageCopy +//go:noescape +func imageCopy( + ret cptr, + Image cptr, +) + +//go:wasmimport _raylib _ImageFromImage +//go:noescape +func imageFromImage( + ret cptr, + Image cptr, + Rec cptr, +) + +//go:wasmimport _raylib _ImageFromChannel +//go:noescape +func imageFromChannel( + ret cptr, + Image cptr, + SelectedChannel int32, +) + +//go:wasmimport _raylib _ImageText +//go:noescape +func imageText( + ret cptr, + Text cptr, + FontSize int32, + Color cptr, +) + +//go:wasmimport _raylib _ImageTextEx +//go:noescape +func imageTextEx( + ret cptr, + Font cptr, + Text cptr, + FontSize float32, + Spacing float32, + Tint cptr, +) + +//go:wasmimport _raylib _ImageFormat +//go:noescape +func imageFormat( + Image cptr, + NewFormat int32, +) + +//go:wasmimport _raylib _ImageToPOT +//go:noescape +func imageToPOT( + Image cptr, + Fill cptr, +) + +//go:wasmimport _raylib _ImageCrop +//go:noescape +func imageCrop( + Image cptr, + Crop cptr, +) + +//go:wasmimport _raylib _ImageAlphaCrop +//go:noescape +func imageAlphaCrop( + Image cptr, + Threshold float32, +) + +//go:wasmimport _raylib _ImageAlphaClear +//go:noescape +func imageAlphaClear( + Image cptr, + Color cptr, + Threshold float32, +) + +//go:wasmimport _raylib _ImageAlphaMask +//go:noescape +func imageAlphaMask( + Image cptr, + AlphaMask cptr, +) + +//go:wasmimport _raylib _ImageAlphaPremultiply +//go:noescape +func imageAlphaPremultiply( + Image cptr, +) + +//go:wasmimport _raylib _ImageBlurGaussian +//go:noescape +func imageBlurGaussian( + Image cptr, + BlurSize int32, +) + +//go:wasmimport _raylib _ImageKernelConvolution +//go:noescape +func imageKernelConvolution( + Image cptr, + Kernel cptr, + KernelSize int32, +) + +//go:wasmimport _raylib _ImageResize +//go:noescape +func imageResize( + Image cptr, + NewWidth int32, + NewHeight int32, +) + +//go:wasmimport _raylib _ImageResizeNN +//go:noescape +func imageResizeNN( + Image cptr, + NewWidth int32, + NewHeight int32, +) + +//go:wasmimport _raylib _ImageResizeCanvas +//go:noescape +func imageResizeCanvas( + Image cptr, + NewWidth int32, + NewHeight int32, + OffsetX int32, + OffsetY int32, + Fill cptr, +) + +//go:wasmimport _raylib _ImageMipmaps +//go:noescape +func imageMipmaps( + Image cptr, +) + +//go:wasmimport _raylib _ImageDither +//go:noescape +func imageDither( + Image cptr, + RBpp int32, + GBpp int32, + BBpp int32, + ABpp int32, +) + +//go:wasmimport _raylib _ImageFlipVertical +//go:noescape +func imageFlipVertical( + Image cptr, +) + +//go:wasmimport _raylib _ImageFlipHorizontal +//go:noescape +func imageFlipHorizontal( + Image cptr, +) + +//go:wasmimport _raylib _ImageRotate +//go:noescape +func imageRotate( + Image cptr, + Degrees int32, +) + +//go:wasmimport _raylib _ImageRotateCW +//go:noescape +func imageRotateCW( + Image cptr, +) + +//go:wasmimport _raylib _ImageRotateCCW +//go:noescape +func imageRotateCCW( + Image cptr, +) + +//go:wasmimport _raylib _ImageColorTint +//go:noescape +func imageColorTint( + Image cptr, + Color cptr, +) + +//go:wasmimport _raylib _ImageColorInvert +//go:noescape +func imageColorInvert( + Image cptr, +) + +//go:wasmimport _raylib _ImageColorGrayscale +//go:noescape +func imageColorGrayscale( + Image cptr, +) + +//go:wasmimport _raylib _ImageColorContrast +//go:noescape +func imageColorContrast( + Image cptr, + Contrast float32, +) + +//go:wasmimport _raylib _ImageColorBrightness +//go:noescape +func imageColorBrightness( + Image cptr, + Brightness int32, +) + +//go:wasmimport _raylib _ImageColorReplace +//go:noescape +func imageColorReplace( + Image cptr, + Color cptr, + Replace cptr, +) + +//go:wasmimport _raylib _LoadImageColors +//go:noescape +func loadImageColors( + ret cptr, + Image cptr, +) + +//go:wasmimport _raylib _LoadImagePalette +//go:noescape +func loadImagePalette( + ret cptr, + Image cptr, + MaxPaletteSize int32, + ColorCount cptr, +) + +//go:wasmimport _raylib _UnloadImageColors +//go:noescape +func unloadImageColors( + Colors cptr, +) + +//go:wasmimport _raylib _UnloadImagePalette +//go:noescape +func unloadImagePalette( + Colors cptr, +) + +//go:wasmimport _raylib _GetImageAlphaBorder +//go:noescape +func getImageAlphaBorder( + ret cptr, + Image cptr, + Threshold float32, +) + +//go:wasmimport _raylib _GetImageColor +//go:noescape +func getImageColor( + ret cptr, + Image cptr, + X int32, + Y int32, +) + +//go:wasmimport _raylib _ImageClearBackground +//go:noescape +func imageClearBackground( + Dst cptr, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawPixel +//go:noescape +func imageDrawPixel( + Dst cptr, + PosX int32, + PosY int32, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawPixelV +//go:noescape +func imageDrawPixelV( + Dst cptr, + Position cptr, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawLine +//go:noescape +func imageDrawLine( + Dst cptr, + StartPosX int32, + StartPosY int32, + EndPosX int32, + EndPosY int32, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawLineV +//go:noescape +func imageDrawLineV( + Dst cptr, + Start cptr, + End cptr, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawLineEx +//go:noescape +func imageDrawLineEx( + Dst cptr, + Start cptr, + End cptr, + Thick int32, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawCircle +//go:noescape +func imageDrawCircle( + Dst cptr, + CenterX int32, + CenterY int32, + Radius int32, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawCircleV +//go:noescape +func imageDrawCircleV( + Dst cptr, + Center cptr, + Radius int32, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawCircleLines +//go:noescape +func imageDrawCircleLines( + Dst cptr, + CenterX int32, + CenterY int32, + Radius int32, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawCircleLinesV +//go:noescape +func imageDrawCircleLinesV( + Dst cptr, + Center cptr, + Radius int32, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawRectangle +//go:noescape +func imageDrawRectangle( + Dst cptr, + PosX int32, + PosY int32, + Width int32, + Height int32, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawRectangleV +//go:noescape +func imageDrawRectangleV( + Dst cptr, + Position cptr, + Size cptr, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawRectangleRec +//go:noescape +func imageDrawRectangleRec( + Dst cptr, + Rec cptr, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawRectangleLines +//go:noescape +func imageDrawRectangleLines( + Dst cptr, + Rec cptr, + Thick int32, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawTriangle +//go:noescape +func imageDrawTriangle( + Dst cptr, + V1 cptr, + V2 cptr, + V3 cptr, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawTriangleEx +//go:noescape +func imageDrawTriangleEx( + Dst cptr, + V1 cptr, + V2 cptr, + V3 cptr, + C1 cptr, + C2 cptr, + C3 cptr, +) + +//go:wasmimport _raylib _ImageDrawTriangleLines +//go:noescape +func imageDrawTriangleLines( + Dst cptr, + V1 cptr, + V2 cptr, + V3 cptr, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawTriangleFan +//go:noescape +func imageDrawTriangleFan( + Dst cptr, + Points cptr, + PointCount int32, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawTriangleStrip +//go:noescape +func imageDrawTriangleStrip( + Dst cptr, + Points cptr, + PointCount int32, + Color cptr, +) + +//go:wasmimport _raylib _ImageDraw +//go:noescape +func imageDraw( + Dst cptr, + Src cptr, + SrcRec cptr, + DstRec cptr, + Tint cptr, +) + +//go:wasmimport _raylib _ImageDrawText +//go:noescape +func imageDrawText( + Dst cptr, + Text cptr, + PosX int32, + PosY int32, + FontSize int32, + Color cptr, +) + +//go:wasmimport _raylib _ImageDrawTextEx +//go:noescape +func imageDrawTextEx( + Dst cptr, + Font cptr, + Text cptr, + Position cptr, + FontSize float32, + Spacing float32, + Tint cptr, +) + +//go:wasmimport _raylib _LoadTexture +//go:noescape +func loadTexture( + ret cptr, + FileName cptr, +) + +//go:wasmimport _raylib _LoadTextureFromImage +//go:noescape +func loadTextureFromImage( + ret cptr, + Image cptr, +) + +//go:wasmimport _raylib _LoadTextureCubemap +//go:noescape +func loadTextureCubemap( + ret cptr, + Image cptr, + Layout int32, +) + +//go:wasmimport _raylib _LoadRenderTexture +//go:noescape +func loadRenderTexture( + ret cptr, + Width int32, + Height int32, +) + +//go:wasmimport _raylib _IsTextureValid +//go:noescape +func isTextureValid( + ret cptr, + Texture cptr, +) + +//go:wasmimport _raylib _UnloadTexture +//go:noescape +func unloadTexture( + Texture cptr, +) + +//go:wasmimport _raylib _IsRenderTextureValid +//go:noescape +func isRenderTextureValid( + ret cptr, + Target cptr, +) + +//go:wasmimport _raylib _UnloadRenderTexture +//go:noescape +func unloadRenderTexture( + Target cptr, +) + +//go:wasmimport _raylib _UpdateTexture +//go:noescape +func updateTexture( + Texture cptr, + Pixels cptr, +) + +//go:wasmimport _raylib _UpdateTextureRec +//go:noescape +func updateTextureRec( + Texture cptr, + Rec cptr, + Pixels cptr, +) + +//go:wasmimport _raylib _GenTextureMipmaps +//go:noescape +func genTextureMipmaps( + Texture cptr, +) + +//go:wasmimport _raylib _SetTextureFilter +//go:noescape +func setTextureFilter( + Texture cptr, + Filter int32, +) + +//go:wasmimport _raylib _SetTextureWrap +//go:noescape +func setTextureWrap( + Texture cptr, + Wrap int32, +) + +//go:wasmimport _raylib _DrawTexture +//go:noescape +func drawTexture( + Texture cptr, + PosX int32, + PosY int32, + Tint cptr, +) + +//go:wasmimport _raylib _DrawTextureV +//go:noescape +func drawTextureV( + Texture cptr, + Position cptr, + Tint cptr, +) + +//go:wasmimport _raylib _DrawTextureEx +//go:noescape +func drawTextureEx( + Texture cptr, + Position cptr, + Rotation float32, + Scale float32, + Tint cptr, +) + +//go:wasmimport _raylib _DrawTextureRec +//go:noescape +func drawTextureRec( + Texture cptr, + Source cptr, + Position cptr, + Tint cptr, +) + +//go:wasmimport _raylib _DrawTexturePro +//go:noescape +func drawTexturePro( + Texture cptr, + Source cptr, + Dest cptr, + Origin cptr, + Rotation float32, + Tint cptr, +) + +//go:wasmimport _raylib _DrawTextureNPatch +//go:noescape +func drawTextureNPatch( + Texture cptr, + NPatchInfo cptr, + Dest cptr, + Origin cptr, + Rotation float32, + Tint cptr, +) + +//go:wasmimport _raylib _ColorIsEqual +//go:noescape +func colorIsEqual( + ret cptr, + Col1 cptr, + Col2 cptr, +) + +//go:wasmimport _raylib _Fade +//go:noescape +func fade( + ret cptr, + Color cptr, + Alpha float32, +) + +//go:wasmimport _raylib _ColorToInt +//go:noescape +func colorToInt( + ret int32, + Color cptr, +) + +//go:wasmimport _raylib _ColorNormalize +//go:noescape +func colorNormalize( + ret cptr, + Color cptr, +) + +//go:wasmimport _raylib _ColorFromNormalized +//go:noescape +func colorFromNormalized( + ret cptr, + Normalized cptr, +) + +//go:wasmimport _raylib _ColorToHSV +//go:noescape +func colorToHSV( + ret cptr, + Color cptr, +) + +//go:wasmimport _raylib _ColorFromHSV +//go:noescape +func colorFromHSV( + ret cptr, + Hue float32, + Saturation float32, + Value float32, +) + +//go:wasmimport _raylib _ColorTint +//go:noescape +func colorTint( + ret cptr, + Color cptr, + Tint cptr, +) + +//go:wasmimport _raylib _ColorBrightness +//go:noescape +func colorBrightness( + ret cptr, + Color cptr, + Factor float32, +) + +//go:wasmimport _raylib _ColorContrast +//go:noescape +func colorContrast( + ret cptr, + Color cptr, + Contrast float32, +) + +//go:wasmimport _raylib _ColorAlpha +//go:noescape +func colorAlpha( + ret cptr, + Color cptr, + Alpha float32, +) + +//go:wasmimport _raylib _ColorAlphaBlend +//go:noescape +func colorAlphaBlend( + ret cptr, + Dst cptr, + Src cptr, + Tint cptr, +) + +//go:wasmimport _raylib _ColorLerp +//go:noescape +func colorLerp( + ret cptr, + Color1 cptr, + Color2 cptr, + Factor float32, +) + +//go:wasmimport _raylib _GetColor +//go:noescape +func getColor( + ret cptr, + HexValue uint32, +) + +//go:wasmimport _raylib _GetPixelColor +//go:noescape +func getPixelColor( + ret cptr, + SrcPtr cptr, + Format int32, +) + +//go:wasmimport _raylib _SetPixelColor +//go:noescape +func setPixelColor( + DstPtr cptr, + Color cptr, + Format int32, +) + +//go:wasmimport _raylib _GetPixelDataSize +//go:noescape +func getPixelDataSize( + ret int32, + Width int32, + Height int32, + Format int32, +) + +//go:wasmimport _raylib _GetFontDefault +//go:noescape +func getFontDefault( + ret cptr, +) + +//go:wasmimport _raylib _LoadFont +//go:noescape +func loadFont( + ret cptr, + FileName cptr, +) + +//go:wasmimport _raylib _LoadFontEx +//go:noescape +func loadFontEx( + ret cptr, + FileName cptr, + FontSize int32, + Codepoints cptr, + CodepointCount int32, +) + +//go:wasmimport _raylib _LoadFontFromImage +//go:noescape +func loadFontFromImage( + ret cptr, + Image cptr, + Key cptr, + FirstChar int32, +) + +//go:wasmimport _raylib _LoadFontFromMemory +//go:noescape +func loadFontFromMemory( + ret cptr, + FileType cptr, + FileData cptr, + DataSize int32, + FontSize int32, + Codepoints cptr, + CodepointCount int32, +) + +//go:wasmimport _raylib _IsFontValid +//go:noescape +func isFontValid( + ret cptr, + Font cptr, +) + +//go:wasmimport _raylib _LoadFontData +//go:noescape +func loadFontData( + ret cptr, + FileData cptr, + DataSize int32, + FontSize int32, + Codepoints cptr, + CodepointCount int32, + Type int32, + GlyphCount cptr, +) + +//go:wasmimport _raylib _GenImageFontAtlas +//go:noescape +func genImageFontAtlas( + ret cptr, + Glyphs cptr, + GlyphRecs cptr, + GlyphCount int32, + FontSize int32, + Padding int32, + PackMethod int32, +) + +//go:wasmimport _raylib _UnloadFontData +//go:noescape +func unloadFontData( + Glyphs cptr, + GlyphCount int32, +) + +//go:wasmimport _raylib _UnloadFont +//go:noescape +func unloadFont( + Font cptr, +) + +//go:wasmimport _raylib _ExportFontAsCode +//go:noescape +func exportFontAsCode( + ret cptr, + Font cptr, + FileName cptr, +) + +//go:wasmimport _raylib _DrawFPS +//go:noescape +func drawFPS( + PosX int32, + PosY int32, +) + +//go:wasmimport _raylib _DrawText +//go:noescape +func drawText( + Text cptr, + PosX int32, + PosY int32, + FontSize int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawTextEx +//go:noescape +func drawTextEx( + Font cptr, + Text cptr, + Position cptr, + FontSize float32, + Spacing float32, + Tint cptr, +) + +//go:wasmimport _raylib _DrawTextPro +//go:noescape +func drawTextPro( + Font cptr, + Text cptr, + Position cptr, + Origin cptr, + Rotation float32, + FontSize float32, + Spacing float32, + Tint cptr, +) + +//go:wasmimport _raylib _DrawTextCodepoint +//go:noescape +func drawTextCodepoint( + Font cptr, + Codepoint int32, + Position cptr, + FontSize float32, + Tint cptr, +) + +//go:wasmimport _raylib _DrawTextCodepoints +//go:noescape +func drawTextCodepoints( + Font cptr, + Codepoints cptr, + CodepointCount int32, + Position cptr, + FontSize float32, + Spacing float32, + Tint cptr, +) + +//go:wasmimport _raylib _SetTextLineSpacing +//go:noescape +func setTextLineSpacing( + Spacing int32, +) + +//go:wasmimport _raylib _MeasureText +//go:noescape +func measureText( + ret int32, + Text cptr, + FontSize int32, +) + +//go:wasmimport _raylib _MeasureTextEx +//go:noescape +func measureTextEx( + ret cptr, + Font cptr, + Text cptr, + FontSize float32, + Spacing float32, +) + +//go:wasmimport _raylib _GetGlyphIndex +//go:noescape +func getGlyphIndex( + ret int32, + Font cptr, + Codepoint int32, +) + +//go:wasmimport _raylib _GetGlyphInfo +//go:noescape +func getGlyphInfo( + ret cptr, + Font cptr, + Codepoint int32, +) + +//go:wasmimport _raylib _GetGlyphAtlasRec +//go:noescape +func getGlyphAtlasRec( + ret cptr, + Font cptr, + Codepoint int32, +) + +//go:wasmimport _raylib _LoadUTF8 +//go:noescape +func loadUTF8( + ret cptr, + Codepoints cptr, + Length int32, +) + +//go:wasmimport _raylib _UnloadUTF8 +//go:noescape +func unloadUTF8( + Text cptr, +) + +//go:wasmimport _raylib _LoadCodepoints +//go:noescape +func loadCodepoints( + ret cptr, + Text cptr, + Count cptr, +) + +//go:wasmimport _raylib _UnloadCodepoints +//go:noescape +func unloadCodepoints( + Codepoints cptr, +) + +//go:wasmimport _raylib _GetCodepointCount +//go:noescape +func getCodepointCount( + ret int32, + Text cptr, +) + +//go:wasmimport _raylib _GetCodepoint +//go:noescape +func getCodepoint( + ret int32, + Text cptr, + CodepointSize cptr, +) + +//go:wasmimport _raylib _GetCodepointNext +//go:noescape +func getCodepointNext( + ret int32, + Text cptr, + CodepointSize cptr, +) + +//go:wasmimport _raylib _GetCodepointPrevious +//go:noescape +func getCodepointPrevious( + ret int32, + Text cptr, + CodepointSize cptr, +) + +//go:wasmimport _raylib _CodepointToUTF8 +//go:noescape +func codepointToUTF8( + ret cptr, + Codepoint int32, + Utf8Size cptr, +) + +//go:wasmimport _raylib _LoadTextLines +//go:noescape +func loadTextLines( + ret cptr, + Text cptr, + Count cptr, +) + +//go:wasmimport _raylib _UnloadTextLines +//go:noescape +func unloadTextLines( + Text cptr, + LineCount int32, +) + +//go:wasmimport _raylib _TextCopy +//go:noescape +func textCopy( + ret int32, + Dst cptr, + Src cptr, +) + +//go:wasmimport _raylib _TextIsEqual +//go:noescape +func textIsEqual( + ret cptr, + Text1 cptr, + Text2 cptr, +) + +//go:wasmimport _raylib _TextLength +//go:noescape +func textLength( + ret uint32, + Text cptr, +) + +//go:wasmimport _raylib _TextFormat +//go:noescape +func textFormat( + ret cptr, + Text cptr, + Args cptr, +) + +//go:wasmimport _raylib _TextSubtext +//go:noescape +func textSubtext( + ret cptr, + Text cptr, + Position int32, + Length int32, +) + +//go:wasmimport _raylib _TextRemoveSpaces +//go:noescape +func textRemoveSpaces( + ret cptr, + Text cptr, +) + +//go:wasmimport _raylib _GetTextBetween +//go:noescape +func getTextBetween( + ret cptr, + Text cptr, + Begin cptr, + End cptr, +) + +//go:wasmimport _raylib _TextReplace +//go:noescape +func textReplace( + ret cptr, + Text cptr, + Search cptr, + Replacement cptr, +) + +//go:wasmimport _raylib _TextReplaceBetween +//go:noescape +func textReplaceBetween( + ret cptr, + Text cptr, + Begin cptr, + End cptr, + Replacement cptr, +) + +//go:wasmimport _raylib _TextInsert +//go:noescape +func textInsert( + ret cptr, + Text cptr, + Insert cptr, + Position int32, +) + +//go:wasmimport _raylib _TextJoin +//go:noescape +func textJoin( + ret cptr, + TextList cptr, + Count int32, + Delimiter cptr, +) + +//go:wasmimport _raylib _TextSplit +//go:noescape +func textSplit( + ret cptr, + Text cptr, + Delimiter byte, + Count cptr, +) + +//go:wasmimport _raylib _TextAppend +//go:noescape +func textAppend( + Text cptr, + Append cptr, + Position cptr, +) + +//go:wasmimport _raylib _TextFindIndex +//go:noescape +func textFindIndex( + ret int32, + Text cptr, + Search cptr, +) + +//go:wasmimport _raylib _TextToUpper +//go:noescape +func textToUpper( + ret cptr, + Text cptr, +) + +//go:wasmimport _raylib _TextToLower +//go:noescape +func textToLower( + ret cptr, + Text cptr, +) + +//go:wasmimport _raylib _TextToPascal +//go:noescape +func textToPascal( + ret cptr, + Text cptr, +) + +//go:wasmimport _raylib _TextToSnake +//go:noescape +func textToSnake( + ret cptr, + Text cptr, +) + +//go:wasmimport _raylib _TextToCamel +//go:noescape +func textToCamel( + ret cptr, + Text cptr, +) + +//go:wasmimport _raylib _TextToInteger +//go:noescape +func textToInteger( + ret int32, + Text cptr, +) + +//go:wasmimport _raylib _TextToFloat +//go:noescape +func textToFloat( + ret float32, + Text cptr, +) + +//go:wasmimport _raylib _DrawLine3D +//go:noescape +func drawLine3D( + StartPos cptr, + EndPos cptr, + Color cptr, +) + +//go:wasmimport _raylib _DrawPoint3D +//go:noescape +func drawPoint3D( + Position cptr, + Color cptr, +) + +//go:wasmimport _raylib _DrawCircle3D +//go:noescape +func drawCircle3D( + Center cptr, + Radius float32, + RotationAxis cptr, + RotationAngle float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawTriangle3D +//go:noescape +func drawTriangle3D( + V1 cptr, + V2 cptr, + V3 cptr, + Color cptr, +) + +//go:wasmimport _raylib _DrawTriangleStrip3D +//go:noescape +func drawTriangleStrip3D( + Points cptr, + PointCount int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawCube +//go:noescape +func drawCube( + Position cptr, + Width float32, + Height float32, + Length float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawCubeV +//go:noescape +func drawCubeV( + Position cptr, + Size cptr, + Color cptr, +) + +//go:wasmimport _raylib _DrawCubeWires +//go:noescape +func drawCubeWires( + Position cptr, + Width float32, + Height float32, + Length float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawCubeWiresV +//go:noescape +func drawCubeWiresV( + Position cptr, + Size cptr, + Color cptr, +) + +//go:wasmimport _raylib _DrawSphere +//go:noescape +func drawSphere( + CenterPos cptr, + Radius float32, + Color cptr, +) + +//go:wasmimport _raylib _DrawSphereEx +//go:noescape +func drawSphereEx( + CenterPos cptr, + Radius float32, + Rings int32, + Slices int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawSphereWires +//go:noescape +func drawSphereWires( + CenterPos cptr, + Radius float32, + Rings int32, + Slices int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawCylinder +//go:noescape +func drawCylinder( + Position cptr, + RadiusTop float32, + RadiusBottom float32, + Height float32, + Slices int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawCylinderEx +//go:noescape +func drawCylinderEx( + StartPos cptr, + EndPos cptr, + StartRadius float32, + EndRadius float32, + Sides int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawCylinderWires +//go:noescape +func drawCylinderWires( + Position cptr, + RadiusTop float32, + RadiusBottom float32, + Height float32, + Slices int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawCylinderWiresEx +//go:noescape +func drawCylinderWiresEx( + StartPos cptr, + EndPos cptr, + StartRadius float32, + EndRadius float32, + Sides int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawCapsule +//go:noescape +func drawCapsule( + StartPos cptr, + EndPos cptr, + Radius float32, + Slices int32, + Rings int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawCapsuleWires +//go:noescape +func drawCapsuleWires( + StartPos cptr, + EndPos cptr, + Radius float32, + Slices int32, + Rings int32, + Color cptr, +) + +//go:wasmimport _raylib _DrawPlane +//go:noescape +func drawPlane( + CenterPos cptr, + Size cptr, + Color cptr, +) + +//go:wasmimport _raylib _DrawRay +//go:noescape +func drawRay( + Ray cptr, + Color cptr, +) + +//go:wasmimport _raylib _DrawGrid +//go:noescape +func drawGrid( + Slices int32, + Spacing float32, +) + +//go:wasmimport _raylib _LoadModel +//go:noescape +func loadModel( + ret cptr, + FileName cptr, +) + +//go:wasmimport _raylib _LoadModelFromMesh +//go:noescape +func loadModelFromMesh( + ret cptr, + Mesh cptr, +) + +//go:wasmimport _raylib _IsModelValid +//go:noescape +func isModelValid( + ret cptr, + Model cptr, +) + +//go:wasmimport _raylib _UnloadModel +//go:noescape +func unloadModel( + Model cptr, +) + +//go:wasmimport _raylib _GetModelBoundingBox +//go:noescape +func getModelBoundingBox( + ret cptr, + Model cptr, +) + +//go:wasmimport _raylib _DrawModel +//go:noescape +func drawModel( + Model cptr, + Position cptr, + Scale float32, + Tint cptr, +) + +//go:wasmimport _raylib _DrawModelEx +//go:noescape +func drawModelEx( + Model cptr, + Position cptr, + RotationAxis cptr, + RotationAngle float32, + Scale cptr, + Tint cptr, +) + +//go:wasmimport _raylib _DrawModelWires +//go:noescape +func drawModelWires( + Model cptr, + Position cptr, + Scale float32, + Tint cptr, +) + +//go:wasmimport _raylib _DrawModelWiresEx +//go:noescape +func drawModelWiresEx( + Model cptr, + Position cptr, + RotationAxis cptr, + RotationAngle float32, + Scale cptr, + Tint cptr, +) + +//go:wasmimport _raylib _DrawModelPoints +//go:noescape +func drawModelPoints( + Model cptr, + Position cptr, + Scale float32, + Tint cptr, +) + +//go:wasmimport _raylib _DrawModelPointsEx +//go:noescape +func drawModelPointsEx( + Model cptr, + Position cptr, + RotationAxis cptr, + RotationAngle float32, + Scale cptr, + Tint cptr, +) + +//go:wasmimport _raylib _DrawBoundingBox +//go:noescape +func drawBoundingBox( + Box cptr, + Color cptr, +) + +//go:wasmimport _raylib _DrawBillboard +//go:noescape +func drawBillboard( + Camera cptr, + Texture cptr, + Position cptr, + Scale float32, + Tint cptr, +) + +//go:wasmimport _raylib _DrawBillboardRec +//go:noescape +func drawBillboardRec( + Camera cptr, + Texture cptr, + Source cptr, + Position cptr, + Size cptr, + Tint cptr, +) + +//go:wasmimport _raylib _DrawBillboardPro +//go:noescape +func drawBillboardPro( + Camera cptr, + Texture cptr, + Source cptr, + Position cptr, + Up cptr, + Size cptr, + Origin cptr, + Rotation float32, + Tint cptr, +) + +//go:wasmimport _raylib _UploadMesh +//go:noescape +func uploadMesh( + Mesh cptr, + Dynamic cptr, +) + +//go:wasmimport _raylib _UpdateMeshBuffer +//go:noescape +func updateMeshBuffer( + Mesh cptr, + Index int32, + Data cptr, + DataSize int32, + Offset int32, +) + +//go:wasmimport _raylib _UnloadMesh +//go:noescape +func unloadMesh( + Mesh cptr, +) + +//go:wasmimport _raylib _DrawMesh +//go:noescape +func drawMesh( + Mesh cptr, + Material cptr, + Transform cptr, +) + +//go:wasmimport _raylib _DrawMeshInstanced +//go:noescape +func drawMeshInstanced( + Mesh cptr, + Material cptr, + Transforms cptr, + Instances int32, +) + +//go:wasmimport _raylib _GetMeshBoundingBox +//go:noescape +func getMeshBoundingBox( + ret cptr, + Mesh cptr, +) + +//go:wasmimport _raylib _GenMeshTangents +//go:noescape +func genMeshTangents( + Mesh cptr, +) + +//go:wasmimport _raylib _ExportMesh +//go:noescape +func exportMesh( + ret cptr, + Mesh cptr, + FileName cptr, +) + +//go:wasmimport _raylib _ExportMeshAsCode +//go:noescape +func exportMeshAsCode( + ret cptr, + Mesh cptr, + FileName cptr, +) + +//go:wasmimport _raylib _GenMeshPoly +//go:noescape +func genMeshPoly( + ret cptr, + Sides int32, + Radius float32, +) + +//go:wasmimport _raylib _GenMeshPlane +//go:noescape +func genMeshPlane( + ret cptr, + Width float32, + Length float32, + ResX int32, + ResZ int32, +) + +//go:wasmimport _raylib _GenMeshCube +//go:noescape +func genMeshCube( + ret cptr, + Width float32, + Height float32, + Length float32, +) + +//go:wasmimport _raylib _GenMeshSphere +//go:noescape +func genMeshSphere( + ret cptr, + Radius float32, + Rings int32, + Slices int32, +) + +//go:wasmimport _raylib _GenMeshHemiSphere +//go:noescape +func genMeshHemiSphere( + ret cptr, + Radius float32, + Rings int32, + Slices int32, +) + +//go:wasmimport _raylib _GenMeshCylinder +//go:noescape +func genMeshCylinder( + ret cptr, + Radius float32, + Height float32, + Slices int32, +) + +//go:wasmimport _raylib _GenMeshCone +//go:noescape +func genMeshCone( + ret cptr, + Radius float32, + Height float32, + Slices int32, +) + +//go:wasmimport _raylib _GenMeshTorus +//go:noescape +func genMeshTorus( + ret cptr, + Radius float32, + Size float32, + RadSeg int32, + Sides int32, +) + +//go:wasmimport _raylib _GenMeshKnot +//go:noescape +func genMeshKnot( + ret cptr, + Radius float32, + Size float32, + RadSeg int32, + Sides int32, +) + +//go:wasmimport _raylib _GenMeshHeightmap +//go:noescape +func genMeshHeightmap( + ret cptr, + Heightmap cptr, + Size cptr, +) + +//go:wasmimport _raylib _GenMeshCubicmap +//go:noescape +func genMeshCubicmap( + ret cptr, + Cubicmap cptr, + CubeSize cptr, +) + +//go:wasmimport _raylib _LoadMaterials +//go:noescape +func loadMaterials( + ret cptr, + FileName cptr, + MaterialCount cptr, +) + +//go:wasmimport _raylib _LoadMaterialDefault +//go:noescape +func loadMaterialDefault( + ret cptr, +) + +//go:wasmimport _raylib _IsMaterialValid +//go:noescape +func isMaterialValid( + ret cptr, + Material cptr, +) + +//go:wasmimport _raylib _UnloadMaterial +//go:noescape +func unloadMaterial( + Material cptr, +) + +//go:wasmimport _raylib _SetMaterialTexture +//go:noescape +func setMaterialTexture( + Material cptr, + MapType int32, + Texture cptr, +) + +//go:wasmimport _raylib _SetModelMeshMaterial +//go:noescape +func setModelMeshMaterial( + Model cptr, + MeshId int32, + MaterialId int32, +) + +//go:wasmimport _raylib _LoadModelAnimations +//go:noescape +func loadModelAnimations( + ret cptr, + FileName cptr, + AnimCount cptr, +) + +//go:wasmimport _raylib _UpdateModelAnimation +//go:noescape +func updateModelAnimation( + Model cptr, + Anim cptr, + Frame int32, +) + +//go:wasmimport _raylib _UpdateModelAnimationBones +//go:noescape +func updateModelAnimationBones( + Model cptr, + Anim cptr, + Frame int32, +) + +//go:wasmimport _raylib _UnloadModelAnimation +//go:noescape +func unloadModelAnimation( + Anim cptr, +) + +//go:wasmimport _raylib _UnloadModelAnimations +//go:noescape +func unloadModelAnimations( + Animations cptr, + AnimCount int32, +) + +//go:wasmimport _raylib _IsModelAnimationValid +//go:noescape +func isModelAnimationValid( + ret cptr, + Model cptr, + Anim cptr, +) + +//go:wasmimport _raylib _CheckCollisionSpheres +//go:noescape +func checkCollisionSpheres( + ret cptr, + Center1 cptr, + Radius1 float32, + Center2 cptr, + Radius2 float32, +) + +//go:wasmimport _raylib _CheckCollisionBoxes +//go:noescape +func checkCollisionBoxes( + ret cptr, + Box1 cptr, + Box2 cptr, +) + +//go:wasmimport _raylib _CheckCollisionBoxSphere +//go:noescape +func checkCollisionBoxSphere( + ret cptr, + Box cptr, + Center cptr, + Radius float32, +) + +//go:wasmimport _raylib _GetRayCollisionSphere +//go:noescape +func getRayCollisionSphere( + ret cptr, + Ray cptr, + Center cptr, + Radius float32, +) + +//go:wasmimport _raylib _GetRayCollisionBox +//go:noescape +func getRayCollisionBox( + ret cptr, + Ray cptr, + Box cptr, +) + +//go:wasmimport _raylib _GetRayCollisionMesh +//go:noescape +func getRayCollisionMesh( + ret cptr, + Ray cptr, + Mesh cptr, + Transform cptr, +) + +//go:wasmimport _raylib _GetRayCollisionTriangle +//go:noescape +func getRayCollisionTriangle( + ret cptr, + Ray cptr, + P1 cptr, + P2 cptr, + P3 cptr, +) + +//go:wasmimport _raylib _GetRayCollisionQuad +//go:noescape +func getRayCollisionQuad( + ret cptr, + Ray cptr, + P1 cptr, + P2 cptr, + P3 cptr, + P4 cptr, +) + +//go:wasmimport _raylib _InitAudioDevice +//go:noescape +func initAudioDevice() + +//go:wasmimport _raylib _CloseAudioDevice +//go:noescape +func closeAudioDevice() + +//go:wasmimport _raylib _IsAudioDeviceReady +//go:noescape +func isAudioDeviceReady( + ret cptr, +) + +//go:wasmimport _raylib _SetMasterVolume +//go:noescape +func setMasterVolume( + Volume float32, +) + +//go:wasmimport _raylib _GetMasterVolume +//go:noescape +func getMasterVolume( + ret float32, +) + +//go:wasmimport _raylib _LoadWave +//go:noescape +func loadWave( + ret cptr, + FileName cptr, +) + +//go:wasmimport _raylib _LoadWaveFromMemory +//go:noescape +func loadWaveFromMemory( + ret cptr, + FileType cptr, + FileData cptr, + DataSize int32, +) + +//go:wasmimport _raylib _IsWaveValid +//go:noescape +func isWaveValid( + ret cptr, + Wave cptr, +) + +//go:wasmimport _raylib _LoadSound +//go:noescape +func loadSound( + ret cptr, + FileName cptr, +) + +//go:wasmimport _raylib _LoadSoundFromWave +//go:noescape +func loadSoundFromWave( + ret cptr, + Wave cptr, +) + +//go:wasmimport _raylib _LoadSoundAlias +//go:noescape +func loadSoundAlias( + ret cptr, + Source cptr, +) + +//go:wasmimport _raylib _IsSoundValid +//go:noescape +func isSoundValid( + ret cptr, + Sound cptr, +) + +//go:wasmimport _raylib _UpdateSound +//go:noescape +func updateSound( + Sound cptr, + Data cptr, + SampleCount int32, +) + +//go:wasmimport _raylib _UnloadWave +//go:noescape +func unloadWave( + Wave cptr, +) + +//go:wasmimport _raylib _UnloadSound +//go:noescape +func unloadSound( + Sound cptr, +) + +//go:wasmimport _raylib _UnloadSoundAlias +//go:noescape +func unloadSoundAlias( + Alias cptr, +) + +//go:wasmimport _raylib _ExportWave +//go:noescape +func exportWave( + ret cptr, + Wave cptr, + FileName cptr, +) + +//go:wasmimport _raylib _ExportWaveAsCode +//go:noescape +func exportWaveAsCode( + ret cptr, + Wave cptr, + FileName cptr, +) + +//go:wasmimport _raylib _PlaySound +//go:noescape +func playSound( + Sound cptr, +) + +//go:wasmimport _raylib _StopSound +//go:noescape +func stopSound( + Sound cptr, +) + +//go:wasmimport _raylib _PauseSound +//go:noescape +func pauseSound( + Sound cptr, +) + +//go:wasmimport _raylib _ResumeSound +//go:noescape +func resumeSound( + Sound cptr, +) + +//go:wasmimport _raylib _IsSoundPlaying +//go:noescape +func isSoundPlaying( + ret cptr, + Sound cptr, +) + +//go:wasmimport _raylib _SetSoundVolume +//go:noescape +func setSoundVolume( + Sound cptr, + Volume float32, +) + +//go:wasmimport _raylib _SetSoundPitch +//go:noescape +func setSoundPitch( + Sound cptr, + Pitch float32, +) + +//go:wasmimport _raylib _SetSoundPan +//go:noescape +func setSoundPan( + Sound cptr, + Pan float32, +) + +//go:wasmimport _raylib _WaveCopy +//go:noescape +func waveCopy( + ret cptr, + Wave cptr, +) + +//go:wasmimport _raylib _WaveCrop +//go:noescape +func waveCrop( + Wave cptr, + InitFrame int32, + FinalFrame int32, +) + +//go:wasmimport _raylib _WaveFormat +//go:noescape +func waveFormat( + Wave cptr, + SampleRate int32, + SampleSize int32, + Channels int32, +) + +//go:wasmimport _raylib _LoadWaveSamples +//go:noescape +func loadWaveSamples( + ret cptr, + Wave cptr, +) + +//go:wasmimport _raylib _UnloadWaveSamples +//go:noescape +func unloadWaveSamples( + Samples cptr, +) + +//go:wasmimport _raylib _LoadMusicStream +//go:noescape +func loadMusicStream( + ret cptr, + FileName cptr, +) + +//go:wasmimport _raylib _LoadMusicStreamFromMemory +//go:noescape +func loadMusicStreamFromMemory( + ret cptr, + FileType cptr, + Data cptr, + DataSize int32, +) + +//go:wasmimport _raylib _IsMusicValid +//go:noescape +func isMusicValid( + ret cptr, + Music cptr, +) + +//go:wasmimport _raylib _UnloadMusicStream +//go:noescape +func unloadMusicStream( + Music cptr, +) + +//go:wasmimport _raylib _PlayMusicStream +//go:noescape +func playMusicStream( + Music cptr, +) + +//go:wasmimport _raylib _IsMusicStreamPlaying +//go:noescape +func isMusicStreamPlaying( + ret cptr, + Music cptr, +) + +//go:wasmimport _raylib _UpdateMusicStream +//go:noescape +func updateMusicStream( + Music cptr, +) + +//go:wasmimport _raylib _StopMusicStream +//go:noescape +func stopMusicStream( + Music cptr, +) + +//go:wasmimport _raylib _PauseMusicStream +//go:noescape +func pauseMusicStream( + Music cptr, +) + +//go:wasmimport _raylib _ResumeMusicStream +//go:noescape +func resumeMusicStream( + Music cptr, +) + +//go:wasmimport _raylib _SeekMusicStream +//go:noescape +func seekMusicStream( + Music cptr, + Position float32, +) + +//go:wasmimport _raylib _SetMusicVolume +//go:noescape +func setMusicVolume( + Music cptr, + Volume float32, +) + +//go:wasmimport _raylib _SetMusicPitch +//go:noescape +func setMusicPitch( + Music cptr, + Pitch float32, +) + +//go:wasmimport _raylib _SetMusicPan +//go:noescape +func setMusicPan( + Music cptr, + Pan float32, +) + +//go:wasmimport _raylib _GetMusicTimeLength +//go:noescape +func getMusicTimeLength( + ret float32, + Music cptr, +) + +//go:wasmimport _raylib _GetMusicTimePlayed +//go:noescape +func getMusicTimePlayed( + ret float32, + Music cptr, +) + +//go:wasmimport _raylib _LoadAudioStream +//go:noescape +func loadAudioStream( + ret cptr, + SampleRate uint32, + SampleSize uint32, + Channels uint32, +) + +//go:wasmimport _raylib _IsAudioStreamValid +//go:noescape +func isAudioStreamValid( + ret cptr, + Stream cptr, +) + +//go:wasmimport _raylib _UnloadAudioStream +//go:noescape +func unloadAudioStream( + Stream cptr, +) + +//go:wasmimport _raylib _UpdateAudioStream +//go:noescape +func updateAudioStream( + Stream cptr, + Data cptr, + FrameCount int32, +) + +//go:wasmimport _raylib _IsAudioStreamProcessed +//go:noescape +func isAudioStreamProcessed( + ret cptr, + Stream cptr, +) + +//go:wasmimport _raylib _PlayAudioStream +//go:noescape +func playAudioStream( + Stream cptr, +) + +//go:wasmimport _raylib _PauseAudioStream +//go:noescape +func pauseAudioStream( + Stream cptr, +) + +//go:wasmimport _raylib _ResumeAudioStream +//go:noescape +func resumeAudioStream( + Stream cptr, +) + +//go:wasmimport _raylib _IsAudioStreamPlaying +//go:noescape +func isAudioStreamPlaying( + ret cptr, + Stream cptr, +) + +//go:wasmimport _raylib _StopAudioStream +//go:noescape +func stopAudioStream( + Stream cptr, +) + +//go:wasmimport _raylib _SetAudioStreamVolume +//go:noescape +func setAudioStreamVolume( + Stream cptr, + Volume float32, +) + +//go:wasmimport _raylib _SetAudioStreamPitch +//go:noescape +func setAudioStreamPitch( + Stream cptr, + Pitch float32, +) + +//go:wasmimport _raylib _SetAudioStreamPan +//go:noescape +func setAudioStreamPan( + Stream cptr, + Pan float32, +) + +//go:wasmimport _raylib _SetAudioStreamBufferSizeDefault +//go:noescape +func setAudioStreamBufferSizeDefault( + Size int32, +) + +//go:wasmimport _raylib _SetAudioStreamCallback +//go:noescape +func setAudioStreamCallback( + Stream cptr, + Callback cptr, +) + +//go:wasmimport _raylib _AttachAudioStreamProcessor +//go:noescape +func attachAudioStreamProcessor( + Stream cptr, + Processor cptr, +) + +//go:wasmimport _raylib _DetachAudioStreamProcessor +//go:noescape +func detachAudioStreamProcessor( + Stream cptr, + Processor cptr, +) + +//go:wasmimport _raylib _AttachAudioMixedProcessor +//go:noescape +func attachAudioMixedProcessor( + Processor cptr, +) + +//go:wasmimport _raylib _DetachAudioMixedProcessor +//go:noescape +func detachAudioMixedProcessor( + Processor cptr, +) diff --git a/wasm-runtime/rl/go.mod b/wasm-runtime/rl/go.mod new file mode 100644 index 0000000..2556a58 --- /dev/null +++ b/wasm-runtime/rl/go.mod @@ -0,0 +1,4 @@ +module rl + +go 1.25.6 + diff --git a/wasm-runtime/rl/structs_gen_formatted.go b/wasm-runtime/rl/structs_gen_formatted.go new file mode 100644 index 0000000..a10fb6d --- /dev/null +++ b/wasm-runtime/rl/structs_gen_formatted.go @@ -0,0 +1,307 @@ +// AUTOGENERATED FILE. DO NOT EDIT + +//go:build js + +package rl + +// Vector2, 2 components +type Vector2 struct { + X float32 // Vector x component + Y float32 // Vector y component +} + +// Vector3, 3 components +type Vector3 struct { + X float32 // Vector x component + Y float32 // Vector y component + Z float32 // Vector z component +} + +// Vector4, 4 components +type Vector4 struct { + X float32 // Vector x component + Y float32 // Vector y component + Z float32 // Vector z component + W float32 // Vector w component +} + +// Matrix, 4x4 components, column major, OpenGL style, right-handed +type Matrix struct { + M0 float32 // Matrix first row (4 components) + M4 float32 // Matrix first row (4 components) + M8 float32 // Matrix first row (4 components) + M12 float32 // Matrix first row (4 components) + M1 float32 // Matrix second row (4 components) + M5 float32 // Matrix second row (4 components) + M9 float32 // Matrix second row (4 components) + M13 float32 // Matrix second row (4 components) + M2 float32 // Matrix third row (4 components) + M6 float32 // Matrix third row (4 components) + M10 float32 // Matrix third row (4 components) + M14 float32 // Matrix third row (4 components) + M3 float32 // Matrix fourth row (4 components) + M7 float32 // Matrix fourth row (4 components) + M11 float32 // Matrix fourth row (4 components) + M15 float32 // Matrix fourth row (4 components) +} + +// Color, 4 components, R8G8B8A8 (32bit) +type Color struct { + R byte // Color red value + G byte // Color green value + B byte // Color blue value + A byte // Color alpha value +} + +// Rectangle, 4 components +type Rectangle struct { + X float32 // Rectangle top-left corner position x + Y float32 // Rectangle top-left corner position y + Width float32 // Rectangle width + Height float32 // Rectangle height +} + +// Image, pixel data stored in CPU memory (RAM) +type Image struct { + Data cptr // Image raw data + Width int32 // Image base width + Height int32 // Image base height + Mipmaps int32 // Mipmap levels, 1 by default + Format int32 // Data format (PixelFormat type) +} + +// Texture, tex data stored in GPU memory (VRAM) +type Texture struct { + Id uint32 // OpenGL texture id + Width int32 // Texture base width + Height int32 // Texture base height + Mipmaps int32 // Mipmap levels, 1 by default + Format int32 // Data format (PixelFormat type) +} + +// RenderTexture, fbo for texture rendering +type RenderTexture struct { + Id uint32 // OpenGL framebuffer object id + Texture Texture // Color buffer attachment texture + Depth Texture // Depth buffer attachment texture +} + +// NPatchInfo, 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 int32 // Layout of the n-patch: 3x3, 1x3 or 3x1 +} + +// GlyphInfo, font characters glyphs info +type GlyphInfo struct { + Value int32 // Character value (Unicode) + OffsetX int32 // Character offset X when drawing + OffsetY int32 // Character offset Y when drawing + AdvanceX int32 // Character advance position X + Image Image // Character image data +} + +// Font, font texture and GlyphInfo array data +type Font struct { + BaseSize int32 // Base size (default chars height) + GlyphCount int32 // Number of glyph characters + GlyphPadding int32 // Padding around the glyph characters + Texture Texture2D // Texture atlas containing the glyphs + Recs cptr // Rectangles in texture for the glyphs + Glyphs cptr // Glyphs info data +} + +// Camera, defines position/orientation in 3d space +type Camera3D struct { + Position Vector3 // Camera position + Target Vector3 // Camera target it looks-at + Up Vector3 // Camera up vector (rotation over its axis) + Fovy float32 // Camera field-of-view aperture in Y (degrees) in perspective, used as near plane height in world units in orthographic + Projection int32 // Camera projection: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC +} + +// Camera2D, defines position/orientation in 2d space +type Camera2D struct { + Offset Vector2 // Camera offset (screen space offset from window origin) + Target Vector2 // Camera target (world space target point that is mapped to screen space offset) + Rotation float32 // Camera rotation in degrees (pivots around target) + Zoom float32 // Camera zoom (scaling around target), must not be set to 0, set to 1.0f for no scale +} + +// Mesh, vertex data and vao/vbo +type Mesh struct { + VertexCount int32 // Number of vertices stored in arrays + TriangleCount int32 // Number of triangles stored (indexed or not) + Vertices cptr // Vertex position (XYZ - 3 components per vertex) (shader-location = 0) + Texcoords cptr // Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1) + Texcoords2 cptr // Vertex texture second coordinates (UV - 2 components per vertex) (shader-location = 5) + Normals cptr // Vertex normals (XYZ - 3 components per vertex) (shader-location = 2) + Tangents cptr // Vertex tangents (XYZW - 4 components per vertex) (shader-location = 4) + Colors cptr // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3) + Indices cptr // Vertex indices (in case vertex data comes indexed) + AnimVertices cptr // Animated vertex positions (after bones transformations) + AnimNormals cptr // Animated normals (after bones transformations) + BoneIds cptr // Vertex bone ids, max 255 bone ids, up to 4 bones influence by vertex (skinning) (shader-location = 6) + BoneWeights cptr // Vertex bone weight, up to 4 bones influence by vertex (skinning) (shader-location = 7) + BoneMatrices cptr // Bones animated transformation matrices + BoneCount int32 // Number of bones + VaoId uint32 // OpenGL Vertex Array Object id + VboId cptr // OpenGL Vertex Buffer Objects id (default vertex data) +} + +// Shader +type Shader struct { + Id uint32 // Shader program id + Locs cptr // Shader locations array (RL_MAX_SHADER_LOCATIONS) +} + +// MaterialMap +type MaterialMap struct { + Texture Texture2D // Material map texture + Color Color // Material map color + Value float32 // Material map value +} + +// Material, includes shader and maps +type Material struct { + Shader Shader // Material shader + Maps cptr // Material maps array (MAX_MATERIAL_MAPS) + Params [4]float32 // Material generic parameters (if required) +} + +// Transform, vertex transformation data +type Transform struct { + Translation Vector3 // Translation + Rotation Quaternion // Rotation + Scale Vector3 // Scale +} + +// Bone, skeletal animation bone +type BoneInfo struct { + Name [32]byte // Bone name + Parent int32 // Bone parent +} + +// Model, meshes, materials and animation data +type Model struct { + Transform Matrix // Local transform matrix + MeshCount int32 // Number of meshes + MaterialCount int32 // Number of materials + Meshes cptr // Meshes array + Materials cptr // Materials array + MeshMaterial cptr // Mesh material number + BoneCount int32 // Number of bones + Bones cptr // Bones information (skeleton) + BindPose cptr // Bones base transformation (pose) +} + +// ModelAnimation +type ModelAnimation struct { + BoneCount int32 // Number of bones + FrameCount int32 // Number of animation frames + Bones cptr // Bones information (skeleton) + FramePoses cptr // Poses array by frame + Name [32]byte // Animation name +} + +// Ray, ray for raycasting +type Ray struct { + Position Vector3 // Ray position (origin) + Direction Vector3 // Ray direction (normalized) +} + +// RayCollision, ray hit information +type RayCollision struct { + Hit bool // Did the ray hit something? + Distance float32 // Distance to the nearest hit + Point Vector3 // Point of the nearest hit + Normal Vector3 // Surface normal of hit +} + +// BoundingBox +type BoundingBox struct { + Min Vector3 // Minimum vertex box-corner + Max Vector3 // Maximum vertex box-corner +} + +// Wave, audio wave data +type Wave struct { + FrameCount uint32 // Total number of frames (considering channels) + SampleRate uint32 // Frequency (samples per second) + SampleSize uint32 // Bit depth (bits per sample): 8, 16, 32 (24 not supported) + Channels uint32 // Number of channels (1-mono, 2-stereo, ...) + Data cptr // Buffer data pointer +} + +// AudioStream, custom audio stream +type AudioStream struct { + Buffer cptr // Pointer to internal data used by the audio system + Processor cptr // Pointer to internal data processor, useful for audio effects + SampleRate uint32 // Frequency (samples per second) + SampleSize uint32 // Bit depth (bits per sample): 8, 16, 32 (24 not supported) + Channels uint32 // Number of channels (1-mono, 2-stereo, ...) +} + +// Sound +type Sound struct { + Stream AudioStream // Audio stream + FrameCount uint32 // Total number of frames (considering channels) +} + +// Music, audio stream, anything longer than ~10 seconds should be streamed +type Music struct { + Stream AudioStream // Audio stream + FrameCount uint32 // Total number of frames (considering channels) + Looping bool // Music looping enable + CtxType int32 // Type of music context (audio filetype) + CtxData cptr // Audio context data, depends on type +} + +// 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 + 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 +} + +// 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 +} + +// File path list +type FilePathList struct { + Count uint32 // Filepaths entries count + Paths cptr // Filepaths entries +} + +// Automation event +type AutomationEvent struct { + Frame uint32 // Event frame + Type uint32 // Event type (AutomationEventType) + Params [4]int32 // Event parameters (if required) +} + +// Automation event list +type AutomationEventList struct { + Capacity uint32 // Events max entries (MAX_AUTOMATION_EVENTS) + Count uint32 // Events entries count + Events cptr // Events entries +} diff --git a/wasm-runtime/rl/wasm.go b/wasm-runtime/rl/wasm.go new file mode 100644 index 0000000..7b790d2 --- /dev/null +++ b/wasm-runtime/rl/wasm.go @@ -0,0 +1,150 @@ +//go:build js + +package rl + +import ( + "syscall/js" + "unsafe" +) + +// cptr is a pointer to raylib wasm memory +type cptr = uint32 + +// Allocates memory on raylib heap +// +//go:wasmimport raylib _malloc +//go:noescape +func malloc(size cptr) cptr + +// malloc the size of V +func mallocV[T any](V T) (cptr, func()) { + ptr := malloc(sizeof(V)) + return ptr, func() { free(ptr) } +} + +// free memory allocated on raylib heap +// +//go:wasmimport raylib _free +//go:noescape +func free(cptr) + +// _copyToC copies a Go type/struct to C memory. Useful for copying slices and structs. +// +// Destination C array must have enough space. +// +// NOTE: Value must be a type, it cannot be a slice. +// To pass a slice, use [unsafe.SliceData] +// +//go:wasmimport gojs CopyToC +//go:noescape +func _copyToC(Value unsafe.Pointer, srcSize, dstCptr cptr) + +// copies C memory to a Go pointer. Useful for copying C structs into Go structs +// +// example usage: +// +// type Person struct{ +// Age int32 +// } +// +// var cPtrToPersonInCHeap cptr = ... +// +// var p Person +// CopyToGo(unsafe.Pointer(&p),unsafe.SizeOf(p),cPtrToPersonInCHeap) +// +// p.Age == (whatever it was in C) +// +//go:wasmimport gojs CopyToGo +//go:noescape +func _copyToGo(dstGoPtr unsafe.Pointer, size cptr, src cptr) + +// Copies the src value to the dst cptr +func copyToC[T any](src T, dst cptr) { + size := sizeof(src) + _copyToC(unsafe.Pointer(&src), size, dst) +} + +// The alocated C string lives on the raylib heap and must be free()'d +// +//go:wasmimport gojs CStringFromGoString +//go:noescape +func cString(string) cptr + +// Scan for null terminator and return length excluding the null terminator. +// +//go:wasmimport gojs CStringGetLength +//go:noescape +func _cStringGetLength(cstr cptr) cptr + +// Copies a C string to Go memory without freeing the C string. +func goString(cstr cptr) string { + size := _cStringGetLength(cstr) + dstStr := make([]byte, size) + copySliceToGo(cstr, dstStr) + return string(dstStr) +} + +// copyValueToC copies a value to C and returns a pointer to it. +// +// NOTE: Value cannot be a slice. For a slice, use [copySliceToC] +func copyValueToC[T any](srcValue T) (cptr, func()) { + dst, free := mallocV(srcValue) + copyToC(srcValue, dst) + return dst, free +} + +// copySliceToC allocates a copy of a slice in C memory and returns a cptr to it. +// +// NOTE: Value MUST be a slice +func copySliceToC[Slice ~[]E, E any](s Slice) (cptr, func()) { + // size of the slice's underlying array in bytes + sliceSize := cptr(unsafe.Sizeof(s[:1][0])) * cptr(len(s)) + // allocate C array to hold Value + dstCptr := malloc(sliceSize) + // copy underlying array memory to C + _copyToC(unsafe.Pointer(unsafe.SliceData(s)), sliceSize, dstCptr) + return dstCptr, func() { free(dstCptr) } +} + +// copyValueToGo copies a value from C memory to Go memory. +// Useful for copying structs +// +// NOTE: Slices are not supported. Use [copySliceToGo] +func copyValueToGo[T any](src cptr, dst *T) { + size := sizeof(*dst) + _copyToGo(unsafe.Pointer(dst), size, src) +} + +// copySliceToGo copies a C array into a Go Slice. +// +// It copies bytes to the underlying array of the slice. +func copySliceToGo[Slice ~[]E, E any](src cptr, dst Slice) { + // size of underlying array + var occupiedSize = len(dst) + if occupiedSize == 0 { + occupiedSize = cap(dst) + } + size := cptr(unsafe.Sizeof(dst[0])) * cptr(occupiedSize) + dstPtr := unsafe.SliceData(dst) + _copyToGo(unsafe.Pointer(dstPtr), size, src) +} + +//go:wasmimport gojs Alert +//go:noescape +func alert(string) + +// Use this instead of a for loop on web platform +// Everything that you would do inside the for-loop must be done inside UpdateAndDrawFrame +func SetMain(UpdateAndDrawFrame func()) { + var updateLoop js.Func + updateLoop = js.FuncOf(func(this js.Value, args []js.Value) any { + UpdateAndDrawFrame() + js.Global().Call("requestAnimationFrame", updateLoop) + return nil + }) + js.Global().Call("requestAnimationFrame", updateLoop) + select {} +} + +// return sizeof of v in bytes +func sizeof[T any](v T) cptr { return cptr(unsafe.Sizeof(v)) } diff --git a/wasm-runtime/templates/aliases.go.gotmpl b/wasm-runtime/templates/aliases.go.gotmpl new file mode 100644 index 0000000..717f967 --- /dev/null +++ b/wasm-runtime/templates/aliases.go.gotmpl @@ -0,0 +1,16 @@ +{{- $root := . -}} + +// AUTOGENERATED FILE. DO NOT EDIT +{{if .BuildTags}} +//go:build {{.BuildTags}} +{{end}} +package rl + +{{- range .Imports }} +import {{ . }} +{{- end }} + +{{- range .Aliases}} +// {{ .Description}} +type {{ .Name}} = {{.Type}} +{{- end}} diff --git a/wasm-runtime/templates/defines.go.gotmpl b/wasm-runtime/templates/defines.go.gotmpl new file mode 100644 index 0000000..56513eb --- /dev/null +++ b/wasm-runtime/templates/defines.go.gotmpl @@ -0,0 +1,30 @@ +{{- $root := . -}} + +// AUTOGENERATED FILE. DO NOT EDIT +{{if .BuildTags}} +//go:build {{.BuildTags}} +{{end}} +package rl + +{{- range .Imports }} +import {{ . }} +{{- end }} + + +{{- range .Defines}} +{{if contains .Type "INT" "FLOAT" "FLOAT_MATH" "STRING" }} + {{if .Description}} + // {{- .Description}} + {{- end}} + const {{.Name}} = {{.Value}} +{{- end}} +{{if contains .Type "COLOR"}} + //{{- .Description}} + var {{.Name}} = {{.Value}} +{{- end}} + +{{if contains .Type "UNKNOWN"}} + // {{- .Description}} + {{.Value}} +{{- end}} +{{- end}} diff --git a/wasm-runtime/templates/enums.go.gotmpl b/wasm-runtime/templates/enums.go.gotmpl new file mode 100644 index 0000000..f06dd4b --- /dev/null +++ b/wasm-runtime/templates/enums.go.gotmpl @@ -0,0 +1,23 @@ + +{{- $root := . -}} + +// AUTOGENERATED FILE. DO NOT EDIT +{{if .BuildTags}} +//go:build {{.BuildTags}} +{{end}} +package rl + +{{- range .Imports }} +import {{ . }} +{{- end }} + +{{- range .Enums}} +// {{ .Description}} +type {{ .Name}} = int32 +const ( + {{- range .Values}} + // {{.Description}} + {{.Name}} = {{.Value}} + {{- end}} +) +{{- end}} diff --git a/wasm-runtime/templates/funcimport.go.gotmpl b/wasm-runtime/templates/funcimport.go.gotmpl new file mode 100644 index 0000000..0571118 --- /dev/null +++ b/wasm-runtime/templates/funcimport.go.gotmpl @@ -0,0 +1,20 @@ +{{- $root := . -}} + +// AUTOGENERATED FILE. DO NOT EDIT +{{if .BuildTags}} +//go:build {{.BuildTags}} +{{end}} +package rl + +{{- range .Imports }} +import {{ . }} +{{- end }} + +{{- range .FuncImports}} +{{ .Description}} +func {{.Name}} ( + {{- range .Params}} + {{.Name}} {{.Type}}, + {{- end}} +) +{{- end}} diff --git a/wasm-runtime/templates/structs.go.gotmpl b/wasm-runtime/templates/structs.go.gotmpl new file mode 100644 index 0000000..46f641b --- /dev/null +++ b/wasm-runtime/templates/structs.go.gotmpl @@ -0,0 +1,22 @@ +{{- $root := . -}} + +// AUTOGENERATED FILE. DO NOT EDIT +{{if .BuildTags}} +//go:build {{.BuildTags}} +{{end}} +package rl + +{{- range .Imports }} +import {{ . }} +{{- end }} + +{{- range .Structs}} + +// {{ .Description}} +type {{ .Name}} struct { + {{- range .Fields }} + {{ .Name }} {{ .Type }} // {{.Description}} + {{- end }} +} + +{{- end}} diff --git a/wasm-runtime/templates/templates.go b/wasm-runtime/templates/templates.go new file mode 100644 index 0000000..3600221 --- /dev/null +++ b/wasm-runtime/templates/templates.go @@ -0,0 +1,57 @@ +package templates + +import ( + "bytes" + _ "embed" + "fmt" + "go/format" + "os" + "text/template" +) + +// LoadTemplate takes in a gotempl as a string and a name for the template. +// It panics if template could not be parsed. +func LoadTemplate(templ, name string) *template.Template { + return template.Must(template.New(name). + Parse(templ)) +} + +// LoadTemplate takes in a gotempl as a string and a name for the template. +// It panics if template could not be parsed. +func LoadTemplateFuncs(templ, name string, funcs template.FuncMap) *template.Template { + return template.Must(template.New(name). + Funcs(funcs). + Parse(templ)) +} + +// GenerateCode will generate the template using model. and write a file to disk in the format: +// rl/{name}_gen_unformatted.go +func GenerateCode(model any, templ string, name string, funcs template.FuncMap) { + structs := LoadTemplateFuncs(templ, name, funcs) + var buf bytes.Buffer + if err := structs.Execute(&buf, model); err != nil { + panic(err) + } + if err := os.WriteFile(fmt.Sprintf("rl/%s_gen_unformatted.go", name), buf.Bytes(), 0644); err != nil { + panic(err) + } +} + +// GenerateCode will generate the template using model. and write a file to disk in the format: +// rl/{name}_gen_formatted.go +func GenerateCodeFormatted(model any, templ string, name string, funcs template.FuncMap) { + structs := LoadTemplateFuncs(templ, name, funcs) + var buf bytes.Buffer + if err := structs.Execute(&buf, model); err != nil { + panic(err) + } + + formatted, err := format.Source(buf.Bytes()) + if err != nil { + panic(err) + } + + if err := os.WriteFile(fmt.Sprintf("rl/%s_gen_formatted.go", name), formatted, 0644); err != nil { + panic(err) + } +} diff --git a/wasm-runtime/util.go b/wasm-runtime/util.go new file mode 100644 index 0000000..e4989fb --- /dev/null +++ b/wasm-runtime/util.go @@ -0,0 +1,124 @@ +package main + +import ( + "codegen/api" + "fmt" + "slices" + "strings" + "unicode" + + "github.com/iancoleman/strcase" +) + +// GoTypeFromC maps a C type to a Go type +var oneToOneTypes = map[string]string{ + "char": "byte", + "float": "float32", + "double": "float64", + "unsigned char": "byte", + "unsigned int": "uint32", + "int": "int32", +} + +func GoTypeFromC(t string) string { + if mapping, ok := oneToOneTypes[t]; ok { + return mapping + } + runed := []rune(t) + if runed[len(runed)-1] == '*' { + return "cptr" + } + if index := slices.Index(runed, '['); index >= 0 { + arraySize := runed[index:] + arrayType := runed[:index] + arrayType = []rune(GoTypeFromC(string(arrayType))) + return string(arraySize) + string(arrayType) + } + return t +} + +// ParseDefines prepares data for inserting into the template. +// Different C #define macros map to different Go constructs. +// +// It also makes the Name of the define PascalCase +// This function maps them to the proper Go constructs. +// See template templates/defines.go.gotmpl +func ParseDefines(defs []api.RlDefine) { + for i, d := range defs { + def := &defs[i] + // make name of defines PascalCase + def.Name = PascalCase(def.Name) + switch d.Type { + case "STRING": + // add quotes around value so the template can do const {{.Name}} = {{.Value}} + def.Value = "\"" + def.Value + "\"" + case "FLOAT_MATH": + // remove the trailing "f" from float values. + def.Value = api.StringyValue(strings.ReplaceAll(string(def.Value), "f", "")) + // make PI pascal case. + def.Value = api.StringyValue(strings.ReplaceAll(string(def.Value), "PI", "Pi")) + case "COLOR": + // turn CLITERAL(Color){ 200, 200, 200, 255 } into Color{ 200, 200, 200, 255 } + v := strings.ReplaceAll(string(def.Value), "CLITERAL(Color)", "Color") + def.Value = api.StringyValue(v) + case "UNKNOWN": + // Special cases need to be handled properly. + switch def.Name { + case "GetMouseRay": + def.Value = api.StringyValue(fmt.Sprintf("var %s = %s", def.Name, def.Value)) + case "Rlapi": + *def = api.RlDefine{} + default: + def.Value = api.StringyValue( + fmt.Sprintf("const %v = %v", def.Name, PascalCase(string(def.Value))), + ) + } + } + } +} + +// Sets the Name field to PascaleCase. And converts type field to a Go type. +func ProcessStructFields(fields []api.RlField) { + for i := range fields { + f := &fields[i] + f.Name = PascalCase(f.Name) + f.Type = GoTypeFromC(f.Type) + } +} + +// Use for adding custom acronym mapping for PascalCase conversion. Eg. (DEG2RAD:Deg2Rad) +func RegisterPascalCaseAcronym(key, val string) { + strcase.ConfigureAcronym(key, val) +} + +func PascalCaseEnums(enums []api.RlEnum) { + for i := range enums { + enum := enums[i] + for i := range enum.Values { + v := &enum.Values[i] + v.Name = PascalCase(v.Name) + } + } +} + +// convert string to PascalCase +func PascalCase(v string) string { return strcase.ToCamel(v) } + +func firstLetterLower(s string) string { + var b strings.Builder + b.Grow(len(s)) + // first letter lowercase + b.WriteRune(unicode.ToLower([]rune(s)[0])) + // remaining + b.WriteString(string([]rune(s)[1:])) + return b.String() +} +func firstLetterUpper(s string) string { + var b strings.Builder + b.Grow(len(s)) + // first letter lowercase + b.WriteRune(unicode.ToUpper([]rune(s)[0])) + // remaining + b.WriteString(string([]rune(s)[1:])) + return b.String() +} From f73030efa86262fdba7b78aab02e57f5ecb9da6b Mon Sep 17 00:00:00 2001 From: BrownNPC Date: Tue, 21 Apr 2026 16:01:30 +0500 Subject: [PATCH 2/9] add runtime --- wasm-runtime/codegen.go | 70 ------------------- wasm-runtime/funcimport.go | 58 ---------------- wasm-runtime/go.mod | 6 +- wasm-runtime/go.sum | 2 - wasm-runtime/util.go | 124 ---------------------------------- wasm-runtime/{rl => }/wasm.go | 2 +- 6 files changed, 3 insertions(+), 259 deletions(-) delete mode 100644 wasm-runtime/codegen.go delete mode 100644 wasm-runtime/funcimport.go delete mode 100644 wasm-runtime/go.sum delete mode 100644 wasm-runtime/util.go rename wasm-runtime/{rl => }/wasm.go (99%) diff --git a/wasm-runtime/codegen.go b/wasm-runtime/codegen.go deleted file mode 100644 index 7891585..0000000 --- a/wasm-runtime/codegen.go +++ /dev/null @@ -1,70 +0,0 @@ -package main - -import ( - "codegen/api" - "codegen/templates" - _ "embed" - "slices" - "text/template" -) - -//go:embed templates/structs.go.gotmpl -var structsTempl string - -//go:embed templates/defines.go.gotmpl -var definesTempl string - -//go:embed templates/enums.go.gotmpl -var enumsTempl string - -//go:embed templates/aliases.go.gotmpl -var aliasesTempl string - -//go:embed templates/funcimport.go.gotmpl -var funcImportTempl string - -type Model struct { - BuildTags string - Imports []string - Structs []api.RlStruct - Defines []api.RlDefine - Enums []api.RlEnum - Aliases []api.RlAlias - // go:wasmimport based function imports - FuncImports []FuncDef -} - -func main() { - m := Model{ - BuildTags: "js", - Imports: []string{}, - Structs: slices.Clone(api.Api.Structs), - // C #define macros need special parsing. And Names need to be PascalCase. - Defines: slices.Clone(api.Api.Defines), - Enums: slices.Clone(api.Api.Enums), - Aliases: slices.Clone(api.Api.Aliases), - FuncImports: slices.Clone(api.Api.Functions), - } - RegisterPascalCaseAcronym("DARKGREEN", "DarkGreen") - ParseDefines(m.Defines) - // convert C types to Go and use PascalCase for field names. - for _, s := range m.Structs { - ProcessStructFields(s.Fields) - } - for i, f := range m.FuncImports { - m.FuncImports[i] = TransformIntoWasmImport(f) - } - - // Use PascalCase for enum names. - PascalCaseEnums(m.Enums) - funcs := template.FuncMap{ - "eq": func(a, b any) bool { return a == b }, - "contains": func(a any, b ...any) bool { return slices.Contains(b, a) }, - } - templates.GenerateCodeFormatted(m, structsTempl, "structs", nil) - templates.GenerateCodeFormatted(m, enumsTempl, "enums", nil) - templates.GenerateCodeFormatted(m, definesTempl, "defines", funcs) - templates.GenerateCodeFormatted(m, aliasesTempl, "aliases", funcs) - templates.GenerateCodeFormatted(m, aliasesTempl, "aliases", funcs) - templates.GenerateCode(m, funcImportTempl, "funcimport", funcs) -} diff --git a/wasm-runtime/funcimport.go b/wasm-runtime/funcimport.go deleted file mode 100644 index ce7a91b..0000000 --- a/wasm-runtime/funcimport.go +++ /dev/null @@ -1,58 +0,0 @@ -package main - -import ( - "codegen/api" - "fmt" - "slices" - "strings" -) - -// FuncImport defines a go:wasmimport function import -type FuncDef = api.RlFunction /* - Name string - Description string - ReturnType string - Params []FuncArg -*/ -type FuncParam = api.RlParam /* - Type string - Name string -*/ - -// Takes in a raw C function definition from raylib's json. -// and produces a //go:wasmimport _raylib -// func (args) -func TransformIntoWasmImport(f FuncDef) FuncDef { - importStatement := fmt.Sprintf("//go:wasmimport _raylib _%s\n", f.Name) - - var comment strings.Builder - comment.WriteString(importStatement) - comment.WriteString("//go:noescape") - - for i, p := range f.Params { - p.Name = firstLetterUpper(p.Name) - // if the type does not map one to one, then it's a cptr. - p.Type = mapGoTypeOneToOne(p.Type) - f.Params[i] = p - } - if f.ReturnType != "void" { - p := FuncParam{Name: "ret", Type: mapGoTypeOneToOne(f.ReturnType)} - f.Params = slices.Concat([]FuncParam{p}, f.Params) - } - final := FuncDef{ - Name: firstLetterLower(f.Name), - Description: comment.String(), - ReturnType: f.ReturnType, - Params: f.Params, - } - return final -} - -// If the C type maps directly to a Go type. Return that, otherwise return cptr. -func mapGoTypeOneToOne(t string) string { - if t, isOneToOne := oneToOneTypes[t]; !isOneToOne { - return "cptr" - } else { - return t - } -} diff --git a/wasm-runtime/go.mod b/wasm-runtime/go.mod index ce211ca..9e29a39 100644 --- a/wasm-runtime/go.mod +++ b/wasm-runtime/go.mod @@ -1,5 +1,3 @@ -module codegen +module github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime -go 1.25.6 - -require github.com/iancoleman/strcase v0.3.0 // indirect +go 1.26.1 diff --git a/wasm-runtime/go.sum b/wasm-runtime/go.sum deleted file mode 100644 index 6261b6a..0000000 --- a/wasm-runtime/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= -github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= diff --git a/wasm-runtime/util.go b/wasm-runtime/util.go deleted file mode 100644 index e4989fb..0000000 --- a/wasm-runtime/util.go +++ /dev/null @@ -1,124 +0,0 @@ -package main - -import ( - "codegen/api" - "fmt" - "slices" - "strings" - "unicode" - - "github.com/iancoleman/strcase" -) - -// GoTypeFromC maps a C type to a Go type -var oneToOneTypes = map[string]string{ - "char": "byte", - "float": "float32", - "double": "float64", - "unsigned char": "byte", - "unsigned int": "uint32", - "int": "int32", -} - -func GoTypeFromC(t string) string { - if mapping, ok := oneToOneTypes[t]; ok { - return mapping - } - runed := []rune(t) - if runed[len(runed)-1] == '*' { - return "cptr" - } - if index := slices.Index(runed, '['); index >= 0 { - arraySize := runed[index:] - arrayType := runed[:index] - arrayType = []rune(GoTypeFromC(string(arrayType))) - return string(arraySize) + string(arrayType) - } - return t -} - -// ParseDefines prepares data for inserting into the template. -// Different C #define macros map to different Go constructs. -// -// It also makes the Name of the define PascalCase -// This function maps them to the proper Go constructs. -// See template templates/defines.go.gotmpl -func ParseDefines(defs []api.RlDefine) { - for i, d := range defs { - def := &defs[i] - // make name of defines PascalCase - def.Name = PascalCase(def.Name) - switch d.Type { - case "STRING": - // add quotes around value so the template can do const {{.Name}} = {{.Value}} - def.Value = "\"" + def.Value + "\"" - case "FLOAT_MATH": - // remove the trailing "f" from float values. - def.Value = api.StringyValue(strings.ReplaceAll(string(def.Value), "f", "")) - // make PI pascal case. - def.Value = api.StringyValue(strings.ReplaceAll(string(def.Value), "PI", "Pi")) - case "COLOR": - // turn CLITERAL(Color){ 200, 200, 200, 255 } into Color{ 200, 200, 200, 255 } - v := strings.ReplaceAll(string(def.Value), "CLITERAL(Color)", "Color") - def.Value = api.StringyValue(v) - case "UNKNOWN": - // Special cases need to be handled properly. - switch def.Name { - case "GetMouseRay": - def.Value = api.StringyValue(fmt.Sprintf("var %s = %s", def.Name, def.Value)) - case "Rlapi": - *def = api.RlDefine{} - default: - def.Value = api.StringyValue( - fmt.Sprintf("const %v = %v", def.Name, PascalCase(string(def.Value))), - ) - } - } - } -} - -// Sets the Name field to PascaleCase. And converts type field to a Go type. -func ProcessStructFields(fields []api.RlField) { - for i := range fields { - f := &fields[i] - f.Name = PascalCase(f.Name) - f.Type = GoTypeFromC(f.Type) - } -} - -// Use for adding custom acronym mapping for PascalCase conversion. Eg. (DEG2RAD:Deg2Rad) -func RegisterPascalCaseAcronym(key, val string) { - strcase.ConfigureAcronym(key, val) -} - -func PascalCaseEnums(enums []api.RlEnum) { - for i := range enums { - enum := enums[i] - for i := range enum.Values { - v := &enum.Values[i] - v.Name = PascalCase(v.Name) - } - } -} - -// convert string to PascalCase -func PascalCase(v string) string { return strcase.ToCamel(v) } - -func firstLetterLower(s string) string { - var b strings.Builder - b.Grow(len(s)) - // first letter lowercase - b.WriteRune(unicode.ToLower([]rune(s)[0])) - // remaining - b.WriteString(string([]rune(s)[1:])) - return b.String() -} -func firstLetterUpper(s string) string { - var b strings.Builder - b.Grow(len(s)) - // first letter lowercase - b.WriteRune(unicode.ToUpper([]rune(s)[0])) - // remaining - b.WriteString(string([]rune(s)[1:])) - return b.String() -} diff --git a/wasm-runtime/rl/wasm.go b/wasm-runtime/wasm.go similarity index 99% rename from wasm-runtime/rl/wasm.go rename to wasm-runtime/wasm.go index 7b790d2..77531b5 100644 --- a/wasm-runtime/rl/wasm.go +++ b/wasm-runtime/wasm.go @@ -1,6 +1,6 @@ //go:build js -package rl +package wasm import ( "syscall/js" From 7c24b2d5e6d33dd1a60d258a9c7d464571285de3 Mon Sep 17 00:00:00 2001 From: BrownNPC Date: Tue, 21 Apr 2026 16:03:50 +0500 Subject: [PATCH 3/9] add js side of runtime --- index/index.html | 50 --------------- index/index.js | 58 +++++++++++------- index/runtime.js | 154 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 191 insertions(+), 71 deletions(-) create mode 100644 index/runtime.js diff --git a/index/index.html b/index/index.html index 6a1d51c..14a03dc 100644 --- a/index/index.html +++ b/index/index.html @@ -1,61 +1,11 @@ - - -
-
-
-
Loading…
-
-
- diff --git a/index/index.js b/index/index.js index d19f170..c45762b 100644 --- a/index/index.js +++ b/index/index.js @@ -1,30 +1,46 @@ -const overlay = document.getElementById('loading-overlay'); -function hideOverlay() { overlay.style.display = 'none' } -function showOverlay() { overlay.style.display = 'flex' } - -// show loading overlay -showOverlay(); +// disable right click context menu +document.getElementById("canvas").addEventListener( + "contextmenu", + (e) => e.preventDefault(), +); +// INITIALIZE RAYLIB import Module from "./rl/raylib.js"; - const wasmBinary = await fetch("./rl/raylib.wasm") - .then(r => r.arrayBuffer()); - -// disable right click context menu -document.getElementById("canvas").addEventListener('contextmenu', e => e.preventDefault()) + .then((r) => r.arrayBuffer()); -let mod = await Module({ - canvas: document.getElementById('canvas'), +const raylib = await Module({ + canvas: document.getElementById("canvas"), wasmBinary: new Uint8Array(wasmBinary), }); -window.mod = mod +// INITIALIZE GO const go = new Go(); -WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject) - .then(result => { - // hide loading overlay before running code - hideOverlay(); - go.run(result.instance); - }) - .catch(console.error); +// inject raylib +go.importObject.raylib = raylib; +go.importObject.globalThis = globalThis; +globalThis.raylib = raylib; + +import { Runtime } from "./runtime.js"; // helper funtions +//init +const runtime = new Runtime(); +// inject custom runtime methods +Object.assign(go.importObject.gojs, { + array: runtime.array.bind(runtime), + struct: runtime.struct.bind(runtime), + CStringFromGoString: runtime.CStringFromGoString.bind(runtime), + CStringGetLength: runtime.CStringGetLength.bind(runtime), + CopyToC: runtime.CopyToC.bind(runtime), + CopyToGo: runtime.CopyToGo.bind(runtime), + Alert: runtime.Alert.bind(runtime), +}); + +WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject).then( + (result) => { + const instance = result.instance; + globalThis.goInstance = instance; + go.run(instance); + }, +); + diff --git a/index/runtime.js b/index/runtime.js new file mode 100644 index 0000000..37aa875 --- /dev/null +++ b/index/runtime.js @@ -0,0 +1,154 @@ +// Helper functions called from Go via go:wasmimport + +class Runtime { + constructor() { + } + get mem() { + return new DataView(globalThis.goInstance.exports.mem.buffer); + } + getmem(addr, len) { + return new Uint8Array(globalThis.goInstance.exports.mem.buffer, addr, len); + } + get Sp() { + return globalThis.goInstance.exports.getsp() >>> 0; + } + // ---- Helpers from wasm_exec.js ---- + setInt32 = (addr, v) => { + return this.mem.setUint32(addr + 0, v, true); + }; + getInt32 = (addr) => { + return this.mem.getUint32(addr + 0, true); + }; + + setInt64 = (addr, v) => { + this.mem.setUint32(addr + 0, v, true); + this.mem.setUint32(addr + 4, Math.floor(v / 4294967296), true); + }; + + getInt64 = (addr) => { + const low = this.mem.getUint32(addr + 0, true); + const high = this.mem.getInt32(addr + 4, true); + return low + high * 4294967296; + }; + + loadSlice = (addr) => { + const array = this.getInt64(addr + 0); + const len = this.getInt64(addr + 8); + return this.getmem(array, len); + }; + + // ---- Runtime helpers ---- + array = (sp) => { + // messing around with slice + sp >>>= 0; + console.log(sp); + // slice capacity + console.log(this.getInt64(sp + 8 + 8)); + console.log(sp + 8); + }; + // function messing around with struct + struct = (sp) => { + sp >>>= 0; + const ptr = this.getInt64(sp + 8); + // this.setInt32(ptr, 99); + // // 2nd field of struct + // this.setInt32(ptr + 4, 69); + // return + this.setInt64(sp + 16, ptr); + }; + + getRaylibU8Array(cptr, len) { + return new Uint8Array( // js slice + globalThis.raylib.HEAPU8.buffer, + cptr, + len, + ); + } + // func(cptr) cstr + // Scans for null terminator and returns the length + CStringGetLength = (sp) => { + sp >>>= 0; + const cStr = this.getInt32(sp + 8 * 1); + const view = raylib.HEAPU8.subarray(cStr); + let len = 0; + while (view[len] !== 0) { + len++; + } + this.setInt32(sp + 8 * 2, len); + }; + // func(string) cptr + // returns pointer to C string in raylib memory + CStringFromGoString = (sp) => { + sp >>>= 0; + // get string addr and length + const saddr = this.getInt64(sp + 8 * 1); // go string address + const len = this.getInt64(sp + 8 * 2); // go string length + + const goStrView = this.getmem(saddr, len); // js slice + + // malloc cstr with room for null terminator + const cstr = globalThis.raylib._malloc(len + 1); + const cStrView = this.getRaylibU8Array(cstr, len + 1); + + // copy Go string to C + cStrView.set(goStrView); + // // set last byte to null terminator + cStrView[len] = 0; + // return cstr + this.setInt32(sp + 8 * 3, cstr); + }; + // func(src unsafe.Pointer, srcSize, dstCptr cptr) + // copies Go memory to C memory. Useful for copying slices and structs. + // Destination C array must have enough space. + // src must be a type. cannot be a slice. To pass a slice, use unsafe.SliceData + CopyToC = (sp) => { + sp >>>= 0; + const srcGoPtr = this.getInt64(sp + 8 * 1); + const srcSize = this.getInt32(sp + 8 * 2); // size of the dstGoPtr + // size and pointer are packed into a single 64bit int by Go's compiler + const dstCptr = this.getInt32(sp + 8 * 2 + 4); + + const goBytes = this.getmem(srcGoPtr, srcSize); + this.getRaylibU8Array(dstCptr, srcSize).set(goBytes); + }; + // func(dstGoPtr unsafe.Pointer, size int32, src cptr) + // copies C memory to a Go pointer. Useful for copying C structs into Go structs + // + // example usage: + // type Person struct{ + // Age string + // } + // + // var cPtrToPersonInCHeap cptr = ... + // + // var p Person + // CopyToGo(unsafe.Pointer(&p),unsafe.SizeOf(p),cPtrToPersonInCHeap) + // + // p.Age == (whatever it was in C) + CopyToGo = (sp) => { + sp >>>= 0; + const dstGoPtr = this.getInt64(sp + 8 * 1); + const size = this.getInt32(sp + 8 * 2); // size of the dstGoPtr + // size and pointer are packed into a single 64bit int by Go's compiler + const srcCptr = this.getInt32(sp + 8 * 2 + 4); + + const srcCBytes = this.getRaylibU8Array(srcCptr, size); + const dstGoBytes = this.getmem(dstGoPtr, size); + // copy C bytes to Go + dstGoBytes.set(srcCBytes); + }; + // func alert(string) + Alert = (sp) => { + sp >>>= 0; + const saddr = this.getInt64(sp + 8 * 1); + const len = this.getInt64(sp + 8 * 2); + const strU8 = this.getmem(saddr, len); + + const decoder = new TextDecoder("utf-8"); // 'utf-8' is the default encoding + const str = decoder.decode(strU8); + alert(str); + }; +} + +export { Runtime }; + From ec1897af7687319357255116a8c37e2b762e6caa Mon Sep 17 00:00:00 2001 From: BrownNPC Date: Tue, 21 Apr 2026 16:42:15 +0500 Subject: [PATCH 4/9] initial bindings --- examples/go.mod | 14 +- examples/go.sum | 6 +- examples/raygui/main.go | 19 + index/index.js | 3 +- raygui/go.mod | 13 +- raygui/go.sum | 6 + raygui/raygui.go | 1537 +++++++++++++++++++++++++++++++++++++++ raylib/go.sum | 4 +- raylib/rcore_wasm.go | 3 - wasm-runtime/wasm.go | 37 +- 10 files changed, 1610 insertions(+), 32 deletions(-) create mode 100644 examples/raygui/main.go create mode 100644 raygui/go.sum create mode 100644 raygui/raygui.go diff --git a/examples/go.mod b/examples/go.mod index 9b9293c..f657d03 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -1,9 +1,17 @@ module github.com/BrownNPC/Raylib-Go-Wasm/examples -go 1.24.1 +go 1.26.1 replace github.com/gen2brain/raylib-go/raylib => ../raylib -require github.com/gen2brain/raylib-go/raylib v0.0.0-00010101000000-000000000000 +replace github.com/gen2brain/raylib-go/raygui => ../raygui -require github.com/BrownNPC/wasm-ffi-go v1.1.0 // indirect +require ( + github.com/gen2brain/raylib-go/raygui v0.0.0-00010101000000-000000000000 + github.com/gen2brain/raylib-go/raylib v0.0.0-00010101000000-000000000000 +) + +require ( + github.com/BrownNPC/Raylib-Go-Wasm/raylib v0.0.0-20260126231012-27bc0271203c // indirect + github.com/BrownNPC/wasm-ffi-go v1.2.0 // indirect +) diff --git a/examples/go.sum b/examples/go.sum index 808648e..ed27ac0 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -1,2 +1,4 @@ -github.com/BrownNPC/wasm-ffi-go v1.1.0 h1:oashfuQflpB+qx/xI71Gvim3YN/0iIny5TMIpzEFz0Y= -github.com/BrownNPC/wasm-ffi-go v1.1.0/go.mod h1:D5+RBMb672fgw6vPz4HOWYxpyrmPrIao8VqlXihOFFg= +github.com/BrownNPC/Raylib-Go-Wasm/raylib v0.0.0-20260126231012-27bc0271203c h1:DqSkpCRDO3o1O/+b5O9buJGTKnF6bdeGi5DLNBoW2Sc= +github.com/BrownNPC/Raylib-Go-Wasm/raylib v0.0.0-20260126231012-27bc0271203c/go.mod h1:u1eTrnnsR5NVJMWwlQEq/FoeDPAKmq9PoRCiO8lwVH4= +github.com/BrownNPC/wasm-ffi-go v1.2.0 h1:Lknst90sTLTkE870OKNP/Vw36TohQIJ4ln8W1IG9Zl0= +github.com/BrownNPC/wasm-ffi-go v1.2.0/go.mod h1:D5+RBMb672fgw6vPz4HOWYxpyrmPrIao8VqlXihOFFg= diff --git a/examples/raygui/main.go b/examples/raygui/main.go new file mode 100644 index 0000000..3d1e16b --- /dev/null +++ b/examples/raygui/main.go @@ -0,0 +1,19 @@ +//go:build js + +package main + +import ( + "github.com/gen2brain/raylib-go/raygui" + rl "github.com/gen2brain/raylib-go/raylib" +) + +func main() { + rl.InitWindow(500, 500, "RayGUI Example") + + update := func() { + rl.BeginDrawing() + rl.ClearBackground(raygui.GetStyle(raygui.DEFAULT, raygui.BASE_COLOR_PRESSED).AsColor()) + rl.EndDrawing() + } + rl.SetMain(update) +} diff --git a/index/index.js b/index/index.js index c45762b..43d8be9 100644 --- a/index/index.js +++ b/index/index.js @@ -21,6 +21,8 @@ const go = new Go(); go.importObject.raylib = raylib; go.importObject.globalThis = globalThis; globalThis.raylib = raylib; +// compatibility with old bindings (v1) +globalThis.mod = raylib; import { Runtime } from "./runtime.js"; // helper funtions //init @@ -43,4 +45,3 @@ WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject).then( go.run(instance); }, ); - diff --git a/raygui/go.mod b/raygui/go.mod index ff9fc9c..5d4dc88 100644 --- a/raygui/go.mod +++ b/raygui/go.mod @@ -1,5 +1,14 @@ module github.com/BrownNPC/Raylib-Go-Wasm/raygui -require github.com/BrownNPC/wasm-ffi-go v1.2.0 +require github.com/BrownNPC/Raylib-Go-Wasm/raylib v0.0.0-20260126231012-27bc0271203c -go 1.24.1 +require ( + github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime v0.0.0-20260421110350-7c24b2d5e6d3 // indirect + github.com/BrownNPC/wasm-ffi-go v1.2.0 // indirect +) + +replace ( + github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime => ../wasm-runtime +) + +go 1.26.1 diff --git a/raygui/go.sum b/raygui/go.sum new file mode 100644 index 0000000..fcc6825 --- /dev/null +++ b/raygui/go.sum @@ -0,0 +1,6 @@ +github.com/BrownNPC/Raylib-Go-Wasm/raylib v0.0.0-20260126231012-27bc0271203c h1:DqSkpCRDO3o1O/+b5O9buJGTKnF6bdeGi5DLNBoW2Sc= +github.com/BrownNPC/Raylib-Go-Wasm/raylib v0.0.0-20260126231012-27bc0271203c/go.mod h1:u1eTrnnsR5NVJMWwlQEq/FoeDPAKmq9PoRCiO8lwVH4= +github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime v0.0.0-20260421110350-7c24b2d5e6d3 h1:3/+QJKkSsqnJiuFdXyLNAbX2C2uB+ikalb80fcZ1iTc= +github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime v0.0.0-20260421110350-7c24b2d5e6d3/go.mod h1:QsnK1qtIkvF266TxA0tLoodc1tRYqMweTl0CUZanRCg= +github.com/BrownNPC/wasm-ffi-go v1.2.0 h1:Lknst90sTLTkE870OKNP/Vw36TohQIJ4ln8W1IG9Zl0= +github.com/BrownNPC/wasm-ffi-go v1.2.0/go.mod h1:D5+RBMb672fgw6vPz4HOWYxpyrmPrIao8VqlXihOFFg= diff --git a/raygui/raygui.go b/raygui/raygui.go new file mode 100644 index 0000000..ff31d29 --- /dev/null +++ b/raygui/raygui.go @@ -0,0 +1,1537 @@ +//go:build js + +package raygui + +import ( + rl "github.com/BrownNPC/Raylib-Go-Wasm/raylib" +) + +type ( + ControlID uint16 + PropertyID uint16 + PropertyValue uint32 + + IconID uint32 +) + +func (p PropertyID) IsExtended() bool { + return p >= 16 +} + +func (v PropertyValue) AsColor() rl.Color { + return rl.Color{uint8(v >> 24), uint8(v >> 16), uint8(v >> 8), uint8(v)} +} + +func NewColorPropertyValue(color rl.Color) PropertyValue { + return PropertyValue(uint32(color.R)<<24 + uint32(color.G)<<16 + uint32(color.B)<<8 + uint32(color.A)) +} + +// Gui control state +const ( + STATE_NORMAL PropertyValue = iota + STATE_FOCUSED + STATE_PRESSED + STATE_DISABLED +) + +// Gui control text alignment +const ( + TEXT_ALIGN_LEFT PropertyValue = iota + TEXT_ALIGN_CENTER + TEXT_ALIGN_RIGHT +) + +// Gui control text alignment vertical +// NOTE: Text vertical position inside the text bounds +const ( + TEXT_ALIGN_TOP PropertyValue = iota + TEXT_ALIGN_MIDDLE + TEXT_ALIGN_BOTTOM +) + +// Gui control text wrap mode +// NOTE: Useful for multiline text +const ( + TEXT_WRAP_NONE PropertyValue = iota + TEXT_WRAP_CHAR + TEXT_WRAP_WORD +) + +const ( + SCROLLBAR_LEFT_SIDE PropertyValue = iota + SCROLLBAR_RIGHT_SIDE +) + +// Gui controls +const ( + // Default -> populates to all controls when set + DEFAULT ControlID = iota + + // Basic controls + LABEL // Used also for: LABELBUTTON + BUTTON + TOGGLE // Used also for: TOGGLEGROUP + SLIDER // Used also for: SLIDERBAR, TOGGLESLIDER + PROGRESSBAR + CHECKBOX + COMBOBOX + DROPDOWNBOX + TEXTBOX // Used also for: TEXTBOXMULTI + VALUEBOX + CONTROL11 + LISTVIEW + COLORPICKER + SCROLLBAR + STATUSBAR +) + +// ---------------------------------------------------------------------------------- +// Module Types and Structures Definition +// ---------------------------------------------------------------------------------- +// Gui control property style color element +const ( + BORDER PropertyID = iota + BASE + TEXT + OTHER +) + +// Gui base properties for every control +// NOTE: RAYGUI_MAX_PROPS_BASE properties (by default 16 properties) +const ( + BORDER_COLOR_NORMAL PropertyID = iota // Control border color in STATE_NORMAL + BASE_COLOR_NORMAL // Control base color in STATE_NORMAL + TEXT_COLOR_NORMAL // Control text color in STATE_NORMAL + BORDER_COLOR_FOCUSED // Control border color in STATE_FOCUSED + BASE_COLOR_FOCUSED // Control base color in STATE_FOCUSED + TEXT_COLOR_FOCUSED // Control text color in STATE_FOCUSED + BORDER_COLOR_PRESSED // Control border color in STATE_PRESSED + BASE_COLOR_PRESSED // Control base color in STATE_PRESSED + TEXT_COLOR_PRESSED // Control text color in STATE_PRESSED + BORDER_COLOR_DISABLED // Control border color in STATE_DISABLED + BASE_COLOR_DISABLED // Control base color in STATE_DISABLED + TEXT_COLOR_DISABLED // Control text color in STATE_DISABLED + BORDER_WIDTH // Control border size, 0 for no border + TEXT_PADDING // Control text padding, not considering border + TEXT_ALIGNMENT // Control text horizontal alignment inside control text bound (after border and padding) +) + +// Gui extended properties depend on control +// NOTE: RAYGUI_MAX_PROPS_EXTENDED properties (by default, max 8 properties) +// ---------------------------------------------------------------------------------- +// DEFAULT extended properties +// NOTE: Those properties are common to all controls or global +// WARNING: We only have 8 slots for those properties by default!!! -> New global control: TEXT? +const ( + TEXT_SIZE PropertyID = 16 + iota // Text size (glyphs max height) + TEXT_SPACING // Text spacing between glyphs + LINE_COLOR // Line control color + BACKGROUND_COLOR // Background color + TEXT_LINE_SPACING // Text spacing between lines + TEXT_ALIGNMENT_VERTICAL // Text vertical alignment inside text bounds (after border and padding) + TEXT_WRAP_MODE // Text wrap-mode inside text bounds +) + +// Toggle/ToggleGroup +const ( + GROUP_PADDING PropertyID = 16 + iota // ToggleGroup separation between toggles +) + +// Slider/SliderBar +const ( + SLIDER_WIDTH PropertyID = 16 + iota // Slider size of internal bar + SLIDER_PADDING // Slider/SliderBar internal bar padding +) + +// ProgressBar +const ( + PROGRESS_PADDING PropertyID = 16 + iota // ProgressBar internal padding +) + +// ScrollBar +const ( + ARROWS_SIZE PropertyID = 16 + iota // ScrollBar arrows size + ARROWS_VISIBLE // ScrollBar arrows visible + SCROLL_SLIDER_PADDING // ScrollBar slider internal padding + SCROLL_SLIDER_SIZE // ScrollBar slider size + SCROLL_PADDING // ScrollBar scroll padding from arrows + SCROLL_SPEED // ScrollBar scrolling speed +) + +// CheckBox +const ( + CHECK_PADDING PropertyID = 16 + iota // CheckBox internal check padding +) + +// ComboBox +const ( + COMBO_BUTTON_WIDTH PropertyID = 16 + iota // ComboBox right button width + COMBO_BUTTON_SPACING // ComboBox button separation +) + +// DropdownBox +const ( + ARROW_PADDING PropertyID = 16 + iota // DropdownBox arrow separation from border and items + DROPDOWN_ITEMS_SPACING // DropdownBox items separation + DROPDOWN_ARROW_HIDDEN // DropdownBox arrow hidden + DROPDOWN_ROLL_UP // DropdownBox roll up flag (default rolls down) +) + +// TextBox/TextBoxMulti/ValueBox/Spinner +const ( + TEXT_READONLY PropertyID = 16 + iota // TextBox in read-only mode: 0-text editable, 1-text no-editable +) + +// ValueBox/Spinner +const ( + SPINNER_BUTTON_WIDTH PropertyID = 16 // Spinner left/right buttons width + SPINNER_BUTTON_SPACING // Spinner buttons separation +) + +// ListView +const ( + LIST_ITEMS_HEIGHT PropertyID = 16 + iota // ListView items height + LIST_ITEMS_SPACING // ListView items separation + SCROLLBAR_WIDTH // ListView scrollbar size (usually width) + SCROLLBAR_SIDE // ListView scrollbar side (0-SCROLLBAR_LEFT_SIDE, 1-SCROLLBAR_RIGHT_SIDE) + LIST_ITEMS_BORDER_NORMAL // ListView items border enabled in normal state + LIST_ITEMS_BORDER_WIDTH // ListView items border width +) + +// ColorPicker +const ( + COLOR_SELECTOR_SIZE PropertyID = 16 + iota + HUEBAR_WIDTH // ColorPicker right hue bar width + HUEBAR_PADDING // ColorPicker right hue bar separation from panel + HUEBAR_SELECTOR_HEIGHT // ColorPicker right hue bar selector height + HUEBAR_SELECTOR_OVERFLOW // ColorPicker right hue bar selector overflow +) + +// Icons enumeration +const ( + ICON_NONE IconID = 0 + ICON_FOLDER_FILE_OPEN IconID = 1 + ICON_FILE_SAVE_CLASSIC IconID = 2 + ICON_FOLDER_OPEN IconID = 3 + ICON_FOLDER_SAVE IconID = 4 + ICON_FILE_OPEN IconID = 5 + ICON_FILE_SAVE IconID = 6 + ICON_FILE_EXPORT IconID = 7 + ICON_FILE_ADD IconID = 8 + ICON_FILE_DELETE IconID = 9 + ICON_FILETYPE_TEXT IconID = 10 + ICON_FILETYPE_AUDIO IconID = 11 + ICON_FILETYPE_IMAGE IconID = 12 + ICON_FILETYPE_PLAY IconID = 13 + ICON_FILETYPE_VIDEO IconID = 14 + ICON_FILETYPE_INFO IconID = 15 + ICON_FILE_COPY IconID = 16 + ICON_FILE_CUT IconID = 17 + ICON_FILE_PASTE IconID = 18 + ICON_CURSOR_HAND IconID = 19 + ICON_CURSOR_POINTER IconID = 20 + ICON_CURSOR_CLASSIC IconID = 21 + ICON_PENCIL IconID = 22 + ICON_PENCIL_BIG IconID = 23 + ICON_BRUSH_CLASSIC IconID = 24 + ICON_BRUSH_PAINTER IconID = 25 + ICON_WATER_DROP IconID = 26 + ICON_COLOR_PICKER IconID = 27 + ICON_RUBBER IconID = 28 + ICON_COLOR_BUCKET IconID = 29 + ICON_TEXT_T IconID = 30 + ICON_TEXT_A IconID = 31 + ICON_SCALE IconID = 32 + ICON_RESIZE IconID = 33 + ICON_FILTER_POINT IconID = 34 + ICON_FILTER_BILINEAR IconID = 35 + ICON_CROP IconID = 36 + ICON_CROP_ALPHA IconID = 37 + ICON_SQUARE_TOGGLE IconID = 38 + ICON_SYMMETRY IconID = 39 + ICON_SYMMETRY_HORIZONTAL IconID = 40 + ICON_SYMMETRY_VERTICAL IconID = 41 + ICON_LENS IconID = 42 + ICON_LENS_BIG IconID = 43 + ICON_EYE_ON IconID = 44 + ICON_EYE_OFF IconID = 45 + ICON_FILTER_TOP IconID = 46 + ICON_FILTER IconID = 47 + ICON_TARGET_POINT IconID = 48 + ICON_TARGET_SMALL IconID = 49 + ICON_TARGET_BIG IconID = 50 + ICON_TARGET_MOVE IconID = 51 + ICON_CURSOR_MOVE IconID = 52 + ICON_CURSOR_SCALE IconID = 53 + ICON_CURSOR_SCALE_RIGHT IconID = 54 + ICON_CURSOR_SCALE_LEFT IconID = 55 + ICON_UNDO IconID = 56 + ICON_REDO IconID = 57 + ICON_REREDO IconID = 58 + ICON_MUTATE IconID = 59 + ICON_ROTATE IconID = 60 + ICON_REPEAT IconID = 61 + ICON_SHUFFLE IconID = 62 + ICON_EMPTYBOX IconID = 63 + ICON_TARGET IconID = 64 + ICON_TARGET_SMALL_FILL IconID = 65 + ICON_TARGET_BIG_FILL IconID = 66 + ICON_TARGET_MOVE_FILL IconID = 67 + ICON_CURSOR_MOVE_FILL IconID = 68 + ICON_CURSOR_SCALE_FILL IconID = 69 + ICON_CURSOR_SCALE_RIGHT_FILL IconID = 70 + ICON_CURSOR_SCALE_LEFT_FILL IconID = 71 + ICON_UNDO_FILL IconID = 72 + ICON_REDO_FILL IconID = 73 + ICON_REREDO_FILL IconID = 74 + ICON_MUTATE_FILL IconID = 75 + ICON_ROTATE_FILL IconID = 76 + ICON_REPEAT_FILL IconID = 77 + ICON_SHUFFLE_FILL IconID = 78 + ICON_EMPTYBOX_SMALL IconID = 79 + ICON_BOX IconID = 80 + ICON_BOX_TOP IconID = 81 + ICON_BOX_TOP_RIGHT IconID = 82 + ICON_BOX_RIGHT IconID = 83 + ICON_BOX_BOTTOM_RIGHT IconID = 84 + ICON_BOX_BOTTOM IconID = 85 + ICON_BOX_BOTTOM_LEFT IconID = 86 + ICON_BOX_LEFT IconID = 87 + ICON_BOX_TOP_LEFT IconID = 88 + ICON_BOX_CENTER IconID = 89 + ICON_BOX_CIRCLE_MASK IconID = 90 + ICON_POT IconID = 91 + ICON_ALPHA_MULTIPLY IconID = 92 + ICON_ALPHA_CLEAR IconID = 93 + ICON_DITHERING IconID = 94 + ICON_MIPMAPS IconID = 95 + ICON_BOX_GRID IconID = 96 + ICON_GRID IconID = 97 + ICON_BOX_CORNERS_SMALL IconID = 98 + ICON_BOX_CORNERS_BIG IconID = 99 + ICON_FOUR_BOXES IconID = 100 + ICON_GRID_FILL IconID = 101 + ICON_BOX_MULTISIZE IconID = 102 + ICON_ZOOM_SMALL IconID = 103 + ICON_ZOOM_MEDIUM IconID = 104 + ICON_ZOOM_BIG IconID = 105 + ICON_ZOOM_ALL IconID = 106 + ICON_ZOOM_CENTER IconID = 107 + ICON_BOX_DOTS_SMALL IconID = 108 + ICON_BOX_DOTS_BIG IconID = 109 + ICON_BOX_CONCENTRIC IconID = 110 + ICON_BOX_GRID_BIG IconID = 111 + ICON_OK_TICK IconID = 112 + ICON_CROSS IconID = 113 + ICON_ARROW_LEFT IconID = 114 + ICON_ARROW_RIGHT IconID = 115 + ICON_ARROW_DOWN IconID = 116 + ICON_ARROW_UP IconID = 117 + ICON_ARROW_LEFT_FILL IconID = 118 + ICON_ARROW_RIGHT_FILL IconID = 119 + ICON_ARROW_DOWN_FILL IconID = 120 + ICON_ARROW_UP_FILL IconID = 121 + ICON_AUDIO IconID = 122 + ICON_FX IconID = 123 + ICON_WAVE IconID = 124 + ICON_WAVE_SINUS IconID = 125 + ICON_WAVE_SQUARE IconID = 126 + ICON_WAVE_TRIANGULAR IconID = 127 + ICON_CROSS_SMALL IconID = 128 + ICON_PLAYER_PREVIOUS IconID = 129 + ICON_PLAYER_PLAY_BACK IconID = 130 + ICON_PLAYER_PLAY IconID = 131 + ICON_PLAYER_PAUSE IconID = 132 + ICON_PLAYER_STOP IconID = 133 + ICON_PLAYER_NEXT IconID = 134 + ICON_PLAYER_RECORD IconID = 135 + ICON_MAGNET IconID = 136 + ICON_LOCK_CLOSE IconID = 137 + ICON_LOCK_OPEN IconID = 138 + ICON_CLOCK IconID = 139 + ICON_TOOLS IconID = 140 + ICON_GEAR IconID = 141 + ICON_GEAR_BIG IconID = 142 + ICON_BIN IconID = 143 + ICON_HAND_POINTER IconID = 144 + ICON_LASER IconID = 145 + ICON_COIN IconID = 146 + ICON_EXPLOSION IconID = 147 + ICON_1UP IconID = 148 + ICON_PLAYER IconID = 149 + ICON_PLAYER_JUMP IconID = 150 + ICON_KEY IconID = 151 + ICON_DEMON IconID = 152 + ICON_TEXT_POPUP IconID = 153 + ICON_GEAR_EX IconID = 154 + ICON_CRACK IconID = 155 + ICON_CRACK_POINTS IconID = 156 + ICON_STAR IconID = 157 + ICON_DOOR IconID = 158 + ICON_EXIT IconID = 159 + ICON_MODE_2D IconID = 160 + ICON_MODE_3D IconID = 161 + ICON_CUBE IconID = 162 + ICON_CUBE_FACE_TOP IconID = 163 + ICON_CUBE_FACE_LEFT IconID = 164 + ICON_CUBE_FACE_FRONT IconID = 165 + ICON_CUBE_FACE_BOTTOM IconID = 166 + ICON_CUBE_FACE_RIGHT IconID = 167 + ICON_CUBE_FACE_BACK IconID = 168 + ICON_CAMERA IconID = 169 + ICON_SPECIAL IconID = 170 + ICON_LINK_NET IconID = 171 + ICON_LINK_BOXES IconID = 172 + ICON_LINK_MULTI IconID = 173 + ICON_LINK IconID = 174 + ICON_LINK_BROKE IconID = 175 + ICON_TEXT_NOTES IconID = 176 + ICON_NOTEBOOK IconID = 177 + ICON_SUITCASE IconID = 178 + ICON_SUITCASE_ZIP IconID = 179 + ICON_MAILBOX IconID = 180 + ICON_MONITOR IconID = 181 + ICON_PRINTER IconID = 182 + ICON_PHOTO_CAMERA IconID = 183 + ICON_PHOTO_CAMERA_FLASH IconID = 184 + ICON_HOUSE IconID = 185 + ICON_HEART IconID = 186 + ICON_CORNER IconID = 187 + ICON_VERTICAL_BARS IconID = 188 + ICON_VERTICAL_BARS_FILL IconID = 189 + ICON_LIFE_BARS IconID = 190 + ICON_INFO IconID = 191 + ICON_CROSSLINE IconID = 192 + ICON_HELP IconID = 193 + ICON_FILETYPE_ALPHA IconID = 194 + ICON_FILETYPE_HOME IconID = 195 + ICON_LAYERS_VISIBLE IconID = 196 + ICON_LAYERS IconID = 197 + ICON_WINDOW IconID = 198 + ICON_HIDPI IconID = 199 + ICON_FILETYPE_BINARY IconID = 200 + ICON_HEX IconID = 201 + ICON_SHIELD IconID = 202 + ICON_FILE_NEW IconID = 203 + ICON_FOLDER_ADD IconID = 204 + ICON_ALARM IconID = 205 + ICON_CPU IconID = 206 + ICON_ROM IconID = 207 + ICON_STEP_OVER IconID = 208 + ICON_STEP_INTO IconID = 209 + ICON_STEP_OUT IconID = 210 + ICON_RESTART IconID = 211 + ICON_BREAKPOINT_ON IconID = 212 + ICON_BREAKPOINT_OFF IconID = 213 + ICON_BURGER_MENU IconID = 214 + ICON_CASE_SENSITIVE IconID = 215 + ICON_REG_EXP IconID = 216 + ICON_FOLDER IconID = 217 + ICON_FILE IconID = 218 + ICON_SAND_TIMER IconID = 219 + ICON_WARNING IconID = 220 + ICON_HELP_BOX IconID = 221 + ICON_INFO_BOX IconID = 222 + ICON_PRIORITY IconID = 223 + ICON_LAYERS_ISO IconID = 224 + ICON_LAYERS2 IconID = 225 + ICON_MLAYERS IconID = 226 + ICON_MAPS IconID = 227 + ICON_HOT IconID = 228 + ICON_LABEL IconID = 229 + ICON_NAME_ID IconID = 230 + ICON_SLICING IconID = 231 + ICON_MANUAL_CONTROL IconID = 232 + ICON_COLLISION IconID = 233 + ICON_CIRCLE_ADD IconID = 234 + ICON_CIRCLE_ADD_FILL IconID = 235 + ICON_CIRCLE_WARNING IconID = 236 + ICON_CIRCLE_WARNING_FILL IconID = 237 + ICON_BOX_MORE IconID = 238 + ICON_BOX_MORE_FILL IconID = 239 + ICON_BOX_MINUS IconID = 240 + ICON_BOX_MINUS_FILL IconID = 241 + ICON_UNION IconID = 242 + ICON_INTERSECTION IconID = 243 + ICON_DIFFERENCE IconID = 244 + ICON_SPHERE IconID = 245 + ICON_CYLINDER IconID = 246 + ICON_CONE IconID = 247 + ICON_ELLIPSOID IconID = 248 + ICON_CAPSULE IconID = 249 + ICON_250 IconID = 250 + ICON_251 IconID = 251 + ICON_252 IconID = 252 + ICON_253 IconID = 253 + ICON_254 IconID = 254 + ICON_255 IconID = 255 +) + +/* +//---------------------------------------------------------------------------------- +// Gui Setup Functions Definition +//---------------------------------------------------------------------------------- + +// Enable gui global state +func Enable() { + C.GuiEnable() +} + +// Disable gui global state +func Disable() { + C.GuiDisable() +} + +// Lock gui global state +func Lock() { + C.GuiLock() +} + +// Unlock gui global state +func Unlock() { + C.GuiUnlock() +} + +// Check if gui is locked (global state) +func IsLocked() bool { + return bool(C.GuiIsLocked()) +} + +// Set gui controls alpha global state +func SetAlpha(alpha float32) { + calpha := C.float(alpha) + C.GuiSetAlpha(calpha) +} + +// Set gui state (global state) +func SetState(state PropertyValue) { + cstate := C.int(state) + C.GuiSetState(cstate) +} + +// Get gui state (global state) +func GetState() PropertyValue { + return PropertyValue(C.GuiGetState()) +} + +// Set custom gui font +func SetFont(font rl.Font) { + cfont := (*C.Font)(unsafe.Pointer(&font)) + C.GuiSetFont(*cfont) +} + +// Get custom gui font +func GetFont() rl.Font { + ret := C.GuiGetFont() + ptr := unsafe.Pointer(&ret) + return *(*rl.Font)(ptr) +} + +// Set control style property value +func SetStyle(control ControlID, property PropertyID, value PropertyValue) { + ccontrol := C.int(control) + cproperty := C.int(property) + cvalue := C.int(value) + C.GuiSetStyle(ccontrol, cproperty, cvalue) +} +*/ + +//go:wasmimport raylib _GuiGetStyle +//go:noescape +func guiGetStyle(control, property int32) int32 + +// Get control style property value +func GetStyle(control ControlID, property PropertyID) PropertyValue { + ccontrol := int32(control) + cproperty := int32(property) + return PropertyValue(guiGetStyle(ccontrol, cproperty)) +} + +/* +func GetColor(control ControlID, property PropertyID) rl.Color { + color := C.GuiGetStyle(C.int(control), C.int(property)) + return rl.Color{R: uint8(color >> 24), G: uint8(color >> 16), B: uint8(color >> 8), A: uint8(color)} +} + +//---------------------------------------------------------------------------------- +// Gui Controls Functions Definition +//---------------------------------------------------------------------------------- + +// Window Box control +func WindowBox(bounds rl.Rectangle, title string) bool { + var cbounds C.struct_Rectangle + cbounds.height = C.float(bounds.Height) + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + var ctitle *C.char + if len(title) > 0 { + ctitle = C.CString(title) + defer C.free(unsafe.Pointer(ctitle)) + } + return C.GuiWindowBox(cbounds, ctitle) != 0 +} + +// Group Box control with text name +func GroupBox(bounds rl.Rectangle, text string) { + var cbounds C.struct_Rectangle + cbounds.height = C.float(bounds.Height) + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + C.GuiGroupBox(cbounds, ctext) +} + +// Line control +func Line(bounds rl.Rectangle, text string) { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + C.GuiLine(cbounds, ctext) +} + +// Panel control +func Panel(bounds rl.Rectangle, text string) { + var cbounds C.struct_Rectangle + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + C.GuiPanel(cbounds, ctext) +} + +// Tab Bar control, returns the current TAB closing requested, -1 otherwise +func TabBar(bounds rl.Rectangle, text []string, active *int32) int32 { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + + ctext := NewCStringArrayFromSlice(text) + defer ctext.Free() + + count := C.int(len(text)) + + if active == nil { + active = new(int32) + } + cactive := C.int(*active) + defer func() { + *active = int32(cactive) + }() + return int32(C.GuiTabBar(cbounds, (**C.char)(ctext.Pointer), count, &cactive)) +} + +// Scroll Panel control +func ScrollPanel(bounds rl.Rectangle, text string, content rl.Rectangle, scroll *rl.Vector2, view *rl.Rectangle) { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + var ccontent C.struct_Rectangle + ccontent.x = C.float(content.X) + ccontent.y = C.float(content.Y) + ccontent.width = C.float(content.Width) + ccontent.height = C.float(content.Height) + var cscroll C.struct_Vector2 + cscroll.x = C.float(scroll.X) + cscroll.y = C.float(scroll.Y) + defer func() { + scroll.X = float32(cscroll.x) + scroll.Y = float32(cscroll.y) + }() + var cview C.struct_Rectangle + cview.x = C.float(view.X) + cview.y = C.float(view.Y) + cview.width = C.float(view.Width) + cview.height = C.float(view.Height) + defer func() { + view.X = float32(cview.x) + view.Y = float32(cview.y) + view.Width = float32(cview.width) + view.Height = float32(cview.height) + }() + + C.GuiScrollPanel(cbounds, ctext, ccontent, &cscroll, &cview) +} + +// Label control +func Label(bounds rl.Rectangle, text string) { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + C.GuiLabel(cbounds, ctext) +} + +// Button control, returns true when clicked +func Button(bounds rl.Rectangle, text string) bool { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + return C.GuiButton(cbounds, ctext) != 0 +} + +// LabelButton control, returns true when clicked +func LabelButton(bounds rl.Rectangle, text string) bool { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + return C.GuiLabelButton(cbounds, ctext) != 0 +} + +// Toggle control, returns true when active +func Toggle(bounds rl.Rectangle, text string, active bool) bool { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + cactive := C.bool(active) + C.GuiToggle(cbounds, ctext, &cactive) + return bool(cactive) +} + +// ToggleGroup control, returns active toggle index +func ToggleGroup(bounds rl.Rectangle, text string, active int32) int32 { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + cactive := C.int(active) + C.GuiToggleGroup(cbounds, ctext, &cactive) + return int32(cactive) +} + +// ToggleSlider control, returns true when clicked +func ToggleSlider(bounds rl.Rectangle, text string, active int32) int32 { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + cactive := C.int(active) + C.GuiToggleSlider(cbounds, ctext, &cactive) + return int32(cactive) +} + +// CheckBox control, returns true when active +func CheckBox(bounds rl.Rectangle, text string, checked bool) bool { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + cchecked := C.bool(checked) + C.GuiCheckBox(cbounds, ctext, &cchecked) + return bool(cchecked) +} + +// ComboBox control, returns selected item index +func ComboBox(bounds rl.Rectangle, text string, active int32) int32 { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + cactive := C.int(active) + C.GuiComboBox(cbounds, ctext, &cactive) + return int32(cactive) +} + +// DropdownBox control, returns true when clicked +func DropdownBox(bounds rl.Rectangle, text string, active *int32, editMode bool) bool { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + + if active == nil { + active = new(int32) + } + cactive := C.int(*active) + defer func() { + *active = int32(cactive) + }() + + ceditMode := C.bool(editMode) + + return C.GuiDropdownBox(cbounds, ctext, &cactive, ceditMode) != 0 +} + +// TextBox control, updates input text, returns true on ENTER pressed or defocused +func TextBox(bounds rl.Rectangle, text *string, textSize int, editMode bool) bool { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + + bs := []byte(*text) + if len(bs) == 0 { + bs = []byte{byte(0)} + } + if 0 < len(bs) && bs[len(bs)-1] != byte(0) { // minimalize allocation + bs = append(bs, byte(0)) // for next input symbols + } + ctext := (*C.char)(unsafe.Pointer(&bs[0])) + defer func() { + *text = strings.Trim(string(bs), "\x00") + // no need : C.free(unsafe.Pointer(ctext)) + }() + + ctextSize := C.int(textSize) + ceditMode := C.bool(editMode) + + return C.GuiTextBox(cbounds, ctext, ctextSize, ceditMode) != 0 +} + +// Spinner control, sets value to the selected number and returns true when clicked. +func Spinner(bounds rl.Rectangle, text string, value *int32, minValue, maxValue int, editMode bool) bool { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + + if value == nil { + value = new(int32) + } + cvalue := C.int(*value) + defer func() { + *value = int32(cvalue) + }() + + cminValue := C.int(minValue) + cmaxValue := C.int(maxValue) + ceditMode := C.bool(editMode) + + return C.GuiSpinner(cbounds, ctext, &cvalue, cminValue, cmaxValue, ceditMode) != 0 +} + +// ValueBox control, updates input text with numbers +func ValueBox(bounds rl.Rectangle, text string, value *int32, minValue, maxValue int, editMode bool) bool { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + + if value == nil { + value = new(int32) + } + cvalue := C.int(*value) + defer func() { + *value = int32(cvalue) + }() + + cminValue := C.int(minValue) + cmaxValue := C.int(maxValue) + ceditMode := C.bool(editMode) + + return C.GuiValueBox(cbounds, ctext, &cvalue, cminValue, cmaxValue, ceditMode) != 0 +} + +// Floating point Value Box control, updates input val_str with numbers +func ValueBoxFloat(bounds rl.Rectangle, text string, textValue *string, value *float32, editMode bool) bool { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + + bs := []byte(*textValue) + if len(bs) == 0 { + bs = []byte{byte(0)} + } + if 0 < len(bs) && bs[len(bs)-1] != byte(0) { // minimalize allocation + bs = append(bs, byte(0)) // for next input symbols + } + ctextValue := (*C.char)(unsafe.Pointer(&bs[0])) + defer func() { + *textValue = strings.Trim(string(bs), "\x00") + // no need : C.free(unsafe.Pointer(ctext)) + }() + + if value == nil { + value = new(float32) + } + cvalue := C.float(*value) + defer func() { + *value = float32(cvalue) + }() + + return C.GuiValueBoxFloat(cbounds, ctext, ctextValue, &cvalue, C.bool(editMode)) != 0 +} + +// Slider control +func Slider(bounds rl.Rectangle, textLeft, textRight string, value, minValue, maxValue float32) float32 { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + + var ctextLeft *C.char + if len(textLeft) > 0 { + ctextLeft = C.CString(textLeft) + defer C.free(unsafe.Pointer(ctextLeft)) + } + + var ctextRight *C.char + if len(textRight) > 0 { + ctextRight = C.CString(textRight) + defer C.free(unsafe.Pointer(ctextRight)) + } + + cvalue := C.float(value) + cminValue := C.float(minValue) + cmaxValue := C.float(maxValue) + C.GuiSlider(cbounds, ctextLeft, ctextRight, &cvalue, cminValue, cmaxValue) + return float32(cvalue) +} + +// SliderBar control, returns selected value +func SliderBar(bounds rl.Rectangle, textLeft, textRight string, value, minValue, maxValue float32) float32 { + var cbounds C.struct_Rectangle + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + + var ctextLeft *C.char + if len(textLeft) > 0 { + ctextLeft = C.CString(textLeft) + defer C.free(unsafe.Pointer(ctextLeft)) + } + + var ctextRight *C.char + if len(textRight) > 0 { + ctextRight = C.CString(textRight) + defer C.free(unsafe.Pointer(ctextRight)) + } + + cvalue := C.float(value) + cminValue := C.float(minValue) + cmaxValue := C.float(maxValue) + C.GuiSliderBar(cbounds, ctextLeft, ctextRight, &cvalue, cminValue, cmaxValue) + return float32(cvalue) +} + +// ProgressBar control, shows current progress value +func ProgressBar(bounds rl.Rectangle, textLeft, textRight string, value, minValue, maxValue float32) float32 { + var cbounds C.struct_Rectangle + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + + var ctextLeft *C.char + if len(textLeft) > 0 { + ctextLeft = C.CString(textLeft) + defer C.free(unsafe.Pointer(ctextLeft)) + } + + var ctextRight *C.char + if len(textRight) > 0 { + ctextRight = C.CString(textRight) + defer C.free(unsafe.Pointer(ctextRight)) + } + + cvalue := C.float(value) + cminValue := C.float(minValue) + cmaxValue := C.float(maxValue) + C.GuiProgressBar(cbounds, ctextLeft, ctextRight, &cvalue, cminValue, cmaxValue) + return float32(cvalue) +} + +// StatusBar control, shows info text +func StatusBar(bounds rl.Rectangle, text string) { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + C.GuiStatusBar(cbounds, ctext) +} + +// DummyRectangle control, intended for placeholding +func DummyRec(bounds rl.Rectangle, text string) { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + C.GuiDummyRec(cbounds, ctext) +} + +// ListView control, returns selected list item index +func ListView(bounds rl.Rectangle, text string, scrollIndex *int32, active int32) int32 { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + + if scrollIndex == nil { + scrollIndex = new(int32) + } + cscrollIndex := C.int(*scrollIndex) + defer func() { + *scrollIndex = int32(cscrollIndex) + }() + + cactive := C.int(active) + + C.GuiListView(cbounds, ctext, &cscrollIndex, &cactive) + return int32(cactive) +} + +// ListView control with extended parameters +func ListViewEx(bounds rl.Rectangle, text []string, focus, scrollIndex *int32, active int32) int32 { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + + ctext := NewCStringArrayFromSlice(text) + defer ctext.Free() + + count := C.int(len(text)) + + if focus == nil { + focus = new(int32) + } + cfocus := C.int(*focus) + defer func() { + *focus = int32(cfocus) + }() + + if scrollIndex == nil { + scrollIndex = new(int32) + } + cscrollIndex := C.int(*scrollIndex) + defer func() { + *scrollIndex = int32(cscrollIndex) + }() + + cactive := C.int(active) + + C.GuiListViewEx(cbounds, (**C.char)(ctext.Pointer), count, &cfocus, &cscrollIndex, &cactive) + return int32(cactive) +} + +// ColorPanel control, Color (RGBA) variant +func ColorPanel(bounds rl.Rectangle, text string, color rl.Color) rl.Color { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + var ccolor C.struct_Color + ccolor.b = C.uchar(color.B) + ccolor.a = C.uchar(color.A) + ccolor.r = C.uchar(color.R) + ccolor.g = C.uchar(color.G) + C.GuiColorPanel(cbounds, ctext, &ccolor) + var goRes rl.Color + goRes.A = byte(ccolor.a) + goRes.R = byte(ccolor.r) + goRes.G = byte(ccolor.g) + goRes.B = byte(ccolor.b) + return goRes +} + +// ColorBarAlpha control, returns alpha value normalized [0..1] +func ColorBarAlpha(bounds rl.Rectangle, text string, alpha float32) float32 { + var cbounds C.struct_Rectangle + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + calpha := C.float(alpha) + C.GuiColorBarAlpha(cbounds, ctext, &calpha) + return float32(calpha) +} + +// ColorBarHue control, returns alpha value normalized [0..1] +func ColorBarHue(bounds rl.Rectangle, text string, value float32) float32 { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + cvalue := C.float(value) + C.GuiColorBarHue(cbounds, ctext, &cvalue) + return float32(cvalue) +} + +// ColorPicker control (multiple color controls) +// NOTE: this picker converts RGB to HSV, which can cause the Hue control to jump. If you have this problem, consider using the HSV variant instead +func ColorPicker(bounds rl.Rectangle, text string, color rl.Color) rl.Color { + var cbounds C.struct_Rectangle + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + var ccolor C.struct_Color + ccolor.r = C.uchar(color.R) + ccolor.g = C.uchar(color.G) + ccolor.b = C.uchar(color.B) + ccolor.a = C.uchar(color.A) + C.GuiColorPicker(cbounds, ctext, &ccolor) + var goRes rl.Color + goRes.A = byte(ccolor.a) + goRes.R = byte(ccolor.r) + goRes.G = byte(ccolor.g) + goRes.B = byte(ccolor.b) + return goRes +} + +// ColorPicker control that avoids conversion to RGB on each call (multiple color controls) +func ColorPickerHSV(bounds rl.Rectangle, text string, colorHSV *rl.Vector3) int32 { + var cbounds C.struct_Rectangle + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + + var ccolorHSV C.struct_Vector3 + ccolorHSV.x = C.float(colorHSV.X) + ccolorHSV.y = C.float(colorHSV.Y) + ccolorHSV.z = C.float(colorHSV.Z) + defer func() { + colorHSV.X = float32(ccolorHSV.x) + colorHSV.Y = float32(ccolorHSV.y) + colorHSV.Z = float32(ccolorHSV.z) + }() + + return int32(C.GuiColorPickerHSV(cbounds, ctext, &ccolorHSV)) +} + +// ColorPanel control that returns HSV color value +func ColorPanelHSV(bounds rl.Rectangle, text string, colorHSV *rl.Vector3) int32 { + var cbounds C.struct_Rectangle + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + + var ccolorHSV C.struct_Vector3 + ccolorHSV.x = C.float(colorHSV.X) + ccolorHSV.y = C.float(colorHSV.Y) + ccolorHSV.z = C.float(colorHSV.Z) + defer func() { + colorHSV.X = float32(ccolorHSV.x) + colorHSV.Y = float32(ccolorHSV.y) + colorHSV.Z = float32(ccolorHSV.z) + }() + + return int32(C.GuiColorPanelHSV(cbounds, ctext, &ccolorHSV)) +} + +// MessageBox control +func MessageBox(bounds rl.Rectangle, title, message, buttons string) int32 { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + var ctitle *C.char + if len(title) > 0 { + ctitle = C.CString(title) + defer C.free(unsafe.Pointer(ctitle)) + } + var cmessage *C.char + if len(message) > 0 { + cmessage = C.CString(message) + defer C.free(unsafe.Pointer(cmessage)) + } + cbuttons := C.CString(buttons) + defer C.free(unsafe.Pointer(cbuttons)) + return int32(C.GuiMessageBox(cbounds, ctitle, cmessage, cbuttons)) +} + +// TextInputBox control, ask for text +func TextInputBox(bounds rl.Rectangle, title, message, buttons string, text *string, textMaxSize int32, secretViewActive *bool) int32 { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + + var ctitle *C.char + if len(title) > 0 { + ctitle = C.CString(title) + defer C.free(unsafe.Pointer(ctitle)) + } + + var cmessage *C.char + if len(message) > 0 { + cmessage = C.CString(message) + defer C.free(unsafe.Pointer(cmessage)) + } + + cbuttons := C.CString(buttons) + defer C.free(unsafe.Pointer(cbuttons)) + + bs := []byte(*text) + if len(bs) == 0 { + bs = []byte{byte(0)} + } + if 0 < len(bs) && bs[len(bs)-1] != byte(0) { // minimalize allocation + bs = append(bs, byte(0)) // for next input symbols + } + ctext := (*C.char)(unsafe.Pointer(&bs[0])) + defer func() { + *text = strings.TrimSpace(strings.Trim(string(bs), "\x00")) + // no need : C.free(unsafe.Pointer(ctext)) + }() + + ctextMaxSize := C.int(textMaxSize) + + csecretViewActive := C.bool(*secretViewActive) + defer func() { + *secretViewActive = bool(csecretViewActive) + }() + + return int32(C.GuiTextInputBox(cbounds, ctitle, cmessage, cbuttons, ctext, ctextMaxSize, &csecretViewActive)) +} + +// Grid control, returns mouse cell position +func Grid(bounds rl.Rectangle, text string, spacing float32, subdivs int32, mouseCell *rl.Vector2) int32 { + var cbounds C.struct_Rectangle + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + cbounds.x = C.float(bounds.X) + var ctext *C.char + if len(text) > 0 { + ctext = C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + } + cspacing := C.float(spacing) + csubdivs := C.int(subdivs) + var cmouseCell C.struct_Vector2 + cmouseCell.x = C.float(mouseCell.X) + cmouseCell.y = C.float(mouseCell.Y) + res := C.GuiGrid(cbounds, ctext, cspacing, csubdivs, &cmouseCell) + mouseCell.X = float32(cmouseCell.x) + mouseCell.Y = float32(cmouseCell.y) + return int32(res) +} + +//---------------------------------------------------------------------------------- +// Tooltip management functions +// NOTE: Tooltips requires some global variables: tooltipPtr +//---------------------------------------------------------------------------------- + +// Enable gui tooltips (global state) +func EnableTooltip() { + C.GuiEnableTooltip() +} + +// Disable gui tooltips (global state) +func DisableTooltip() { + C.GuiDisableTooltip() +} + +// Set tooltip string +func SetTooltip(tooltip string) { + ctooltip := C.CString(tooltip) + defer C.free(unsafe.Pointer(ctooltip)) + C.GuiSetTooltip(ctooltip) +} + +//---------------------------------------------------------------------------------- +// Styles loading functions +//---------------------------------------------------------------------------------- + +// Load raygui style file (.rgs) +func LoadStyle(fileName string) { + cfileName := C.CString(fileName) + defer C.free(unsafe.Pointer(cfileName)) + C.GuiLoadStyle(cfileName) +} + +// Load style default over global style +func LoadStyleDefault() { + C.GuiLoadStyleDefault() +} + +// IconText gets text with icon id prepended (if supported) +func IconText(iconId IconID, text string) string { + ciconId := C.int(iconId) + ctext := C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + return C.GoString(C.GuiIconText(ciconId, ctext)) +} + +// Load raygui icons file (.rgi) +func LoadIcons(fileName string, loadIconsName bool) { + cfileName := C.CString(fileName) + defer C.free(unsafe.Pointer(cfileName)) + C.GuiLoadIcons(cfileName, C.bool(loadIconsName)) +} + +// Load icons from memory (Binary files only) +func LoadIconsFromMemory(data []byte, loadIconsName bool) { + C.GuiLoadIconsFromMemory((*C.uchar)(unsafe.Pointer(&data[0])), C.int(len(data)), C.bool(loadIconsName)) +} + +// Draw icon using pixel size at specified position +func DrawIcon(iconId IconID, posX, posY, pixelSize int32, col color.RGBA) { + C.GuiDrawIcon(C.int(iconId), C.int(posX), C.int(posY), C.int(pixelSize), *(*C.Color)(unsafe.Pointer(&col))) +} + +// Set icon drawing size +func SetIconScale(scale int32) { + C.GuiSetIconScale(C.int(scale)) +} + +// Get text width considering gui style and icon size (if required) +func GetTextWidth(text string) int32 { + ctext := C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + return int32(C.GuiGetTextWidth(ctext)) +} + +//---------------------------------------------------------------------------------- +// Module Internal Functions Definition +//---------------------------------------------------------------------------------- + +// Load style from memory (Binary files only) +func LoadStyleFromMemory(data []byte) { + C.GuiLoadStyleFromMemory((*C.uchar)(unsafe.Pointer(&data[0])), C.int(len(data))) +} + +// ScrollBar control +func ScrollBar(bounds rl.Rectangle, value, minValue, maxValue int32) int32 { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + + cvalue := C.int(value) + cminValue := C.int(minValue) + cmaxValue := C.int(maxValue) + + return int32(C.GuiScrollBar(cbounds, cvalue, cminValue, cmaxValue)) +} + +// Color fade-in or fade-out, alpha value normalized [0..1] +// WARNING: It multiplies current alpha by alpha scale factor +func Fade(color rl.Color, alpha float32) rl.Color { + ccolor := C.struct_Color{C.uchar(color.R), C.uchar(color.G), C.uchar(color.B), C.uchar(color.A)} + calpha := C.float(alpha) + cresult := C.GuiFade(ccolor, calpha) + return rl.Color{R: uint8(cresult.r), G: uint8(cresult.g), B: uint8(cresult.b), A: uint8(cresult.a)} +} + +//---------------------------------------------------------------------------------- +// Additional Draw functions +//---------------------------------------------------------------------------------- + +func DrawRectangle(bounds rl.Rectangle, borderWidth int32, borderColor, fillColor rl.Color) { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + + var cborderColor C.struct_Color + cborderColor.r = C.uchar(borderColor.R) + cborderColor.g = C.uchar(borderColor.G) + cborderColor.b = C.uchar(borderColor.B) + cborderColor.a = C.uchar(borderColor.A) + + var cfillColor C.struct_Color + cfillColor.r = C.uchar(fillColor.R) + cfillColor.g = C.uchar(fillColor.G) + cfillColor.b = C.uchar(fillColor.B) + cfillColor.a = C.uchar(fillColor.A) + + bw := C.int(borderWidth) + + C.GuiDrawRectangle(cbounds, bw, cborderColor, cfillColor) +} + +// DrawText - static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, Color tint); +func DrawText(text string, position rl.Rectangle, alignment int32, color rl.Color) { + ctext := C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + + var cposition C.struct_Rectangle + cposition.x = C.float(position.X) + cposition.y = C.float(position.Y) + cposition.width = C.float(position.Width) + cposition.height = C.float(position.Height) + + calignment := C.int(alignment) + var ccolor C.struct_Color + ccolor.r = C.uchar(color.R) + ccolor.g = C.uchar(color.G) + ccolor.b = C.uchar(color.B) + ccolor.a = C.uchar(color.A) + + C.GuiDrawText(ctext, cposition, calignment, ccolor) +} + +// GetTextBounds - static Rectangle GetTextBounds(int control, Rectangle bounds) +func GetTextBounds(control ControlID, bounds rl.Rectangle) rl.Rectangle { + var cbounds C.struct_Rectangle + cbounds.x = C.float(bounds.X) + cbounds.y = C.float(bounds.Y) + cbounds.width = C.float(bounds.Width) + cbounds.height = C.float(bounds.Height) + + ccontrol := C.int(control) + cretBounds := C.GetTextBounds(ccontrol, cbounds) + return rl.Rectangle{ + X: float32(cretBounds.x), + Y: float32(cretBounds.y), + Width: float32(cretBounds.width), + Height: float32(cretBounds.height), + } +} +*/ diff --git a/raylib/go.sum b/raylib/go.sum index 808648e..b242b0a 100644 --- a/raylib/go.sum +++ b/raylib/go.sum @@ -1,2 +1,2 @@ -github.com/BrownNPC/wasm-ffi-go v1.1.0 h1:oashfuQflpB+qx/xI71Gvim3YN/0iIny5TMIpzEFz0Y= -github.com/BrownNPC/wasm-ffi-go v1.1.0/go.mod h1:D5+RBMb672fgw6vPz4HOWYxpyrmPrIao8VqlXihOFFg= +github.com/BrownNPC/wasm-ffi-go v1.2.0 h1:Lknst90sTLTkE870OKNP/Vw36TohQIJ4ln8W1IG9Zl0= +github.com/BrownNPC/wasm-ffi-go v1.2.0/go.mod h1:D5+RBMb672fgw6vPz4HOWYxpyrmPrIao8VqlXihOFFg= diff --git a/raylib/rcore_wasm.go b/raylib/rcore_wasm.go index 71b447e..f1ef90e 100644 --- a/raylib/rcore_wasm.go +++ b/raylib/rcore_wasm.go @@ -2174,7 +2174,6 @@ func ExportImageToMemory(image Image, fileType string) []byte { return zero } - // GenImageGradientLinear - Generate image: linear gradient, direction in degrees [0..360], 0=Vertical gradient func GenImageGradientLinear(width int, height int, direction int, start color.RGBA, end color.RGBA) *Image { var zero *Image @@ -2591,7 +2590,6 @@ func LoadTexture(fileName string) Texture2D { return v } - // LoadTextureCubemap - Load cubemap from image, multiple image cubemap layouts supported func LoadTextureCubemap(image *Image, layout int32) Texture2D { ret, fl := loadTextureCubemap.Call(image, layout) @@ -3922,7 +3920,6 @@ func SetCallbackFunc() { wasm.Free(fl...) } - // ToImage converts a Image to Go image.Image func ToImage() image.Image { // ret, fl := toImage.Call() diff --git a/wasm-runtime/wasm.go b/wasm-runtime/wasm.go index 77531b5..c15fd3e 100644 --- a/wasm-runtime/wasm.go +++ b/wasm-runtime/wasm.go @@ -1,5 +1,4 @@ //go:build js - package wasm import ( @@ -7,17 +6,17 @@ import ( "unsafe" ) -// cptr is a pointer to raylib wasm memory -type cptr = uint32 +// Cptr is a pointer to raylib wasm memory +type Cptr = uint32 // Allocates memory on raylib heap // //go:wasmimport raylib _malloc //go:noescape -func malloc(size cptr) cptr +func malloc(size Cptr) Cptr // malloc the size of V -func mallocV[T any](V T) (cptr, func()) { +func mallocV[T any](V T) (Cptr, func()) { ptr := malloc(sizeof(V)) return ptr, func() { free(ptr) } } @@ -26,7 +25,7 @@ func mallocV[T any](V T) (cptr, func()) { // //go:wasmimport raylib _free //go:noescape -func free(cptr) +func free(Cptr) // _copyToC copies a Go type/struct to C memory. Useful for copying slices and structs. // @@ -37,7 +36,7 @@ func free(cptr) // //go:wasmimport gojs CopyToC //go:noescape -func _copyToC(Value unsafe.Pointer, srcSize, dstCptr cptr) +func _copyToC(Value unsafe.Pointer, srcSize, dstCptr Cptr) // copies C memory to a Go pointer. Useful for copying C structs into Go structs // @@ -56,10 +55,10 @@ func _copyToC(Value unsafe.Pointer, srcSize, dstCptr cptr) // //go:wasmimport gojs CopyToGo //go:noescape -func _copyToGo(dstGoPtr unsafe.Pointer, size cptr, src cptr) +func _copyToGo(dstGoPtr unsafe.Pointer, size Cptr, src Cptr) // Copies the src value to the dst cptr -func copyToC[T any](src T, dst cptr) { +func copyToC[T any](src T, dst Cptr) { size := sizeof(src) _copyToC(unsafe.Pointer(&src), size, dst) } @@ -68,16 +67,16 @@ func copyToC[T any](src T, dst cptr) { // //go:wasmimport gojs CStringFromGoString //go:noescape -func cString(string) cptr +func cString(string) Cptr // Scan for null terminator and return length excluding the null terminator. // //go:wasmimport gojs CStringGetLength //go:noescape -func _cStringGetLength(cstr cptr) cptr +func _cStringGetLength(cstr Cptr) Cptr // Copies a C string to Go memory without freeing the C string. -func goString(cstr cptr) string { +func goString(cstr Cptr) string { size := _cStringGetLength(cstr) dstStr := make([]byte, size) copySliceToGo(cstr, dstStr) @@ -87,7 +86,7 @@ func goString(cstr cptr) string { // copyValueToC copies a value to C and returns a pointer to it. // // NOTE: Value cannot be a slice. For a slice, use [copySliceToC] -func copyValueToC[T any](srcValue T) (cptr, func()) { +func copyValueToC[T any](srcValue T) (Cptr, func()) { dst, free := mallocV(srcValue) copyToC(srcValue, dst) return dst, free @@ -96,9 +95,9 @@ func copyValueToC[T any](srcValue T) (cptr, func()) { // copySliceToC allocates a copy of a slice in C memory and returns a cptr to it. // // NOTE: Value MUST be a slice -func copySliceToC[Slice ~[]E, E any](s Slice) (cptr, func()) { +func copySliceToC[Slice ~[]E, E any](s Slice) (Cptr, func()) { // size of the slice's underlying array in bytes - sliceSize := cptr(unsafe.Sizeof(s[:1][0])) * cptr(len(s)) + sliceSize := Cptr(unsafe.Sizeof(s[:1][0])) * Cptr(len(s)) // allocate C array to hold Value dstCptr := malloc(sliceSize) // copy underlying array memory to C @@ -110,7 +109,7 @@ func copySliceToC[Slice ~[]E, E any](s Slice) (cptr, func()) { // Useful for copying structs // // NOTE: Slices are not supported. Use [copySliceToGo] -func copyValueToGo[T any](src cptr, dst *T) { +func copyValueToGo[T any](src Cptr, dst *T) { size := sizeof(*dst) _copyToGo(unsafe.Pointer(dst), size, src) } @@ -118,13 +117,13 @@ func copyValueToGo[T any](src cptr, dst *T) { // copySliceToGo copies a C array into a Go Slice. // // It copies bytes to the underlying array of the slice. -func copySliceToGo[Slice ~[]E, E any](src cptr, dst Slice) { +func copySliceToGo[Slice ~[]E, E any](src Cptr, dst Slice) { // size of underlying array var occupiedSize = len(dst) if occupiedSize == 0 { occupiedSize = cap(dst) } - size := cptr(unsafe.Sizeof(dst[0])) * cptr(occupiedSize) + size := Cptr(unsafe.Sizeof(dst[0])) * Cptr(occupiedSize) dstPtr := unsafe.SliceData(dst) _copyToGo(unsafe.Pointer(dstPtr), size, src) } @@ -147,4 +146,4 @@ func SetMain(UpdateAndDrawFrame func()) { } // return sizeof of v in bytes -func sizeof[T any](v T) cptr { return cptr(unsafe.Sizeof(v)) } +func sizeof[T any](v T) Cptr { return Cptr(unsafe.Sizeof(v)) } From b10b9676285494520d0d1e0dad0063d6100ade7e Mon Sep 17 00:00:00 2001 From: Cristian Marcos Martin Date: Wed, 22 Apr 2026 23:41:13 +0200 Subject: [PATCH 5/9] Draft of the raygui bindings implementation --- examples/raygui/main.go | 4 +- index/index.js | 1 + index/runtime.js | 6 + raygui/raygui.go | 1343 +++++++++++++++++++++++---------------- wasm-runtime/wasm.go | 64 +- 5 files changed, 857 insertions(+), 561 deletions(-) diff --git a/examples/raygui/main.go b/examples/raygui/main.go index 3d1e16b..3ab095f 100644 --- a/examples/raygui/main.go +++ b/examples/raygui/main.go @@ -3,7 +3,7 @@ package main import ( - "github.com/gen2brain/raylib-go/raygui" + rg "github.com/gen2brain/raylib-go/raygui" rl "github.com/gen2brain/raylib-go/raylib" ) @@ -12,7 +12,7 @@ func main() { update := func() { rl.BeginDrawing() - rl.ClearBackground(raygui.GetStyle(raygui.DEFAULT, raygui.BASE_COLOR_PRESSED).AsColor()) + rl.ClearBackground(rg.GetStyle(rg.DEFAULT, rg.BASE_COLOR_PRESSED).AsColor()) rl.EndDrawing() } rl.SetMain(update) diff --git a/index/index.js b/index/index.js index 43d8be9..b9e7ed5 100644 --- a/index/index.js +++ b/index/index.js @@ -33,6 +33,7 @@ Object.assign(go.importObject.gojs, { struct: runtime.struct.bind(runtime), CStringFromGoString: runtime.CStringFromGoString.bind(runtime), CStringGetLength: runtime.CStringGetLength.bind(runtime), + CBoolFromGoBool: runtime.CBoolFromGoBool.bind(runtime), CopyToC: runtime.CopyToC.bind(runtime), CopyToGo: runtime.CopyToGo.bind(runtime), Alert: runtime.Alert.bind(runtime), diff --git a/index/runtime.js b/index/runtime.js index 37aa875..76ceac2 100644 --- a/index/runtime.js +++ b/index/runtime.js @@ -97,6 +97,12 @@ class Runtime { // return cstr this.setInt32(sp + 8 * 3, cstr); }; + // func(int32) bool + // returns a C int32 + CBoolFromGoBool = (b) => { + if (b == true) return 1; + return 0; + }; // func(src unsafe.Pointer, srcSize, dstCptr cptr) // copies Go memory to C memory. Useful for copying slices and structs. // Destination C array must have enough space. diff --git a/raygui/raygui.go b/raygui/raygui.go index ff31d29..a592ce4 100644 --- a/raygui/raygui.go +++ b/raygui/raygui.go @@ -3,7 +3,11 @@ package raygui import ( + "image/color" + "unsafe" + rl "github.com/BrownNPC/Raylib-Go-Wasm/raylib" + wasm "github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime" ) type ( @@ -467,74 +471,116 @@ const ( ICON_255 IconID = 255 ) -/* //---------------------------------------------------------------------------------- // Gui Setup Functions Definition //---------------------------------------------------------------------------------- +//go:wasmimport raylib _GuiEnable +//go:noescape +func guiEnable() + // Enable gui global state func Enable() { - C.GuiEnable() + guiEnable() } +//go:wasmimport raylib _GuiDisable +//go:noescape +func guiDisable() + // Disable gui global state func Disable() { - C.GuiDisable() + guiDisable() } +//go:wasmimport raylib _GuiLock +//go:noescape +func guiLock() + // Lock gui global state func Lock() { - C.GuiLock() + guiLock() } +//go:wasmimport raylib _GuiUnlock +//go:noescape +func guiUnlock() + // Unlock gui global state func Unlock() { - C.GuiUnlock() + guiUnlock() } +//go:wasmimport raylib _GuiIsLocked +//go:noescape +func guiIsLocked() int32 + // Check if gui is locked (global state) func IsLocked() bool { - return bool(C.GuiIsLocked()) + return wasm.GoBool(guiIsLocked()) } +//go:wasmimport raylib _GuiSetAlpha +//go:noescape +func guiSetAlpha(alpha float32) + // Set gui controls alpha global state func SetAlpha(alpha float32) { - calpha := C.float(alpha) - C.GuiSetAlpha(calpha) + calpha := float32(alpha) + guiSetAlpha(calpha) } +//go:wasmimport raylib _GuiSetState +//go:noescape +func guiSetState(state int32) + // Set gui state (global state) func SetState(state PropertyValue) { - cstate := C.int(state) - C.GuiSetState(cstate) + cstate := int32(state) + guiSetState(cstate) } +//go:wasmimport raylib _GuiGetState +//go:noescape +func guiGetState() PropertyValue + // Get gui state (global state) func GetState() PropertyValue { - return PropertyValue(C.GuiGetState()) + return PropertyValue(guiGetState()) } +//go:wasmimport raylib _GuiSetFont +//go:noescape +func guiSetFont(font *rl.Font) + // Set custom gui font func SetFont(font rl.Font) { - cfont := (*C.Font)(unsafe.Pointer(&font)) - C.GuiSetFont(*cfont) + cfont := (*rl.Font)(unsafe.Pointer(&font)) + guiSetFont(cfont) } +//go:wasmimport raylib _GuiGetFont +//go:noescape +func guiGetFont() *rl.Font + // Get custom gui font func GetFont() rl.Font { - ret := C.GuiGetFont() - ptr := unsafe.Pointer(&ret) + ret := guiGetFont() + ptr := unsafe.Pointer(ret) return *(*rl.Font)(ptr) } +//go:wasmimport raylib _GuiSetStyle +//go:noescape +func guiSetStyle(control, property, value int32) int32 + // Set control style property value func SetStyle(control ControlID, property PropertyID, value PropertyValue) { - ccontrol := C.int(control) - cproperty := C.int(property) - cvalue := C.int(value) - C.GuiSetStyle(ccontrol, cproperty, cvalue) + ccontrol := int32(control) + cproperty := int32(property) + cvalue := int32(value) + guiSetStyle(ccontrol, cproperty, cvalue) } -*/ //go:wasmimport raylib _GuiGetStyle //go:noescape @@ -547,9 +593,12 @@ func GetStyle(control ControlID, property PropertyID) PropertyValue { return PropertyValue(guiGetStyle(ccontrol, cproperty)) } -/* +//go:wasmimport raylib _GuiGetColor +//go:noescape +func guiGetColor(control, property uint16) rl.Color + func GetColor(control ControlID, property PropertyID) rl.Color { - color := C.GuiGetStyle(C.int(control), C.int(property)) + color := guiGetStyle(int32(control), int32(property)) return rl.Color{R: uint8(color >> 24), G: uint8(color >> 16), B: uint8(color >> 8), A: uint8(color)} } @@ -557,291 +606,357 @@ func GetColor(control ControlID, property PropertyID) rl.Color { // Gui Controls Functions Definition //---------------------------------------------------------------------------------- +//go:wasmimport raylib _GuiWindowBox +//go:noescape +func guiWindowBox(bounds rl.Rectangle, title wasm.Cptr) int32 + // Window Box control func WindowBox(bounds rl.Rectangle, title string) bool { - var cbounds C.struct_Rectangle - cbounds.height = C.float(bounds.Height) - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - var ctitle *C.char + var cbounds rl.Rectangle + cbounds.Height = float32(bounds.Height) + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + var ctitle wasm.Cptr if len(title) > 0 { - ctitle = C.CString(title) - defer C.free(unsafe.Pointer(ctitle)) + ctitle = wasm.CString(title) + defer wasm.Free(ctitle) } - return C.GuiWindowBox(cbounds, ctitle) != 0 + return guiWindowBox(cbounds, ctitle) != 0 } +//go:wasmimport raylib _GuiGroupBox +//go:noescape +func guiGroupBox(bounds rl.Rectangle, text wasm.Cptr) + // Group Box control with text name func GroupBox(bounds rl.Rectangle, text string) { - var cbounds C.struct_Rectangle - cbounds.height = C.float(bounds.Height) - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.Height = float32(bounds.Height) + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - C.GuiGroupBox(cbounds, ctext) + guiGroupBox(cbounds, ctext) } +//go:wasmimport raylib _GuiLine +//go:noescape +func guiLine(bounds rl.Rectangle, text wasm.Cptr) + // Line control func Line(bounds rl.Rectangle, text string) { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - C.GuiLine(cbounds, ctext) + guiLine(cbounds, ctext) } +//go:wasmimport raylib _GuiPanel +//go:noescape +func guiPanel(bounds rl.Rectangle, text wasm.Cptr) + // Panel control func Panel(bounds rl.Rectangle, text string) { - var cbounds C.struct_Rectangle - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - C.GuiPanel(cbounds, ctext) + guiPanel(cbounds, ctext) } +/* +//go:wasmimport raylib _GuiTabBar +//go:noescape +func guiTabBar(bounds rl.Rectangle, text []wasm.Cptr, active *int32) int32 + // Tab Bar control, returns the current TAB closing requested, -1 otherwise func TabBar(bounds rl.Rectangle, text []string, active *int32) int32 { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) ctext := NewCStringArrayFromSlice(text) defer ctext.Free() - count := C.int(len(text)) + count := int32(len(text)) if active == nil { active = new(int32) } - cactive := C.int(*active) + cactive := int32(*active) defer func() { *active = int32(cactive) }() - return int32(C.GuiTabBar(cbounds, (**C.char)(ctext.Pointer), count, &cactive)) + return int32(guiTabBar(cbounds, (*wasm.Cptr)(ctext.Pointer), count, cactive)) } +*/ + +//go:wasmimport raylib _GuiScrollPanel +//go:noescape +func guiScrollPanel(bounds rl.Rectangle, text wasm.Cptr, content rl.Rectangle, scroll *rl.Vector2, view *rl.Rectangle) // Scroll Panel control func ScrollPanel(bounds rl.Rectangle, text string, content rl.Rectangle, scroll *rl.Vector2, view *rl.Rectangle) { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - var ccontent C.struct_Rectangle - ccontent.x = C.float(content.X) - ccontent.y = C.float(content.Y) - ccontent.width = C.float(content.Width) - ccontent.height = C.float(content.Height) - var cscroll C.struct_Vector2 - cscroll.x = C.float(scroll.X) - cscroll.y = C.float(scroll.Y) + var ccontent rl.Rectangle + ccontent.X = float32(content.X) + ccontent.Y = float32(content.Y) + ccontent.Width = float32(content.Width) + ccontent.Height = float32(content.Height) + var cscroll rl.Vector2 + cscroll.X = float32(scroll.X) + cscroll.Y = float32(scroll.Y) defer func() { - scroll.X = float32(cscroll.x) - scroll.Y = float32(cscroll.y) + scroll.X = float32(cscroll.X) + scroll.Y = float32(cscroll.Y) }() - var cview C.struct_Rectangle - cview.x = C.float(view.X) - cview.y = C.float(view.Y) - cview.width = C.float(view.Width) - cview.height = C.float(view.Height) + var cview rl.Rectangle + cview.X = float32(view.X) + cview.Y = float32(view.Y) + cview.Width = float32(view.Width) + cview.Height = float32(view.Height) defer func() { - view.X = float32(cview.x) - view.Y = float32(cview.y) - view.Width = float32(cview.width) - view.Height = float32(cview.height) + view.X = float32(cview.X) + view.Y = float32(cview.Y) + view.Width = float32(cview.Width) + view.Height = float32(cview.Height) }() - C.GuiScrollPanel(cbounds, ctext, ccontent, &cscroll, &cview) + guiScrollPanel(cbounds, ctext, ccontent, &cscroll, &cview) } +//go:wasmimport raylib _GuiLabel +//go:noescape +func guiLabel(bounds rl.Rectangle, text wasm.Cptr) + // Label control func Label(bounds rl.Rectangle, text string) { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - C.GuiLabel(cbounds, ctext) + guiLabel(cbounds, ctext) } +//go:wasmimport raylib _GuiButton +//go:noescape +func guiButton(bounds rl.Rectangle, text wasm.Cptr) int32 + // Button control, returns true when clicked func Button(bounds rl.Rectangle, text string) bool { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - return C.GuiButton(cbounds, ctext) != 0 + return guiButton(cbounds, ctext) != 0 } +//go:wasmimport raylib _GuiLabelButton +//go:noescape +func guiLabelButton(bounds rl.Rectangle, text wasm.Cptr) int32 + // LabelButton control, returns true when clicked func LabelButton(bounds rl.Rectangle, text string) bool { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - return C.GuiLabelButton(cbounds, ctext) != 0 + return guiLabelButton(cbounds, ctext) != 0 } +//go:wasmimport raylib _GuiToggle +//go:noescape +func guiToggle(bounds rl.Rectangle, text wasm.Cptr, active int32) int32 + // Toggle control, returns true when active func Toggle(bounds rl.Rectangle, text string, active bool) bool { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - cactive := C.bool(active) - C.GuiToggle(cbounds, ctext, &cactive) - return bool(cactive) + cactive := wasm.CBool(active) + guiToggle(cbounds, ctext, cactive) + return wasm.GoBool(cactive) } +//go:wasmimport raylib _GuiToggleGroup +//go:noescape +func guiToggleGroup(bounds rl.Rectangle, text wasm.Cptr, active int32) int32 + // ToggleGroup control, returns active toggle index func ToggleGroup(bounds rl.Rectangle, text string, active int32) int32 { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - cactive := C.int(active) - C.GuiToggleGroup(cbounds, ctext, &cactive) + cactive := int32(active) + guiToggleGroup(cbounds, ctext, cactive) return int32(cactive) } +//go:wasmimport raylib _GuiToggleSlider +//go:noescape +func guiToggleSlider(bounds rl.Rectangle, text wasm.Cptr, active int32) int32 + // ToggleSlider control, returns true when clicked func ToggleSlider(bounds rl.Rectangle, text string, active int32) int32 { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - cactive := C.int(active) - C.GuiToggleSlider(cbounds, ctext, &cactive) + cactive := int32(active) + guiToggleSlider(cbounds, ctext, cactive) return int32(cactive) } +//go:wasmimport raylib _GuiCheckBox +//go:noescape +func guiCheckBox(bounds rl.Rectangle, text wasm.Cptr, checked int32) int32 + // CheckBox control, returns true when active func CheckBox(bounds rl.Rectangle, text string, checked bool) bool { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - cchecked := C.bool(checked) - C.GuiCheckBox(cbounds, ctext, &cchecked) - return bool(cchecked) + cchecked := wasm.CBool(checked) + return wasm.GoBool(guiCheckBox(cbounds, ctext, cchecked)) } +//go:wasmimport raylib _GuiComboBox +//go:noescape +func guiComboBox(bounds rl.Rectangle, text wasm.Cptr, active int32) int32 + // ComboBox control, returns selected item index func ComboBox(bounds rl.Rectangle, text string, active int32) int32 { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - cactive := C.int(active) - C.GuiComboBox(cbounds, ctext, &cactive) + cactive := int32(active) + guiComboBox(cbounds, ctext, cactive) return int32(cactive) } +//go:wasmimport raylib _GuiDropdownBox +//go:noescape +func guiDropdownBox(bounds rl.Rectangle, text wasm.Cptr, active *int32, editMode int32) int32 + // DropdownBox control, returns true when clicked func DropdownBox(bounds rl.Rectangle, text string, active *int32, editMode bool) bool { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } if active == nil { active = new(int32) } - cactive := C.int(*active) + cactive := int32(*active) defer func() { *active = int32(cactive) }() - ceditMode := C.bool(editMode) + ceditMode := wasm.CBool(editMode) - return C.GuiDropdownBox(cbounds, ctext, &cactive, ceditMode) != 0 + return guiDropdownBox(cbounds, ctext, &cactive, ceditMode) != 0 } +/* +//go:wasmimport raylib _GuiTextBox +//go:noescape +func guiTextBox(bounds rl.Rectangle, text *wasm.Cptr, textSize int32, editMode int32) int32 + // TextBox control, updates input text, returns true on ENTER pressed or defocused -func TextBox(bounds rl.Rectangle, text *string, textSize int, editMode bool) bool { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) +func TextBox(bounds rl.Rectangle, text *string, textSize int32, editMode bool) bool { + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) bs := []byte(*text) if len(bs) == 0 { @@ -850,85 +965,99 @@ func TextBox(bounds rl.Rectangle, text *string, textSize int, editMode bool) boo if 0 < len(bs) && bs[len(bs)-1] != byte(0) { // minimalize allocation bs = append(bs, byte(0)) // for next input symbols } - ctext := (*C.char)(unsafe.Pointer(&bs[0])) + ctext := (wasm.Cptr)(unsafe.Pointer(bs[0])) defer func() { *text = strings.Trim(string(bs), "\x00") - // no need : C.free(unsafe.Pointer(ctext)) + // no need : wasm.Free(ctext) }() - ctextSize := C.int(textSize) - ceditMode := C.bool(editMode) + ctextSize := int32(textSize) + ceditMode := wasm.CBool(editMode) - return C.GuiTextBox(cbounds, ctext, ctextSize, ceditMode) != 0 + return guiTextBox(cbounds, ctext, ctextSize, ceditMode) != 0 } +*/ + +//go:wasmimport raylib _GuiSpinner +//go:noescape +func guiSpinner(bounds rl.Rectangle, text wasm.Cptr, value *int32, minValue, maxValue int32, editMode int32) int32 // Spinner control, sets value to the selected number and returns true when clicked. func Spinner(bounds rl.Rectangle, text string, value *int32, minValue, maxValue int, editMode bool) bool { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } if value == nil { value = new(int32) } - cvalue := C.int(*value) + cvalue := int32(*value) defer func() { *value = int32(cvalue) }() - cminValue := C.int(minValue) - cmaxValue := C.int(maxValue) - ceditMode := C.bool(editMode) + cminValue := int32(minValue) + cmaxValue := int32(maxValue) + ceditMode := wasm.CBool(editMode) - return C.GuiSpinner(cbounds, ctext, &cvalue, cminValue, cmaxValue, ceditMode) != 0 + return guiSpinner(cbounds, ctext, &cvalue, cminValue, cmaxValue, ceditMode) != 0 } +//go:wasmimport raylib _GuiValueBox +//go:noescape +func guiValueBox(bounds rl.Rectangle, text wasm.Cptr, value *int32, minValue, maxValue int32, editMode int32) int32 + // ValueBox control, updates input text with numbers func ValueBox(bounds rl.Rectangle, text string, value *int32, minValue, maxValue int, editMode bool) bool { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } if value == nil { value = new(int32) } - cvalue := C.int(*value) + cvalue := int32(*value) defer func() { *value = int32(cvalue) }() - cminValue := C.int(minValue) - cmaxValue := C.int(maxValue) - ceditMode := C.bool(editMode) + cminValue := int32(minValue) + cmaxValue := int32(maxValue) + ceditMode := wasm.CBool(editMode) - return C.GuiValueBox(cbounds, ctext, &cvalue, cminValue, cmaxValue, ceditMode) != 0 + return guiValueBox(cbounds, ctext, &cvalue, cminValue, cmaxValue, ceditMode) != 0 } +/* +//go:wasmimport raylib _GuiValueBoxFloat +//go:noescape +func guiValueBoxFloat(bounds rl.Rectangle, text wasm.Cptr, textValue *wasm.Cptr, value *float32, editMode int32) int32 + // Floating point Value Box control, updates input val_str with numbers func ValueBoxFloat(bounds rl.Rectangle, text string, textValue *string, value *float32, editMode bool) bool { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } bs := []byte(*textValue) @@ -938,178 +1067,211 @@ func ValueBoxFloat(bounds rl.Rectangle, text string, textValue *string, value *f if 0 < len(bs) && bs[len(bs)-1] != byte(0) { // minimalize allocation bs = append(bs, byte(0)) // for next input symbols } - ctextValue := (*C.char)(unsafe.Pointer(&bs[0])) + ctextValue := (wasm.Cptr)(unsafe.Pointer(bs[0])) defer func() { *textValue = strings.Trim(string(bs), "\x00") - // no need : C.free(unsafe.Pointer(ctext)) + // no need : wasm.Free(ctext) }() if value == nil { value = new(float32) } - cvalue := C.float(*value) + cvalue := float32(*value) defer func() { *value = float32(cvalue) }() - return C.GuiValueBoxFloat(cbounds, ctext, ctextValue, &cvalue, C.bool(editMode)) != 0 + return guiValueBoxFloat(cbounds, ctext, ctextValue, &cvalue, wasm.CBool(editMode)) != 0 } +*/ + +//go:wasmimport raylib _GuiSlider +//go:noescape +func guiSlider(bounds rl.Rectangle, textLeft, textRight wasm.Cptr, value, minValue, maxValue float32) float32 // Slider control func Slider(bounds rl.Rectangle, textLeft, textRight string, value, minValue, maxValue float32) float32 { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) - var ctextLeft *C.char + var ctextLeft wasm.Cptr if len(textLeft) > 0 { - ctextLeft = C.CString(textLeft) - defer C.free(unsafe.Pointer(ctextLeft)) + ctextLeft = wasm.CString(textLeft) + defer wasm.Free(ctextLeft) } - var ctextRight *C.char + var ctextRight wasm.Cptr if len(textRight) > 0 { - ctextRight = C.CString(textRight) - defer C.free(unsafe.Pointer(ctextRight)) + ctextRight = wasm.CString(textRight) + defer wasm.Free(ctextRight) } - cvalue := C.float(value) - cminValue := C.float(minValue) - cmaxValue := C.float(maxValue) - C.GuiSlider(cbounds, ctextLeft, ctextRight, &cvalue, cminValue, cmaxValue) + cvalue := float32(value) + cminValue := float32(minValue) + cmaxValue := float32(maxValue) + guiSlider(cbounds, ctextLeft, ctextRight, cvalue, cminValue, cmaxValue) return float32(cvalue) } +//go:wasmimport raylib _GuiSliderBar +//go:noescape +func guiSliderBar(bounds rl.Rectangle, textLeft, textRight wasm.Cptr, value, minValue, maxValue float32) float32 + // SliderBar control, returns selected value func SliderBar(bounds rl.Rectangle, textLeft, textRight string, value, minValue, maxValue float32) float32 { - var cbounds C.struct_Rectangle - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) + var cbounds rl.Rectangle + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) - var ctextLeft *C.char + var ctextLeft wasm.Cptr if len(textLeft) > 0 { - ctextLeft = C.CString(textLeft) - defer C.free(unsafe.Pointer(ctextLeft)) + ctextLeft = wasm.CString(textLeft) + defer wasm.Free(ctextLeft) } - var ctextRight *C.char + var ctextRight wasm.Cptr if len(textRight) > 0 { - ctextRight = C.CString(textRight) - defer C.free(unsafe.Pointer(ctextRight)) + ctextRight = wasm.CString(textRight) + defer wasm.Free(ctextRight) } - cvalue := C.float(value) - cminValue := C.float(minValue) - cmaxValue := C.float(maxValue) - C.GuiSliderBar(cbounds, ctextLeft, ctextRight, &cvalue, cminValue, cmaxValue) + cvalue := float32(value) + cminValue := float32(minValue) + cmaxValue := float32(maxValue) + guiSliderBar(cbounds, ctextLeft, ctextRight, cvalue, cminValue, cmaxValue) return float32(cvalue) } +//go:wasmimport raylib _GuiProgressBar +//go:noescape +func guiProgressBar(bounds rl.Rectangle, textLeft, textRight wasm.Cptr, value, minValue, maxValue float32) float32 + // ProgressBar control, shows current progress value func ProgressBar(bounds rl.Rectangle, textLeft, textRight string, value, minValue, maxValue float32) float32 { - var cbounds C.struct_Rectangle - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) + var cbounds rl.Rectangle + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) - var ctextLeft *C.char + var ctextLeft wasm.Cptr if len(textLeft) > 0 { - ctextLeft = C.CString(textLeft) - defer C.free(unsafe.Pointer(ctextLeft)) + ctextLeft = wasm.CString(textLeft) + defer wasm.Free(ctextLeft) } - var ctextRight *C.char + var ctextRight wasm.Cptr if len(textRight) > 0 { - ctextRight = C.CString(textRight) - defer C.free(unsafe.Pointer(ctextRight)) + ctextRight = wasm.CString(textRight) + defer wasm.Free(ctextRight) } - cvalue := C.float(value) - cminValue := C.float(minValue) - cmaxValue := C.float(maxValue) - C.GuiProgressBar(cbounds, ctextLeft, ctextRight, &cvalue, cminValue, cmaxValue) + cvalue := float32(value) + cminValue := float32(minValue) + cmaxValue := float32(maxValue) + guiProgressBar(cbounds, ctextLeft, ctextRight, cvalue, cminValue, cmaxValue) return float32(cvalue) } // StatusBar control, shows info text + +//go:wasmimport raylib _GuiStatusBar +//go:noescape +func guiStatusBar(bounds rl.Rectangle, text wasm.Cptr) + func StatusBar(bounds rl.Rectangle, text string) { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - C.GuiStatusBar(cbounds, ctext) + guiStatusBar(cbounds, ctext) } // DummyRectangle control, intended for placeholding + +//go:wasmimport raylib _GuiDummyRec +//go:noescape +func guiDummyRec(bounds rl.Rectangle, text wasm.Cptr) + func DummyRec(bounds rl.Rectangle, text string) { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - C.GuiDummyRec(cbounds, ctext) + guiDummyRec(cbounds, ctext) } // ListView control, returns selected list item index + +//go:wasmimport raylib _GuiListView +//go:noescape +func guiListView(bounds rl.Rectangle, text wasm.Cptr, scrollIndex *int32, active int32) int32 + func ListView(bounds rl.Rectangle, text string, scrollIndex *int32, active int32) int32 { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } if scrollIndex == nil { scrollIndex = new(int32) } - cscrollIndex := C.int(*scrollIndex) + cscrollIndex := int32(*scrollIndex) defer func() { *scrollIndex = int32(cscrollIndex) }() - cactive := C.int(active) + cactive := int32(active) - C.GuiListView(cbounds, ctext, &cscrollIndex, &cactive) + guiListView(cbounds, ctext, &cscrollIndex, cactive) return int32(cactive) } +/* +//go:wasmimport raylib _GuiListViewEx +//go:noescape +func guiListViewEx(bounds rl.Rectangle, text []wasm.Cptr, focus, scrollIndex *int32, active *int32) int32 + // ListView control with extended parameters func ListViewEx(bounds rl.Rectangle, text []string, focus, scrollIndex *int32, active int32) int32 { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) ctext := NewCStringArrayFromSlice(text) defer ctext.Free() - count := C.int(len(text)) + count := int32(len(text)) if focus == nil { focus = new(int32) } - cfocus := C.int(*focus) + cfocus := int32(*focus) defer func() { *focus = int32(cfocus) }() @@ -1117,202 +1279,236 @@ func ListViewEx(bounds rl.Rectangle, text []string, focus, scrollIndex *int32, a if scrollIndex == nil { scrollIndex = new(int32) } - cscrollIndex := C.int(*scrollIndex) + cscrollIndex := int32(*scrollIndex) defer func() { *scrollIndex = int32(cscrollIndex) }() - cactive := C.int(active) + cactive := int32(active) - C.GuiListViewEx(cbounds, (**C.char)(ctext.Pointer), count, &cfocus, &cscrollIndex, &cactive) + guiListViewEx(cbounds, (*wasm.Cptr)(ctext.Pointer), count, cfocus, cscrollIndex, cactive) return int32(cactive) } +*/ + +//go:wasmimport raylib _GuiColorPanel +//go:noescape +func guiColorPanel(bounds rl.Rectangle, text wasm.Cptr, color rl.Color) rl.Color // ColorPanel control, Color (RGBA) variant func ColorPanel(bounds rl.Rectangle, text string, color rl.Color) rl.Color { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - var ccolor C.struct_Color - ccolor.b = C.uchar(color.B) - ccolor.a = C.uchar(color.A) - ccolor.r = C.uchar(color.R) - ccolor.g = C.uchar(color.G) - C.GuiColorPanel(cbounds, ctext, &ccolor) + var ccolor rl.Color + ccolor.B = uint8(color.B) + ccolor.A = uint8(color.A) + ccolor.R = uint8(color.R) + ccolor.G = uint8(color.G) + guiColorPanel(cbounds, ctext, ccolor) var goRes rl.Color - goRes.A = byte(ccolor.a) - goRes.R = byte(ccolor.r) - goRes.G = byte(ccolor.g) - goRes.B = byte(ccolor.b) + goRes.A = byte(ccolor.A) + goRes.R = byte(ccolor.R) + goRes.G = byte(ccolor.G) + goRes.B = byte(ccolor.B) return goRes } +//go:wasmimport raylib _GuiColorBarAlpha +//go:noescape +func guiColorBarAlpha(bounds rl.Rectangle, text wasm.Cptr, alpha float32) float32 + // ColorBarAlpha control, returns alpha value normalized [0..1] func ColorBarAlpha(bounds rl.Rectangle, text string, alpha float32) float32 { - var cbounds C.struct_Rectangle - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - calpha := C.float(alpha) - C.GuiColorBarAlpha(cbounds, ctext, &calpha) + calpha := float32(alpha) + guiColorBarAlpha(cbounds, ctext, calpha) return float32(calpha) } +//go:wasmimport raylib _GuiColorBarHue +//go:noescape +func guiColorBarHue(bounds rl.Rectangle, text wasm.Cptr, value float32) float32 + // ColorBarHue control, returns alpha value normalized [0..1] func ColorBarHue(bounds rl.Rectangle, text string, value float32) float32 { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - cvalue := C.float(value) - C.GuiColorBarHue(cbounds, ctext, &cvalue) + cvalue := float32(value) + guiColorBarHue(cbounds, ctext, cvalue) return float32(cvalue) } +//go:wasmimport raylib _GuiColorPicker +//go:noescape +func guiColorPicker(bounds rl.Rectangle, text wasm.Cptr, color rl.Color) rl.Color + // ColorPicker control (multiple color controls) // NOTE: this picker converts RGB to HSV, which can cause the Hue control to jump. If you have this problem, consider using the HSV variant instead func ColorPicker(bounds rl.Rectangle, text string, color rl.Color) rl.Color { - var cbounds C.struct_Rectangle - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - var ccolor C.struct_Color - ccolor.r = C.uchar(color.R) - ccolor.g = C.uchar(color.G) - ccolor.b = C.uchar(color.B) - ccolor.a = C.uchar(color.A) - C.GuiColorPicker(cbounds, ctext, &ccolor) + var ccolor rl.Color + ccolor.R = uint8(color.R) + ccolor.G = uint8(color.G) + ccolor.B = uint8(color.B) + ccolor.A = uint8(color.A) + guiColorPicker(cbounds, ctext, ccolor) var goRes rl.Color - goRes.A = byte(ccolor.a) - goRes.R = byte(ccolor.r) - goRes.G = byte(ccolor.g) - goRes.B = byte(ccolor.b) + goRes.A = byte(ccolor.A) + goRes.R = byte(ccolor.R) + goRes.G = byte(ccolor.G) + goRes.B = byte(ccolor.B) return goRes } +//go:wasmimport raylib _GuiColorPickerHSV +//go:noescape +func guiColorPickerHSV(bounds rl.Rectangle, text wasm.Cptr, colorHSV *rl.Vector3) int32 + // ColorPicker control that avoids conversion to RGB on each call (multiple color controls) func ColorPickerHSV(bounds rl.Rectangle, text string, colorHSV *rl.Vector3) int32 { - var cbounds C.struct_Rectangle - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) + var cbounds rl.Rectangle + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) - var ctext *C.char + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - var ccolorHSV C.struct_Vector3 - ccolorHSV.x = C.float(colorHSV.X) - ccolorHSV.y = C.float(colorHSV.Y) - ccolorHSV.z = C.float(colorHSV.Z) + var ccolorHSV rl.Vector3 + ccolorHSV.X = float32(colorHSV.X) + ccolorHSV.Y = float32(colorHSV.Y) + ccolorHSV.Z = float32(colorHSV.Z) defer func() { - colorHSV.X = float32(ccolorHSV.x) - colorHSV.Y = float32(ccolorHSV.y) - colorHSV.Z = float32(ccolorHSV.z) + colorHSV.X = float32(ccolorHSV.X) + colorHSV.Y = float32(ccolorHSV.Y) + colorHSV.Z = float32(ccolorHSV.Z) }() - return int32(C.GuiColorPickerHSV(cbounds, ctext, &ccolorHSV)) + return int32(guiColorPickerHSV(cbounds, ctext, &ccolorHSV)) } +//go:wasmimport raylib _GuiColorPanelHSV +//go:noescape +func guiColorPanelHSV(bounds rl.Rectangle, text wasm.Cptr, colorHSV *rl.Vector3) int32 + // ColorPanel control that returns HSV color value func ColorPanelHSV(bounds rl.Rectangle, text string, colorHSV *rl.Vector3) int32 { - var cbounds C.struct_Rectangle - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) + var cbounds rl.Rectangle + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) - var ctext *C.char + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - var ccolorHSV C.struct_Vector3 - ccolorHSV.x = C.float(colorHSV.X) - ccolorHSV.y = C.float(colorHSV.Y) - ccolorHSV.z = C.float(colorHSV.Z) + var ccolorHSV rl.Vector3 + ccolorHSV.X = float32(colorHSV.X) + ccolorHSV.Y = float32(colorHSV.Y) + ccolorHSV.Z = float32(colorHSV.Z) defer func() { - colorHSV.X = float32(ccolorHSV.x) - colorHSV.Y = float32(ccolorHSV.y) - colorHSV.Z = float32(ccolorHSV.z) + colorHSV.X = float32(ccolorHSV.X) + colorHSV.Y = float32(ccolorHSV.Y) + colorHSV.Z = float32(ccolorHSV.Z) }() - return int32(C.GuiColorPanelHSV(cbounds, ctext, &ccolorHSV)) + return int32(guiColorPanelHSV(cbounds, ctext, &ccolorHSV)) } +//go:wasmimport raylib _GuiMessageBox +//go:noescape +func guiMessageBox(bounds rl.Rectangle, title, message, buttons wasm.Cptr) int32 + // MessageBox control func MessageBox(bounds rl.Rectangle, title, message, buttons string) int32 { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - var ctitle *C.char + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + var ctitle wasm.Cptr if len(title) > 0 { - ctitle = C.CString(title) - defer C.free(unsafe.Pointer(ctitle)) + ctitle = wasm.CString(title) + defer wasm.Free(ctitle) } - var cmessage *C.char + var cmessage wasm.Cptr if len(message) > 0 { - cmessage = C.CString(message) - defer C.free(unsafe.Pointer(cmessage)) + cmessage = wasm.CString(message) + defer wasm.Free(cmessage) } - cbuttons := C.CString(buttons) - defer C.free(unsafe.Pointer(cbuttons)) - return int32(C.GuiMessageBox(cbounds, ctitle, cmessage, cbuttons)) + cbuttons := wasm.CString(buttons) + defer wasm.Free(cbuttons) + return int32(guiMessageBox(cbounds, ctitle, cmessage, cbuttons)) } +/* +//go:wasmimport raylib _GuiTextInputBox +//go:noescape +func guiTextInputBox(bounds rl.Rectangle, title, message, buttons wasm.Cptr, text *wasm.Cptr, textMaxSize int32, secretViewActive *int32) int32 + // TextInputBox control, ask for text func TextInputBox(bounds rl.Rectangle, title, message, buttons string, text *string, textMaxSize int32, secretViewActive *bool) int32 { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) - var ctitle *C.char + var ctitle wasm.Cptr if len(title) > 0 { - ctitle = C.CString(title) - defer C.free(unsafe.Pointer(ctitle)) + ctitle = wasm.CString(title) + defer wasm.Free(ctitle) } - var cmessage *C.char + var cmessage wasm.Cptr if len(message) > 0 { - cmessage = C.CString(message) - defer C.free(unsafe.Pointer(cmessage)) + cmessage = wasm.CString(message) + defer wasm.Free(cmessage) } - cbuttons := C.CString(buttons) - defer C.free(unsafe.Pointer(cbuttons)) + cbuttons := wasm.CString(buttons) + defer wasm.Free(cbuttons) bs := []byte(*text) if len(bs) == 0 { @@ -1321,42 +1517,47 @@ func TextInputBox(bounds rl.Rectangle, title, message, buttons string, text *str if 0 < len(bs) && bs[len(bs)-1] != byte(0) { // minimalize allocation bs = append(bs, byte(0)) // for next input symbols } - ctext := (*C.char)(unsafe.Pointer(&bs[0])) + ctext := (wasm.Cptr)(unsafe.Pointer(bs[0])) defer func() { *text = strings.TrimSpace(strings.Trim(string(bs), "\x00")) - // no need : C.free(unsafe.Pointer(ctext)) + // no need : wasm.Free(ctext) }() - ctextMaxSize := C.int(textMaxSize) + ctextMaxSize := int32(textMaxSize) - csecretViewActive := C.bool(*secretViewActive) + csecretViewActive := wasm.CBool(*secretViewActive) defer func() { - *secretViewActive = bool(csecretViewActive) + *secretViewActive = wasm.GoBool(csecretViewActive) }() - return int32(C.GuiTextInputBox(cbounds, ctitle, cmessage, cbuttons, ctext, ctextMaxSize, &csecretViewActive)) + return int32(guiTextInputBox(cbounds, ctitle, cmessage, cbuttons, ctext, ctextMaxSize, &csecretViewActive)) } +*/ + +//go:wasmimport raylib _GuiGrid +//go:noescape +func guiGrid(bounds rl.Rectangle, text wasm.Cptr, spacing float32, subdivs int32, mouseCell *rl.Vector2) int32 // Grid control, returns mouse cell position func Grid(bounds rl.Rectangle, text string, spacing float32, subdivs int32, mouseCell *rl.Vector2) int32 { - var cbounds C.struct_Rectangle - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - cbounds.x = C.float(bounds.X) - var ctext *C.char + var cbounds rl.Rectangle + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + cbounds.X = float32(bounds.X) + var ctext wasm.Cptr if len(text) > 0 { - ctext = C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext = wasm.CString(text) + defer wasm.Free(ctext) } - cspacing := C.float(spacing) - csubdivs := C.int(subdivs) - var cmouseCell C.struct_Vector2 - cmouseCell.x = C.float(mouseCell.X) - cmouseCell.y = C.float(mouseCell.Y) - res := C.GuiGrid(cbounds, ctext, cspacing, csubdivs, &cmouseCell) - mouseCell.X = float32(cmouseCell.x) - mouseCell.Y = float32(cmouseCell.y) + cspacing := float32(spacing) + csubdivs := int32(subdivs) + var cmouseCell rl.Vector2 + cmouseCell.X = float32(mouseCell.X) + cmouseCell.Y = float32(mouseCell.Y) + res := guiGrid(cbounds, ctext, cspacing, csubdivs, &cmouseCell) + mouseCell.X = float32(cmouseCell.X) + mouseCell.Y = float32(cmouseCell.Y) return int32(res) } @@ -1365,173 +1566,247 @@ func Grid(bounds rl.Rectangle, text string, spacing float32, subdivs int32, mous // NOTE: Tooltips requires some global variables: tooltipPtr //---------------------------------------------------------------------------------- +//go:wasmimport raylib _GuiEnableTooltip +//go:noescape +func guiEnableTooltip() + // Enable gui tooltips (global state) func EnableTooltip() { - C.GuiEnableTooltip() + guiEnableTooltip() } +//go:wasmimport raylib _GuiDisableTooltip +//go:noescape +func guiDisableTooltip() + // Disable gui tooltips (global state) func DisableTooltip() { - C.GuiDisableTooltip() + guiDisableTooltip() } +//go:wasmimport raylib _GuiSetTooltip +//go:noescape +func guiSetTooltip(tooltip wasm.Cptr) + // Set tooltip string func SetTooltip(tooltip string) { - ctooltip := C.CString(tooltip) - defer C.free(unsafe.Pointer(ctooltip)) - C.GuiSetTooltip(ctooltip) + ctooltip := wasm.CString(tooltip) + defer wasm.Free(ctooltip) + guiSetTooltip(ctooltip) } //---------------------------------------------------------------------------------- // Styles loading functions //---------------------------------------------------------------------------------- +//go:wasmimport raylib _GuiLoadStyle +//go:noescape +func guiLoadStyle(fileName wasm.Cptr) + // Load raygui style file (.rgs) func LoadStyle(fileName string) { - cfileName := C.CString(fileName) - defer C.free(unsafe.Pointer(cfileName)) - C.GuiLoadStyle(cfileName) + cfileName := wasm.CString(fileName) + defer wasm.Free(cfileName) + guiLoadStyle(cfileName) } +//go:wasmimport raylib _GuiLoadStyleDefault +//go:noescape +func guiLoadStyleDefault() + // Load style default over global style func LoadStyleDefault() { - C.GuiLoadStyleDefault() + guiLoadStyleDefault() } +//go:wasmimport raylib _GuiIconText +//go:noescape +func guiIconText(iconId int32, text wasm.Cptr) wasm.Cptr + // IconText gets text with icon id prepended (if supported) func IconText(iconId IconID, text string) string { - ciconId := C.int(iconId) - ctext := C.CString(text) - defer C.free(unsafe.Pointer(ctext)) - return C.GoString(C.GuiIconText(ciconId, ctext)) + ciconId := int32(iconId) + ctext := wasm.CString(text) + defer wasm.Free(ctext) + return wasm.GoString(guiIconText(ciconId, ctext)) } +//go:wasmimport raylib _GuiLoadIcons +//go:noescape +func guiLoadIcons(fileName wasm.Cptr, loadIconsName int32) + // Load raygui icons file (.rgi) func LoadIcons(fileName string, loadIconsName bool) { - cfileName := C.CString(fileName) - defer C.free(unsafe.Pointer(cfileName)) - C.GuiLoadIcons(cfileName, C.bool(loadIconsName)) + cfileName := wasm.CString(fileName) + defer wasm.Free(cfileName) + guiLoadIcons(cfileName, wasm.CBool(loadIconsName)) } +/* +//go:wasmimport raylib _GuiLoadIconsFromMemory +//go:noescape +func guiLoadIconsFromMemory(data []byte, size int32, loadIconsName int32) + // Load icons from memory (Binary files only) func LoadIconsFromMemory(data []byte, loadIconsName bool) { - C.GuiLoadIconsFromMemory((*C.uchar)(unsafe.Pointer(&data[0])), C.int(len(data)), C.bool(loadIconsName)) + guiLoadIconsFromMemory((*uint8)(unsafe.Pointer(data[0])), int32(len(data)), wasm.CBool(loadIconsName)) } +*/ + +//go:wasmimport raylib _GuiDrawIcon +//go:noescape +func guiDrawIcon(iconId, posX, posY, pixelSize int32, col color.RGBA) // Draw icon using pixel size at specified position func DrawIcon(iconId IconID, posX, posY, pixelSize int32, col color.RGBA) { - C.GuiDrawIcon(C.int(iconId), C.int(posX), C.int(posY), C.int(pixelSize), *(*C.Color)(unsafe.Pointer(&col))) + guiDrawIcon(int32(iconId), int32(posX), int32(posY), int32(pixelSize), col) } +//go:wasmimport raylib _GuiSetIconScale +//go:noescape +func guiSetIconScale(scale int32) + // Set icon drawing size func SetIconScale(scale int32) { - C.GuiSetIconScale(C.int(scale)) + guiSetIconScale(int32(scale)) } +//go:wasmimport raylib _GuiGetTextWidth +//go:noescape +func guiGetTextWidth(text wasm.Cptr) int32 + // Get text width considering gui style and icon size (if required) func GetTextWidth(text string) int32 { - ctext := C.CString(text) - defer C.free(unsafe.Pointer(ctext)) - return int32(C.GuiGetTextWidth(ctext)) + ctext := wasm.CString(text) + defer wasm.Free(ctext) + return int32(guiGetTextWidth(ctext)) } //---------------------------------------------------------------------------------- // Module Internal Functions Definition //---------------------------------------------------------------------------------- +/* +//go:wasmimport raylib _GuiLoadStyleFromMemory +//go:noescape +func guiLoadStyleFromMemory(data wasm.Cptr, size int32) + // Load style from memory (Binary files only) func LoadStyleFromMemory(data []byte) { - C.GuiLoadStyleFromMemory((*C.uchar)(unsafe.Pointer(&data[0])), C.int(len(data))) + guiLoadStyleFromMemory((*uint8)(unsafe.Pointer(data[0])), int32(len(data))) } +*/ + +//go:wasmimport raylib _GuiScrollBar +//go:noescape +func guiScrollBar(bounds rl.Rectangle, value, minValue, maxValue int32) int32 // ScrollBar control func ScrollBar(bounds rl.Rectangle, value, minValue, maxValue int32) int32 { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) - cvalue := C.int(value) - cminValue := C.int(minValue) - cmaxValue := C.int(maxValue) + cvalue := int32(value) + cminValue := int32(minValue) + cmaxValue := int32(maxValue) - return int32(C.GuiScrollBar(cbounds, cvalue, cminValue, cmaxValue)) + return int32(guiScrollBar(cbounds, cvalue, cminValue, cmaxValue)) } // Color fade-in or fade-out, alpha value normalized [0..1] // WARNING: It multiplies current alpha by alpha scale factor + +//go:wasmimport raylib _GuiFade +//go:noescape +func guiFade(color rl.Color, alpha float32) rl.Color + func Fade(color rl.Color, alpha float32) rl.Color { - ccolor := C.struct_Color{C.uchar(color.R), C.uchar(color.G), C.uchar(color.B), C.uchar(color.A)} - calpha := C.float(alpha) - cresult := C.GuiFade(ccolor, calpha) - return rl.Color{R: uint8(cresult.r), G: uint8(cresult.g), B: uint8(cresult.b), A: uint8(cresult.a)} + ccolor := rl.Color{uint8(color.R), uint8(color.G), uint8(color.B), uint8(color.A)} + calpha := float32(alpha) + cresult := guiFade(ccolor, calpha) + return rl.Color{R: uint8(cresult.R), G: uint8(cresult.G), B: uint8(cresult.B), A: uint8(cresult.A)} } //---------------------------------------------------------------------------------- // Additional Draw functions //---------------------------------------------------------------------------------- +//go:wasmimport raylib _GuiDrawRectangle +//go:noescape +func guiDrawRectangle(bounds rl.Rectangle, borderWidth int32, borderColor, fillColor rl.Color) + func DrawRectangle(bounds rl.Rectangle, borderWidth int32, borderColor, fillColor rl.Color) { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) - var cborderColor C.struct_Color - cborderColor.r = C.uchar(borderColor.R) - cborderColor.g = C.uchar(borderColor.G) - cborderColor.b = C.uchar(borderColor.B) - cborderColor.a = C.uchar(borderColor.A) + var cborderColor rl.Color + cborderColor.R = uint8(borderColor.R) + cborderColor.G = uint8(borderColor.G) + cborderColor.B = uint8(borderColor.B) + cborderColor.A = uint8(borderColor.A) - var cfillColor C.struct_Color - cfillColor.r = C.uchar(fillColor.R) - cfillColor.g = C.uchar(fillColor.G) - cfillColor.b = C.uchar(fillColor.B) - cfillColor.a = C.uchar(fillColor.A) + var cfillColor rl.Color + cfillColor.R = uint8(fillColor.R) + cfillColor.G = uint8(fillColor.G) + cfillColor.B = uint8(fillColor.B) + cfillColor.A = uint8(fillColor.A) - bw := C.int(borderWidth) + bw := int32(borderWidth) - C.GuiDrawRectangle(cbounds, bw, cborderColor, cfillColor) + guiDrawRectangle(cbounds, bw, cborderColor, cfillColor) } // DrawText - static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, Color tint); + +//go:wasmimport raylib _GuiDrawText +//go:noescape +func guiDrawText(text wasm.Cptr, position rl.Rectangle, alignment int32, color rl.Color) + func DrawText(text string, position rl.Rectangle, alignment int32, color rl.Color) { - ctext := C.CString(text) - defer C.free(unsafe.Pointer(ctext)) + ctext := wasm.CString(text) + defer wasm.Free(ctext) - var cposition C.struct_Rectangle - cposition.x = C.float(position.X) - cposition.y = C.float(position.Y) - cposition.width = C.float(position.Width) - cposition.height = C.float(position.Height) + var cposition rl.Rectangle + cposition.X = float32(position.X) + cposition.Y = float32(position.Y) + cposition.Width = float32(position.Width) + cposition.Height = float32(position.Height) - calignment := C.int(alignment) - var ccolor C.struct_Color - ccolor.r = C.uchar(color.R) - ccolor.g = C.uchar(color.G) - ccolor.b = C.uchar(color.B) - ccolor.a = C.uchar(color.A) + calignment := int32(alignment) + var ccolor rl.Color + ccolor.R = uint8(color.R) + ccolor.G = uint8(color.G) + ccolor.B = uint8(color.B) + ccolor.A = uint8(color.A) - C.GuiDrawText(ctext, cposition, calignment, ccolor) + guiDrawText(ctext, cposition, calignment, ccolor) } // GetTextBounds - static Rectangle GetTextBounds(int control, Rectangle bounds) + +//go:wasmimport raylib _GuiGetTextBounds +//go:noescape +func guiGetTextBounds(control uint16, bounds rl.Rectangle) rl.Rectangle + func GetTextBounds(control ControlID, bounds rl.Rectangle) rl.Rectangle { - var cbounds C.struct_Rectangle - cbounds.x = C.float(bounds.X) - cbounds.y = C.float(bounds.Y) - cbounds.width = C.float(bounds.Width) - cbounds.height = C.float(bounds.Height) - - ccontrol := C.int(control) - cretBounds := C.GetTextBounds(ccontrol, cbounds) + var cbounds rl.Rectangle + cbounds.X = float32(bounds.X) + cbounds.Y = float32(bounds.Y) + cbounds.Width = float32(bounds.Width) + cbounds.Height = float32(bounds.Height) + + ccontrol := uint16(control) + cretBounds := guiGetTextBounds(ccontrol, cbounds) return rl.Rectangle{ - X: float32(cretBounds.x), - Y: float32(cretBounds.y), - Width: float32(cretBounds.width), - Height: float32(cretBounds.height), + X: float32(cretBounds.X), + Y: float32(cretBounds.Y), + Width: float32(cretBounds.Width), + Height: float32(cretBounds.Height), } } -*/ diff --git a/wasm-runtime/wasm.go b/wasm-runtime/wasm.go index c15fd3e..932383e 100644 --- a/wasm-runtime/wasm.go +++ b/wasm-runtime/wasm.go @@ -1,4 +1,5 @@ //go:build js + package wasm import ( @@ -13,19 +14,19 @@ type Cptr = uint32 // //go:wasmimport raylib _malloc //go:noescape -func malloc(size Cptr) Cptr +func Malloc(size Cptr) Cptr // malloc the size of V func mallocV[T any](V T) (Cptr, func()) { - ptr := malloc(sizeof(V)) - return ptr, func() { free(ptr) } + ptr := Malloc(Sizeof(V)) + return ptr, func() { Free(ptr) } } -// free memory allocated on raylib heap +// Free memory allocated on raylib heap // //go:wasmimport raylib _free //go:noescape -func free(Cptr) +func Free(Cptr) // _copyToC copies a Go type/struct to C memory. Useful for copying slices and structs. // @@ -59,15 +60,15 @@ func _copyToGo(dstGoPtr unsafe.Pointer, size Cptr, src Cptr) // Copies the src value to the dst cptr func copyToC[T any](src T, dst Cptr) { - size := sizeof(src) + size := Sizeof(src) _copyToC(unsafe.Pointer(&src), size, dst) } -// The alocated C string lives on the raylib heap and must be free()'d +// The allocated C string lives on the raylib heap and must be free()'d // //go:wasmimport gojs CStringFromGoString //go:noescape -func cString(string) Cptr +func CString(string) Cptr // Scan for null terminator and return length excluding the null terminator. // @@ -76,48 +77,61 @@ func cString(string) Cptr func _cStringGetLength(cstr Cptr) Cptr // Copies a C string to Go memory without freeing the C string. -func goString(cstr Cptr) string { +func GoString(cstr Cptr) string { size := _cStringGetLength(cstr) dstStr := make([]byte, size) - copySliceToGo(cstr, dstStr) + CopySliceToGo(cstr, dstStr) return string(dstStr) } -// copyValueToC copies a value to C and returns a pointer to it. +// TODO +//go:wasmimport gojs CBoolFromGoBool +//go:noescape +func CBool(bool) int32 + +// TODO +func GoBool(b int32) bool { + if b == 0 { + return false + } + return true +} + +// CopyValueToC copies a value to C and returns a pointer to it. // -// NOTE: Value cannot be a slice. For a slice, use [copySliceToC] -func copyValueToC[T any](srcValue T) (Cptr, func()) { +// NOTE: Value cannot be a slice. For a slice, use [CopySliceToC] +func CopyValueToC[T any](srcValue T) (Cptr, func()) { dst, free := mallocV(srcValue) copyToC(srcValue, dst) return dst, free } -// copySliceToC allocates a copy of a slice in C memory and returns a cptr to it. +// CopySliceToC allocates a copy of a slice in C memory and returns a cptr to it. // // NOTE: Value MUST be a slice -func copySliceToC[Slice ~[]E, E any](s Slice) (Cptr, func()) { +func CopySliceToC[Slice ~[]E, E any](s Slice) (Cptr, func()) { // size of the slice's underlying array in bytes sliceSize := Cptr(unsafe.Sizeof(s[:1][0])) * Cptr(len(s)) // allocate C array to hold Value - dstCptr := malloc(sliceSize) + dstCptr := Malloc(sliceSize) // copy underlying array memory to C _copyToC(unsafe.Pointer(unsafe.SliceData(s)), sliceSize, dstCptr) - return dstCptr, func() { free(dstCptr) } + return dstCptr, func() { Free(dstCptr) } } -// copyValueToGo copies a value from C memory to Go memory. +// CopyValueToGo copies a value from C memory to Go memory. // Useful for copying structs // -// NOTE: Slices are not supported. Use [copySliceToGo] -func copyValueToGo[T any](src Cptr, dst *T) { - size := sizeof(*dst) +// NOTE: Slices are not supported. Use [CopySliceToGo] +func CopyValueToGo[T any](src Cptr, dst *T) { + size := Sizeof(*dst) _copyToGo(unsafe.Pointer(dst), size, src) } -// copySliceToGo copies a C array into a Go Slice. +// CopySliceToGo copies a C array into a Go Slice. // // It copies bytes to the underlying array of the slice. -func copySliceToGo[Slice ~[]E, E any](src Cptr, dst Slice) { +func CopySliceToGo[Slice ~[]E, E any](src Cptr, dst Slice) { // size of underlying array var occupiedSize = len(dst) if occupiedSize == 0 { @@ -130,7 +144,7 @@ func copySliceToGo[Slice ~[]E, E any](src Cptr, dst Slice) { //go:wasmimport gojs Alert //go:noescape -func alert(string) +func Alert(string) // Use this instead of a for loop on web platform // Everything that you would do inside the for-loop must be done inside UpdateAndDrawFrame @@ -146,4 +160,4 @@ func SetMain(UpdateAndDrawFrame func()) { } // return sizeof of v in bytes -func sizeof[T any](v T) Cptr { return Cptr(unsafe.Sizeof(v)) } +func Sizeof[T any](v T) Cptr { return Cptr(unsafe.Sizeof(v)) } From 1349317c82eb2e9e5aa5c243378d747890cae52f Mon Sep 17 00:00:00 2001 From: BrownNPC Date: Fri, 24 Apr 2026 10:57:51 +0500 Subject: [PATCH 6/9] base bindings with memory corruption bugs --- examples/go.mod | 15 +- examples/go.sum | 2 - examples/raygui/main.go | 273 +++++++++- index/index.html | 16 + index/index.js | 2 +- index/runtime.js | 22 +- raygui/cstring.go | 103 ++++ raygui/go.mod | 14 +- raygui/go.sum | 14 +- raygui/raygui.go | 1078 +++++++++++++++------------------------ wasm-runtime/wasm.go | 81 +-- 11 files changed, 891 insertions(+), 729 deletions(-) create mode 100644 raygui/cstring.go diff --git a/examples/go.mod b/examples/go.mod index f657d03..d731bb6 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -2,16 +2,19 @@ module github.com/BrownNPC/Raylib-Go-Wasm/examples go 1.26.1 -replace github.com/gen2brain/raylib-go/raylib => ../raylib - -replace github.com/gen2brain/raylib-go/raygui => ../raygui - require ( github.com/gen2brain/raylib-go/raygui v0.0.0-00010101000000-000000000000 - github.com/gen2brain/raylib-go/raylib v0.0.0-00010101000000-000000000000 + github.com/gen2brain/raylib-go/raylib v0.55.1 +) + +replace ( + github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime => ../wasm-runtime + + github.com/gen2brain/raylib-go/raygui => ../raygui + github.com/gen2brain/raylib-go/raylib => ../raylib ) require ( - github.com/BrownNPC/Raylib-Go-Wasm/raylib v0.0.0-20260126231012-27bc0271203c // indirect + github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime v0.0.0-20260421110350-7c24b2d5e6d3 // indirect github.com/BrownNPC/wasm-ffi-go v1.2.0 // indirect ) diff --git a/examples/go.sum b/examples/go.sum index ed27ac0..b242b0a 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -1,4 +1,2 @@ -github.com/BrownNPC/Raylib-Go-Wasm/raylib v0.0.0-20260126231012-27bc0271203c h1:DqSkpCRDO3o1O/+b5O9buJGTKnF6bdeGi5DLNBoW2Sc= -github.com/BrownNPC/Raylib-Go-Wasm/raylib v0.0.0-20260126231012-27bc0271203c/go.mod h1:u1eTrnnsR5NVJMWwlQEq/FoeDPAKmq9PoRCiO8lwVH4= github.com/BrownNPC/wasm-ffi-go v1.2.0 h1:Lknst90sTLTkE870OKNP/Vw36TohQIJ4ln8W1IG9Zl0= github.com/BrownNPC/wasm-ffi-go v1.2.0/go.mod h1:D5+RBMb672fgw6vPz4HOWYxpyrmPrIao8VqlXihOFFg= diff --git a/examples/raygui/main.go b/examples/raygui/main.go index 3ab095f..37e9446 100644 --- a/examples/raygui/main.go +++ b/examples/raygui/main.go @@ -3,17 +3,282 @@ package main import ( - rg "github.com/gen2brain/raylib-go/raygui" + "fmt" + + gui "github.com/gen2brain/raylib-go/raygui" rl "github.com/gen2brain/raylib-go/raylib" ) +/******************************************************************************************* +* +* raygui - controls test suite +* +* TEST CONTROLS: +* - gui.DropdownBox() +* - gui.CheckBox() +* - gui.Spinner() +* - gui.ValueBox() +* - gui.TextBox() +* - gui.Button() +* - gui.ComboBox() +* - gui.ListView() +* - gui.ToggleGroup() +* - gui.ColorPicker() +* - gui.Slider() +* - gui.SliderBar() +* - gui.ProgressBar() +* - gui.ColorBarAlpha() +* - gui.ScrollPanel() +* +* +* DEPENDENCIES: +* raylib 4.0 - Windowing/input management and drawing. +* raygui 3.2 - Immediate-mode GUI controls. +* +* COMPILATION (Windows - MinGW): +* gcc -o $(NAME_PART).exe $(FILE_NAME) -I../../src -lraylib -lopengl32 -lgdi32 -std=c99 +* +* LICENSE: zlib/libpng +* +* Copyright (c) 2016-2022 Ramon Santamaria (@raysan5) +* +**********************************************************************************************/ + +//#define RAYGUI_CUSTOM_ICONS // It requires providing gui_icons.h in the same directory +//#include "gui_icons.h" // External icons data provided, it can be generated with rGuiIcons tool + +// ------------------------------------------------------------------------------------ +// Program main entry point +// ------------------------------------------------------------------------------------ func main() { - rl.InitWindow(500, 500, "RayGUI Example") + // Initialization + //--------------------------------------------------------------------------------------- + const ( + screenWidth = 690 + screenHeight = 560 + ) + + rl.InitWindow(screenWidth, screenHeight, "raygui - controls test suite") + rl.SetExitKey(0) + + // GUI controls initialization + //---------------------------------------------------------------------------------- + var ( + dropdownBox000Active int32 = 0 + dropDown000EditMode bool = false + + dropdownBox001Active int32 = 0 + dropDown001EditMode bool = false + + spinner001Value int32 = 0 + spinnerEditMode bool = false + + valueBox002Value int32 = 0 + valueBoxEditMode bool = false + + textBoxText = "Text box" + textBoxEditMode bool = false + + // listViewScrollIndex int32 = 0 + // listViewActive int32 = -1 + + // listViewExScrollIndex int32 = 0 + // listViewExActive int32 = 2 + // listViewExFocus int32 = -1 + // listViewExList = []string{"This", "is", "a", "list view", "with", "disable", "elements", "amazing!"} + + colorPickerValue = rl.Red + + sliderValue float32 = 50 + sliderBarValue float32 = 60 + progressValue float32 = 0.4 + + forceSquaredChecked bool = false + + alphaValue float32 = 0.5 + + comboBoxActive int32 = 1 + + toggleGroupActive int32 = 0 + + viewScroll = rl.Vector2{0, 0} + + //---------------------------------------------------------------------------------- + + // Custom GUI font loading + //Font font = LoadFontEx("fonts/rainyhearts16.ttf", 12, 0, 0); + //GuiSetFont(font); + + exitWindow bool = false + showMessageBox bool = false + + textInput string + showTextInputBox bool = false + + // TODO textInputFileName string + ) + + rl.SetTargetFPS(60) + //-------------------------------------------------------------------------------------- + + // Main game loop + update := func() { // Detect window close button or ESC key + _ = exitWindow + // Update + //---------------------------------------------------------------------------------- + + if rl.IsKeyPressed(rl.KeyEscape) { + showMessageBox = !showMessageBox + } + + if rl.IsKeyDown(rl.KeyLeftControl) && rl.IsKeyPressed(rl.KeyS) { + showTextInputBox = true + } - update := func() { + // TODO if rl.IsFileDropped() { + // TODO var droppedFiles gui.FilePathList = rl.LoadDroppedFiles() + // TODO if (droppedFiles.count > 0) && rl.IsFileExtension(droppedFiles.paths[0], ".rgs") { + // TODO gui.LoadStyle(droppedFiles.paths[0]) + // TODO } + // TODO rl.UnloadDroppedFiles(droppedFiles) // Clear internal buffers + // TODO } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- rl.BeginDrawing() - rl.ClearBackground(rg.GetStyle(rg.DEFAULT, rg.BASE_COLOR_PRESSED).AsColor()) + + rl.ClearBackground(rl.GetColor(uint(gui.GetStyle(gui.DEFAULT, gui.BACKGROUND_COLOR)))) + + // raygui: controls drawing + //---------------------------------------------------------------------------------- + if dropDown000EditMode || dropDown001EditMode { + gui.Lock() + } else if !dropDown000EditMode && !dropDown001EditMode { + gui.Unlock() + } + //GuiDisable(); + + // First GUI column + //GuiSetStyle(CHECKBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); + forceSquaredChecked = gui.CheckBox(rl.Rectangle{25, 108, 15, 15}, "FORCE CHECK!", forceSquaredChecked) + + gui.SetStyle(gui.TEXTBOX, gui.TEXT_ALIGNMENT, gui.TEXT_ALIGN_CENTER) + //GuiSetStyle(VALUEBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); + gui.Spinner(rl.Rectangle{25, 135, 125, 30}, "", &spinner001Value, 0, 100, spinnerEditMode) + + if gui.ValueBox(rl.Rectangle{25, 175, 125, 30}, "", &valueBox002Value, 0, 100, valueBoxEditMode) { + valueBoxEditMode = !valueBoxEditMode + } + gui.SetStyle(gui.TEXTBOX, gui.TEXT_ALIGNMENT, gui.TEXT_ALIGN_LEFT) + if gui.TextBox(rl.Rectangle{25, 215, 125, 30}, &textBoxText, 64, textBoxEditMode) { + textBoxEditMode = !textBoxEditMode + } + + gui.SetStyle(gui.BUTTON, gui.TEXT_ALIGNMENT, gui.TEXT_ALIGN_CENTER) + + if gui.Button(rl.Rectangle{25, 255, 125, 30}, gui.IconText(gui.ICON_FILE_SAVE, "Save File")) { + showTextInputBox = true + } + + gui.GroupBox(rl.Rectangle{25, 310, 125, 150}, "STATES") + //GuiLock(); + gui.SetState(gui.STATE_NORMAL) + if gui.Button(rl.Rectangle{30, 320, 115, 30}, "NORMAL") { + } + gui.SetState(gui.STATE_FOCUSED) + if gui.Button(rl.Rectangle{30, 355, 115, 30}, "FOCUSED") { + } + gui.SetState(gui.STATE_PRESSED) + if gui.Button(rl.Rectangle{30, 390, 115, 30}, "#15#PRESSED") { + } + gui.SetState(gui.STATE_DISABLED) + if gui.Button(rl.Rectangle{30, 425, 115, 30}, "DISABLED") { + } + gui.SetState(gui.STATE_NORMAL) + //GuiUnlock(); + + comboBoxActive = gui.ComboBox(rl.Rectangle{25, 470, 125, 30}, "ONE;TWO;THREE;FOUR", comboBoxActive) + + // NOTE: gui.DropdownBox must draw after any other control that can be covered on unfolding + gui.SetStyle(gui.DROPDOWNBOX, gui.TEXT_ALIGNMENT, gui.TEXT_ALIGN_LEFT) + if gui.DropdownBox(rl.Rectangle{25, 65, 125, 30}, "#01#ONE;#02#TWO;#03#THREE;#04#FOUR", &dropdownBox001Active, dropDown001EditMode) { + dropDown001EditMode = !dropDown001EditMode + } + + gui.SetStyle(gui.DROPDOWNBOX, gui.TEXT_ALIGNMENT, gui.TEXT_ALIGN_CENTER) + if gui.DropdownBox(rl.Rectangle{25, 25, 125, 30}, "ONE;TWO;THREE", &dropdownBox000Active, dropDown000EditMode) { + dropDown000EditMode = !dropDown000EditMode + } + + // Second GUI column + // listViewActive = gui.ListView(rl.Rectangle{165, 25, 140, 140}, "Charmander;Bulbasaur;#18#Squirtel;Pikachu;Eevee;Pidgey", &listViewScrollIndex, listViewActive) + // listViewExActive = gui.ListViewEx(rl.Rectangle{165, 180, 140, 200}, listViewExList, &listViewExFocus, &listViewExScrollIndex, listViewExActive) + + toggleGroupActive = gui.ToggleGroup(rl.Rectangle{165, 400, 140, 25}, "#1#ONE\n#3#TWO\n#8#THREE\n#23#", toggleGroupActive) + + // Third GUI column + gui.Panel(rl.NewRectangle(320, 25, 225, 140), "Panel Info") + colorPickerValue = gui.ColorPicker(rl.Rectangle{320, 185, 196, 192}, "", colorPickerValue) + + sliderValue = gui.Slider(rl.Rectangle{355, 400, 165, 20}, "TEST", + fmt.Sprintf("%2.2f", sliderValue), sliderValue, -50, 100) + sliderBarValue = gui.SliderBar(rl.Rectangle{320, 430, 200, 20}, "", + fmt.Sprintf("%2.2f", sliderBarValue), sliderBarValue, 0, 100) + progressValue = gui.ProgressBar(rl.Rectangle{320, 460, 200, 20}, "", "", progressValue, 0, 1) + + // NOTE: View rectangle could be used to perform some scissor test + var view rl.Rectangle + gui.ScrollPanel(rl.Rectangle{560, 25, 102, 354}, "", rl.Rectangle{560, 25, 300, 1200}, &viewScroll, &view) + + var mouseCell rl.Vector2 + gui.Grid(rl.Rectangle{560, 25 + 180 + 195, 100, 120}, "", 20, 3, &mouseCell) + + alphaValue = gui.ColorBarAlpha(rl.Rectangle{320, 490, 200, 30}, "", alphaValue) + + gui.StatusBar(rl.Rectangle{0, float32(rl.GetScreenHeight()) - 20, float32(rl.GetScreenWidth()), 20}, "This is a status bar") + + if showMessageBox { + rl.DrawRectangle(0, 0, int32(rl.GetScreenWidth()), int32(rl.GetScreenHeight()), rl.Fade(rl.RayWhite, 0.8)) + var result int32 = gui.MessageBox(rl.Rectangle{float32(rl.GetScreenWidth())/2 - 125, float32(rl.GetScreenHeight())/2 - 50, 250, 100}, gui.IconText(gui.ICON_EXIT, "Close Window"), "Do you really want to exit?", "Yes;No") + + if (result == 0) || (result == 2) { + showMessageBox = false + } else if result == 1 { + exitWindow = true + } + } + + if showTextInputBox { + rl.DrawRectangle(0, 0, int32(rl.GetScreenWidth()), int32(rl.GetScreenHeight()), rl.Fade(rl.RayWhite, 0.8)) + var secretViewActive bool + var result int32 = gui.TextInputBox( + rl.Rectangle{float32(rl.GetScreenWidth())/2 - 120, float32(rl.GetScreenHeight())/2 - 60, 240, 140}, + "Save", + gui.IconText(gui.ICON_FILE_SAVE, "Save file as..."), + "Ok;Cancel", + &textInput, 255, &secretViewActive) + + if result == 1 { + // TODO: Validate textInput value and save + // strcpy(textInputFileName, textInput) + // TODO textInputFileName = textInput + } + if (result == 0) || (result == 1) || (result == 2) { + showTextInputBox = false + //strcpy(textInput, "\0"); + textInput = "" + } + } + //---------------------------------------------------------------------------------- + rl.EndDrawing() + //---------------------------------------------------------------------------------- } rl.SetMain(update) + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow() // Close window and OpenGL context + //-------------------------------------------------------------------------------------- } diff --git a/index/index.html b/index/index.html index 14a03dc..b601842 100644 --- a/index/index.html +++ b/index/index.html @@ -5,6 +5,22 @@ + + diff --git a/index/index.js b/index/index.js index b9e7ed5..e3150af 100644 --- a/index/index.js +++ b/index/index.js @@ -33,7 +33,7 @@ Object.assign(go.importObject.gojs, { struct: runtime.struct.bind(runtime), CStringFromGoString: runtime.CStringFromGoString.bind(runtime), CStringGetLength: runtime.CStringGetLength.bind(runtime), - CBoolFromGoBool: runtime.CBoolFromGoBool.bind(runtime), + CStringArrayGetLength: runtime.CStringArrayGetLength.bind(runtime), CopyToC: runtime.CopyToC.bind(runtime), CopyToGo: runtime.CopyToGo.bind(runtime), Alert: runtime.Alert.bind(runtime), diff --git a/index/runtime.js b/index/runtime.js index 76ceac2..b40b921 100644 --- a/index/runtime.js +++ b/index/runtime.js @@ -97,11 +97,22 @@ class Runtime { // return cstr this.setInt32(sp + 8 * 3, cstr); }; - // func(int32) bool - // returns a C int32 - CBoolFromGoBool = (b) => { - if (b == true) return 1; - return 0; + CStringArrayGetLength = (sp) => { + sp >>>= 0; + + const basePtr = this.getInt32(sp + 8 * 1); + const heap32 = raylib.HEAP32; + + let count = 0; + const idx = basePtr >> 2; // convert byte offset → i32 index + + while (true) { + const ptr = heap32[idx + count]; + if (ptr === 0) break; + count++; + } + + this.setInt32(sp + 8 * 2, count); }; // func(src unsafe.Pointer, srcSize, dstCptr cptr) // copies Go memory to C memory. Useful for copying slices and structs. @@ -157,4 +168,3 @@ class Runtime { } export { Runtime }; - diff --git a/raygui/cstring.go b/raygui/cstring.go new file mode 100644 index 0000000..eb5ed1c --- /dev/null +++ b/raygui/cstring.go @@ -0,0 +1,103 @@ +//go:build js + +package raygui + +import ( + "github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime" +) + +func makeStringArray(size int) wasm.Ptr { + var arr = make([]wasm.Ptr, size) + ptr, _ := wasm.CopySliceToC(arr) + return ptr +} + +func setStringArray(arr wasm.Ptr, idx int, cstring wasm.Ptr) { + wasm.CopyToC(&cstring, arr+(wasm.Ptr(idx*wasm.PTR_SIZE))) +} + +// TODO: do this in the runtime if possible. +// CStringArray represents an array of pointers to NULL terminated C strings, +// the array itself is terminated with a NULL +type CStringArray struct { + Pointer wasm.Ptr + Length int +} + +// NewCStringArray returns an instance of CStringArray +func NewCStringArray() *CStringArray { + return &CStringArray{} +} + +// NewCStringArray returns an instance of CStringArray +func NewCStringArrayFromPointer(p wasm.Ptr) *CStringArray { + length := wasm.CStringArrayGetLength(p) + return &CStringArray{ + Pointer: p, + Length: int(length), + } +} + +// NewCStringArrayFromSlice makes an instance of CStringArray then copy the +// input slice to it. +func NewCStringArrayFromSlice(ss []string) *CStringArray { + var arr CStringArray + arr.Copy(ss) + return &arr +} + +// TODO: do this in the runtime if possible. +// ToSlice converts CStringArray to Go slice of strings +func (arr *CStringArray) ToSlice() []string { + if arr.Length == 0 || arr.Pointer == 0 { + return []string{} + } + + var ss []string + p := arr.Pointer + //NOTE: upstream raylib-go does this wrong. + for { + var cs wasm.Ptr + wasm.CopyTGo(p, wasm.PTR_SIZE, &cs) + if cs == 0 { // skip NULL - the last element + break + } + ss = append(ss, wasm.GoString(cs)) + p += wasm.PTR_SIZE + } + return ss +} + +// TODO: do this in the runtime if possible. +// Copy converts Go slice of strings to C underlying struct of CStringArray +func (arr *CStringArray) Copy(ss []string) { + arr.Length = len(ss) + 1 // one more element for NULL at the end + arr.Pointer = makeStringArray(arr.Length) + + for i, s := range ss { + str := wasm.CString(s) + // copy the pointer into the array. + // A CStringArray is an array of pointers. + wasm.CopyToC(&str, arr.Pointer+wasm.Ptr(i*wasm.PTR_SIZE)) + } +} + +// TODO: do this in the runtime if possible. +// +// Free frees C underlying struct of CStringArray +// MUST call this method after using CStringArray +// Exception: If you use NewCStringArrayFromPointer() to create CStringArray object +// and you use other way to free C underlying structure pointed by the pointer, +// then don't need to call Free() +func (arr *CStringArray) Free() { + for i := range wasm.Ptr(arr.Length) { + idx := (i * wasm.PTR_SIZE) + var cs wasm.Ptr + wasm.CopyTGo(arr.Pointer+idx, wasm.PTR_SIZE, &cs) + if cs == 0 { // skip NULL - the last element + break + } + wasm.Free(cs) + } + wasm.Free(arr.Pointer) +} diff --git a/raygui/go.mod b/raygui/go.mod index 5d4dc88..89bd8e8 100644 --- a/raygui/go.mod +++ b/raygui/go.mod @@ -1,14 +1,16 @@ module github.com/BrownNPC/Raylib-Go-Wasm/raygui -require github.com/BrownNPC/Raylib-Go-Wasm/raylib v0.0.0-20260126231012-27bc0271203c - require ( - github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime v0.0.0-20260421110350-7c24b2d5e6d3 // indirect - github.com/BrownNPC/wasm-ffi-go v1.2.0 // indirect + github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime v0.0.0-20260421110350-7c24b2d5e6d3 + github.com/gen2brain/raylib-go/raylib v0.55.1 ) -replace ( - github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime => ../wasm-runtime +require ( + github.com/ebitengine/purego v0.7.1 // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect + golang.org/x/sys v0.20.0 // indirect ) +replace github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime => ../wasm-runtime + go 1.26.1 diff --git a/raygui/go.sum b/raygui/go.sum index fcc6825..aa78a1e 100644 --- a/raygui/go.sum +++ b/raygui/go.sum @@ -1,6 +1,8 @@ -github.com/BrownNPC/Raylib-Go-Wasm/raylib v0.0.0-20260126231012-27bc0271203c h1:DqSkpCRDO3o1O/+b5O9buJGTKnF6bdeGi5DLNBoW2Sc= -github.com/BrownNPC/Raylib-Go-Wasm/raylib v0.0.0-20260126231012-27bc0271203c/go.mod h1:u1eTrnnsR5NVJMWwlQEq/FoeDPAKmq9PoRCiO8lwVH4= -github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime v0.0.0-20260421110350-7c24b2d5e6d3 h1:3/+QJKkSsqnJiuFdXyLNAbX2C2uB+ikalb80fcZ1iTc= -github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime v0.0.0-20260421110350-7c24b2d5e6d3/go.mod h1:QsnK1qtIkvF266TxA0tLoodc1tRYqMweTl0CUZanRCg= -github.com/BrownNPC/wasm-ffi-go v1.2.0 h1:Lknst90sTLTkE870OKNP/Vw36TohQIJ4ln8W1IG9Zl0= -github.com/BrownNPC/wasm-ffi-go v1.2.0/go.mod h1:D5+RBMb672fgw6vPz4HOWYxpyrmPrIao8VqlXihOFFg= +github.com/ebitengine/purego v0.7.1 h1:6/55d26lG3o9VCZX8lping+bZcmShseiqlh2bnUDiPA= +github.com/ebitengine/purego v0.7.1/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= +github.com/gen2brain/raylib-go/raylib v0.55.1 h1:1rdc10WvvYjtj7qijHnV9T38/WuvlT6IIL+PaZ6cNA8= +github.com/gen2brain/raylib-go/raylib v0.55.1/go.mod h1:BaY76bZk7nw1/kVOSQObPY1v1iwVE1KHAGMfvI6oK1Q= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/raygui/raygui.go b/raygui/raygui.go index a592ce4..b8298f3 100644 --- a/raygui/raygui.go +++ b/raygui/raygui.go @@ -4,10 +4,9 @@ package raygui import ( "image/color" - "unsafe" - rl "github.com/BrownNPC/Raylib-Go-Wasm/raylib" wasm "github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime" + rl "github.com/gen2brain/raylib-go/raylib" ) type ( @@ -511,63 +510,53 @@ func Unlock() { guiUnlock() } +// Check if gui is locked (global state) +// //go:wasmimport raylib _GuiIsLocked //go:noescape -func guiIsLocked() int32 - -// Check if gui is locked (global state) -func IsLocked() bool { - return wasm.GoBool(guiIsLocked()) -} +func IsLocked() bool +// Set gui controls alpha global state +// //go:wasmimport raylib _GuiSetAlpha //go:noescape -func guiSetAlpha(alpha float32) - -// Set gui controls alpha global state -func SetAlpha(alpha float32) { - calpha := float32(alpha) - guiSetAlpha(calpha) -} +func SetAlpha(alpha float32) +// Set gui state (global state) +// //go:wasmimport raylib _GuiSetState //go:noescape -func guiSetState(state int32) - -// Set gui state (global state) -func SetState(state PropertyValue) { - cstate := int32(state) - guiSetState(cstate) -} +func SetState(state PropertyValue) +// Get gui state (global state) +// //go:wasmimport raylib _GuiGetState //go:noescape -func guiGetState() PropertyValue - -// Get gui state (global state) -func GetState() PropertyValue { - return PropertyValue(guiGetState()) -} +func GetState() PropertyValue //go:wasmimport raylib _GuiSetFont //go:noescape -func guiSetFont(font *rl.Font) +func guiSetFont(font wasm.Ptr) // Set custom gui font func SetFont(font rl.Font) { - cfont := (*rl.Font)(unsafe.Pointer(&font)) - guiSetFont(cfont) + v, free := wasm.CopyValueToC(&font) + defer free() + guiSetFont(v) } //go:wasmimport raylib _GuiGetFont //go:noescape -func guiGetFont() *rl.Font +func guiGetFont(ret wasm.Ptr) // Get custom gui font func GetFont() rl.Font { - ret := guiGetFont() - ptr := unsafe.Pointer(ret) - return *(*rl.Font)(ptr) + var ret rl.Font + v, free := wasm.MallocV[rl.Font]() + defer free() + + guiGetFont(v) + return ret } //go:wasmimport raylib _GuiSetStyle @@ -593,10 +582,6 @@ func GetStyle(control ControlID, property PropertyID) PropertyValue { return PropertyValue(guiGetStyle(ccontrol, cproperty)) } -//go:wasmimport raylib _GuiGetColor -//go:noescape -func guiGetColor(control, property uint16) rl.Color - func GetColor(control ControlID, property PropertyID) rl.Color { color := guiGetStyle(int32(control), int32(property)) return rl.Color{R: uint8(color >> 24), G: uint8(color >> 16), B: uint8(color >> 8), A: uint8(color)} @@ -608,84 +593,61 @@ func GetColor(control ControlID, property PropertyID) rl.Color { //go:wasmimport raylib _GuiWindowBox //go:noescape -func guiWindowBox(bounds rl.Rectangle, title wasm.Cptr) int32 +func guiWindowBox(bounds wasm.Ptr, title wasm.Ptr) int32 // Window Box control func WindowBox(bounds rl.Rectangle, title string) bool { - var cbounds rl.Rectangle - cbounds.Height = float32(bounds.Height) - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - var ctitle wasm.Cptr - if len(title) > 0 { - ctitle = wasm.CString(title) - defer wasm.Free(ctitle) - } + cbounds, free := wasm.CopyValueToC(&bounds) + defer free() + ctitle := wasm.CString(title) + defer wasm.Free(ctitle) return guiWindowBox(cbounds, ctitle) != 0 } //go:wasmimport raylib _GuiGroupBox //go:noescape -func guiGroupBox(bounds rl.Rectangle, text wasm.Cptr) +func guiGroupBox(bounds wasm.Ptr, text wasm.Ptr) // Group Box control with text name func GroupBox(bounds rl.Rectangle, text string) { - var cbounds rl.Rectangle - cbounds.Height = float32(bounds.Height) - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } + cbounds, free := wasm.CopyValueToC(&bounds) + defer free() + ctext := wasm.CString(text) + defer wasm.Free(ctext) guiGroupBox(cbounds, ctext) } //go:wasmimport raylib _GuiLine //go:noescape -func guiLine(bounds rl.Rectangle, text wasm.Cptr) +func guiLine(bounds wasm.Ptr, text wasm.Ptr) // Line control func Line(bounds rl.Rectangle, text string) { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } + cbounds, free := wasm.CopyValueToC(&bounds) + defer free() + ctext := wasm.CString(text) + defer wasm.Free(ctext) guiLine(cbounds, ctext) } //go:wasmimport raylib _GuiPanel //go:noescape -func guiPanel(bounds rl.Rectangle, text wasm.Cptr) +func guiPanel(bounds wasm.Ptr, text wasm.Ptr) // Panel control func Panel(bounds rl.Rectangle, text string) { - var cbounds rl.Rectangle - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } + cbounds, free := wasm.CopyValueToC(&bounds) + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) guiPanel(cbounds, ctext) } /* //go:wasmimport raylib _GuiTabBar //go:noescape -func guiTabBar(bounds rl.Rectangle, text []wasm.Cptr, active *int32) int32 +func guiTabBar(bounds rl.Rectangle, text []wasm.Ptr, active *int32) int32 // Tab Bar control, returns the current TAB closing requested, -1 otherwise func TabBar(bounds rl.Rectangle, text []string, active *int32) int32 { @@ -707,345 +669,267 @@ func TabBar(bounds rl.Rectangle, text []string, active *int32) int32 { defer func() { *active = int32(cactive) }() - return int32(guiTabBar(cbounds, (*wasm.Cptr)(ctext.Pointer), count, cactive)) + return int32(guiTabBar(cbounds, (*wasm.Ptr)(ctext.Pointer), count, cactive)) } */ //go:wasmimport raylib _GuiScrollPanel //go:noescape -func guiScrollPanel(bounds rl.Rectangle, text wasm.Cptr, content rl.Rectangle, scroll *rl.Vector2, view *rl.Rectangle) +func guiScrollPanel(bounds wasm.Ptr, text wasm.Ptr, content wasm.Ptr, scroll wasm.Ptr, view wasm.Ptr) // Scroll Panel control func ScrollPanel(bounds rl.Rectangle, text string, content rl.Rectangle, scroll *rl.Vector2, view *rl.Rectangle) { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } - var ccontent rl.Rectangle - ccontent.X = float32(content.X) - ccontent.Y = float32(content.Y) - ccontent.Width = float32(content.Width) - ccontent.Height = float32(content.Height) - var cscroll rl.Vector2 - cscroll.X = float32(scroll.X) - cscroll.Y = float32(scroll.Y) - defer func() { - scroll.X = float32(cscroll.X) - scroll.Y = float32(cscroll.Y) - }() - var cview rl.Rectangle - cview.X = float32(view.X) - cview.Y = float32(view.Y) - cview.Width = float32(view.Width) - cview.Height = float32(view.Height) - defer func() { - view.X = float32(cview.X) - view.Y = float32(cview.Y) - view.Width = float32(cview.Width) - view.Height = float32(cview.Height) - }() + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + ctext := wasm.CString(text) + defer wasm.Free(ctext) + + ccontent, free := wasm.MallocV[rl.Rectangle]() + defer free() + + cscroll, free := wasm.MallocV[rl.Vector2]() + defer free() - guiScrollPanel(cbounds, ctext, ccontent, &cscroll, &cview) + cview, free := wasm.CopyValueToC(view) + defer free() + + guiScrollPanel(cbounds, ctext, ccontent, cscroll, cview) + + wasm.CopyValueToGo(cscroll, scroll) + wasm.CopyValueToGo(cview, view) } //go:wasmimport raylib _GuiLabel //go:noescape -func guiLabel(bounds rl.Rectangle, text wasm.Cptr) +func guiLabel(bounds wasm.Ptr, text wasm.Ptr) // Label control func Label(bounds rl.Rectangle, text string) { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) guiLabel(cbounds, ctext) } //go:wasmimport raylib _GuiButton //go:noescape -func guiButton(bounds rl.Rectangle, text wasm.Cptr) int32 +func guiButton(bounds wasm.Ptr, text wasm.Ptr) int32 // Button control, returns true when clicked func Button(bounds rl.Rectangle, text string) bool { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) + return guiButton(cbounds, ctext) != 0 } //go:wasmimport raylib _GuiLabelButton //go:noescape -func guiLabelButton(bounds rl.Rectangle, text wasm.Cptr) int32 +func guiLabelButton(bounds wasm.Ptr, text wasm.Ptr) int32 // LabelButton control, returns true when clicked func LabelButton(bounds rl.Rectangle, text string) bool { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) return guiLabelButton(cbounds, ctext) != 0 } //go:wasmimport raylib _GuiToggle //go:noescape -func guiToggle(bounds rl.Rectangle, text wasm.Cptr, active int32) int32 +func guiToggle(bounds wasm.Ptr, text wasm.Ptr, active int32) int32 // Toggle control, returns true when active func Toggle(bounds rl.Rectangle, text string, active bool) bool { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } - cactive := wasm.CBool(active) - guiToggle(cbounds, ctext, cactive) - return wasm.GoBool(cactive) + cbounds, free := wasm.CopyValueToC(&bounds) + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) + + return guiToggle(cbounds, ctext, wasm.BtoI(active)) != 0 } //go:wasmimport raylib _GuiToggleGroup //go:noescape -func guiToggleGroup(bounds rl.Rectangle, text wasm.Cptr, active int32) int32 +func guiToggleGroup(bounds wasm.Ptr, text wasm.Ptr, active int32) int32 // ToggleGroup control, returns active toggle index func ToggleGroup(bounds rl.Rectangle, text string, active int32) int32 { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } - cactive := int32(active) - guiToggleGroup(cbounds, ctext, cactive) - return int32(cactive) + + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) + return guiToggleGroup(cbounds, ctext, active) } //go:wasmimport raylib _GuiToggleSlider //go:noescape -func guiToggleSlider(bounds rl.Rectangle, text wasm.Cptr, active int32) int32 +func guiToggleSlider(bounds wasm.Ptr, text wasm.Ptr, active int32) int32 // ToggleSlider control, returns true when clicked func ToggleSlider(bounds rl.Rectangle, text string, active int32) int32 { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } - cactive := int32(active) - guiToggleSlider(cbounds, ctext, cactive) - return int32(cactive) + + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) + return guiToggleSlider(cbounds, ctext, active) } //go:wasmimport raylib _GuiCheckBox //go:noescape -func guiCheckBox(bounds rl.Rectangle, text wasm.Cptr, checked int32) int32 +func guiCheckBox(bounds wasm.Ptr, text wasm.Ptr, checked bool) int32 // CheckBox control, returns true when active func CheckBox(bounds rl.Rectangle, text string, checked bool) bool { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } - cchecked := wasm.CBool(checked) - return wasm.GoBool(guiCheckBox(cbounds, ctext, cchecked)) + + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) + + cchecked, free := wasm.CopyValueToC(&checked) + defer func() { + wasm.CopyValueToGo(cchecked,&checked) + free() + }() + guiCheckBox(cbounds, ctext, checked) + return checked } //go:wasmimport raylib _GuiComboBox //go:noescape -func guiComboBox(bounds rl.Rectangle, text wasm.Cptr, active int32) int32 +func guiComboBox(bounds wasm.Ptr, text wasm.Ptr, active int32) int32 // ComboBox control, returns selected item index func ComboBox(bounds rl.Rectangle, text string, active int32) int32 { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } - cactive := int32(active) - guiComboBox(cbounds, ctext, cactive) - return int32(cactive) + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) + return guiComboBox(cbounds, ctext, active) } //go:wasmimport raylib _GuiDropdownBox //go:noescape -func guiDropdownBox(bounds rl.Rectangle, text wasm.Cptr, active *int32, editMode int32) int32 +func guiDropdownBox(bounds wasm.Ptr, text wasm.Ptr, active wasm.Ptr, editMode int32) int32 // DropdownBox control, returns true when clicked func DropdownBox(bounds rl.Rectangle, text string, active *int32, editMode bool) bool { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } + + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) if active == nil { active = new(int32) } - cactive := int32(*active) + cactive, free := wasm.CopyValueToC(active) defer func() { - *active = int32(cactive) + wasm.CopyValueToGo(cactive, active) + free() }() - ceditMode := wasm.CBool(editMode) + ceditMode := wasm.BtoI(editMode) - return guiDropdownBox(cbounds, ctext, &cactive, ceditMode) != 0 + return guiDropdownBox(cbounds, ctext, cactive, ceditMode) != 0 } -/* //go:wasmimport raylib _GuiTextBox //go:noescape -func guiTextBox(bounds rl.Rectangle, text *wasm.Cptr, textSize int32, editMode int32) int32 +func guiTextBox(bounds wasm.Ptr, text wasm.Ptr, textSize int32, editMode int32) int32 // TextBox control, updates input text, returns true on ENTER pressed or defocused func TextBox(bounds rl.Rectangle, text *string, textSize int32, editMode bool) bool { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - bs := []byte(*text) - if len(bs) == 0 { - bs = []byte{byte(0)} - } - if 0 < len(bs) && bs[len(bs)-1] != byte(0) { // minimalize allocation - bs = append(bs, byte(0)) // for next input symbols - } - ctext := (wasm.Cptr)(unsafe.Pointer(bs[0])) + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(*text) defer func() { - *text = strings.Trim(string(bs), "\x00") - // no need : wasm.Free(ctext) + *text = wasm.GoString(ctext) + wasm.Free(ctext) }() ctextSize := int32(textSize) - ceditMode := wasm.CBool(editMode) + ceditMode := wasm.BtoI(editMode) return guiTextBox(cbounds, ctext, ctextSize, ceditMode) != 0 } -*/ //go:wasmimport raylib _GuiSpinner //go:noescape -func guiSpinner(bounds rl.Rectangle, text wasm.Cptr, value *int32, minValue, maxValue int32, editMode int32) int32 +func guiSpinner(bounds wasm.Ptr, text wasm.Ptr, value wasm.Ptr, minValue, maxValue int32, editMode bool) int32 // Spinner control, sets value to the selected number and returns true when clicked. func Spinner(bounds rl.Rectangle, text string, value *int32, minValue, maxValue int, editMode bool) bool { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } + + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) if value == nil { value = new(int32) } - cvalue := int32(*value) + cvalue, free := wasm.CopyValueToC(value) defer func() { - *value = int32(cvalue) + wasm.CopyValueToGo(cvalue, value) + free() }() - cminValue := int32(minValue) - cmaxValue := int32(maxValue) - ceditMode := wasm.CBool(editMode) - - return guiSpinner(cbounds, ctext, &cvalue, cminValue, cmaxValue, ceditMode) != 0 + return guiSpinner(cbounds, ctext, cvalue, int32(minValue), int32(maxValue), editMode) != 0 } //go:wasmimport raylib _GuiValueBox //go:noescape -func guiValueBox(bounds rl.Rectangle, text wasm.Cptr, value *int32, minValue, maxValue int32, editMode int32) int32 +func guiValueBox(bounds wasm.Ptr, text wasm.Ptr, value wasm.Ptr, minValue, maxValue int32, editMode int32) int32 // ValueBox control, updates input text with numbers func ValueBox(bounds rl.Rectangle, text string, value *int32, minValue, maxValue int, editMode bool) bool { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } + + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) if value == nil { value = new(int32) } - cvalue := int32(*value) + + cvalue, free := wasm.CopyValueToC(value) defer func() { - *value = int32(cvalue) + wasm.CopyValueToGo(cvalue, value) + free() }() - cminValue := int32(minValue) cmaxValue := int32(maxValue) - ceditMode := wasm.CBool(editMode) + ceditMode := wasm.BtoI(editMode) - return guiValueBox(cbounds, ctext, &cvalue, cminValue, cmaxValue, ceditMode) != 0 + return guiValueBox(cbounds, ctext, cvalue, cminValue, cmaxValue, ceditMode) != 0 } /* //go:wasmimport raylib _GuiValueBoxFloat //go:noescape -func guiValueBoxFloat(bounds rl.Rectangle, text wasm.Cptr, textValue *wasm.Cptr, value *float32, editMode int32) int32 +func guiValueBoxFloat(bounds rl.Rectangle, text wasm.Ptr, textValue *wasm.Ptr, value *float32, editMode int32) int32 // Floating point Value Box control, updates input val_str with numbers func ValueBoxFloat(bounds rl.Rectangle, text string, textValue *string, value *float32, editMode bool) bool { @@ -1054,7 +938,7 @@ func ValueBoxFloat(bounds rl.Rectangle, text string, textValue *string, value *f cbounds.Y = float32(bounds.Y) cbounds.Width = float32(bounds.Width) cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr + var ctext wasm.Ptr if len(text) > 0 { ctext = wasm.CString(text) defer wasm.Free(ctext) @@ -1067,7 +951,7 @@ func ValueBoxFloat(bounds rl.Rectangle, text string, textValue *string, value *f if 0 < len(bs) && bs[len(bs)-1] != byte(0) { // minimalize allocation bs = append(bs, byte(0)) // for next input symbols } - ctextValue := (wasm.Cptr)(unsafe.Pointer(bs[0])) + ctextValue := (wasm.Ptr)(unsafe.Pointer(bs[0])) defer func() { *textValue = strings.Trim(string(bs), "\x00") // no need : wasm.Free(ctext) @@ -1081,64 +965,45 @@ func ValueBoxFloat(bounds rl.Rectangle, text string, textValue *string, value *f *value = float32(cvalue) }() - return guiValueBoxFloat(cbounds, ctext, ctextValue, &cvalue, wasm.CBool(editMode)) != 0 + return guiValueBoxFloat(cbounds, ctext, ctextValue, &cvalue, wasm.BtoI(editMode)) != 0 } */ //go:wasmimport raylib _GuiSlider //go:noescape -func guiSlider(bounds rl.Rectangle, textLeft, textRight wasm.Cptr, value, minValue, maxValue float32) float32 +func guiSlider(bounds wasm.Ptr, textLeft, textRight wasm.Ptr, value, minValue, maxValue float32) float32 // Slider control func Slider(bounds rl.Rectangle, textLeft, textRight string, value, minValue, maxValue float32) float32 { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctextLeft wasm.Cptr - if len(textLeft) > 0 { - ctextLeft = wasm.CString(textLeft) - defer wasm.Free(ctextLeft) - } + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() - var ctextRight wasm.Cptr - if len(textRight) > 0 { - ctextRight = wasm.CString(textRight) - defer wasm.Free(ctextRight) - } + ctextLeft := wasm.CString(textLeft) + defer wasm.Free(ctextLeft) + ctextRight := wasm.CString(textRight) + defer wasm.Free(ctextRight) cvalue := float32(value) cminValue := float32(minValue) cmaxValue := float32(maxValue) - guiSlider(cbounds, ctextLeft, ctextRight, cvalue, cminValue, cmaxValue) - return float32(cvalue) + return guiSlider(cbounds, ctextLeft, ctextRight, cvalue, cminValue, cmaxValue) } //go:wasmimport raylib _GuiSliderBar //go:noescape -func guiSliderBar(bounds rl.Rectangle, textLeft, textRight wasm.Cptr, value, minValue, maxValue float32) float32 +func guiSliderBar(bounds wasm.Ptr, textLeft, textRight wasm.Ptr, value, minValue, maxValue float32) float32 // SliderBar control, returns selected value func SliderBar(bounds rl.Rectangle, textLeft, textRight string, value, minValue, maxValue float32) float32 { - var cbounds rl.Rectangle - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - var ctextLeft wasm.Cptr - if len(textLeft) > 0 { - ctextLeft = wasm.CString(textLeft) - defer wasm.Free(ctextLeft) - } + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() - var ctextRight wasm.Cptr - if len(textRight) > 0 { - ctextRight = wasm.CString(textRight) - defer wasm.Free(ctextRight) - } + ctextLeft := wasm.CString(textLeft) + defer wasm.Free(ctextLeft) + ctextRight := wasm.CString(textRight) + defer wasm.Free(ctextRight) cvalue := float32(value) cminValue := float32(minValue) @@ -1149,52 +1014,38 @@ func SliderBar(bounds rl.Rectangle, textLeft, textRight string, value, minValue, //go:wasmimport raylib _GuiProgressBar //go:noescape -func guiProgressBar(bounds rl.Rectangle, textLeft, textRight wasm.Cptr, value, minValue, maxValue float32) float32 +func guiProgressBar(bounds wasm.Ptr, textLeft, textRight wasm.Ptr, value, minValue, maxValue float32) float32 // ProgressBar control, shows current progress value func ProgressBar(bounds rl.Rectangle, textLeft, textRight string, value, minValue, maxValue float32) float32 { - var cbounds rl.Rectangle - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - var ctextLeft wasm.Cptr - if len(textLeft) > 0 { - ctextLeft = wasm.CString(textLeft) - defer wasm.Free(ctextLeft) - } + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() - var ctextRight wasm.Cptr - if len(textRight) > 0 { - ctextRight = wasm.CString(textRight) - defer wasm.Free(ctextRight) - } + ctextLeft := wasm.CString(textLeft) + defer wasm.Free(ctextLeft) + ctextRight := wasm.CString(textRight) + defer wasm.Free(ctextRight) cvalue := float32(value) cminValue := float32(minValue) cmaxValue := float32(maxValue) - guiProgressBar(cbounds, ctextLeft, ctextRight, cvalue, cminValue, cmaxValue) - return float32(cvalue) + return guiProgressBar(cbounds, ctextLeft, ctextRight, cvalue, cminValue, cmaxValue) } // StatusBar control, shows info text //go:wasmimport raylib _GuiStatusBar //go:noescape -func guiStatusBar(bounds rl.Rectangle, text wasm.Cptr) +func guiStatusBar(bounds wasm.Ptr, text wasm.Ptr) func StatusBar(bounds rl.Rectangle, text string) { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } + + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) guiStatusBar(cbounds, ctext) } @@ -1202,19 +1053,14 @@ func StatusBar(bounds rl.Rectangle, text string) { //go:wasmimport raylib _GuiDummyRec //go:noescape -func guiDummyRec(bounds rl.Rectangle, text wasm.Cptr) +func guiDummyRec(bounds wasm.Ptr, text wasm.Ptr) func DummyRec(bounds rl.Rectangle, text string) { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) guiDummyRec(cbounds, ctext) } @@ -1222,286 +1068,232 @@ func DummyRec(bounds rl.Rectangle, text string) { //go:wasmimport raylib _GuiListView //go:noescape -func guiListView(bounds rl.Rectangle, text wasm.Cptr, scrollIndex *int32, active int32) int32 +func guiListView(bounds wasm.Ptr, text wasm.Ptr, scrollIndex wasm.Ptr, active int32) int32 func ListView(bounds rl.Rectangle, text string, scrollIndex *int32, active int32) int32 { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) if scrollIndex == nil { scrollIndex = new(int32) } - cscrollIndex := int32(*scrollIndex) + cscrollIndex, free := wasm.CopyValueToC(scrollIndex) defer func() { - *scrollIndex = int32(cscrollIndex) + wasm.CopyValueToGo(cscrollIndex, scrollIndex) + free() }() cactive := int32(active) - guiListView(cbounds, ctext, &cscrollIndex, cactive) - return int32(cactive) + return guiListView(cbounds, ctext, cscrollIndex, cactive) } -/* //go:wasmimport raylib _GuiListViewEx //go:noescape -func guiListViewEx(bounds rl.Rectangle, text []wasm.Cptr, focus, scrollIndex *int32, active *int32) int32 +func guiListViewEx(bounds wasm.Ptr, text wasm.Ptr, count int32, scrollIndex wasm.Ptr, active wasm.Ptr, focus wasm.Ptr) int32 // ListView control with extended parameters -func ListViewEx(bounds rl.Rectangle, text []string, focus, scrollIndex *int32, active int32) int32 { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) +func ListViewEx(bounds rl.Rectangle, text []string, + scrollIndex, focus *int32, active int32) int32 { + + cbounds, free := wasm.CopyValueToC(&bounds) + defer free() ctext := NewCStringArrayFromSlice(text) defer ctext.Free() - count := int32(len(text)) - if focus == nil { focus = new(int32) } - cfocus := int32(*focus) - defer func() { - *focus = int32(cfocus) - }() - if scrollIndex == nil { scrollIndex = new(int32) } - cscrollIndex := int32(*scrollIndex) + + cscrollIndex, free := wasm.CopyValueToC(scrollIndex) defer func() { - *scrollIndex = int32(cscrollIndex) + wasm.CopyValueToGo(cscrollIndex, scrollIndex) + free() }() - cactive := int32(active) + cactive, free := wasm.CopyValueToC(&active) + defer func() { + wasm.CopyValueToGo(cactive, &active) + free() + }() - guiListViewEx(cbounds, (*wasm.Cptr)(ctext.Pointer), count, cfocus, cscrollIndex, cactive) - return int32(cactive) + cfocus, free := wasm.CopyValueToC(focus) + defer func() { + wasm.CopyValueToGo(cfocus, focus) + free() + }() + + count := int32(len(text)) + guiListViewEx(cbounds, ctext.Pointer, count, cscrollIndex, cactive, cfocus) + return active } -*/ //go:wasmimport raylib _GuiColorPanel //go:noescape -func guiColorPanel(bounds rl.Rectangle, text wasm.Cptr, color rl.Color) rl.Color +func guiColorPanel(ret wasm.Ptr, bounds wasm.Ptr, text wasm.Ptr, color wasm.Ptr) // ColorPanel control, Color (RGBA) variant func ColorPanel(bounds rl.Rectangle, text string, color rl.Color) rl.Color { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } - var ccolor rl.Color - ccolor.B = uint8(color.B) - ccolor.A = uint8(color.A) - ccolor.R = uint8(color.R) - ccolor.G = uint8(color.G) - guiColorPanel(cbounds, ctext, ccolor) - var goRes rl.Color - goRes.A = byte(ccolor.A) - goRes.R = byte(ccolor.R) - goRes.G = byte(ccolor.G) - goRes.B = byte(ccolor.B) - return goRes + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) + ccolor, free := wasm.MallocV[rl.Color]() + defer free() + + var v rl.Color + ret, free := wasm.CopyValueToC(&v) + defer func() { + wasm.CopyValueToGo(ret, &v) + free() + }() + guiColorPanel(ret, cbounds, ctext, ccolor) + + return v } //go:wasmimport raylib _GuiColorBarAlpha //go:noescape -func guiColorBarAlpha(bounds rl.Rectangle, text wasm.Cptr, alpha float32) float32 +func guiColorBarAlpha(bounds wasm.Ptr, text wasm.Ptr, alpha float32) float32 // ColorBarAlpha control, returns alpha value normalized [0..1] func ColorBarAlpha(bounds rl.Rectangle, text string, alpha float32) float32 { - var cbounds rl.Rectangle - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) calpha := float32(alpha) - guiColorBarAlpha(cbounds, ctext, calpha) - return float32(calpha) + return guiColorBarAlpha(cbounds, ctext, calpha) } //go:wasmimport raylib _GuiColorBarHue //go:noescape -func guiColorBarHue(bounds rl.Rectangle, text wasm.Cptr, value float32) float32 +func guiColorBarHue(bounds wasm.Ptr, text wasm.Ptr, value float32) float32 // ColorBarHue control, returns alpha value normalized [0..1] func ColorBarHue(bounds rl.Rectangle, text string, value float32) float32 { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } + + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) cvalue := float32(value) - guiColorBarHue(cbounds, ctext, cvalue) - return float32(cvalue) + return guiColorBarHue(cbounds, ctext, cvalue) } //go:wasmimport raylib _GuiColorPicker //go:noescape -func guiColorPicker(bounds rl.Rectangle, text wasm.Cptr, color rl.Color) rl.Color +func guiColorPicker(ret wasm.Ptr, bounds wasm.Ptr, text wasm.Ptr, color wasm.Ptr) // ColorPicker control (multiple color controls) // NOTE: this picker converts RGB to HSV, which can cause the Hue control to jump. If you have this problem, consider using the HSV variant instead func ColorPicker(bounds rl.Rectangle, text string, color rl.Color) rl.Color { - var cbounds rl.Rectangle - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } - var ccolor rl.Color - ccolor.R = uint8(color.R) - ccolor.G = uint8(color.G) - ccolor.B = uint8(color.B) - ccolor.A = uint8(color.A) - guiColorPicker(cbounds, ctext, ccolor) - var goRes rl.Color - goRes.A = byte(ccolor.A) - goRes.R = byte(ccolor.R) - goRes.G = byte(ccolor.G) - goRes.B = byte(ccolor.B) - return goRes + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) + + ccolor, free := wasm.MallocV[rl.Color]() + defer free() + var v rl.Color + ret, free := wasm.CopyValueToC(&v) + defer func() { + wasm.CopyValueToGo(ret, &v) + free() + }() + guiColorPicker(ret, cbounds, ctext, ccolor) + return v } //go:wasmimport raylib _GuiColorPickerHSV //go:noescape -func guiColorPickerHSV(bounds rl.Rectangle, text wasm.Cptr, colorHSV *rl.Vector3) int32 +func guiColorPickerHSV(bounds wasm.Ptr, text wasm.Ptr, colorHSV wasm.Ptr) int32 // ColorPicker control that avoids conversion to RGB on each call (multiple color controls) func ColorPickerHSV(bounds rl.Rectangle, text string, colorHSV *rl.Vector3) int32 { - var cbounds rl.Rectangle - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } + ctext := wasm.CString(text) + defer wasm.Free(ctext) - var ccolorHSV rl.Vector3 - ccolorHSV.X = float32(colorHSV.X) - ccolorHSV.Y = float32(colorHSV.Y) - ccolorHSV.Z = float32(colorHSV.Z) + ccolorHSV, free := wasm.CopyValueToC(colorHSV) defer func() { - colorHSV.X = float32(ccolorHSV.X) - colorHSV.Y = float32(ccolorHSV.Y) - colorHSV.Z = float32(ccolorHSV.Z) + wasm.CopyValueToGo(ccolorHSV, colorHSV) + free() }() - return int32(guiColorPickerHSV(cbounds, ctext, &ccolorHSV)) + return int32(guiColorPickerHSV(cbounds, ctext, ccolorHSV)) } //go:wasmimport raylib _GuiColorPanelHSV //go:noescape -func guiColorPanelHSV(bounds rl.Rectangle, text wasm.Cptr, colorHSV *rl.Vector3) int32 +func guiColorPanelHSV(bounds wasm.Ptr, text wasm.Ptr, colorHSV wasm.Ptr) int32 // ColorPanel control that returns HSV color value func ColorPanelHSV(bounds rl.Rectangle, text string, colorHSV *rl.Vector3) int32 { - var cbounds rl.Rectangle - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } + ctext := wasm.CString(text) + defer wasm.Free(ctext) - var ccolorHSV rl.Vector3 - ccolorHSV.X = float32(colorHSV.X) - ccolorHSV.Y = float32(colorHSV.Y) - ccolorHSV.Z = float32(colorHSV.Z) + ccolorHSV, free := wasm.CopyValueToC(colorHSV) defer func() { - colorHSV.X = float32(ccolorHSV.X) - colorHSV.Y = float32(ccolorHSV.Y) - colorHSV.Z = float32(ccolorHSV.Z) + wasm.CopyValueToGo(ccolorHSV, colorHSV) + free() }() - - return int32(guiColorPanelHSV(cbounds, ctext, &ccolorHSV)) + return int32(guiColorPanelHSV(cbounds, ctext, ccolorHSV)) } //go:wasmimport raylib _GuiMessageBox //go:noescape -func guiMessageBox(bounds rl.Rectangle, title, message, buttons wasm.Cptr) int32 +func guiMessageBox(bounds wasm.Ptr, title, message, buttons wasm.Ptr) int32 // MessageBox control func MessageBox(bounds rl.Rectangle, title, message, buttons string) int32 { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - var ctitle wasm.Cptr - if len(title) > 0 { - ctitle = wasm.CString(title) - defer wasm.Free(ctitle) - } - var cmessage wasm.Cptr - if len(message) > 0 { - cmessage = wasm.CString(message) - defer wasm.Free(cmessage) - } + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctitle := wasm.CString(title) + defer wasm.Free(ctitle) + cmessage := wasm.CString(message) + defer wasm.Free(cmessage) + cbuttons := wasm.CString(buttons) defer wasm.Free(cbuttons) + return int32(guiMessageBox(cbounds, ctitle, cmessage, cbuttons)) } -/* +// //go:wasmimport raylib _GuiTextInputBox //go:noescape -func guiTextInputBox(bounds rl.Rectangle, title, message, buttons wasm.Cptr, text *wasm.Cptr, textMaxSize int32, secretViewActive *int32) int32 +func guiTextInputBox(bounds wasm.Ptr, title, message, buttons wasm.Ptr, text wasm.Ptr, textMaxSize int32, secretViewActive wasm.Ptr) int32 // TextInputBox control, ask for text func TextInputBox(bounds rl.Rectangle, title, message, buttons string, text *string, textMaxSize int32, secretViewActive *bool) int32 { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) + cbounds, free := wasm.CopyValueToC(&bounds) + defer free() - var ctitle wasm.Cptr + var ctitle wasm.Ptr if len(title) > 0 { ctitle = wasm.CString(title) defer wasm.Free(ctitle) } - var cmessage wasm.Cptr + var cmessage wasm.Ptr if len(message) > 0 { cmessage = wasm.CString(message) defer wasm.Free(cmessage) @@ -1510,55 +1302,40 @@ func TextInputBox(bounds rl.Rectangle, title, message, buttons string, text *str cbuttons := wasm.CString(buttons) defer wasm.Free(cbuttons) - bs := []byte(*text) - if len(bs) == 0 { - bs = []byte{byte(0)} - } - if 0 < len(bs) && bs[len(bs)-1] != byte(0) { // minimalize allocation - bs = append(bs, byte(0)) // for next input symbols - } - ctext := (wasm.Cptr)(unsafe.Pointer(bs[0])) - defer func() { - *text = strings.TrimSpace(strings.Trim(string(bs), "\x00")) - // no need : wasm.Free(ctext) - }() + ctext := wasm.CString(*text) + defer wasm.Free(ctext) ctextMaxSize := int32(textMaxSize) - csecretViewActive := wasm.CBool(*secretViewActive) + csecretViewActive, free := wasm.CopyValueToC(secretViewActive) defer func() { - *secretViewActive = wasm.GoBool(csecretViewActive) + wasm.CopyValueToGo(csecretViewActive, secretViewActive) + free() }() - return int32(guiTextInputBox(cbounds, ctitle, cmessage, cbuttons, ctext, ctextMaxSize, &csecretViewActive)) + return int32(guiTextInputBox(cbounds, ctitle, cmessage, cbuttons, ctext, ctextMaxSize, csecretViewActive)) } -*/ //go:wasmimport raylib _GuiGrid //go:noescape -func guiGrid(bounds rl.Rectangle, text wasm.Cptr, spacing float32, subdivs int32, mouseCell *rl.Vector2) int32 +func guiGrid(bounds wasm.Ptr, text wasm.Ptr, spacing float32, subdivs int32, mouseCell wasm.Ptr) int32 // Grid control, returns mouse cell position func Grid(bounds rl.Rectangle, text string, spacing float32, subdivs int32, mouseCell *rl.Vector2) int32 { - var cbounds rl.Rectangle - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - cbounds.X = float32(bounds.X) - var ctext wasm.Cptr - if len(text) > 0 { - ctext = wasm.CString(text) - defer wasm.Free(ctext) - } + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() + + ctext := wasm.CString(text) + defer wasm.Free(ctext) + cspacing := float32(spacing) csubdivs := int32(subdivs) - var cmouseCell rl.Vector2 - cmouseCell.X = float32(mouseCell.X) - cmouseCell.Y = float32(mouseCell.Y) - res := guiGrid(cbounds, ctext, cspacing, csubdivs, &cmouseCell) - mouseCell.X = float32(cmouseCell.X) - mouseCell.Y = float32(cmouseCell.Y) - return int32(res) + cmouseCell, free := wasm.CopyValueToC(mouseCell) + defer func() { + wasm.CopyValueToGo(cmouseCell, mouseCell) + free() + }() + return guiGrid(cbounds, ctext, cspacing, csubdivs, cmouseCell) } //---------------------------------------------------------------------------------- @@ -1566,27 +1343,21 @@ func Grid(bounds rl.Rectangle, text string, spacing float32, subdivs int32, mous // NOTE: Tooltips requires some global variables: tooltipPtr //---------------------------------------------------------------------------------- +// Enable gui tooltips (global state) +// //go:wasmimport raylib _GuiEnableTooltip //go:noescape -func guiEnableTooltip() - -// Enable gui tooltips (global state) -func EnableTooltip() { - guiEnableTooltip() -} +func EnableTooltip() +// Disable gui tooltips (global state) +// //go:wasmimport raylib _GuiDisableTooltip //go:noescape -func guiDisableTooltip() - -// Disable gui tooltips (global state) -func DisableTooltip() { - guiDisableTooltip() -} +func DisableTooltip() //go:wasmimport raylib _GuiSetTooltip //go:noescape -func guiSetTooltip(tooltip wasm.Cptr) +func guiSetTooltip(tooltip wasm.Ptr) // Set tooltip string func SetTooltip(tooltip string) { @@ -1601,7 +1372,7 @@ func SetTooltip(tooltip string) { //go:wasmimport raylib _GuiLoadStyle //go:noescape -func guiLoadStyle(fileName wasm.Cptr) +func guiLoadStyle(fileName wasm.Ptr) // Load raygui style file (.rgs) func LoadStyle(fileName string) { @@ -1621,7 +1392,7 @@ func LoadStyleDefault() { //go:wasmimport raylib _GuiIconText //go:noescape -func guiIconText(iconId int32, text wasm.Cptr) wasm.Cptr +func guiIconText(iconId int32, text wasm.Ptr) wasm.Ptr // IconText gets text with icon id prepended (if supported) func IconText(iconId IconID, text string) string { @@ -1633,13 +1404,13 @@ func IconText(iconId IconID, text string) string { //go:wasmimport raylib _GuiLoadIcons //go:noescape -func guiLoadIcons(fileName wasm.Cptr, loadIconsName int32) +func guiLoadIcons(fileName wasm.Ptr, loadIconsName int32) // Load raygui icons file (.rgi) func LoadIcons(fileName string, loadIconsName bool) { cfileName := wasm.CString(fileName) defer wasm.Free(cfileName) - guiLoadIcons(cfileName, wasm.CBool(loadIconsName)) + guiLoadIcons(cfileName, wasm.BtoI(loadIconsName)) } /* @@ -1649,31 +1420,30 @@ func guiLoadIconsFromMemory(data []byte, size int32, loadIconsName int32) // Load icons from memory (Binary files only) func LoadIconsFromMemory(data []byte, loadIconsName bool) { - guiLoadIconsFromMemory((*uint8)(unsafe.Pointer(data[0])), int32(len(data)), wasm.CBool(loadIconsName)) + guiLoadIconsFromMemory((*uint8)(unsafe.Pointer(data[0])), int32(len(data)), wasm.BtoI(loadIconsName)) } */ //go:wasmimport raylib _GuiDrawIcon //go:noescape -func guiDrawIcon(iconId, posX, posY, pixelSize int32, col color.RGBA) +func guiDrawIcon(iconId, posX, posY, pixelSize int32, col wasm.Ptr) // Draw icon using pixel size at specified position func DrawIcon(iconId IconID, posX, posY, pixelSize int32, col color.RGBA) { - guiDrawIcon(int32(iconId), int32(posX), int32(posY), int32(pixelSize), col) + ccol, free := wasm.CopyValueToC(&col) + defer free() + guiDrawIcon(int32(iconId), int32(posX), int32(posY), int32(pixelSize), ccol) } +// Set icon drawing size +// //go:wasmimport raylib _GuiSetIconScale //go:noescape -func guiSetIconScale(scale int32) - -// Set icon drawing size -func SetIconScale(scale int32) { - guiSetIconScale(int32(scale)) -} +func SetIconScale(scale int32) //go:wasmimport raylib _GuiGetTextWidth //go:noescape -func guiGetTextWidth(text wasm.Cptr) int32 +func guiGetTextWidth(text wasm.Ptr) int32 // Get text width considering gui style and icon size (if required) func GetTextWidth(text string) int32 { @@ -1689,7 +1459,7 @@ func GetTextWidth(text string) int32 { /* //go:wasmimport raylib _GuiLoadStyleFromMemory //go:noescape -func guiLoadStyleFromMemory(data wasm.Cptr, size int32) +func guiLoadStyleFromMemory(data wasm.Ptr, size int32) // Load style from memory (Binary files only) func LoadStyleFromMemory(data []byte) { @@ -1699,15 +1469,12 @@ func LoadStyleFromMemory(data []byte) { //go:wasmimport raylib _GuiScrollBar //go:noescape -func guiScrollBar(bounds rl.Rectangle, value, minValue, maxValue int32) int32 +func guiScrollBar(bounds wasm.Ptr, value, minValue, maxValue int32) int32 // ScrollBar control func ScrollBar(bounds rl.Rectangle, value, minValue, maxValue int32) int32 { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() cvalue := int32(value) cminValue := int32(minValue) @@ -1716,18 +1483,26 @@ func ScrollBar(bounds rl.Rectangle, value, minValue, maxValue int32) int32 { return int32(guiScrollBar(cbounds, cvalue, cminValue, cmaxValue)) } -// Color fade-in or fade-out, alpha value normalized [0..1] -// WARNING: It multiplies current alpha by alpha scale factor - //go:wasmimport raylib _GuiFade //go:noescape -func guiFade(color rl.Color, alpha float32) rl.Color +func guiFade(ret wasm.Ptr, color wasm.Ptr, alpha float32) +// Color fade-in or fade-out, alpha value normalized [0..1] +// WARNING: It multiplies current alpha by alpha scale factor func Fade(color rl.Color, alpha float32) rl.Color { - ccolor := rl.Color{uint8(color.R), uint8(color.G), uint8(color.B), uint8(color.A)} - calpha := float32(alpha) - cresult := guiFade(ccolor, calpha) - return rl.Color{R: uint8(cresult.R), G: uint8(cresult.G), B: uint8(cresult.B), A: uint8(cresult.A)} + + ccolor, free := wasm.MallocV[rl.Color]() + defer free() + + var v rl.Color + ret, free := wasm.CopyValueToC(&v) + defer func() { + wasm.CopyValueToGo(ret, &v) + free() + }() + + guiFade(ret, ccolor, alpha) + return v } //---------------------------------------------------------------------------------- @@ -1736,26 +1511,16 @@ func Fade(color rl.Color, alpha float32) rl.Color { //go:wasmimport raylib _GuiDrawRectangle //go:noescape -func guiDrawRectangle(bounds rl.Rectangle, borderWidth int32, borderColor, fillColor rl.Color) +func guiDrawRectangle(bounds wasm.Ptr, borderWidth int32, borderColor, fillColor wasm.Ptr) func DrawRectangle(bounds rl.Rectangle, borderWidth int32, borderColor, fillColor rl.Color) { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) - - var cborderColor rl.Color - cborderColor.R = uint8(borderColor.R) - cborderColor.G = uint8(borderColor.G) - cborderColor.B = uint8(borderColor.B) - cborderColor.A = uint8(borderColor.A) + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() - var cfillColor rl.Color - cfillColor.R = uint8(fillColor.R) - cfillColor.G = uint8(fillColor.G) - cfillColor.B = uint8(fillColor.B) - cfillColor.A = uint8(fillColor.A) + cfillColor, free := wasm.MallocV[rl.Color]() + defer free() + cborderColor, free := wasm.MallocV[rl.Color]() + defer free() bw := int32(borderWidth) @@ -1766,47 +1531,38 @@ func DrawRectangle(bounds rl.Rectangle, borderWidth int32, borderColor, fillColo //go:wasmimport raylib _GuiDrawText //go:noescape -func guiDrawText(text wasm.Cptr, position rl.Rectangle, alignment int32, color rl.Color) +func guiDrawText(text wasm.Ptr, position wasm.Ptr, alignment int32, color wasm.Ptr) func DrawText(text string, position rl.Rectangle, alignment int32, color rl.Color) { + + cposition, free := wasm.MallocV[rl.Rectangle]() + defer free() + ccolor, free := wasm.MallocV[rl.Color]() + defer free() + ctext := wasm.CString(text) defer wasm.Free(ctext) - var cposition rl.Rectangle - cposition.X = float32(position.X) - cposition.Y = float32(position.Y) - cposition.Width = float32(position.Width) - cposition.Height = float32(position.Height) - calignment := int32(alignment) - var ccolor rl.Color - ccolor.R = uint8(color.R) - ccolor.G = uint8(color.G) - ccolor.B = uint8(color.B) - ccolor.A = uint8(color.A) - guiDrawText(ctext, cposition, calignment, ccolor) } -// GetTextBounds - static Rectangle GetTextBounds(int control, Rectangle bounds) - //go:wasmimport raylib _GuiGetTextBounds //go:noescape -func guiGetTextBounds(control uint16, bounds rl.Rectangle) rl.Rectangle +func guiGetTextBounds(ret wasm.Ptr, control int32, bounds wasm.Ptr) +// GetTextBounds - static Rectangle GetTextBounds(int control, Rectangle bounds) func GetTextBounds(control ControlID, bounds rl.Rectangle) rl.Rectangle { - var cbounds rl.Rectangle - cbounds.X = float32(bounds.X) - cbounds.Y = float32(bounds.Y) - cbounds.Width = float32(bounds.Width) - cbounds.Height = float32(bounds.Height) + cbounds, free := wasm.MallocV[rl.Rectangle]() + defer free() ccontrol := uint16(control) - cretBounds := guiGetTextBounds(ccontrol, cbounds) - return rl.Rectangle{ - X: float32(cretBounds.X), - Y: float32(cretBounds.Y), - Width: float32(cretBounds.Width), - Height: float32(cretBounds.Height), - } + var v rl.Rectangle + cret, free := wasm.CopyValueToC(&v) + defer func() { + wasm.CopyValueToGo(cret, &v) + free() + }() + guiGetTextBounds(cret, int32(ccontrol), cbounds) + return v } diff --git a/wasm-runtime/wasm.go b/wasm-runtime/wasm.go index 932383e..c3c2bd1 100644 --- a/wasm-runtime/wasm.go +++ b/wasm-runtime/wasm.go @@ -3,22 +3,25 @@ package wasm import ( + "reflect" "syscall/js" "unsafe" ) -// Cptr is a pointer to raylib wasm memory -type Cptr = uint32 +// Ptr is a pointer to raylib wasm memory +type Ptr = uint32 + +const PTR_SIZE = 4 // bytes // Allocates memory on raylib heap // //go:wasmimport raylib _malloc //go:noescape -func Malloc(size Cptr) Cptr +func malloc(size Ptr) Ptr // malloc the size of V -func mallocV[T any](V T) (Cptr, func()) { - ptr := Malloc(Sizeof(V)) +func MallocV[T any]() (Ptr, func()) { + ptr := malloc(Ptr(reflect.TypeFor[T]().Size())) return ptr, func() { Free(ptr) } } @@ -26,7 +29,7 @@ func mallocV[T any](V T) (Cptr, func()) { // //go:wasmimport raylib _free //go:noescape -func Free(Cptr) +func Free(Ptr) // _copyToC copies a Go type/struct to C memory. Useful for copying slices and structs. // @@ -37,7 +40,7 @@ func Free(Cptr) // //go:wasmimport gojs CopyToC //go:noescape -func _copyToC(Value unsafe.Pointer, srcSize, dstCptr Cptr) +func _copyToC(Value unsafe.Pointer, srcSize, dstCptr Ptr) // copies C memory to a Go pointer. Useful for copying C structs into Go structs // @@ -56,64 +59,71 @@ func _copyToC(Value unsafe.Pointer, srcSize, dstCptr Cptr) // //go:wasmimport gojs CopyToGo //go:noescape -func _copyToGo(dstGoPtr unsafe.Pointer, size Cptr, src Cptr) +func _copyToGo(dstGoPtr unsafe.Pointer, size Ptr, src Ptr) // Copies the src value to the dst cptr -func copyToC[T any](src T, dst Cptr) { - size := Sizeof(src) - _copyToC(unsafe.Pointer(&src), size, dst) +func CopyToC[T any](src *T, dst Ptr) { + size := Ptr(reflect.TypeFor[T]().Size()) + _copyToC(unsafe.Pointer(src), size, dst) +} + +// Copies srcSize bytes from src into dst. +func CopyTGo[T any](src Ptr, srcSize Ptr, dst *T) { + _copyToGo(unsafe.Pointer(dst), srcSize, src) } // The allocated C string lives on the raylib heap and must be free()'d // //go:wasmimport gojs CStringFromGoString //go:noescape -func CString(string) Cptr +func CString(string) Ptr // Scan for null terminator and return length excluding the null terminator. // //go:wasmimport gojs CStringGetLength //go:noescape -func _cStringGetLength(cstr Cptr) Cptr +func _cStringGetLength(cstr Ptr) Ptr + +// Scan for null terminator and return length excluding the null terminator. +// +//go:wasmimport gojs CStringGetLength +//go:noescape +func CStringArrayGetLength(cstrArray Ptr) Ptr // Copies a C string to Go memory without freeing the C string. -func GoString(cstr Cptr) string { +func GoString(cstr Ptr) string { size := _cStringGetLength(cstr) dstStr := make([]byte, size) CopySliceToGo(cstr, dstStr) return string(dstStr) } -// TODO -//go:wasmimport gojs CBoolFromGoBool -//go:noescape -func CBool(bool) int32 - -// TODO -func GoBool(b int32) bool { - if b == 0 { - return false +// Convert boolean to int32 +func BtoI(v bool) int32 { + if v == true { + return 1 + } else { + return 0 } - return true } // CopyValueToC copies a value to C and returns a pointer to it. // // NOTE: Value cannot be a slice. For a slice, use [CopySliceToC] -func CopyValueToC[T any](srcValue T) (Cptr, func()) { - dst, free := mallocV(srcValue) - copyToC(srcValue, dst) +func CopyValueToC[T any](srcValue *T) (Ptr, func()) { + dst, free := MallocV[T]() + CopyToC(srcValue, dst) return dst, free } // CopySliceToC allocates a copy of a slice in C memory and returns a cptr to it. // // NOTE: Value MUST be a slice -func CopySliceToC[Slice ~[]E, E any](s Slice) (Cptr, func()) { +func CopySliceToC[Slice ~[]E, E any](s Slice) (Ptr, func()) { // size of the slice's underlying array in bytes - sliceSize := Cptr(unsafe.Sizeof(s[:1][0])) * Cptr(len(s)) + sliceSize := Ptr(unsafe.Sizeof(s[:1][0])) * Ptr(len(s)) // allocate C array to hold Value - dstCptr := Malloc(sliceSize) + dstCptr := malloc(sliceSize) // copy underlying array memory to C _copyToC(unsafe.Pointer(unsafe.SliceData(s)), sliceSize, dstCptr) return dstCptr, func() { Free(dstCptr) } @@ -123,21 +133,21 @@ func CopySliceToC[Slice ~[]E, E any](s Slice) (Cptr, func()) { // Useful for copying structs // // NOTE: Slices are not supported. Use [CopySliceToGo] -func CopyValueToGo[T any](src Cptr, dst *T) { - size := Sizeof(*dst) +func CopyValueToGo[T any](src Ptr, dst *T) { + size := Ptr(unsafe.Sizeof(*dst)) _copyToGo(unsafe.Pointer(dst), size, src) } // CopySliceToGo copies a C array into a Go Slice. // // It copies bytes to the underlying array of the slice. -func CopySliceToGo[Slice ~[]E, E any](src Cptr, dst Slice) { +func CopySliceToGo[Slice ~[]E, E any](src Ptr, dst Slice) { // size of underlying array var occupiedSize = len(dst) if occupiedSize == 0 { occupiedSize = cap(dst) } - size := Cptr(unsafe.Sizeof(dst[0])) * Cptr(occupiedSize) + size := Ptr(unsafe.Sizeof(dst[0])) * Ptr(occupiedSize) dstPtr := unsafe.SliceData(dst) _copyToGo(unsafe.Pointer(dstPtr), size, src) } @@ -158,6 +168,3 @@ func SetMain(UpdateAndDrawFrame func()) { js.Global().Call("requestAnimationFrame", updateLoop) select {} } - -// return sizeof of v in bytes -func Sizeof[T any](v T) Cptr { return Cptr(unsafe.Sizeof(v)) } From 3d41c53d66cfc981a07ba0bdb0775fb1fc3f8242 Mon Sep 17 00:00:00 2001 From: "coderabbitai[bot]" <136622811+coderabbitai[bot]@users.noreply.github.com> Date: Fri, 24 Apr 2026 06:48:26 +0000 Subject: [PATCH 7/9] fix: apply CodeRabbit auto-fixes Fixed 5 file(s) based on 10 unresolved review comments. Co-authored-by: CodeRabbit --- index/index.js | 2 - index/runtime.js | 26 ++------ raygui/cstring.go | 14 ++-- raygui/raygui.go | 148 ++++++++++++++++++++++++++++--------------- wasm-runtime/wasm.go | 4 +- 5 files changed, 115 insertions(+), 79 deletions(-) diff --git a/index/index.js b/index/index.js index e3150af..38b9226 100644 --- a/index/index.js +++ b/index/index.js @@ -29,8 +29,6 @@ import { Runtime } from "./runtime.js"; // helper funtions const runtime = new Runtime(); // inject custom runtime methods Object.assign(go.importObject.gojs, { - array: runtime.array.bind(runtime), - struct: runtime.struct.bind(runtime), CStringFromGoString: runtime.CStringFromGoString.bind(runtime), CStringGetLength: runtime.CStringGetLength.bind(runtime), CStringArrayGetLength: runtime.CStringArrayGetLength.bind(runtime), diff --git a/index/runtime.js b/index/runtime.js index b40b921..f5e27dc 100644 --- a/index/runtime.js +++ b/index/runtime.js @@ -38,25 +38,6 @@ class Runtime { }; // ---- Runtime helpers ---- - array = (sp) => { - // messing around with slice - sp >>>= 0; - console.log(sp); - // slice capacity - console.log(this.getInt64(sp + 8 + 8)); - console.log(sp + 8); - }; - // function messing around with struct - struct = (sp) => { - sp >>>= 0; - const ptr = this.getInt64(sp + 8); - // this.setInt32(ptr, 99); - // // 2nd field of struct - // this.setInt32(ptr + 4, 69); - // return - this.setInt64(sp + 16, ptr); - }; - getRaylibU8Array(cptr, len) { return new Uint8Array( // js slice globalThis.raylib.HEAPU8.buffer, @@ -105,13 +86,18 @@ class Runtime { let count = 0; const idx = basePtr >> 2; // convert byte offset → i32 index + const heapLen = heap32.length; - while (true) { + while (idx + count < heapLen) { const ptr = heap32[idx + count]; if (ptr === 0) break; count++; } + if (idx + count >= heapLen) { + throw new Error("CStringArrayGetLength: reached heap end without finding NULL terminator"); + } + this.setInt32(sp + 8 * 2, count); }; // func(src unsafe.Pointer, srcSize, dstCptr cptr) diff --git a/raygui/cstring.go b/raygui/cstring.go index eb5ed1c..03187f9 100644 --- a/raygui/cstring.go +++ b/raygui/cstring.go @@ -39,7 +39,8 @@ func NewCStringArrayFromPointer(p wasm.Ptr) *CStringArray { } // NewCStringArrayFromSlice makes an instance of CStringArray then copy the -// input slice to it. +// input slice to it. The returned CStringArray takes ownership of the allocated +// C memory and must be Free()d by the caller. func NewCStringArrayFromSlice(ss []string) *CStringArray { var arr CStringArray arr.Copy(ss) @@ -56,9 +57,9 @@ func (arr *CStringArray) ToSlice() []string { var ss []string p := arr.Pointer //NOTE: upstream raylib-go does this wrong. - for { + for i := 0; i < arr.Length; i++ { var cs wasm.Ptr - wasm.CopyTGo(p, wasm.PTR_SIZE, &cs) + wasm.CopyToGo(p, wasm.PTR_SIZE, &cs) if cs == 0 { // skip NULL - the last element break } @@ -71,6 +72,11 @@ func (arr *CStringArray) ToSlice() []string { // TODO: do this in the runtime if possible. // Copy converts Go slice of strings to C underlying struct of CStringArray func (arr *CStringArray) Copy(ss []string) { + // Free existing C memory if any + if arr.Pointer != 0 || arr.Length > 0 { + arr.Free() + } + arr.Length = len(ss) + 1 // one more element for NULL at the end arr.Pointer = makeStringArray(arr.Length) @@ -93,7 +99,7 @@ func (arr *CStringArray) Free() { for i := range wasm.Ptr(arr.Length) { idx := (i * wasm.PTR_SIZE) var cs wasm.Ptr - wasm.CopyTGo(arr.Pointer+idx, wasm.PTR_SIZE, &cs) + wasm.CopyToGo(arr.Pointer+idx, wasm.PTR_SIZE, &cs) if cs == 0 { // skip NULL - the last element break } diff --git a/raygui/raygui.go b/raygui/raygui.go index b8298f3..d981516 100644 --- a/raygui/raygui.go +++ b/raygui/raygui.go @@ -556,6 +556,7 @@ func GetFont() rl.Font { defer free() guiGetFont(v) + wasm.CopyValueToGo(v, &ret) return ret } @@ -679,15 +680,15 @@ func guiScrollPanel(bounds wasm.Ptr, text wasm.Ptr, content wasm.Ptr, scroll was // Scroll Panel control func ScrollPanel(bounds rl.Rectangle, text string, content rl.Rectangle, scroll *rl.Vector2, view *rl.Rectangle) { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) defer wasm.Free(ctext) - ccontent, free := wasm.MallocV[rl.Rectangle]() + ccontent, free := wasm.CopyValueToC(&content) defer free() - cscroll, free := wasm.MallocV[rl.Vector2]() + cscroll, free := wasm.CopyValueToC(scroll) defer free() cview, free := wasm.CopyValueToC(view) @@ -705,7 +706,7 @@ func guiLabel(bounds wasm.Ptr, text wasm.Ptr) // Label control func Label(bounds rl.Rectangle, text string) { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) @@ -719,7 +720,7 @@ func guiButton(bounds wasm.Ptr, text wasm.Ptr) int32 // Button control, returns true when clicked func Button(bounds rl.Rectangle, text string) bool { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) @@ -734,7 +735,7 @@ func guiLabelButton(bounds wasm.Ptr, text wasm.Ptr) int32 // LabelButton control, returns true when clicked func LabelButton(bounds rl.Rectangle, text string) bool { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) @@ -764,7 +765,7 @@ func guiToggleGroup(bounds wasm.Ptr, text wasm.Ptr, active int32) int32 // ToggleGroup control, returns active toggle index func ToggleGroup(bounds rl.Rectangle, text string, active int32) int32 { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) @@ -779,7 +780,7 @@ func guiToggleSlider(bounds wasm.Ptr, text wasm.Ptr, active int32) int32 // ToggleSlider control, returns true when clicked func ToggleSlider(bounds rl.Rectangle, text string, active int32) int32 { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) @@ -789,23 +790,23 @@ func ToggleSlider(bounds rl.Rectangle, text string, active int32) int32 { //go:wasmimport raylib _GuiCheckBox //go:noescape -func guiCheckBox(bounds wasm.Ptr, text wasm.Ptr, checked bool) int32 +func guiCheckBox(bounds wasm.Ptr, text wasm.Ptr, checked wasm.Ptr) int32 // CheckBox control, returns true when active func CheckBox(bounds rl.Rectangle, text string, checked bool) bool { - cbounds, free := wasm.MallocV[rl.Rectangle]() - defer free() + cbounds, freeBounds := wasm.CopyValueToC(&bounds) + defer freeBounds() ctext := wasm.CString(text) defer wasm.Free(ctext) - cchecked, free := wasm.CopyValueToC(&checked) + cchecked, freeChecked := wasm.CopyValueToC(&checked) defer func() { wasm.CopyValueToGo(cchecked,&checked) - free() + freeChecked() }() - guiCheckBox(cbounds, ctext, checked) + guiCheckBox(cbounds, ctext, cchecked) return checked } @@ -815,7 +816,7 @@ func guiComboBox(bounds wasm.Ptr, text wasm.Ptr, active int32) int32 // ComboBox control, returns selected item index func ComboBox(bounds rl.Rectangle, text string, active int32) int32 { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) @@ -830,7 +831,7 @@ func guiDropdownBox(bounds wasm.Ptr, text wasm.Ptr, active wasm.Ptr, editMode in // DropdownBox control, returns true when clicked func DropdownBox(bounds rl.Rectangle, text string, active *int32, editMode bool) bool { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) @@ -857,19 +858,40 @@ func guiTextBox(bounds wasm.Ptr, text wasm.Ptr, textSize int32, editMode int32) // TextBox control, updates input text, returns true on ENTER pressed or defocused func TextBox(bounds rl.Rectangle, text *string, textSize int32, editMode bool) bool { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() - ctext := wasm.CString(*text) - defer func() { - *text = wasm.GoString(ctext) - wasm.Free(ctext) - }() + // Allocate writable buffer of size textSize + ctext := wasm.malloc(wasm.Ptr(textSize)) + defer wasm.Free(ctext) + + // Copy current text into buffer and ensure NUL-termination + currentText := []byte(*text) + if len(currentText) > int(textSize)-1 { + currentText = currentText[:int(textSize)-1] + } + // Zero-fill the buffer + for i := wasm.Ptr(0); i < wasm.Ptr(textSize); i++ { + wasm.CopyToC(&[]byte{0}[0], ctext+i) + } + // Copy the actual text + if len(currentText) > 0 { + wasm.CopySliceToGo(ctext, currentText) + for i, b := range currentText { + src := []byte{b} + wasm.CopyToC(&src[0], ctext+wasm.Ptr(i)) + } + } ctextSize := int32(textSize) ceditMode := wasm.BtoI(editMode) - return guiTextBox(cbounds, ctext, ctextSize, ceditMode) != 0 + result := guiTextBox(cbounds, ctext, ctextSize, ceditMode) != 0 + + // Copy the result back + *text = wasm.GoString(ctext) + + return result } //go:wasmimport raylib _GuiSpinner @@ -879,7 +901,7 @@ func guiSpinner(bounds wasm.Ptr, text wasm.Ptr, value wasm.Ptr, minValue, maxVal // Spinner control, sets value to the selected number and returns true when clicked. func Spinner(bounds rl.Rectangle, text string, value *int32, minValue, maxValue int, editMode bool) bool { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) @@ -904,7 +926,7 @@ func guiValueBox(bounds wasm.Ptr, text wasm.Ptr, value wasm.Ptr, minValue, maxVa // ValueBox control, updates input text with numbers func ValueBox(bounds rl.Rectangle, text string, value *int32, minValue, maxValue int, editMode bool) bool { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) @@ -976,7 +998,7 @@ func guiSlider(bounds wasm.Ptr, textLeft, textRight wasm.Ptr, value, minValue, m // Slider control func Slider(bounds rl.Rectangle, textLeft, textRight string, value, minValue, maxValue float32) float32 { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctextLeft := wasm.CString(textLeft) @@ -997,7 +1019,7 @@ func guiSliderBar(bounds wasm.Ptr, textLeft, textRight wasm.Ptr, value, minValue // SliderBar control, returns selected value func SliderBar(bounds rl.Rectangle, textLeft, textRight string, value, minValue, maxValue float32) float32 { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctextLeft := wasm.CString(textLeft) @@ -1019,7 +1041,7 @@ func guiProgressBar(bounds wasm.Ptr, textLeft, textRight wasm.Ptr, value, minVal // ProgressBar control, shows current progress value func ProgressBar(bounds rl.Rectangle, textLeft, textRight string, value, minValue, maxValue float32) float32 { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctextLeft := wasm.CString(textLeft) @@ -1041,7 +1063,7 @@ func guiStatusBar(bounds wasm.Ptr, text wasm.Ptr) func StatusBar(bounds rl.Rectangle, text string) { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) @@ -1056,7 +1078,7 @@ func StatusBar(bounds rl.Rectangle, text string) { func guiDummyRec(bounds wasm.Ptr, text wasm.Ptr) func DummyRec(bounds rl.Rectangle, text string) { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) @@ -1071,7 +1093,7 @@ func DummyRec(bounds rl.Rectangle, text string) { func guiListView(bounds wasm.Ptr, text wasm.Ptr, scrollIndex wasm.Ptr, active int32) int32 func ListView(bounds rl.Rectangle, text string, scrollIndex *int32, active int32) int32 { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) @@ -1141,12 +1163,12 @@ func guiColorPanel(ret wasm.Ptr, bounds wasm.Ptr, text wasm.Ptr, color wasm.Ptr) // ColorPanel control, Color (RGBA) variant func ColorPanel(bounds rl.Rectangle, text string, color rl.Color) rl.Color { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) defer wasm.Free(ctext) - ccolor, free := wasm.MallocV[rl.Color]() + ccolor, free := wasm.CopyValueToC(&color) defer free() var v rl.Color @@ -1166,7 +1188,7 @@ func guiColorBarAlpha(bounds wasm.Ptr, text wasm.Ptr, alpha float32) float32 // ColorBarAlpha control, returns alpha value normalized [0..1] func ColorBarAlpha(bounds rl.Rectangle, text string, alpha float32) float32 { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) @@ -1182,7 +1204,7 @@ func guiColorBarHue(bounds wasm.Ptr, text wasm.Ptr, value float32) float32 // ColorBarHue control, returns alpha value normalized [0..1] func ColorBarHue(bounds rl.Rectangle, text string, value float32) float32 { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) @@ -1198,13 +1220,13 @@ func guiColorPicker(ret wasm.Ptr, bounds wasm.Ptr, text wasm.Ptr, color wasm.Ptr // ColorPicker control (multiple color controls) // NOTE: this picker converts RGB to HSV, which can cause the Hue control to jump. If you have this problem, consider using the HSV variant instead func ColorPicker(bounds rl.Rectangle, text string, color rl.Color) rl.Color { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) defer wasm.Free(ctext) - ccolor, free := wasm.MallocV[rl.Color]() + ccolor, free := wasm.CopyValueToC(&color) defer free() var v rl.Color ret, free := wasm.CopyValueToC(&v) @@ -1222,7 +1244,7 @@ func guiColorPickerHSV(bounds wasm.Ptr, text wasm.Ptr, colorHSV wasm.Ptr) int32 // ColorPicker control that avoids conversion to RGB on each call (multiple color controls) func ColorPickerHSV(bounds rl.Rectangle, text string, colorHSV *rl.Vector3) int32 { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) @@ -1243,7 +1265,7 @@ func guiColorPanelHSV(bounds wasm.Ptr, text wasm.Ptr, colorHSV wasm.Ptr) int32 // ColorPanel control that returns HSV color value func ColorPanelHSV(bounds rl.Rectangle, text string, colorHSV *rl.Vector3) int32 { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) @@ -1263,7 +1285,7 @@ func guiMessageBox(bounds wasm.Ptr, title, message, buttons wasm.Ptr) int32 // MessageBox control func MessageBox(bounds rl.Rectangle, title, message, buttons string) int32 { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctitle := wasm.CString(title) @@ -1302,9 +1324,28 @@ func TextInputBox(bounds rl.Rectangle, title, message, buttons string, text *str cbuttons := wasm.CString(buttons) defer wasm.Free(cbuttons) - ctext := wasm.CString(*text) + // Allocate writable buffer of size textMaxSize + ctext := wasm.malloc(wasm.Ptr(textMaxSize)) defer wasm.Free(ctext) + // Copy current text into buffer and ensure NUL-termination + currentText := []byte(*text) + if len(currentText) > int(textMaxSize)-1 { + currentText = currentText[:int(textMaxSize)-1] + } + // Zero-fill the buffer + for i := wasm.Ptr(0); i < wasm.Ptr(textMaxSize); i++ { + src := []byte{0} + wasm.CopyToC(&src[0], ctext+i) + } + // Copy the actual text + if len(currentText) > 0 { + for i, b := range currentText { + src := []byte{b} + wasm.CopyToC(&src[0], ctext+wasm.Ptr(i)) + } + } + ctextMaxSize := int32(textMaxSize) csecretViewActive, free := wasm.CopyValueToC(secretViewActive) @@ -1313,7 +1354,12 @@ func TextInputBox(bounds rl.Rectangle, title, message, buttons string, text *str free() }() - return int32(guiTextInputBox(cbounds, ctitle, cmessage, cbuttons, ctext, ctextMaxSize, csecretViewActive)) + result := int32(guiTextInputBox(cbounds, ctitle, cmessage, cbuttons, ctext, ctextMaxSize, csecretViewActive)) + + // Copy the result back + *text = wasm.GoString(ctext) + + return result } //go:wasmimport raylib _GuiGrid @@ -1322,7 +1368,7 @@ func guiGrid(bounds wasm.Ptr, text wasm.Ptr, spacing float32, subdivs int32, mou // Grid control, returns mouse cell position func Grid(bounds rl.Rectangle, text string, spacing float32, subdivs int32, mouseCell *rl.Vector2) int32 { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ctext := wasm.CString(text) @@ -1473,7 +1519,7 @@ func guiScrollBar(bounds wasm.Ptr, value, minValue, maxValue int32) int32 // ScrollBar control func ScrollBar(bounds rl.Rectangle, value, minValue, maxValue int32) int32 { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() cvalue := int32(value) @@ -1491,7 +1537,7 @@ func guiFade(ret wasm.Ptr, color wasm.Ptr, alpha float32) // WARNING: It multiplies current alpha by alpha scale factor func Fade(color rl.Color, alpha float32) rl.Color { - ccolor, free := wasm.MallocV[rl.Color]() + ccolor, free := wasm.CopyValueToC(&color) defer free() var v rl.Color @@ -1514,12 +1560,12 @@ func Fade(color rl.Color, alpha float32) rl.Color { func guiDrawRectangle(bounds wasm.Ptr, borderWidth int32, borderColor, fillColor wasm.Ptr) func DrawRectangle(bounds rl.Rectangle, borderWidth int32, borderColor, fillColor rl.Color) { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() - cfillColor, free := wasm.MallocV[rl.Color]() + cfillColor, free := wasm.CopyValueToC(&fillColor) defer free() - cborderColor, free := wasm.MallocV[rl.Color]() + cborderColor, free := wasm.CopyValueToC(&borderColor) defer free() bw := int32(borderWidth) @@ -1535,9 +1581,9 @@ func guiDrawText(text wasm.Ptr, position wasm.Ptr, alignment int32, color wasm.P func DrawText(text string, position rl.Rectangle, alignment int32, color rl.Color) { - cposition, free := wasm.MallocV[rl.Rectangle]() + cposition, free := wasm.CopyValueToC(&position) defer free() - ccolor, free := wasm.MallocV[rl.Color]() + ccolor, free := wasm.CopyValueToC(&color) defer free() ctext := wasm.CString(text) @@ -1553,7 +1599,7 @@ func guiGetTextBounds(ret wasm.Ptr, control int32, bounds wasm.Ptr) // GetTextBounds - static Rectangle GetTextBounds(int control, Rectangle bounds) func GetTextBounds(control ControlID, bounds rl.Rectangle) rl.Rectangle { - cbounds, free := wasm.MallocV[rl.Rectangle]() + cbounds, free := wasm.CopyValueToC(&bounds) defer free() ccontrol := uint16(control) diff --git a/wasm-runtime/wasm.go b/wasm-runtime/wasm.go index c3c2bd1..2078a90 100644 --- a/wasm-runtime/wasm.go +++ b/wasm-runtime/wasm.go @@ -68,7 +68,7 @@ func CopyToC[T any](src *T, dst Ptr) { } // Copies srcSize bytes from src into dst. -func CopyTGo[T any](src Ptr, srcSize Ptr, dst *T) { +func CopyToGo[T any](src Ptr, srcSize Ptr, dst *T) { _copyToGo(unsafe.Pointer(dst), srcSize, src) } @@ -86,7 +86,7 @@ func _cStringGetLength(cstr Ptr) Ptr // Scan for null terminator and return length excluding the null terminator. // -//go:wasmimport gojs CStringGetLength +//go:wasmimport gojs CStringArrayGetLength //go:noescape func CStringArrayGetLength(cstrArray Ptr) Ptr From 41b8e6eb46e4ef1f71726a000b47b3b5d0ca75e3 Mon Sep 17 00:00:00 2001 From: "Omer." <100426634+BrownNPC@users.noreply.github.com> Date: Fri, 24 Apr 2026 14:56:00 +0500 Subject: [PATCH 8/9] Update raygui/raygui.go Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- raygui/raygui.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/raygui/raygui.go b/raygui/raygui.go index d981516..4d33338 100644 --- a/raygui/raygui.go +++ b/raygui/raygui.go @@ -1172,13 +1172,11 @@ func ColorPanel(bounds rl.Rectangle, text string, color rl.Color) rl.Color { defer free() var v rl.Color - ret, free := wasm.CopyValueToC(&v) - defer func() { - wasm.CopyValueToGo(ret, &v) - free() - }() - guiColorPanel(ret, cbounds, ctext, ccolor) + ret, freeRet := wasm.MallocV[rl.Color]() + defer freeRet() + guiColorPanel(ret, cbounds, ctext, ccolor) + wasm.CopyValueToGo(ret, &v) return v } From 74fc632ac1e983a47387512ad71ba0adfd535af7 Mon Sep 17 00:00:00 2001 From: "coderabbitai[bot]" <136622811+coderabbitai[bot]@users.noreply.github.com> Date: Fri, 24 Apr 2026 10:02:06 +0000 Subject: [PATCH 9/9] fix: apply CodeRabbit auto-fixes Fixed 3 file(s) based on 4 unresolved review comments. Co-authored-by: CodeRabbit --- raygui/go.mod | 10 +++---- raygui/go.sum | 10 ++----- raygui/raygui.go | 73 +++++++++++++++++++----------------------------- 3 files changed, 34 insertions(+), 59 deletions(-) diff --git a/raygui/go.mod b/raygui/go.mod index 89bd8e8..cb90c60 100644 --- a/raygui/go.mod +++ b/raygui/go.mod @@ -1,16 +1,14 @@ module github.com/BrownNPC/Raylib-Go-Wasm/raygui require ( + github.com/BrownNPC/Raylib-Go-Wasm/raylib v0.0.0-20260421110350-7c24b2d5e6d3 github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime v0.0.0-20260421110350-7c24b2d5e6d3 - github.com/gen2brain/raylib-go/raylib v0.55.1 ) -require ( - github.com/ebitengine/purego v0.7.1 // indirect - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/sys v0.20.0 // indirect -) +require github.com/BrownNPC/wasm-ffi-go v1.2.0 // indirect replace github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime => ../wasm-runtime +replace github.com/BrownNPC/Raylib-Go-Wasm/raylib => ../raylib + go 1.26.1 diff --git a/raygui/go.sum b/raygui/go.sum index aa78a1e..b242b0a 100644 --- a/raygui/go.sum +++ b/raygui/go.sum @@ -1,8 +1,2 @@ -github.com/ebitengine/purego v0.7.1 h1:6/55d26lG3o9VCZX8lping+bZcmShseiqlh2bnUDiPA= -github.com/ebitengine/purego v0.7.1/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= -github.com/gen2brain/raylib-go/raylib v0.55.1 h1:1rdc10WvvYjtj7qijHnV9T38/WuvlT6IIL+PaZ6cNA8= -github.com/gen2brain/raylib-go/raylib v0.55.1/go.mod h1:BaY76bZk7nw1/kVOSQObPY1v1iwVE1KHAGMfvI6oK1Q= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +github.com/BrownNPC/wasm-ffi-go v1.2.0 h1:Lknst90sTLTkE870OKNP/Vw36TohQIJ4ln8W1IG9Zl0= +github.com/BrownNPC/wasm-ffi-go v1.2.0/go.mod h1:D5+RBMb672fgw6vPz4HOWYxpyrmPrIao8VqlXihOFFg= diff --git a/raygui/raygui.go b/raygui/raygui.go index 4d33338..2e5e9ac 100644 --- a/raygui/raygui.go +++ b/raygui/raygui.go @@ -6,7 +6,7 @@ import ( "image/color" wasm "github.com/BrownNPC/Raylib-Go-Wasm/wasm-runtime" - rl "github.com/gen2brain/raylib-go/raylib" + rl "github.com/BrownNPC/Raylib-Go-Wasm/raylib" ) type ( @@ -862,26 +862,18 @@ func TextBox(bounds rl.Rectangle, text *string, textSize int32, editMode bool) b defer free() // Allocate writable buffer of size textSize - ctext := wasm.malloc(wasm.Ptr(textSize)) - defer wasm.Free(ctext) - - // Copy current text into buffer and ensure NUL-termination + // Truncate to textSize-1 and NUL-terminate currentText := []byte(*text) if len(currentText) > int(textSize)-1 { currentText = currentText[:int(textSize)-1] } - // Zero-fill the buffer - for i := wasm.Ptr(0); i < wasm.Ptr(textSize); i++ { - wasm.CopyToC(&[]byte{0}[0], ctext+i) - } - // Copy the actual text - if len(currentText) > 0 { - wasm.CopySliceToGo(ctext, currentText) - for i, b := range currentText { - src := []byte{b} - wasm.CopyToC(&src[0], ctext+wasm.Ptr(i)) - } - } + // Create a zero-filled buffer of size textSize + buffer := make([]byte, textSize) + copy(buffer, currentText) + // buffer is already zero-filled by make, so NUL-termination is automatic + + ctext, freeText := wasm.CopySliceToC(buffer) + defer freeText() ctextSize := int32(textSize) ceditMode := wasm.BtoI(editMode) @@ -896,7 +888,7 @@ func TextBox(bounds rl.Rectangle, text *string, textSize int32, editMode bool) b //go:wasmimport raylib _GuiSpinner //go:noescape -func guiSpinner(bounds wasm.Ptr, text wasm.Ptr, value wasm.Ptr, minValue, maxValue int32, editMode bool) int32 +func guiSpinner(bounds wasm.Ptr, text wasm.Ptr, value wasm.Ptr, minValue, maxValue int32, editMode int32) int32 // Spinner control, sets value to the selected number and returns true when clicked. func Spinner(bounds rl.Rectangle, text string, value *int32, minValue, maxValue int, editMode bool) bool { @@ -916,7 +908,7 @@ func Spinner(bounds rl.Rectangle, text string, value *int32, minValue, maxValue free() }() - return guiSpinner(cbounds, ctext, cvalue, int32(minValue), int32(maxValue), editMode) != 0 + return guiSpinner(cbounds, ctext, cvalue, int32(minValue), int32(maxValue), wasm.BtoI(editMode)) != 0 } //go:wasmimport raylib _GuiValueBox @@ -1140,20 +1132,19 @@ func ListViewEx(bounds rl.Rectangle, text []string, free() }() - cactive, free := wasm.CopyValueToC(&active) - defer func() { - wasm.CopyValueToGo(cactive, &active) - free() - }() + cactive, freeActive := wasm.CopyValueToC(&active) + defer freeActive() - cfocus, free := wasm.CopyValueToC(focus) - defer func() { - wasm.CopyValueToGo(cfocus, focus) - free() - }() + cfocus, freeFocus := wasm.CopyValueToC(focus) + defer freeFocus() count := int32(len(text)) guiListViewEx(cbounds, ctext.Pointer, count, cscrollIndex, cactive, cfocus) + + // Copy values back before freeing + wasm.CopyValueToGo(cactive, &active) + wasm.CopyValueToGo(cfocus, focus) + return active } @@ -1323,26 +1314,18 @@ func TextInputBox(bounds rl.Rectangle, title, message, buttons string, text *str defer wasm.Free(cbuttons) // Allocate writable buffer of size textMaxSize - ctext := wasm.malloc(wasm.Ptr(textMaxSize)) - defer wasm.Free(ctext) - - // Copy current text into buffer and ensure NUL-termination + // Truncate to textMaxSize-1 and NUL-terminate currentText := []byte(*text) if len(currentText) > int(textMaxSize)-1 { currentText = currentText[:int(textMaxSize)-1] } - // Zero-fill the buffer - for i := wasm.Ptr(0); i < wasm.Ptr(textMaxSize); i++ { - src := []byte{0} - wasm.CopyToC(&src[0], ctext+i) - } - // Copy the actual text - if len(currentText) > 0 { - for i, b := range currentText { - src := []byte{b} - wasm.CopyToC(&src[0], ctext+wasm.Ptr(i)) - } - } + // Create a zero-filled buffer of size textMaxSize + buffer := make([]byte, textMaxSize) + copy(buffer, currentText) + // buffer is already zero-filled by make, so NUL-termination is automatic + + ctext, freeText := wasm.CopySliceToC(buffer) + defer freeText() ctextMaxSize := int32(textMaxSize)