refactor binding generation

This commit is contained in:
Alexander Klingenbeck 2023-06-02 18:58:53 +02:00
parent 8049204120
commit 13f74bf5a1
7 changed files with 1864 additions and 2644 deletions

View File

@ -3,6 +3,9 @@ import { RayLibApi, RayLibFunction, RayLibStruct } from "./interfaces";
import { RayLibHeader } from "./raylib-header"; import { RayLibHeader } from "./raylib-header";
import { HeaderParser } from "./header-parser"; import { HeaderParser } from "./header-parser";
import { RayLibAlias } from "./interfaces"; import { RayLibAlias } from "./interfaces";
import { QuickJsGenerator } from "./quickjs";
let api: RayLibApi
function getFunction(funList: RayLibFunction[], name: string){ function getFunction(funList: RayLibFunction[], name: string){
return funList.find(x => x.name === name) return funList.find(x => x.name === name)
@ -16,10 +19,14 @@ function getAliases(aliasList: RayLibAlias[], name: string) {
return aliasList.filter(x => x.type === name).map(x => x.name) return aliasList.filter(x => x.type === name).map(x => x.name)
} }
function ignore(name: string){
getFunction(api.functions, name)!.binding = { ignore: true }
}
function main(){ function main(){
// Load the pre-generated raylib api // Load the pre-generated raylib api
const api = <RayLibApi>JSON.parse(readFileSync("thirdparty/raylib/parser/output/raylib_api.json", 'utf8')) api = <RayLibApi>JSON.parse(readFileSync("thirdparty/raylib/parser/output/raylib_api.json", 'utf8'))
const parser = new HeaderParser() const parser = new HeaderParser()
@ -274,19 +281,19 @@ function main(){
//destructor: "UnloadMaterial" //destructor: "UnloadMaterial"
} }
getFunction(api.functions, "SetWindowIcons")!.binding = { ignore: true } ignore("SetWindowIcons")
getFunction(api.functions, "GetWindowHandle")!.binding = { ignore: true } ignore("GetWindowHandle")
// Custom frame control functions // Custom frame control functions
// NOT SUPPORTED BECAUSE NEEDS COMPILER FLAG // NOT SUPPORTED BECAUSE NEEDS COMPILER FLAG
getFunction(api.functions, "SwapScreenBuffer")!.binding = { ignore: true } ignore("SwapScreenBuffer")
getFunction(api.functions, "PollInputEvents")!.binding = { ignore: true } ignore("PollInputEvents")
getFunction(api.functions, "WaitTime")!.binding = { ignore: true } ignore("WaitTime")
getFunction(api.functions, "BeginVrStereoMode")!.binding = { ignore: true } ignore("BeginVrStereoMode")
getFunction(api.functions, "EndVrStereoMode")!.binding = { ignore: true } ignore("EndVrStereoMode")
getFunction(api.functions, "LoadVrStereoConfig")!.binding = { ignore: true } ignore("LoadVrStereoConfig")
getFunction(api.functions, "UnloadVrStereoConfig")!.binding = { ignore: true } ignore("UnloadVrStereoConfig")
getFunction(api.functions, "SetShaderValue")!.binding = { body: (gen) => { getFunction(api.functions, "SetShaderValue")!.binding = { body: (gen) => {
gen.jsToC("Shader","shader","argv[0]", core.structLookup) gen.jsToC("Shader","shader","argv[0]", core.structLookup)
@ -316,768 +323,205 @@ function main(){
gen.call("SetShaderValue", ["shader","locIndex","value","uniformType"]) gen.call("SetShaderValue", ["shader","locIndex","value","uniformType"])
gen.returnExp("JS_UNDEFINED") gen.returnExp("JS_UNDEFINED")
}} }}
getFunction(api.functions, "SetShaderValueV")!.binding = { ignore: true } ignore("SetShaderValueV")
const traceLog = getFunction(api.functions, "TraceLog")!
traceLog.params?.pop()
const traceLog = apiDesc.getFunction("TraceLog") // Memory functions not supported on JS, just use ArrayBuffer
if(!traceLog) throw new Error("TraceLog not found") ignore("MemAlloc")
traceLog.params.pop() ignore("MemRealloc")
core.addApiFunction(traceLog) ignore("MemFree")
core.addApiFunctionByName("SetTraceLogLevel")
// Memory functions not supported on JS
core.addApiFunctionByName("OpenURL")
// Callbacks not supported on JS // Callbacks not supported on JS
ignore("SetTraceLogCallback")
ignore("SetLoadFileDataCallback")
ignore("SetSaveFileDataCallback")
ignore("SetLoadFileTextCallback")
ignore("SetSaveFileTextCallback")
// Files management functions // Files management functions
const lfd = apiDesc.getFunction("LoadFileData") const lfd = getFunction(api.functions, "LoadFileData")!
lfd?.params.pop() lfd.params![lfd.params!.length-1].binding = { ignore: true }
core.addApiFunctionByName("LoadFileData", null, { body: gen => { lfd.binding = {
gen.jsToC("const char *", "fileName", "argv[0]")
gen.declare("bytesRead", "unsigned int")
gen.call("LoadFileData", ["fileName", "&bytesRead"], { type: "unsigned char *", name: "retVal" })
gen.statement("JSValue buffer = JS_NewArrayBufferCopy(ctx, (const uint8_t*)retVal, bytesRead)")
gen.call("UnloadFileData", ["retVal"])
gen.jsCleanUpParameter("const char*","fileName")
gen.returnExp("buffer")
} })
//UnloadLoadFileData not needed, data is copied
// TODO: Works but unnecessary makes copy of memory
core.addApiFunctionByName("SaveFileData")
// Export data as code not needed
core.addApiFunctionByName("LoadFileText", null, { after: gen => gen.call("UnloadFileText", ["returnVal"]) })
core.addApiFunctionByName("SaveFileText")
core.addApiFunctionByName("FileExists")
core.addApiFunctionByName("DirectoryExists")
core.addApiFunctionByName("IsFileExtension")
core.addApiFunctionByName("GetFileLength")
// TODO: Who needs to clean memory here?
core.addApiFunctionByName("GetFileExtension")
core.addApiFunctionByName("GetFileName")
core.addApiFunctionByName("GetFileNameWithoutExt")
core.addApiFunctionByName("GetDirectoryPath")
core.addApiFunctionByName("GetPrevDirectoryPath")
core.addApiFunctionByName("GetWorkingDirectory")
core.addApiFunctionByName("GetApplicationDirectory")
core.addApiFunctionByName("ChangeDirectory")
core.addApiFunctionByName("IsPathFile")
//core.addApiFunctionByName("LoadDirectoryFiles")
//core.addApiFunctionByName("LoadDirectoryFilesEx")
// UnloadDirectoryFiles
core.addApiFunctionByName("IsFileDropped")
const ldf = apiDesc.getFunction("LoadDroppedFiles")
ldf!.returnType = "string[]"
core.addApiFunction(ldf!, null, {
body: gen => { body: gen => {
gen.call("LoadDroppedFiles", [], { type: "FilePathList", name: "files" }) gen.jsToC("const char *", "fileName", "argv[0]")
gen.call("JS_NewArray", ["ctx"], { type: "JSValue", name:"ret"}) gen.declare("bytesRead", "unsigned int")
const f = gen.for("i", "files.count") gen.call("LoadFileData", ["fileName", "&bytesRead"], { type: "unsigned char *", name: "retVal" })
f.call("JS_SetPropertyUint32", ["ctx","ret", "i", "JS_NewString(ctx,files.paths[i])"]) gen.statement("JSValue buffer = JS_NewArrayBufferCopy(ctx, (const uint8_t*)retVal, bytesRead)")
gen.call("UnloadDroppedFiles", ["files"]) gen.call("UnloadFileData", ["retVal"])
gen.jsCleanUpParameter("const char*","fileName")
gen.returnExp("buffer")
}
}
ignore("UnloadFileData")
// TODO: SaveFileData works but unnecessary makes copy of memory
getFunction(api.functions, "SaveFileData")!.binding = { }
ignore("ExportDataAsCode")
getFunction(api.functions, "LoadFileText")!.binding = { after: gen => gen.call("UnloadFileText", ["returnVal"]) }
ignore("UnloadFileText")
const createFileList = (gen: QuickJsGenerator, loadName: string, unloadName: string, args: string[]) => {
gen.call(loadName, args, { type: "FilePathList", name: "files" })
gen.call("JS_NewArray", ["ctx"], { type: "JSValue", name:"ret"})
const f = gen.for("i", "files.count")
f.call("JS_SetPropertyUint32", ["ctx","ret", "i", "JS_NewString(ctx,files.paths[i])"])
gen.call(unloadName, ["files"])
}
getFunction(api.functions, "LoadDirectoryFiles")!.binding = {
jsReturns: "string[]",
body: gen => {
gen.jsToC("const char *", "dirPath", "argv[0]")
createFileList(gen, "LoadDirectoryFiles", "UnloadDirectoryFiles", ["dirPath"])
gen.jsCleanUpParameter("const char *", "dirPath")
gen.returnExp("ret") gen.returnExp("ret")
} }
}) }
// UnloadDroppedFiles getFunction(api.functions, "LoadDirectoryFilesEx")!.binding = {
core.addApiFunctionByName("GetFileModTime") jsReturns: "string[]",
body: gen => {
gen.jsToC("const char *", "basePath", "argv[0]")
gen.jsToC("const char *", "filter", "argv[1]")
gen.jsToC("bool", "scanSubdirs", "argv[2]")
createFileList(gen, "LoadDirectoryFilesEx", "UnloadDirectoryFiles", ["basePath", "filter", "scanSubdirs"])
gen.jsCleanUpParameter("const char *", "basePath")
gen.jsCleanUpParameter("const char *", "filter")
gen.returnExp("ret")
}
}
ignore("UnloadDirectoryFiles")
getFunction(api.functions, "LoadDroppedFiles")!.binding = {
jsReturns: "string[]",
body: gen => {
createFileList(gen, "LoadDroppedFiles", "UnloadDroppedFiles", [])
gen.returnExp("ret")
}
}
ignore("UnloadDroppedFiles")
// Compression/encoding functionality // Compression/encoding functionality
//core.addApiFunctionByName("CompressData") ignore("CompressData")
//core.addApiFunctionByName("DecompressData") ignore("DecompressData")
//core.addApiFunctionByName("EncodeDataBase64") ignore("EncodeDataBase64")
//core.addApiFunctionByName("DecodeDataBase64") ignore("DecodeDataBase64")
// input handling functions ignore("DrawLineStrip")
core.addApiFunctionByName("IsKeyPressed") ignore("DrawTriangleFan")
core.addApiFunctionByName("IsKeyDown") ignore("DrawTriangleStrip")
core.addApiFunctionByName("IsKeyReleased") ignore("CheckCollisionPointPoly")
core.addApiFunctionByName("IsKeyUp") ignore("CheckCollisionLines")
core.addApiFunctionByName("SetExitKey") ignore("LoadImageAnim")
core.addApiFunctionByName("GetKeyPressed") ignore("ExportImageAsCode")
core.addApiFunctionByName("GetCharPressed")
// input-related functions: gamepads getFunction(api.functions, "LoadImageColors")!.binding = {
core.addApiFunctionByName("IsGamepadAvailable") jsReturns: "ArrayBuffer",
core.addApiFunctionByName("GetGamepadName") body: gen => {
core.addApiFunctionByName("IsGamepadButtonPressed") gen.jsToC("Image","image","argv[0]", core.structLookup)
core.addApiFunctionByName("IsGamepadButtonDown") gen.call("LoadImageColors", ["image"], {name:"colors",type:"Color *"})
core.addApiFunctionByName("IsGamepadButtonReleased") gen.statement("JSValue retVal = JS_NewArrayBufferCopy(ctx, (const uint8_t*)colors, image.width*image.height*sizeof(Color))")
core.addApiFunctionByName("IsGamepadButtonUp") gen.call("UnloadImageColors", ["colors"])
core.addApiFunctionByName("GetGamepadButtonPressed") gen.returnExp("retVal")
core.addApiFunctionByName("GetGamepadAxisCount") }
core.addApiFunctionByName("GetGamepadAxisMovement") }
core.addApiFunctionByName("SetGamepadMappings")
// input-related functions: mouse ignore("LoadImagePalette")
core.addApiFunctionByName("IsMouseButtonPressed") ignore("UnloadImageColors")
core.addApiFunctionByName("IsMouseButtonDown") ignore("UnloadImagePalette")
core.addApiFunctionByName("IsMouseButtonReleased") ignore("GetPixelColor")
core.addApiFunctionByName("IsMouseButtonUp") ignore("SetPixelColor")
core.addApiFunctionByName("GetMouseX")
core.addApiFunctionByName("GetMouseY")
core.addApiFunctionByName("GetMousePosition")
core.addApiFunctionByName("GetMouseDelta")
core.addApiFunctionByName("SetMousePosition")
core.addApiFunctionByName("SetMouseOffset")
core.addApiFunctionByName("SetMouseScale")
core.addApiFunctionByName("GetMouseWheelMove")
core.addApiFunctionByName("GetMouseWheelMoveV")
core.addApiFunctionByName("SetMouseCursor")
// input-related functions: touch const lfx = getFunction(api.functions, "LoadFontEx")!
core.addApiFunctionByName("GetTouchX") lfx.params![2].binding = { ignore: true }
core.addApiFunctionByName("GetTouchY") lfx.params![3].binding = { ignore: true }
core.addApiFunctionByName("GetTouchPosition") lfx.binding = { customizeCall: "Font returnVal = LoadFontEx(fileName, fontSize, NULL, 0);" }
core.addApiFunctionByName("GetTouchPointId")
core.addApiFunctionByName("GetTouchPointCount")
// Gesture and touch handling functions ignore("LoadFontFromMemory")
core.addApiFunctionByName("SetGesturesEnabled") ignore("LoadFontData")
core.addApiFunctionByName("IsGestureDetected") ignore("GenImageFontAtlas")
core.addApiFunctionByName("GetGestureDetected") ignore("UnloadFontData")
core.addApiFunctionByName("GetGestureHoldDuration") ignore("ExportFontAsCode")
core.addApiFunctionByName("GetGestureDragVector") ignore("DrawTextCodepoints")
core.addApiFunctionByName("GetGestureDragAngle") ignore("GetGlyphInfo")
core.addApiFunctionByName("GetGesturePinchVector") ignore("LoadUTF8")
core.addApiFunctionByName("GetGesturePinchAngle") ignore("UnloadUTF8")
ignore("LoadCodepoints")
// Camera system functions ignore("UnloadCodepoints")
core.addApiFunctionByName("UpdateCamera") ignore("GetCodepointCount")
core.addApiFunctionByName("UpdateCameraPro") ignore("GetCodepoint")
ignore("GetCodepointNext")
ignore("GetCodepointPrevious")
ignore("CodepointToUTF8")
//api.functions.forEach(x => console.log(`core.addApiFunctionByName("${x.name}")`))
// module: rshapes
core.addApiFunctionByName("SetShapesTexture")
// Basic shapes drawing functions
core.addApiFunctionByName("DrawPixel")
core.addApiFunctionByName("DrawPixelV")
core.addApiFunctionByName("DrawLine")
core.addApiFunctionByName("DrawLineV")
core.addApiFunctionByName("DrawLineEx")
core.addApiFunctionByName("DrawLineBezier")
core.addApiFunctionByName("DrawLineBezierQuad")
core.addApiFunctionByName("DrawLineBezierCubic")
// core.addApiFunctionByName("DrawLineStrip")
core.addApiFunctionByName("DrawCircle")
core.addApiFunctionByName("DrawCircleSector")
core.addApiFunctionByName("DrawCircleSectorLines")
core.addApiFunctionByName("DrawCircleGradient")
core.addApiFunctionByName("DrawCircleV")
core.addApiFunctionByName("DrawCircleLines")
core.addApiFunctionByName("DrawEllipse")
core.addApiFunctionByName("DrawEllipseLines")
core.addApiFunctionByName("DrawRing")
core.addApiFunctionByName("DrawRingLines")
core.addApiFunctionByName("DrawRectangle")
core.addApiFunctionByName("DrawRectangleV")
core.addApiFunctionByName("DrawRectangleRec")
core.addApiFunctionByName("DrawRectanglePro")
core.addApiFunctionByName("DrawRectangleGradientV")
core.addApiFunctionByName("DrawRectangleGradientH")
core.addApiFunctionByName("DrawRectangleGradientEx")
core.addApiFunctionByName("DrawRectangleLines")
core.addApiFunctionByName("DrawRectangleLinesEx")
core.addApiFunctionByName("DrawRectangleRounded")
core.addApiFunctionByName("DrawRectangleRoundedLines")
core.addApiFunctionByName("DrawTriangle")
core.addApiFunctionByName("DrawTriangleLines")
//core.addApiFunctionByName("DrawTriangleFan")
//core.addApiFunctionByName("DrawTriangleStrip")
core.addApiFunctionByName("DrawPoly")
core.addApiFunctionByName("DrawPolyLines")
core.addApiFunctionByName("DrawPolyLinesEx")
// Basic shapes collision detection functions
core.addApiFunctionByName("CheckCollisionRecs")
core.addApiFunctionByName("CheckCollisionCircles")
core.addApiFunctionByName("CheckCollisionCircleRec")
core.addApiFunctionByName("CheckCollisionPointRec")
core.addApiFunctionByName("CheckCollisionPointCircle")
core.addApiFunctionByName("CheckCollisionPointTriangle")
// core.addApiFunctionByName("CheckCollisionPointPoly")
// core.addApiFunctionByName("CheckCollisionLines")
core.addApiFunctionByName("CheckCollisionPointLine")
core.addApiFunctionByName("GetCollisionRec")
// Image loading functions
core.addApiFunctionByName("LoadImage")
core.addApiFunctionByName("LoadImageRaw")
// core.addApiFunctionByName("LoadImageAnim")
core.addApiFunctionByName("LoadImageFromMemory")
core.addApiFunctionByName("LoadImageFromTexture")
core.addApiFunctionByName("LoadImageFromScreen")
core.addApiFunctionByName("IsImageReady")
core.addApiFunctionByName("UnloadImage")
core.addApiFunctionByName("ExportImage")
// needed?
// core.addApiFunctionByName("ExportImageAsCode")
// Image generation functions
core.addApiFunctionByName("GenImageColor")
core.addApiFunctionByName("GenImageGradientV")
core.addApiFunctionByName("GenImageGradientH")
core.addApiFunctionByName("GenImageGradientRadial")
core.addApiFunctionByName("GenImageChecked")
core.addApiFunctionByName("GenImageWhiteNoise")
core.addApiFunctionByName("GenImagePerlinNoise")
core.addApiFunctionByName("GenImageCellular")
core.addApiFunctionByName("GenImageText")
// Image manipulations functions
core.addApiFunctionByName("ImageCopy")
core.addApiFunctionByName("ImageFromImage")
core.addApiFunctionByName("ImageText")
core.addApiFunctionByName("ImageTextEx")
core.addApiFunctionByName("ImageFormat")
core.addApiFunctionByName("ImageToPOT")
core.addApiFunctionByName("ImageCrop")
core.addApiFunctionByName("ImageAlphaCrop")
core.addApiFunctionByName("ImageAlphaClear")
core.addApiFunctionByName("ImageAlphaMask")
core.addApiFunctionByName("ImageAlphaPremultiply")
core.addApiFunctionByName("ImageBlurGaussian")
core.addApiFunctionByName("ImageResize")
core.addApiFunctionByName("ImageResizeNN")
core.addApiFunctionByName("ImageResizeCanvas")
core.addApiFunctionByName("ImageMipmaps")
core.addApiFunctionByName("ImageDither")
core.addApiFunctionByName("ImageFlipVertical")
core.addApiFunctionByName("ImageFlipHorizontal")
core.addApiFunctionByName("ImageRotateCW")
core.addApiFunctionByName("ImageRotateCCW")
core.addApiFunctionByName("ImageColorTint")
core.addApiFunctionByName("ImageColorInvert")
core.addApiFunctionByName("ImageColorGrayscale")
core.addApiFunctionByName("ImageColorContrast")
core.addApiFunctionByName("ImageColorBrightness")
core.addApiFunctionByName("ImageColorReplace")
const lic = <ApiFunction>apiDesc.getFunction("LoadImageColors")
lic.returnType = "unsigned char *"
core.addApiFunction(lic, null, { body: (gen) => {
gen.jsToC("Image","image","argv[0]", core.structLookup)
gen.call("LoadImageColors", ["image"], {name:"colors",type:"Color *"})
gen.statement("JSValue retVal = JS_NewArrayBufferCopy(ctx, (const uint8_t*)colors, image.width*image.height*sizeof(Color))")
gen.call("UnloadImageColors", ["colors"])
gen.returnExp("retVal")
}})
//core.addApiFunctionByName("LoadImagePalette")
//core.addApiFunctionByName("UnloadImageColors")
//core.addApiFunctionByName("UnloadImagePalette")
core.addApiFunctionByName("GetImageAlphaBorder")
core.addApiFunctionByName("GetImageColor")
// Image drawing functions
core.addApiFunctionByName("ImageClearBackground")
core.addApiFunctionByName("ImageDrawPixel")
core.addApiFunctionByName("ImageDrawPixelV")
core.addApiFunctionByName("ImageDrawLine")
core.addApiFunctionByName("ImageDrawLineV")
core.addApiFunctionByName("ImageDrawCircle")
core.addApiFunctionByName("ImageDrawCircleV")
core.addApiFunctionByName("ImageDrawCircleLines")
core.addApiFunctionByName("ImageDrawCircleLinesV")
core.addApiFunctionByName("ImageDrawRectangle")
core.addApiFunctionByName("ImageDrawRectangleV")
core.addApiFunctionByName("ImageDrawRectangleRec")
core.addApiFunctionByName("ImageDrawRectangleLines")
core.addApiFunctionByName("ImageDraw")
core.addApiFunctionByName("ImageDrawText")
core.addApiFunctionByName("ImageDrawTextEx")
// Texture loading functions
core.addApiFunctionByName("LoadTexture")
core.addApiFunctionByName("LoadTextureFromImage")
core.addApiFunctionByName("LoadTextureCubemap")
core.addApiFunctionByName("LoadRenderTexture")
core.addApiFunctionByName("IsTextureReady")
core.addApiFunctionByName("UnloadTexture")
core.addApiFunctionByName("IsRenderTextureReady")
core.addApiFunctionByName("UnloadRenderTexture")
core.addApiFunctionByName("UpdateTexture")
core.addApiFunctionByName("UpdateTextureRec")
// Texture configuration functions
core.addApiFunctionByName("GenTextureMipmaps")
core.addApiFunctionByName("SetTextureFilter")
core.addApiFunctionByName("SetTextureWrap")
// Texture drawing functions
core.addApiFunctionByName("DrawTexture")
core.addApiFunctionByName("DrawTextureV")
core.addApiFunctionByName("DrawTextureEx")
core.addApiFunctionByName("DrawTextureRec")
core.addApiFunctionByName("DrawTexturePro")
core.addApiFunctionByName("DrawTextureNPatch")
// Color/pixel related functions
core.addApiFunctionByName("Fade")
core.addApiFunctionByName("ColorToInt")
core.addApiFunctionByName("ColorNormalize")
core.addApiFunctionByName("ColorFromNormalized")
core.addApiFunctionByName("ColorToHSV")
core.addApiFunctionByName("ColorFromHSV")
core.addApiFunctionByName("ColorTint")
core.addApiFunctionByName("ColorBrightness")
core.addApiFunctionByName("ColorContrast")
core.addApiFunctionByName("ColorAlpha")
core.addApiFunctionByName("ColorAlphaBlend")
core.addApiFunctionByName("GetColor")
// core.addApiFunctionByName("GetPixelColor")
// core.addApiFunctionByName("SetPixelColor")
core.addApiFunctionByName("GetPixelDataSize")
// module: rtext
// Font loading/unloading
core.addApiFunctionByName("GetFontDefault")
core.addApiFunctionByName("LoadFont")
const lfx = apiDesc.getFunction("LoadFontEx")
lfx?.params!.pop()
lfx?.params!.pop()
core.addApiFunction(lfx!, null, { customizeCall: "Font returnVal = LoadFontEx(fileName, fontSize, NULL, 0);" })
core.addApiFunctionByName("LoadFontFromImage")
// core.addApiFunctionByName("LoadFontFromMemory")
core.addApiFunctionByName("IsFontReady")
// core.addApiFunctionByName("LoadFontData")
// core.addApiFunctionByName("GenImageFontAtlas")
// core.addApiFunctionByName("UnloadFontData")
core.addApiFunctionByName("UnloadFont")
// core.addApiFunctionByName("ExportFontAsCode")
// Text drawing functions
core.addApiFunctionByName("DrawFPS")
core.addApiFunctionByName("DrawText")
core.addApiFunctionByName("DrawTextEx")
core.addApiFunctionByName("DrawTextPro")
core.addApiFunctionByName("DrawTextCodepoint")
//core.addApiFunctionByName("DrawTextCodepoints")
// Text font info functions
core.addApiFunctionByName("MeasureText")
core.addApiFunctionByName("MeasureTextEx")
core.addApiFunctionByName("GetGlyphIndex")
// core.addApiFunctionByName("GetGlyphInfo")
core.addApiFunctionByName("GetGlyphAtlasRec")
// Text codepoints management functions (unicode characters)
// Is this needed?
// core.addApiFunctionByName("LoadUTF8")
// core.addApiFunctionByName("UnloadUTF8")
// core.addApiFunctionByName("LoadCodepoints")
// core.addApiFunctionByName("UnloadCodepoints")
// core.addApiFunctionByName("GetCodepointCount")
// core.addApiFunctionByName("GetCodepoint")
// core.addApiFunctionByName("GetCodepointNext")
// core.addApiFunctionByName("GetCodepointPrevious")
// core.addApiFunctionByName("CodepointToUTF8")
// Text strings management functions (no UTF-8 strings, only byte chars)
// Not supported, use JS Stdlib instead // Not supported, use JS Stdlib instead
api.functions.filter(x => x.name.startsWith("Text")).forEach(x => ignore(x.name))
// module: rmodels ignore("DrawTriangleStrip3D")
ignore("LoadMaterials")
// Basic geometric 3D shapes drawing functions ignore("LoadModelAnimations")
core.addApiFunctionByName("DrawLine3D") ignore("UpdateModelAnimation")
core.addApiFunctionByName("DrawPoint3D") ignore("UnloadModelAnimation")
core.addApiFunctionByName("DrawCircle3D") ignore("UnloadModelAnimations")
core.addApiFunctionByName("DrawTriangle3D") ignore("IsModelAnimationValid")
//core.addApiFunctionByName("DrawTriangleStrip3D") ignore("ExportWaveAsCode")
core.addApiFunctionByName("DrawCube")
core.addApiFunctionByName("DrawCubeV")
core.addApiFunctionByName("DrawCubeWires")
core.addApiFunctionByName("DrawCubeWiresV")
core.addApiFunctionByName("DrawSphere")
core.addApiFunctionByName("DrawSphereEx")
core.addApiFunctionByName("DrawSphereWires")
core.addApiFunctionByName("DrawCylinder")
core.addApiFunctionByName("DrawCylinderEx")
core.addApiFunctionByName("DrawCylinderWires")
core.addApiFunctionByName("DrawCylinderWiresEx")
core.addApiFunctionByName("DrawCapsule")
core.addApiFunctionByName("DrawCapsuleWires")
core.addApiFunctionByName("DrawPlane")
core.addApiFunctionByName("DrawRay")
core.addApiFunctionByName("DrawGrid")
// model management functions
core.addApiFunctionByName("LoadModel")
core.addApiFunctionByName("LoadModelFromMesh")
core.addApiFunctionByName("IsModelReady")
core.addApiFunctionByName("UnloadModel")
core.addApiFunctionByName("GetModelBoundingBox")
// model drawing functions
core.addApiFunctionByName("DrawModel")
core.addApiFunctionByName("DrawModelEx")
core.addApiFunctionByName("DrawModelWires")
core.addApiFunctionByName("DrawModelWiresEx")
core.addApiFunctionByName("DrawBoundingBox")
core.addApiFunctionByName("DrawBillboard")
core.addApiFunctionByName("DrawBillboardRec")
core.addApiFunctionByName("DrawBillboardPro")
// Mesh management functions
core.addApiFunctionByName("UploadMesh")
core.addApiFunctionByName("UpdateMeshBuffer")
core.addApiFunctionByName("UnloadMesh")
core.addApiFunctionByName("DrawMesh")
core.addApiFunctionByName("DrawMeshInstanced")
core.addApiFunctionByName("ExportMesh")
core.addApiFunctionByName("GetMeshBoundingBox")
core.addApiFunctionByName("GenMeshTangents")
// Mesh generation functions
core.addApiFunctionByName("GenMeshPoly")
core.addApiFunctionByName("GenMeshPlane")
core.addApiFunctionByName("GenMeshCube")
core.addApiFunctionByName("GenMeshSphere")
core.addApiFunctionByName("GenMeshHemiSphere")
core.addApiFunctionByName("GenMeshCylinder")
core.addApiFunctionByName("GenMeshCone")
core.addApiFunctionByName("GenMeshTorus")
core.addApiFunctionByName("GenMeshKnot")
core.addApiFunctionByName("GenMeshHeightmap")
core.addApiFunctionByName("GenMeshCubicmap")
// Material loading/unloading functions
// core.addApiFunctionByName("LoadMaterials")
core.addApiFunctionByName("LoadMaterialDefault")
core.addApiFunctionByName("IsMaterialReady")
core.addApiFunctionByName("UnloadMaterial")
core.addApiFunctionByName("SetMaterialTexture")
core.addApiFunctionByName("SetModelMaterial")
core.addApiFunctionByName("SetModelMeshMaterial")
// Model animations loading/unloading functions
// core.addApiFunctionByName("LoadModelAnimations")
// core.addApiFunctionByName("UpdateModelAnimation")
// core.addApiFunctionByName("UnloadModelAnimation")
// core.addApiFunctionByName("UnloadModelAnimations")
// core.addApiFunctionByName("IsModelAnimationValid")
// Collision detection functions
core.addApiFunctionByName("CheckCollisionSpheres")
core.addApiFunctionByName("CheckCollisionBoxes")
core.addApiFunctionByName("CheckCollisionBoxSphere")
core.addApiFunctionByName("GetRayCollisionSphere")
core.addApiFunctionByName("GetRayCollisionBox")
core.addApiFunctionByName("GetRayCollisionMesh")
core.addApiFunctionByName("GetRayCollisionTriangle")
core.addApiFunctionByName("GetRayCollisionQuad")
// module: raudio
// Audio device management functions
core.addApiFunctionByName("InitAudioDevice")
core.addApiFunctionByName("CloseAudioDevice")
core.addApiFunctionByName("IsAudioDeviceReady")
core.addApiFunctionByName("SetMasterVolume")
// Wave/Sound loading/unloading functions
core.addApiFunctionByName("LoadWave")
core.addApiFunctionByName("LoadWaveFromMemory")
core.addApiFunctionByName("IsWaveReady")
core.addApiFunctionByName("LoadSound")
core.addApiFunctionByName("LoadSoundFromWave")
core.addApiFunctionByName("IsSoundReady")
core.addApiFunctionByName("UpdateSound")
core.addApiFunctionByName("UnloadWave")
core.addApiFunctionByName("UnloadSound")
core.addApiFunctionByName("ExportWave")
// core.addApiFunctionByName("ExportWaveAsCode")
// Wave/Sound management functions // Wave/Sound management functions
core.addApiFunctionByName("PlaySound") ignore("LoadWaveSamples")
core.addApiFunctionByName("StopSound") ignore("UnloadWaveSamples")
core.addApiFunctionByName("PauseSound") ignore("LoadMusicStreamFromMemory")
core.addApiFunctionByName("ResumeSound") ignore("LoadAudioStream")
core.addApiFunctionByName("IsSoundPlaying") ignore("IsAudioStreamReady")
core.addApiFunctionByName("SetSoundVolume") ignore("UnloadAudioStream")
core.addApiFunctionByName("SetSoundPitch") ignore("UpdateAudioStream")
core.addApiFunctionByName("SetSoundPan") ignore("IsAudioStreamProcessed")
core.addApiFunctionByName("WaveCopy") ignore("PlayAudioStream")
core.addApiFunctionByName("WaveCrop") ignore("PauseAudioStream")
core.addApiFunctionByName("WaveFormat") ignore("ResumeAudioStream")
// core.addApiFunctionByName("LoadWaveSamples") ignore("IsAudioStreamPlaying")
// core.addApiFunctionByName("UnloadWaveSamples") ignore("StopAudioStream")
ignore("SetAudioStreamVolume")
ignore("SetAudioStreamPitch")
ignore("SetAudioStreamPan")
ignore("SetAudioStreamBufferSizeDefault")
ignore("SetAudioStreamCallback")
ignore("AttachAudioStreamProcessor")
ignore("DetachAudioStreamProcessor")
ignore("AttachAudioMixedProcessor")
ignore("DetachAudioMixedProcessor")
// Music management functions ignore("Vector3OrthoNormalize")
core.addApiFunctionByName("LoadMusicStream") ignore("Vector3ToFloatV")
// core.addApiFunctionByName("LoadMusicStreamFromMemory") ignore("MatrixToFloatV")
core.addApiFunctionByName("IsMusicReady") ignore("QuaternionToAxisAngle")
core.addApiFunctionByName("UnloadMusicStream")
core.addApiFunctionByName("PlayMusicStream")
core.addApiFunctionByName("IsMusicStreamPlaying")
core.addApiFunctionByName("UpdateMusicStream")
core.addApiFunctionByName("StopMusicStream")
core.addApiFunctionByName("PauseMusicStream")
core.addApiFunctionByName("ResumeMusicStream")
core.addApiFunctionByName("SeekMusicStream")
core.addApiFunctionByName("SetMusicVolume")
core.addApiFunctionByName("SetMusicPitch")
core.addApiFunctionByName("SetMusicPan")
core.addApiFunctionByName("GetMusicTimeLength")
core.addApiFunctionByName("GetMusicTimePlayed")
// AudioStream management functions
// core.addApiFunctionByName("LoadAudioStream")
// core.addApiFunctionByName("IsAudioStreamReady")
// core.addApiFunctionByName("UnloadAudioStream")
// core.addApiFunctionByName("UpdateAudioStream")
// core.addApiFunctionByName("IsAudioStreamProcessed")
// core.addApiFunctionByName("PlayAudioStream")
// core.addApiFunctionByName("PauseAudioStream")
// core.addApiFunctionByName("ResumeAudioStream")
// core.addApiFunctionByName("IsAudioStreamPlaying")
// core.addApiFunctionByName("StopAudioStream")
// core.addApiFunctionByName("SetAudioStreamVolume")
// core.addApiFunctionByName("SetAudioStreamPitch")
// core.addApiFunctionByName("SetAudioStreamPan")
// core.addApiFunctionByName("SetAudioStreamBufferSizeDefault")
// core.addApiFunctionByName("SetAudioStreamCallback")
// core.addApiFunctionByName("AttachAudioStreamProcessor")
// core.addApiFunctionByName("DetachAudioStreamProcessor")
// core.addApiFunctionByName("AttachAudioMixedProcessor")
// core.addApiFunctionByName("DetachAudioMixedProcessor")
// module: raymath
core.addApiFunctionByName("Clamp")
core.addApiFunctionByName("Lerp")
core.addApiFunctionByName("Normalize")
core.addApiFunctionByName("Remap")
core.addApiFunctionByName("Wrap")
core.addApiFunctionByName("FloatEquals")
core.addApiFunctionByName("Vector2Zero")
core.addApiFunctionByName("Vector2One")
core.addApiFunctionByName("Vector2Add")
core.addApiFunctionByName("Vector2AddValue")
core.addApiFunctionByName("Vector2Subtract")
core.addApiFunctionByName("Vector2SubtractValue")
core.addApiFunctionByName("Vector2Length")
core.addApiFunctionByName("Vector2LengthSqr")
core.addApiFunctionByName("Vector2DotProduct")
core.addApiFunctionByName("Vector2Distance")
core.addApiFunctionByName("Vector2DistanceSqr")
core.addApiFunctionByName("Vector2Angle")
core.addApiFunctionByName("Vector2LineAngle")
core.addApiFunctionByName("Vector2Scale")
core.addApiFunctionByName("Vector2Multiply")
core.addApiFunctionByName("Vector2Negate")
core.addApiFunctionByName("Vector2Divide")
core.addApiFunctionByName("Vector2Normalize")
core.addApiFunctionByName("Vector2Transform")
core.addApiFunctionByName("Vector2Lerp")
core.addApiFunctionByName("Vector2Reflect")
core.addApiFunctionByName("Vector2Rotate")
core.addApiFunctionByName("Vector2MoveTowards")
core.addApiFunctionByName("Vector2Invert")
core.addApiFunctionByName("Vector2Clamp")
core.addApiFunctionByName("Vector2ClampValue")
core.addApiFunctionByName("Vector2Equals")
core.addApiFunctionByName("Vector3Zero")
core.addApiFunctionByName("Vector3One")
core.addApiFunctionByName("Vector3Add")
core.addApiFunctionByName("Vector3AddValue")
core.addApiFunctionByName("Vector3Subtract")
core.addApiFunctionByName("Vector3SubtractValue")
core.addApiFunctionByName("Vector3Scale")
core.addApiFunctionByName("Vector3Multiply")
core.addApiFunctionByName("Vector3CrossProduct")
core.addApiFunctionByName("Vector3Perpendicular")
core.addApiFunctionByName("Vector3Length")
core.addApiFunctionByName("Vector3LengthSqr")
core.addApiFunctionByName("Vector3DotProduct")
core.addApiFunctionByName("Vector3Distance")
core.addApiFunctionByName("Vector3DistanceSqr")
core.addApiFunctionByName("Vector3Angle")
core.addApiFunctionByName("Vector3Negate")
core.addApiFunctionByName("Vector3Divide")
core.addApiFunctionByName("Vector3Normalize")
//core.addApiFunctionByName("Vector3OrthoNormalize")
core.addApiFunctionByName("Vector3Transform")
core.addApiFunctionByName("Vector3RotateByQuaternion")
core.addApiFunctionByName("Vector3RotateByAxisAngle")
core.addApiFunctionByName("Vector3Lerp")
core.addApiFunctionByName("Vector3Reflect")
core.addApiFunctionByName("Vector3Min")
core.addApiFunctionByName("Vector3Max")
core.addApiFunctionByName("Vector3Barycenter")
core.addApiFunctionByName("Vector3Unproject")
//core.addApiFunctionByName("Vector3ToFloatV")
core.addApiFunctionByName("Vector3Invert")
core.addApiFunctionByName("Vector3Clamp")
core.addApiFunctionByName("Vector3ClampValue")
core.addApiFunctionByName("Vector3Equals")
core.addApiFunctionByName("Vector3Refract")
core.addApiFunctionByName("MatrixDeterminant")
core.addApiFunctionByName("MatrixTrace")
core.addApiFunctionByName("MatrixTranspose")
core.addApiFunctionByName("MatrixInvert")
core.addApiFunctionByName("MatrixIdentity")
core.addApiFunctionByName("MatrixAdd")
core.addApiFunctionByName("MatrixSubtract")
core.addApiFunctionByName("MatrixMultiply")
core.addApiFunctionByName("MatrixTranslate")
core.addApiFunctionByName("MatrixRotate")
core.addApiFunctionByName("MatrixRotateX")
core.addApiFunctionByName("MatrixRotateY")
core.addApiFunctionByName("MatrixRotateZ")
core.addApiFunctionByName("MatrixRotateXYZ")
core.addApiFunctionByName("MatrixRotateZYX")
core.addApiFunctionByName("MatrixScale")
core.addApiFunctionByName("MatrixFrustum")
core.addApiFunctionByName("MatrixPerspective")
core.addApiFunctionByName("MatrixOrtho")
core.addApiFunctionByName("MatrixLookAt")
//core.addApiFunctionByName("MatrixToFloatV")
core.addApiFunctionByName("QuaternionAdd")
core.addApiFunctionByName("QuaternionAddValue")
core.addApiFunctionByName("QuaternionSubtract")
core.addApiFunctionByName("QuaternionSubtractValue")
core.addApiFunctionByName("QuaternionIdentity")
core.addApiFunctionByName("QuaternionLength")
core.addApiFunctionByName("QuaternionNormalize")
core.addApiFunctionByName("QuaternionInvert")
core.addApiFunctionByName("QuaternionMultiply")
core.addApiFunctionByName("QuaternionScale")
core.addApiFunctionByName("QuaternionDivide")
core.addApiFunctionByName("QuaternionLerp")
core.addApiFunctionByName("QuaternionNlerp")
core.addApiFunctionByName("QuaternionSlerp")
core.addApiFunctionByName("QuaternionFromVector3ToVector3")
core.addApiFunctionByName("QuaternionFromMatrix")
core.addApiFunctionByName("QuaternionToMatrix")
core.addApiFunctionByName("QuaternionFromAxisAngle")
//core.addApiFunctionByName("QuaternionToAxisAngle")
core.addApiFunctionByName("QuaternionFromEuler")
core.addApiFunctionByName("QuaternionToEuler")
core.addApiFunctionByName("QuaternionTransform")
core.addApiFunctionByName("QuaternionEquals")
core.exportGlobalConstant("DEG2RAD", "(PI/180.0)") core.exportGlobalConstant("DEG2RAD", "(PI/180.0)")
core.exportGlobalConstant("RAD2DEG", "(180.0/PI)") core.exportGlobalConstant("RAD2DEG", "(180.0/PI)")
// module: rcamera ignore("GuiDropdownBox")
core.addApiFunctionByName("GetCameraForward") ignore("GuiSpinner")
core.addApiFunctionByName("GetCameraUp") ignore("GuiValueBox")
core.addApiFunctionByName("GetCameraRight") ignore("GuiListView")
core.addApiFunctionByName("CameraMoveForward") ignore("GuiListViewEx")
core.addApiFunctionByName("CameraMoveUp") ignore("GuiTextInputBox")
core.addApiFunctionByName("CameraMoveRight") ignore("GuiGetIcons")
core.addApiFunctionByName("CameraMoveToTarget") ignore("GuiTabBar")
core.addApiFunctionByName("CameraYaw") ignore("GuiLoadIcons")
core.addApiFunctionByName("CameraPitch")
core.addApiFunctionByName("CameraRoll")
core.addApiFunctionByName("GetCameraViewMatrix")
core.addApiFunctionByName("GetCameraProjectionMatrix")
// module: rgui
core.addApiFunctionByName("GuiEnable")
core.addApiFunctionByName("GuiDisable")
core.addApiFunctionByName("GuiLock")
core.addApiFunctionByName("GuiUnlock")
core.addApiFunctionByName("GuiIsLocked")
core.addApiFunctionByName("GuiFade")
core.addApiFunctionByName("GuiSetState")
core.addApiFunctionByName("GuiGetState")
core.addApiFunctionByName("GuiSetFont")
core.addApiFunctionByName("GuiGetFont")
core.addApiFunctionByName("GuiSetStyle")
core.addApiFunctionByName("GuiGetStyle")
core.addApiFunctionByName("GuiWindowBox")
core.addApiFunctionByName("GuiGroupBox")
core.addApiFunctionByName("GuiLine")
core.addApiFunctionByName("GuiPanel")
core.addApiFunctionByName("GuiScrollPanel")
core.addApiFunctionByName("GuiLabel")
core.addApiFunctionByName("GuiButton")
core.addApiFunctionByName("GuiLabelButton")
core.addApiFunctionByName("GuiToggle")
core.addApiFunctionByName("GuiToggleGroup")
core.addApiFunctionByName("GuiCheckBox")
core.addApiFunctionByName("GuiComboBox")
//core.addApiFunctionByName("GuiDropdownBox")
//core.addApiFunctionByName("GuiSpinner")
//core.addApiFunctionByName("GuiValueBox")
core.addApiFunctionByName("GuiTextBox")
//core.addApiFunctionByName("GuiTextBoxMulti")
core.addApiFunctionByName("GuiSlider")
core.addApiFunctionByName("GuiSliderBar")
core.addApiFunctionByName("GuiProgressBar")
core.addApiFunctionByName("GuiStatusBar")
core.addApiFunctionByName("GuiDummyRec")
core.addApiFunctionByName("GuiGrid")
//core.addApiFunctionByName("GuiListView")
//core.addApiFunctionByName("GuiListViewEx")
core.addApiFunctionByName("GuiMessageBox")
//core.addApiFunctionByName("GuiTextInputBox")
core.addApiFunctionByName("GuiColorPicker")
core.addApiFunctionByName("GuiColorPanel")
core.addApiFunctionByName("GuiColorBarAlpha")
core.addApiFunctionByName("GuiColorBarHue")
core.addApiFunctionByName("GuiLoadStyle")
core.addApiFunctionByName("GuiLoadStyleDefault")
core.addApiFunctionByName("GuiIconText")
core.addApiFunctionByName("GuiDrawIcon")
//core.addApiFunctionByName("GuiGetIcons")
//core.addApiFunctionByName("GuiGetIconData")
//core.addApiFunctionByName("GuiSetIconData")
core.addApiFunctionByName("GuiSetIconScale")
// module: rlights
// TODO: Parse and support light struct // TODO: Parse and support light struct
// core.addApiFunctionByName("CreateLight") ignore("CreateLight")
// core.addApiFunctionByName("UpdateLightValues") ignore("UpdateLightValues")
// module: reasings
core.addApiFunctionByName("EaseLinearNone")
core.addApiFunctionByName("EaseLinearIn")
core.addApiFunctionByName("EaseLinearOut")
core.addApiFunctionByName("EaseLinearInOut")
core.addApiFunctionByName("EaseSineIn")
core.addApiFunctionByName("EaseSineOut")
core.addApiFunctionByName("EaseSineInOut")
core.addApiFunctionByName("EaseCircIn")
core.addApiFunctionByName("EaseCircOut")
core.addApiFunctionByName("EaseCircInOut")
core.addApiFunctionByName("EaseCubicIn")
core.addApiFunctionByName("EaseCubicOut")
core.addApiFunctionByName("EaseCubicInOut")
core.addApiFunctionByName("EaseQuadIn")
core.addApiFunctionByName("EaseQuadOut")
core.addApiFunctionByName("EaseQuadInOut")
core.addApiFunctionByName("EaseExpoIn")
core.addApiFunctionByName("EaseExpoOut")
core.addApiFunctionByName("EaseExpoInOut")
core.addApiFunctionByName("EaseBackIn")
core.addApiFunctionByName("EaseBounceOut")
core.addApiFunctionByName("EaseBounceInOut")
core.addApiFunctionByName("EaseElasticIn")
api.structs.forEach(x => core.addApiStruct(x))
api.functions.forEach(x => core.addApiFunction(x))
api.defines.filter(x => x.type === "COLOR").map(x => ({ name: x.name, description: x.description, values: (x.value.match(/\{([^}]+)\}/) || "")[1].split(',').map(x => x.trim()) })).forEach(x => { api.defines.filter(x => x.type === "COLOR").map(x => ({ name: x.name, description: x.description, values: (x.value.match(/\{([^}]+)\}/) || "")[1].split(',').map(x => x.trim()) })).forEach(x => {
core.exportGlobalStruct("Color", x.name, x.values, x.description) core.exportGlobalStruct("Color", x.name, x.values, x.description)
}) })
api.enums.forEach(x => core.addEnum(x))
core.addAllEnums()
// api.enums.find(x => x.name === "KeyboardKey")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "MouseButton")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "ConfigFlags")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "BlendMode")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "TraceLogLevel")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "MouseCursor")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "PixelFormat")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "CameraProjection")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "CameraMode")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "ShaderLocationIndex")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "ShaderUniformDataType")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "MaterialMapIndex")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
core.exportGlobalConstant("MATERIAL_MAP_DIFFUSE", "Albedo material (same as: MATERIAL_MAP_DIFFUSE") core.exportGlobalConstant("MATERIAL_MAP_DIFFUSE", "Albedo material (same as: MATERIAL_MAP_DIFFUSE")
core.exportGlobalConstant("MATERIAL_MAP_SPECULAR", "Metalness material (same as: MATERIAL_MAP_SPECULAR)") core.exportGlobalConstant("MATERIAL_MAP_SPECULAR", "Metalness material (same as: MATERIAL_MAP_SPECULAR)")
core.writeTo("src/bindings/js_raylib_core.h") core.writeTo("src/bindings/js_raylib_core.h")
core.typings.writeTo("examples/lib.raylib.d.ts") core.typings.writeTo("examples/lib.raylib.d.ts")
const ignored = api.functions.filter(x => x.binding?.ignore).length
console.log(`Converted ${api.functions.length-ignored} function. ${ignored} ignored`)
console.log("Success!")
} }
main() main()

View File

@ -15,6 +15,11 @@ export interface FuncBindingOptions {
customizeCall?: string, customizeCall?: string,
body?: (gen: QuickJsGenerator) => void, body?: (gen: QuickJsGenerator) => void,
jsName?: string, jsName?: string,
ignore?: boolean,
jsReturns?: string
}
export interface ParamBindingOptions {
ignore?: boolean ignore?: boolean
} }
@ -54,7 +59,8 @@ export interface RayLibEnum {
export interface RayLibParamDescription { export interface RayLibParamDescription {
type: RayLibType | string, type: RayLibType | string,
name: string name: string,
binding?: ParamBindingOptions
} }
export interface RayLibFunction { export interface RayLibFunction {

View File

@ -22,6 +22,7 @@ export class RayLibHeader extends QuickJsHeader {
if(options.ignore) return if(options.ignore) return
const jName = options.jsName || api.name.charAt(0).toLowerCase() + api.name.slice(1) const jName = options.jsName || api.name.charAt(0).toLowerCase() + api.name.slice(1)
console.log("Binding function "+api.name)
const fun = this.functions.jsBindingFunction(jName) const fun = this.functions.jsBindingFunction(jName)
if(options.body) { if(options.body) {
@ -31,6 +32,7 @@ export class RayLibHeader extends QuickJsHeader {
// read parameters // read parameters
api.params = api.params || [] api.params = api.params || []
for (let i = 0; i < api.params.length; i++) { for (let i = 0; i < api.params.length; i++) {
if(api.params[i]?.binding?.ignore) continue;
const para = api.params[i] const para = api.params[i]
fun.jsToC(para.type,para.name,"argv["+i+"]", this.structLookup) fun.jsToC(para.type,para.name,"argv["+i+"]", this.structLookup)
} }
@ -53,16 +55,18 @@ export class RayLibHeader extends QuickJsHeader {
} }
// add binding to function declaration // add binding to function declaration
this.moduleFunctionList.jsFuncDef(jName, api.params?.length ?? 0, fun.getTag("_name")) this.moduleFunctionList.jsFuncDef(jName, (api.params || []).filter(x => !x.binding?.ignore).length, fun.getTag("_name"))
this.typings.addFunction(jName,api) this.typings.addFunction(jName,api)
} }
addEnum(renum: RayLibEnum){ addEnum(renum: RayLibEnum){
console.log("Binding enum "+ renum.name)
renum.values.forEach(x => this.exportGlobalConstant(x.name, x.description)) renum.values.forEach(x => this.exportGlobalConstant(x.name, x.description))
} }
addApiStruct(struct: RayLibStruct){ addApiStruct(struct: RayLibStruct){
const options = struct.binding || {} const options = struct.binding || {}
console.log("Binding struct "+ struct.name)
const classId = this.definitions.jsClassId(`js_${struct.name}_class_id`) const classId = this.definitions.jsClassId(`js_${struct.name}_class_id`)
this.registerStruct(struct.name, classId) this.registerStruct(struct.name, classId)
options.aliases?.forEach(x => this.registerStruct(x, classId)) options.aliases?.forEach(x => this.registerStruct(x, classId))
@ -97,7 +101,7 @@ export class RayLibHeader extends QuickJsHeader {
this.moduleEntry.call("JS_AddModuleExport", ["ctx","m",'"'+struct.name+'"']) this.moduleEntry.call("JS_AddModuleExport", ["ctx","m",'"'+struct.name+'"'])
} }
this.typings.addStruct(struct, options || {}) this.typings.addStruct(struct)
} }
exportGlobalStruct(structName: string, exportName: string, values: string[], description: string){ exportGlobalStruct(structName: string, exportName: string, values: string[], description: string){

View File

@ -1,7 +1,6 @@
import { ApiFunction, ApiStruct } from "./api";
import { GenericCodeGenerator, FunctionArgument, CodeWriter } from "./generation" import { GenericCodeGenerator, FunctionArgument, CodeWriter } from "./generation"
import { writeFileSync } from "fs"; import { writeFileSync } from "fs";
import { StructBindingOptions } from "./raylib-header"; import { RayLibFunction, RayLibStruct } from "./interfaces";
export class TypeScriptDeclaration { export class TypeScriptDeclaration {
root = new TypescriptGenerator() root = new TypescriptGenerator()
@ -17,13 +16,15 @@ export class TypeScriptDeclaration {
addFunction(name: string, api: ApiFunction){ addFunction(name: string, api: RayLibFunction){
const para = api.params.map(x => ({ name: x.name, type: this.toJsType(x.type)})) const options = api.binding || {}
const returnType = this.toJsType(api.returnType) const para = (api.params || []).filter(x => !x.binding?.ignore).map(x => ({ name: x.name, type: this.toJsType(x.type)}))
const returnType = options.jsReturns ?? this.toJsType(api.returnType)
this.functions.tsDeclareFunction(name, para, returnType, api.description) this.functions.tsDeclareFunction(name, para, returnType, api.description)
} }
addStruct(api: ApiStruct, options: StructBindingOptions){ addStruct(api: RayLibStruct){
const options = api.binding || {}
var fields = api.fields.filter(x => !!(options.properties || {})[x.name]).map(x => ({name: x.name, description: x.description, type: this.toJsType(x.type)})) var fields = api.fields.filter(x => !!(options.properties || {})[x.name]).map(x => ({name: x.name, description: x.description, type: this.toJsType(x.type)}))
this.structs.tsDeclareInterface(api.name, fields) this.structs.tsDeclareInterface(api.name, fields)
this.structs.tsDeclareType(api.name, !!(options.createConstructor || options.createEmptyConstructor), options.createEmptyConstructor ? [] : fields) this.structs.tsDeclareType(api.name, !!(options.createConstructor || options.createEmptyConstructor), options.createEmptyConstructor ? [] : fields)

View File

@ -1,31 +1,3 @@
interface Color {
/** Color red value */
r: number,
/** Color green value */
g: number,
/** Color blue value */
b: number,
/** Color alpha value */
a: number,
}
declare var Color: {
prototype: Color;
new(r: number, g: number, b: number, a: number): Color;
}
interface Rectangle {
/** Rectangle top-left corner position x */
x: number,
/** Rectangle top-left corner position y */
y: number,
/** Rectangle width */
width: number,
/** Rectangle height */
height: number,
}
declare var Rectangle: {
prototype: Rectangle;
new(x: number, y: number, width: number, height: number): Rectangle;
}
interface Vector2 { interface Vector2 {
/** Vector x component */ /** Vector x component */
x: number, x: number,
@ -62,74 +34,72 @@ declare var Vector4: {
prototype: Vector4; prototype: Vector4;
new(x: number, y: number, z: number, w: number): Vector4; new(x: number, y: number, z: number, w: number): Vector4;
} }
interface Ray {
/** Ray position (origin) */
position: Vector3,
/** Ray direction */
direction: Vector3,
}
declare var Ray: {
prototype: Ray;
new(position: Vector3, direction: Vector3): Ray;
}
interface RayCollision {
/** Did the ray hit something? */
hit: boolean,
/** Distance to the nearest hit */
distance: number,
/** Point of the nearest hit */
point: Vector3,
/** Surface normal of hit */
normal: Vector3,
}
declare var RayCollision: {
prototype: RayCollision;
}
interface Camera2D {
/** Camera offset (displacement from target) */
offset: Vector2,
/** Camera target (rotation and zoom origin) */
target: Vector2,
/** Camera rotation in degrees */
rotation: number,
/** Camera zoom (scaling), should be 1.0f by default */
zoom: number,
}
declare var Camera2D: {
prototype: Camera2D;
new(offset: Vector2, target: Vector2, rotation: number, zoom: number): Camera2D;
}
interface Camera3D {
/** Camera position */
position: Vector3,
/** Camera target it looks-at */
target: Vector3,
/** Camera up vector (rotation over its axis) */
up: Vector3,
/** Camera field-of-view aperture in Y (degrees) in perspective, used as near plane width in orthographic */
fovy: number,
/** Camera projection: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC */
projection: number,
}
declare var Camera3D: {
prototype: Camera3D;
new(position: Vector3, target: Vector3, up: Vector3, fovy: number, projection: number): Camera3D;
}
interface BoundingBox {
/** Minimum vertex box-corner */
min: Vector3,
/** Maximum vertex box-corner */
max: Vector3,
}
declare var BoundingBox: {
prototype: BoundingBox;
new(min: Vector3, max: Vector3): BoundingBox;
}
interface Matrix { interface Matrix {
} }
declare var Matrix: { declare var Matrix: {
prototype: Matrix; prototype: Matrix;
} }
interface Color {
/** Color red value */
r: number,
/** Color green value */
g: number,
/** Color blue value */
b: number,
/** Color alpha value */
a: number,
}
declare var Color: {
prototype: Color;
new(r: number, g: number, b: number, a: number): Color;
}
interface Rectangle {
/** Rectangle top-left corner position x */
x: number,
/** Rectangle top-left corner position y */
y: number,
/** Rectangle width */
width: number,
/** Rectangle height */
height: number,
}
declare var Rectangle: {
prototype: Rectangle;
new(x: number, y: number, width: number, height: number): Rectangle;
}
interface Image {
/** Image base width */
width: number,
/** Image base height */
height: number,
/** Mipmap levels, 1 by default */
mipmaps: number,
/** Data format (PixelFormat type) */
format: number,
}
declare var Image: {
prototype: Image;
}
interface Texture {
/** Texture base width */
width: number,
/** Texture base height */
height: number,
/** Mipmap levels, 1 by default */
mipmaps: number,
/** Data format (PixelFormat type) */
format: number,
}
declare var Texture: {
prototype: Texture;
}
interface RenderTexture {
/** OpenGL framebuffer object id */
id: number,
}
declare var RenderTexture: {
prototype: RenderTexture;
}
interface NPatchInfo { interface NPatchInfo {
/** Texture source rectangle */ /** Texture source rectangle */
source: Rectangle, source: Rectangle,
@ -148,62 +118,51 @@ declare var NPatchInfo: {
prototype: NPatchInfo; prototype: NPatchInfo;
new(source: Rectangle, left: number, top: number, right: number, bottom: number, layout: number): NPatchInfo; new(source: Rectangle, left: number, top: number, right: number, bottom: number, layout: number): NPatchInfo;
} }
interface Image { interface GlyphInfo {
/** Image base width */
width: number,
/** Image base height */
height: number,
/** Mipmap levels, 1 by default */
mipmaps: number,
/** Data format (PixelFormat type) */
format: number,
} }
declare var Image: { declare var GlyphInfo: {
prototype: Image; prototype: GlyphInfo;
} }
interface Wave { interface Font {
/** Total number of frames (considering channels) */ /** Base size (default chars height) */
frameCount: number, baseSize: number,
/** Frequency (samples per second) */ /** Number of glyph characters */
sampleRate: number, glyphCount: number,
/** Bit depth (bits per sample): 8, 16, 32 (24 not supported) */ /** Padding around the glyph characters */
sampleSize: number, glyphPadding: number,
/** Number of channels (1-mono, 2-stereo, ...) */
channels: number,
} }
declare var Wave: { declare var Font: {
prototype: Wave; prototype: Font;
} }
interface Sound { interface Camera3D {
/** Total number of frames (considering channels) */ /** Camera position */
frameCount: number, position: Vector3,
/** Camera target it looks-at */
target: Vector3,
/** Camera up vector (rotation over its axis) */
up: Vector3,
/** Camera field-of-view aperture in Y (degrees) in perspective, used as near plane width in orthographic */
fovy: number,
/** Camera projection: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC */
projection: number,
} }
declare var Sound: { declare var Camera3D: {
prototype: Sound; prototype: Camera3D;
new(position: Vector3, target: Vector3, up: Vector3, fovy: number, projection: number): Camera3D;
} }
interface Music { interface Camera2D {
/** Total number of frames (considering channels) */ /** Camera offset (displacement from target) */
frameCount: number, offset: Vector2,
/** Music looping enable */ /** Camera target (rotation and zoom origin) */
looping: boolean, target: Vector2,
/** Type of music context (audio filetype) */ /** Camera rotation in degrees */
ctxType: number, rotation: number,
/** Camera zoom (scaling), should be 1.0f by default */
zoom: number,
} }
declare var Music: { declare var Camera2D: {
prototype: Music; prototype: Camera2D;
} new(offset: Vector2, target: Vector2, rotation: number, zoom: number): Camera2D;
interface Model {
/** Local transform matrix */
transform: Matrix,
/** Number of meshes */
meshCount: number,
/** Number of materials */
materialCount: number,
/** Number of bones */
boneCount: number,
}
declare var Model: {
prototype: Model;
} }
interface Mesh { interface Mesh {
/** Number of vertices stored in arrays */ /** Number of vertices stored in arrays */
@ -244,37 +203,6 @@ interface Shader {
declare var Shader: { declare var Shader: {
prototype: Shader; prototype: Shader;
} }
interface Texture {
/** Texture base width */
width: number,
/** Texture base height */
height: number,
/** Mipmap levels, 1 by default */
mipmaps: number,
/** Data format (PixelFormat type) */
format: number,
}
declare var Texture: {
prototype: Texture;
}
interface Font {
/** Base size (default chars height) */
baseSize: number,
/** Number of glyph characters */
glyphCount: number,
/** Padding around the glyph characters */
glyphPadding: number,
}
declare var Font: {
prototype: Font;
}
interface RenderTexture {
/** OpenGL framebuffer object id */
id: number,
}
declare var RenderTexture: {
prototype: RenderTexture;
}
interface MaterialMap { interface MaterialMap {
/** Material map texture */ /** Material map texture */
texture: Texture, texture: Texture,
@ -293,6 +221,118 @@ interface Material {
declare var Material: { declare var Material: {
prototype: Material; prototype: Material;
} }
interface Transform {
}
declare var Transform: {
prototype: Transform;
}
interface BoneInfo {
}
declare var BoneInfo: {
prototype: BoneInfo;
}
interface Model {
/** Local transform matrix */
transform: Matrix,
/** Number of meshes */
meshCount: number,
/** Number of materials */
materialCount: number,
/** Number of bones */
boneCount: number,
}
declare var Model: {
prototype: Model;
}
interface ModelAnimation {
}
declare var ModelAnimation: {
prototype: ModelAnimation;
}
interface Ray {
/** Ray position (origin) */
position: Vector3,
/** Ray direction */
direction: Vector3,
}
declare var Ray: {
prototype: Ray;
new(position: Vector3, direction: Vector3): Ray;
}
interface RayCollision {
/** Did the ray hit something? */
hit: boolean,
/** Distance to the nearest hit */
distance: number,
/** Point of the nearest hit */
point: Vector3,
/** Surface normal of hit */
normal: Vector3,
}
declare var RayCollision: {
prototype: RayCollision;
}
interface BoundingBox {
/** Minimum vertex box-corner */
min: Vector3,
/** Maximum vertex box-corner */
max: Vector3,
}
declare var BoundingBox: {
prototype: BoundingBox;
new(min: Vector3, max: Vector3): BoundingBox;
}
interface Wave {
/** Total number of frames (considering channels) */
frameCount: number,
/** Frequency (samples per second) */
sampleRate: number,
/** Bit depth (bits per sample): 8, 16, 32 (24 not supported) */
sampleSize: number,
/** Number of channels (1-mono, 2-stereo, ...) */
channels: number,
}
declare var Wave: {
prototype: Wave;
}
interface AudioStream {
}
declare var AudioStream: {
prototype: AudioStream;
}
interface Sound {
/** Total number of frames (considering channels) */
frameCount: number,
}
declare var Sound: {
prototype: Sound;
}
interface Music {
/** Total number of frames (considering channels) */
frameCount: number,
/** Music looping enable */
looping: boolean,
/** Type of music context (audio filetype) */
ctxType: number,
}
declare var Music: {
prototype: Music;
}
interface VrDeviceInfo {
}
declare var VrDeviceInfo: {
prototype: VrDeviceInfo;
}
interface VrStereoConfig {
}
declare var VrStereoConfig: {
prototype: VrStereoConfig;
}
interface FilePathList {
}
declare var FilePathList: {
prototype: FilePathList;
}
/** Initialize window and OpenGL context */ /** Initialize window and OpenGL context */
declare function initWindow(width: number, height: number, title: string): void; declare function initWindow(width: number, height: number, title: string): void;
/** Check if KEY_ESCAPE pressed or Close icon pressed */ /** Check if KEY_ESCAPE pressed or Close icon pressed */
@ -509,6 +549,10 @@ declare function getApplicationDirectory(): string;
declare function changeDirectory(dir: string): boolean; declare function changeDirectory(dir: string): boolean;
/** Check if a given path is a file or a directory */ /** Check if a given path is a file or a directory */
declare function isPathFile(path: string): boolean; declare function isPathFile(path: string): boolean;
/** Load directory filepaths */
declare function loadDirectoryFiles(dirPath: string): string[];
/** Load directory filepaths with extension filtering and recursive directory scan */
declare function loadDirectoryFilesEx(basePath: string, filter: string, scanSubdirs: boolean): string[];
/** Check if a file has been dropped into window */ /** Check if a file has been dropped into window */
declare function isFileDropped(): boolean; declare function isFileDropped(): boolean;
/** Load dropped filepaths */ /** Load dropped filepaths */
@ -1025,8 +1069,6 @@ declare function isMaterialReady(material: Material): boolean;
declare function unloadMaterial(material: Material): void; declare function unloadMaterial(material: Material): void;
/** Set texture for a material map type (MATERIAL_MAP_DIFFUSE, MATERIAL_MAP_SPECULAR...) */ /** Set texture for a material map type (MATERIAL_MAP_DIFFUSE, MATERIAL_MAP_SPECULAR...) */
declare function setMaterialTexture(material: Material, mapType: number, texture: Texture): void; declare function setMaterialTexture(material: Material, mapType: number, texture: Texture): void;
/** Replace material in slot materialIndex */
declare function setModelMaterial(model: Model, materialIndex: number, material: Material): void;
/** Set material for a mesh */ /** Set material for a mesh */
declare function setModelMeshMaterial(model: Model, meshId: number, materialId: number): void; declare function setModelMeshMaterial(model: Model, meshId: number, materialId: number): void;
/** Check collision between two spheres */ /** Check collision between two spheres */
@ -1464,12 +1506,18 @@ declare function guiColorBarHue(bounds: Rectangle, text: string, value: number):
declare function guiLoadStyle(fileName: string): void; declare function guiLoadStyle(fileName: string): void;
/** Load style default over global style */ /** Load style default over global style */
declare function guiLoadStyleDefault(): void; declare function guiLoadStyleDefault(): void;
/** Enable gui tooltips (global state) */
declare function guiEnableTooltip(): void;
/** Disable gui tooltips (global state) */
declare function guiDisableTooltip(): void;
/** Set tooltip string */
declare function guiSetTooltip(tooltip: string): void;
/** Get text with icon id prepended (if supported) */ /** Get text with icon id prepended (if supported) */
declare function guiIconText(iconId: number, text: string): string; declare function guiIconText(iconId: number, text: string): string;
/** Draw icon using pixel size at specified position */
declare function guiDrawIcon(iconId: number, posX: number, posY: number, pixelSize: number, color: Color): void;
/** Set default icon drawing size */ /** Set default icon drawing size */
declare function guiSetIconScale(scale: number): void; declare function guiSetIconScale(scale: number): void;
/** Draw icon using pixel size at specified position */
declare function guiDrawIcon(iconId: number, posX: number, posY: number, pixelSize: number, color: Color): void;
/** Linear Easing functions */ /** Linear Easing functions */
declare function easeLinearNone(t: number, b: number, c: number, d: number): number; declare function easeLinearNone(t: number, b: number, c: number, d: number): number;
/** Ease: Linear */ /** Ease: Linear */
@ -1516,6 +1564,8 @@ declare function easeBounceOut(t: number, b: number, c: number, d: number): numb
declare function easeBounceInOut(t: number, b: number, c: number, d: number): number; declare function easeBounceInOut(t: number, b: number, c: number, d: number): number;
/** Elastic Easing functions */ /** Elastic Easing functions */
declare function easeElasticIn(t: number, b: number, c: number, d: number): number; declare function easeElasticIn(t: number, b: number, c: number, d: number): number;
/** Replace material in slot materialIndex */
declare function setModelMaterial(model: Model, materialIndex: number, material: Material): void;
/** (PI/180.0) */ /** (PI/180.0) */
declare var DEG2RAD: number; declare var DEG2RAD: number;
/** (180.0/PI) */ /** (180.0/PI) */

View File

@ -651,6 +651,7 @@ class RayLibHeader extends quickjs_1.QuickJsHeader {
if (options.ignore) if (options.ignore)
return; return;
const jName = options.jsName || api.name.charAt(0).toLowerCase() + api.name.slice(1); const jName = options.jsName || api.name.charAt(0).toLowerCase() + api.name.slice(1);
console.log("Binding function " + api.name);
const fun = this.functions.jsBindingFunction(jName); const fun = this.functions.jsBindingFunction(jName);
if (options.body) { if (options.body) {
options.body(fun); options.body(fun);
@ -661,6 +662,8 @@ class RayLibHeader extends quickjs_1.QuickJsHeader {
// read parameters // read parameters
api.params = api.params || []; api.params = api.params || [];
for (let i = 0; i < api.params.length; i++) { for (let i = 0; i < api.params.length; i++) {
if (api.params[i]?.binding?.ignore)
continue;
const para = api.params[i]; const para = api.params[i];
fun.jsToC(para.type, para.name, "argv[" + i + "]", this.structLookup); fun.jsToC(para.type, para.name, "argv[" + i + "]", this.structLookup);
} }
@ -687,14 +690,16 @@ class RayLibHeader extends quickjs_1.QuickJsHeader {
} }
} }
// add binding to function declaration // add binding to function declaration
this.moduleFunctionList.jsFuncDef(jName, api.params?.length ?? 0, fun.getTag("_name")); this.moduleFunctionList.jsFuncDef(jName, (api.params || []).filter(x => !x.binding?.ignore).length, fun.getTag("_name"));
this.typings.addFunction(jName, api); this.typings.addFunction(jName, api);
} }
addEnum(renum) { addEnum(renum) {
console.log("Binding enum " + renum.name);
renum.values.forEach(x => this.exportGlobalConstant(x.name, x.description)); renum.values.forEach(x => this.exportGlobalConstant(x.name, x.description));
} }
addApiStruct(struct) { addApiStruct(struct) {
const options = struct.binding || {}; const options = struct.binding || {};
console.log("Binding struct " + struct.name);
const classId = this.definitions.jsClassId(`js_${struct.name}_class_id`); const classId = this.definitions.jsClassId(`js_${struct.name}_class_id`);
this.registerStruct(struct.name, classId); this.registerStruct(struct.name, classId);
options.aliases?.forEach(x => this.registerStruct(x, classId)); options.aliases?.forEach(x => this.registerStruct(x, classId));
@ -726,7 +731,7 @@ class RayLibHeader extends quickjs_1.QuickJsHeader {
this.moduleInit.call("JS_SetModuleExport", ["ctx", "m", `"${struct.name}"`, struct.name + "_constr"]); this.moduleInit.call("JS_SetModuleExport", ["ctx", "m", `"${struct.name}"`, struct.name + "_constr"]);
this.moduleEntry.call("JS_AddModuleExport", ["ctx", "m", '"' + struct.name + '"']); this.moduleEntry.call("JS_AddModuleExport", ["ctx", "m", '"' + struct.name + '"']);
} }
this.typings.addStruct(struct, options || {}); this.typings.addStruct(struct);
} }
exportGlobalStruct(structName, exportName, values, description) { exportGlobalStruct(structName, exportName, values, description) {
this.moduleInit.declareStruct(structName, exportName + "_struct", values); this.moduleInit.declareStruct(structName, exportName + "_struct", values);
@ -768,11 +773,13 @@ class TypeScriptDeclaration {
this.constants = this.root.child(); this.constants = this.root.child();
} }
addFunction(name, api) { addFunction(name, api) {
const para = api.params.map(x => ({ name: x.name, type: this.toJsType(x.type) })); const options = api.binding || {};
const returnType = this.toJsType(api.returnType); const para = (api.params || []).filter(x => !x.binding?.ignore).map(x => ({ name: x.name, type: this.toJsType(x.type) }));
const returnType = options.jsReturns ?? this.toJsType(api.returnType);
this.functions.tsDeclareFunction(name, para, returnType, api.description); this.functions.tsDeclareFunction(name, para, returnType, api.description);
} }
addStruct(api, options) { addStruct(api) {
const options = api.binding || {};
var fields = api.fields.filter(x => !!(options.properties || {})[x.name]).map(x => ({ name: x.name, description: x.description, type: this.toJsType(x.type) })); var fields = api.fields.filter(x => !!(options.properties || {})[x.name]).map(x => ({ name: x.name, description: x.description, type: this.toJsType(x.type) }));
this.structs.tsDeclareInterface(api.name, fields); this.structs.tsDeclareInterface(api.name, fields);
this.structs.tsDeclareType(api.name, !!(options.createConstructor || options.createEmptyConstructor), options.createEmptyConstructor ? [] : fields); this.structs.tsDeclareType(api.name, !!(options.createConstructor || options.createEmptyConstructor), options.createEmptyConstructor ? [] : fields);
@ -915,6 +922,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
const fs_1 = __webpack_require__(/*! fs */ "fs"); const fs_1 = __webpack_require__(/*! fs */ "fs");
const raylib_header_1 = __webpack_require__(/*! ./raylib-header */ "./src/raylib-header.ts"); const raylib_header_1 = __webpack_require__(/*! ./raylib-header */ "./src/raylib-header.ts");
const header_parser_1 = __webpack_require__(/*! ./header-parser */ "./src/header-parser.ts"); const header_parser_1 = __webpack_require__(/*! ./header-parser */ "./src/header-parser.ts");
let api;
function getFunction(funList, name) { function getFunction(funList, name) {
return funList.find(x => x.name === name); return funList.find(x => x.name === name);
} }
@ -924,9 +932,12 @@ function getStruct(strList, name) {
function getAliases(aliasList, name) { function getAliases(aliasList, name) {
return aliasList.filter(x => x.type === name).map(x => x.name); return aliasList.filter(x => x.type === name).map(x => x.name);
} }
function ignore(name) {
getFunction(api.functions, name).binding = { ignore: true };
}
function main() { function main() {
// Load the pre-generated raylib api // Load the pre-generated raylib api
const api = JSON.parse((0, fs_1.readFileSync)("thirdparty/raylib/parser/output/raylib_api.json", 'utf8')); api = JSON.parse((0, fs_1.readFileSync)("thirdparty/raylib/parser/output/raylib_api.json", 'utf8'));
const parser = new header_parser_1.HeaderParser(); const parser = new header_parser_1.HeaderParser();
const rmathHeader = (0, fs_1.readFileSync)("thirdparty/raylib/src/raymath.h", "utf8"); const rmathHeader = (0, fs_1.readFileSync)("thirdparty/raylib/src/raymath.h", "utf8");
const mathApi = parser.parseFunctions(rmathHeader); const mathApi = parser.parseFunctions(rmathHeader);
@ -1171,17 +1182,17 @@ function main() {
}, },
//destructor: "UnloadMaterial" //destructor: "UnloadMaterial"
}; };
getFunction(api.functions, "SetWindowIcons").binding = { ignore: true }; ignore("SetWindowIcons");
getFunction(api.functions, "GetWindowHandle").binding = { ignore: true }; ignore("GetWindowHandle");
// Custom frame control functions // Custom frame control functions
// NOT SUPPORTED BECAUSE NEEDS COMPILER FLAG // NOT SUPPORTED BECAUSE NEEDS COMPILER FLAG
getFunction(api.functions, "SwapScreenBuffer").binding = { ignore: true }; ignore("SwapScreenBuffer");
getFunction(api.functions, "PollInputEvents").binding = { ignore: true }; ignore("PollInputEvents");
getFunction(api.functions, "WaitTime").binding = { ignore: true }; ignore("WaitTime");
getFunction(api.functions, "BeginVrStereoMode").binding = { ignore: true }; ignore("BeginVrStereoMode");
getFunction(api.functions, "EndVrStereoMode").binding = { ignore: true }; ignore("EndVrStereoMode");
getFunction(api.functions, "LoadVrStereoConfig").binding = { ignore: true }; ignore("LoadVrStereoConfig");
getFunction(api.functions, "UnloadVrStereoConfig").binding = { ignore: true }; ignore("UnloadVrStereoConfig");
getFunction(api.functions, "SetShaderValue").binding = { body: (gen) => { getFunction(api.functions, "SetShaderValue").binding = { body: (gen) => {
gen.jsToC("Shader", "shader", "argv[0]", core.structLookup); gen.jsToC("Shader", "shader", "argv[0]", core.structLookup);
gen.jsToC("int", "locIndex", "argv[1]", core.structLookup); gen.jsToC("int", "locIndex", "argv[1]", core.structLookup);
@ -1210,20 +1221,24 @@ function main() {
gen.call("SetShaderValue", ["shader", "locIndex", "value", "uniformType"]); gen.call("SetShaderValue", ["shader", "locIndex", "value", "uniformType"]);
gen.returnExp("JS_UNDEFINED"); gen.returnExp("JS_UNDEFINED");
} }; } };
getFunction(api.functions, "SetShaderValueV").binding = { ignore: true }; ignore("SetShaderValueV");
const traceLog = apiDesc.getFunction("TraceLog"); const traceLog = getFunction(api.functions, "TraceLog");
if (!traceLog) traceLog.params?.pop();
throw new Error("TraceLog not found"); // Memory functions not supported on JS, just use ArrayBuffer
traceLog.params.pop(); ignore("MemAlloc");
core.addApiFunction(traceLog); ignore("MemRealloc");
core.addApiFunctionByName("SetTraceLogLevel"); ignore("MemFree");
// Memory functions not supported on JS
core.addApiFunctionByName("OpenURL");
// Callbacks not supported on JS // Callbacks not supported on JS
ignore("SetTraceLogCallback");
ignore("SetLoadFileDataCallback");
ignore("SetSaveFileDataCallback");
ignore("SetLoadFileTextCallback");
ignore("SetSaveFileTextCallback");
// Files management functions // Files management functions
const lfd = apiDesc.getFunction("LoadFileData"); const lfd = getFunction(api.functions, "LoadFileData");
lfd?.params.pop(); lfd.params[lfd.params.length - 1].binding = { ignore: true };
core.addApiFunctionByName("LoadFileData", null, { body: gen => { lfd.binding = {
body: gen => {
gen.jsToC("const char *", "fileName", "argv[0]"); gen.jsToC("const char *", "fileName", "argv[0]");
gen.declare("bytesRead", "unsigned int"); gen.declare("bytesRead", "unsigned int");
gen.call("LoadFileData", ["fileName", "&bytesRead"], { type: "unsigned char *", name: "retVal" }); gen.call("LoadFileData", ["fileName", "&bytesRead"], { type: "unsigned char *", name: "retVal" });
@ -1231,694 +1246,162 @@ function main() {
gen.call("UnloadFileData", ["retVal"]); gen.call("UnloadFileData", ["retVal"]);
gen.jsCleanUpParameter("const char*", "fileName"); gen.jsCleanUpParameter("const char*", "fileName");
gen.returnExp("buffer"); gen.returnExp("buffer");
} }); }
//UnloadLoadFileData not needed, data is copied };
// TODO: Works but unnecessary makes copy of memory ignore("UnloadFileData");
core.addApiFunctionByName("SaveFileData"); // TODO: SaveFileData works but unnecessary makes copy of memory
// Export data as code not needed getFunction(api.functions, "SaveFileData").binding = {};
core.addApiFunctionByName("LoadFileText", null, { after: gen => gen.call("UnloadFileText", ["returnVal"]) }); ignore("ExportDataAsCode");
core.addApiFunctionByName("SaveFileText"); getFunction(api.functions, "LoadFileText").binding = { after: gen => gen.call("UnloadFileText", ["returnVal"]) };
core.addApiFunctionByName("FileExists"); ignore("UnloadFileText");
core.addApiFunctionByName("DirectoryExists"); const createFileList = (gen, loadName, unloadName, args) => {
core.addApiFunctionByName("IsFileExtension"); gen.call(loadName, args, { type: "FilePathList", name: "files" });
core.addApiFunctionByName("GetFileLength"); gen.call("JS_NewArray", ["ctx"], { type: "JSValue", name: "ret" });
// TODO: Who needs to clean memory here? const f = gen.for("i", "files.count");
core.addApiFunctionByName("GetFileExtension"); f.call("JS_SetPropertyUint32", ["ctx", "ret", "i", "JS_NewString(ctx,files.paths[i])"]);
core.addApiFunctionByName("GetFileName"); gen.call(unloadName, ["files"]);
core.addApiFunctionByName("GetFileNameWithoutExt"); };
core.addApiFunctionByName("GetDirectoryPath"); getFunction(api.functions, "LoadDirectoryFiles").binding = {
core.addApiFunctionByName("GetPrevDirectoryPath"); jsReturns: "string[]",
core.addApiFunctionByName("GetWorkingDirectory");
core.addApiFunctionByName("GetApplicationDirectory");
core.addApiFunctionByName("ChangeDirectory");
core.addApiFunctionByName("IsPathFile");
//core.addApiFunctionByName("LoadDirectoryFiles")
//core.addApiFunctionByName("LoadDirectoryFilesEx")
// UnloadDirectoryFiles
core.addApiFunctionByName("IsFileDropped");
const ldf = apiDesc.getFunction("LoadDroppedFiles");
ldf.returnType = "string[]";
core.addApiFunction(ldf, null, {
body: gen => { body: gen => {
gen.call("LoadDroppedFiles", [], { type: "FilePathList", name: "files" }); gen.jsToC("const char *", "dirPath", "argv[0]");
gen.call("JS_NewArray", ["ctx"], { type: "JSValue", name: "ret" }); createFileList(gen, "LoadDirectoryFiles", "UnloadDirectoryFiles", ["dirPath"]);
const f = gen.for("i", "files.count"); gen.jsCleanUpParameter("const char *", "dirPath");
f.call("JS_SetPropertyUint32", ["ctx", "ret", "i", "JS_NewString(ctx,files.paths[i])"]);
gen.call("UnloadDroppedFiles", ["files"]);
gen.returnExp("ret"); gen.returnExp("ret");
} }
}); };
// UnloadDroppedFiles getFunction(api.functions, "LoadDirectoryFilesEx").binding = {
core.addApiFunctionByName("GetFileModTime"); jsReturns: "string[]",
body: gen => {
gen.jsToC("const char *", "basePath", "argv[0]");
gen.jsToC("const char *", "filter", "argv[1]");
gen.jsToC("bool", "scanSubdirs", "argv[2]");
createFileList(gen, "LoadDirectoryFilesEx", "UnloadDirectoryFiles", ["basePath", "filter", "scanSubdirs"]);
gen.jsCleanUpParameter("const char *", "basePath");
gen.jsCleanUpParameter("const char *", "filter");
gen.returnExp("ret");
}
};
ignore("UnloadDirectoryFiles");
getFunction(api.functions, "LoadDroppedFiles").binding = {
jsReturns: "string[]",
body: gen => {
createFileList(gen, "LoadDroppedFiles", "UnloadDroppedFiles", []);
gen.returnExp("ret");
}
};
ignore("UnloadDroppedFiles");
// Compression/encoding functionality // Compression/encoding functionality
//core.addApiFunctionByName("CompressData") ignore("CompressData");
//core.addApiFunctionByName("DecompressData") ignore("DecompressData");
//core.addApiFunctionByName("EncodeDataBase64") ignore("EncodeDataBase64");
//core.addApiFunctionByName("DecodeDataBase64") ignore("DecodeDataBase64");
// input handling functions ignore("DrawLineStrip");
core.addApiFunctionByName("IsKeyPressed"); ignore("DrawTriangleFan");
core.addApiFunctionByName("IsKeyDown"); ignore("DrawTriangleStrip");
core.addApiFunctionByName("IsKeyReleased"); ignore("CheckCollisionPointPoly");
core.addApiFunctionByName("IsKeyUp"); ignore("CheckCollisionLines");
core.addApiFunctionByName("SetExitKey"); ignore("LoadImageAnim");
core.addApiFunctionByName("GetKeyPressed"); ignore("ExportImageAsCode");
core.addApiFunctionByName("GetCharPressed"); getFunction(api.functions, "LoadImageColors").binding = {
// input-related functions: gamepads jsReturns: "ArrayBuffer",
core.addApiFunctionByName("IsGamepadAvailable"); body: gen => {
core.addApiFunctionByName("GetGamepadName");
core.addApiFunctionByName("IsGamepadButtonPressed");
core.addApiFunctionByName("IsGamepadButtonDown");
core.addApiFunctionByName("IsGamepadButtonReleased");
core.addApiFunctionByName("IsGamepadButtonUp");
core.addApiFunctionByName("GetGamepadButtonPressed");
core.addApiFunctionByName("GetGamepadAxisCount");
core.addApiFunctionByName("GetGamepadAxisMovement");
core.addApiFunctionByName("SetGamepadMappings");
// input-related functions: mouse
core.addApiFunctionByName("IsMouseButtonPressed");
core.addApiFunctionByName("IsMouseButtonDown");
core.addApiFunctionByName("IsMouseButtonReleased");
core.addApiFunctionByName("IsMouseButtonUp");
core.addApiFunctionByName("GetMouseX");
core.addApiFunctionByName("GetMouseY");
core.addApiFunctionByName("GetMousePosition");
core.addApiFunctionByName("GetMouseDelta");
core.addApiFunctionByName("SetMousePosition");
core.addApiFunctionByName("SetMouseOffset");
core.addApiFunctionByName("SetMouseScale");
core.addApiFunctionByName("GetMouseWheelMove");
core.addApiFunctionByName("GetMouseWheelMoveV");
core.addApiFunctionByName("SetMouseCursor");
// input-related functions: touch
core.addApiFunctionByName("GetTouchX");
core.addApiFunctionByName("GetTouchY");
core.addApiFunctionByName("GetTouchPosition");
core.addApiFunctionByName("GetTouchPointId");
core.addApiFunctionByName("GetTouchPointCount");
// Gesture and touch handling functions
core.addApiFunctionByName("SetGesturesEnabled");
core.addApiFunctionByName("IsGestureDetected");
core.addApiFunctionByName("GetGestureDetected");
core.addApiFunctionByName("GetGestureHoldDuration");
core.addApiFunctionByName("GetGestureDragVector");
core.addApiFunctionByName("GetGestureDragAngle");
core.addApiFunctionByName("GetGesturePinchVector");
core.addApiFunctionByName("GetGesturePinchAngle");
// Camera system functions
core.addApiFunctionByName("UpdateCamera");
core.addApiFunctionByName("UpdateCameraPro");
//api.functions.forEach(x => console.log(`core.addApiFunctionByName("${x.name}")`))
// module: rshapes
core.addApiFunctionByName("SetShapesTexture");
// Basic shapes drawing functions
core.addApiFunctionByName("DrawPixel");
core.addApiFunctionByName("DrawPixelV");
core.addApiFunctionByName("DrawLine");
core.addApiFunctionByName("DrawLineV");
core.addApiFunctionByName("DrawLineEx");
core.addApiFunctionByName("DrawLineBezier");
core.addApiFunctionByName("DrawLineBezierQuad");
core.addApiFunctionByName("DrawLineBezierCubic");
// core.addApiFunctionByName("DrawLineStrip")
core.addApiFunctionByName("DrawCircle");
core.addApiFunctionByName("DrawCircleSector");
core.addApiFunctionByName("DrawCircleSectorLines");
core.addApiFunctionByName("DrawCircleGradient");
core.addApiFunctionByName("DrawCircleV");
core.addApiFunctionByName("DrawCircleLines");
core.addApiFunctionByName("DrawEllipse");
core.addApiFunctionByName("DrawEllipseLines");
core.addApiFunctionByName("DrawRing");
core.addApiFunctionByName("DrawRingLines");
core.addApiFunctionByName("DrawRectangle");
core.addApiFunctionByName("DrawRectangleV");
core.addApiFunctionByName("DrawRectangleRec");
core.addApiFunctionByName("DrawRectanglePro");
core.addApiFunctionByName("DrawRectangleGradientV");
core.addApiFunctionByName("DrawRectangleGradientH");
core.addApiFunctionByName("DrawRectangleGradientEx");
core.addApiFunctionByName("DrawRectangleLines");
core.addApiFunctionByName("DrawRectangleLinesEx");
core.addApiFunctionByName("DrawRectangleRounded");
core.addApiFunctionByName("DrawRectangleRoundedLines");
core.addApiFunctionByName("DrawTriangle");
core.addApiFunctionByName("DrawTriangleLines");
//core.addApiFunctionByName("DrawTriangleFan")
//core.addApiFunctionByName("DrawTriangleStrip")
core.addApiFunctionByName("DrawPoly");
core.addApiFunctionByName("DrawPolyLines");
core.addApiFunctionByName("DrawPolyLinesEx");
// Basic shapes collision detection functions
core.addApiFunctionByName("CheckCollisionRecs");
core.addApiFunctionByName("CheckCollisionCircles");
core.addApiFunctionByName("CheckCollisionCircleRec");
core.addApiFunctionByName("CheckCollisionPointRec");
core.addApiFunctionByName("CheckCollisionPointCircle");
core.addApiFunctionByName("CheckCollisionPointTriangle");
// core.addApiFunctionByName("CheckCollisionPointPoly")
// core.addApiFunctionByName("CheckCollisionLines")
core.addApiFunctionByName("CheckCollisionPointLine");
core.addApiFunctionByName("GetCollisionRec");
// Image loading functions
core.addApiFunctionByName("LoadImage");
core.addApiFunctionByName("LoadImageRaw");
// core.addApiFunctionByName("LoadImageAnim")
core.addApiFunctionByName("LoadImageFromMemory");
core.addApiFunctionByName("LoadImageFromTexture");
core.addApiFunctionByName("LoadImageFromScreen");
core.addApiFunctionByName("IsImageReady");
core.addApiFunctionByName("UnloadImage");
core.addApiFunctionByName("ExportImage");
// needed?
// core.addApiFunctionByName("ExportImageAsCode")
// Image generation functions
core.addApiFunctionByName("GenImageColor");
core.addApiFunctionByName("GenImageGradientV");
core.addApiFunctionByName("GenImageGradientH");
core.addApiFunctionByName("GenImageGradientRadial");
core.addApiFunctionByName("GenImageChecked");
core.addApiFunctionByName("GenImageWhiteNoise");
core.addApiFunctionByName("GenImagePerlinNoise");
core.addApiFunctionByName("GenImageCellular");
core.addApiFunctionByName("GenImageText");
// Image manipulations functions
core.addApiFunctionByName("ImageCopy");
core.addApiFunctionByName("ImageFromImage");
core.addApiFunctionByName("ImageText");
core.addApiFunctionByName("ImageTextEx");
core.addApiFunctionByName("ImageFormat");
core.addApiFunctionByName("ImageToPOT");
core.addApiFunctionByName("ImageCrop");
core.addApiFunctionByName("ImageAlphaCrop");
core.addApiFunctionByName("ImageAlphaClear");
core.addApiFunctionByName("ImageAlphaMask");
core.addApiFunctionByName("ImageAlphaPremultiply");
core.addApiFunctionByName("ImageBlurGaussian");
core.addApiFunctionByName("ImageResize");
core.addApiFunctionByName("ImageResizeNN");
core.addApiFunctionByName("ImageResizeCanvas");
core.addApiFunctionByName("ImageMipmaps");
core.addApiFunctionByName("ImageDither");
core.addApiFunctionByName("ImageFlipVertical");
core.addApiFunctionByName("ImageFlipHorizontal");
core.addApiFunctionByName("ImageRotateCW");
core.addApiFunctionByName("ImageRotateCCW");
core.addApiFunctionByName("ImageColorTint");
core.addApiFunctionByName("ImageColorInvert");
core.addApiFunctionByName("ImageColorGrayscale");
core.addApiFunctionByName("ImageColorContrast");
core.addApiFunctionByName("ImageColorBrightness");
core.addApiFunctionByName("ImageColorReplace");
const lic = apiDesc.getFunction("LoadImageColors");
lic.returnType = "unsigned char *";
core.addApiFunction(lic, null, { body: (gen) => {
gen.jsToC("Image", "image", "argv[0]", core.structLookup); gen.jsToC("Image", "image", "argv[0]", core.structLookup);
gen.call("LoadImageColors", ["image"], { name: "colors", type: "Color *" }); gen.call("LoadImageColors", ["image"], { name: "colors", type: "Color *" });
gen.statement("JSValue retVal = JS_NewArrayBufferCopy(ctx, (const uint8_t*)colors, image.width*image.height*sizeof(Color))"); gen.statement("JSValue retVal = JS_NewArrayBufferCopy(ctx, (const uint8_t*)colors, image.width*image.height*sizeof(Color))");
gen.call("UnloadImageColors", ["colors"]); gen.call("UnloadImageColors", ["colors"]);
gen.returnExp("retVal"); gen.returnExp("retVal");
} }); }
//core.addApiFunctionByName("LoadImagePalette") };
//core.addApiFunctionByName("UnloadImageColors") ignore("LoadImagePalette");
//core.addApiFunctionByName("UnloadImagePalette") ignore("UnloadImageColors");
core.addApiFunctionByName("GetImageAlphaBorder"); ignore("UnloadImagePalette");
core.addApiFunctionByName("GetImageColor"); ignore("GetPixelColor");
// Image drawing functions ignore("SetPixelColor");
core.addApiFunctionByName("ImageClearBackground"); const lfx = getFunction(api.functions, "LoadFontEx");
core.addApiFunctionByName("ImageDrawPixel"); lfx.params[2].binding = { ignore: true };
core.addApiFunctionByName("ImageDrawPixelV"); lfx.params[3].binding = { ignore: true };
core.addApiFunctionByName("ImageDrawLine"); lfx.binding = { customizeCall: "Font returnVal = LoadFontEx(fileName, fontSize, NULL, 0);" };
core.addApiFunctionByName("ImageDrawLineV"); ignore("LoadFontFromMemory");
core.addApiFunctionByName("ImageDrawCircle"); ignore("LoadFontData");
core.addApiFunctionByName("ImageDrawCircleV"); ignore("GenImageFontAtlas");
core.addApiFunctionByName("ImageDrawCircleLines"); ignore("UnloadFontData");
core.addApiFunctionByName("ImageDrawCircleLinesV"); ignore("ExportFontAsCode");
core.addApiFunctionByName("ImageDrawRectangle"); ignore("DrawTextCodepoints");
core.addApiFunctionByName("ImageDrawRectangleV"); ignore("GetGlyphInfo");
core.addApiFunctionByName("ImageDrawRectangleRec"); ignore("LoadUTF8");
core.addApiFunctionByName("ImageDrawRectangleLines"); ignore("UnloadUTF8");
core.addApiFunctionByName("ImageDraw"); ignore("LoadCodepoints");
core.addApiFunctionByName("ImageDrawText"); ignore("UnloadCodepoints");
core.addApiFunctionByName("ImageDrawTextEx"); ignore("GetCodepointCount");
// Texture loading functions ignore("GetCodepoint");
core.addApiFunctionByName("LoadTexture"); ignore("GetCodepointNext");
core.addApiFunctionByName("LoadTextureFromImage"); ignore("GetCodepointPrevious");
core.addApiFunctionByName("LoadTextureCubemap"); ignore("CodepointToUTF8");
core.addApiFunctionByName("LoadRenderTexture");
core.addApiFunctionByName("IsTextureReady");
core.addApiFunctionByName("UnloadTexture");
core.addApiFunctionByName("IsRenderTextureReady");
core.addApiFunctionByName("UnloadRenderTexture");
core.addApiFunctionByName("UpdateTexture");
core.addApiFunctionByName("UpdateTextureRec");
// Texture configuration functions
core.addApiFunctionByName("GenTextureMipmaps");
core.addApiFunctionByName("SetTextureFilter");
core.addApiFunctionByName("SetTextureWrap");
// Texture drawing functions
core.addApiFunctionByName("DrawTexture");
core.addApiFunctionByName("DrawTextureV");
core.addApiFunctionByName("DrawTextureEx");
core.addApiFunctionByName("DrawTextureRec");
core.addApiFunctionByName("DrawTexturePro");
core.addApiFunctionByName("DrawTextureNPatch");
// Color/pixel related functions
core.addApiFunctionByName("Fade");
core.addApiFunctionByName("ColorToInt");
core.addApiFunctionByName("ColorNormalize");
core.addApiFunctionByName("ColorFromNormalized");
core.addApiFunctionByName("ColorToHSV");
core.addApiFunctionByName("ColorFromHSV");
core.addApiFunctionByName("ColorTint");
core.addApiFunctionByName("ColorBrightness");
core.addApiFunctionByName("ColorContrast");
core.addApiFunctionByName("ColorAlpha");
core.addApiFunctionByName("ColorAlphaBlend");
core.addApiFunctionByName("GetColor");
// core.addApiFunctionByName("GetPixelColor")
// core.addApiFunctionByName("SetPixelColor")
core.addApiFunctionByName("GetPixelDataSize");
// module: rtext
// Font loading/unloading
core.addApiFunctionByName("GetFontDefault");
core.addApiFunctionByName("LoadFont");
const lfx = apiDesc.getFunction("LoadFontEx");
lfx?.params.pop();
lfx?.params.pop();
core.addApiFunction(lfx, null, { customizeCall: "Font returnVal = LoadFontEx(fileName, fontSize, NULL, 0);" });
core.addApiFunctionByName("LoadFontFromImage");
// core.addApiFunctionByName("LoadFontFromMemory")
core.addApiFunctionByName("IsFontReady");
// core.addApiFunctionByName("LoadFontData")
// core.addApiFunctionByName("GenImageFontAtlas")
// core.addApiFunctionByName("UnloadFontData")
core.addApiFunctionByName("UnloadFont");
// core.addApiFunctionByName("ExportFontAsCode")
// Text drawing functions
core.addApiFunctionByName("DrawFPS");
core.addApiFunctionByName("DrawText");
core.addApiFunctionByName("DrawTextEx");
core.addApiFunctionByName("DrawTextPro");
core.addApiFunctionByName("DrawTextCodepoint");
//core.addApiFunctionByName("DrawTextCodepoints")
// Text font info functions
core.addApiFunctionByName("MeasureText");
core.addApiFunctionByName("MeasureTextEx");
core.addApiFunctionByName("GetGlyphIndex");
// core.addApiFunctionByName("GetGlyphInfo")
core.addApiFunctionByName("GetGlyphAtlasRec");
// Text codepoints management functions (unicode characters)
// Is this needed?
// core.addApiFunctionByName("LoadUTF8")
// core.addApiFunctionByName("UnloadUTF8")
// core.addApiFunctionByName("LoadCodepoints")
// core.addApiFunctionByName("UnloadCodepoints")
// core.addApiFunctionByName("GetCodepointCount")
// core.addApiFunctionByName("GetCodepoint")
// core.addApiFunctionByName("GetCodepointNext")
// core.addApiFunctionByName("GetCodepointPrevious")
// core.addApiFunctionByName("CodepointToUTF8")
// Text strings management functions (no UTF-8 strings, only byte chars)
// Not supported, use JS Stdlib instead // Not supported, use JS Stdlib instead
// module: rmodels api.functions.filter(x => x.name.startsWith("Text")).forEach(x => ignore(x.name));
// Basic geometric 3D shapes drawing functions ignore("DrawTriangleStrip3D");
core.addApiFunctionByName("DrawLine3D"); ignore("LoadMaterials");
core.addApiFunctionByName("DrawPoint3D"); ignore("LoadModelAnimations");
core.addApiFunctionByName("DrawCircle3D"); ignore("UpdateModelAnimation");
core.addApiFunctionByName("DrawTriangle3D"); ignore("UnloadModelAnimation");
//core.addApiFunctionByName("DrawTriangleStrip3D") ignore("UnloadModelAnimations");
core.addApiFunctionByName("DrawCube"); ignore("IsModelAnimationValid");
core.addApiFunctionByName("DrawCubeV"); ignore("ExportWaveAsCode");
core.addApiFunctionByName("DrawCubeWires");
core.addApiFunctionByName("DrawCubeWiresV");
core.addApiFunctionByName("DrawSphere");
core.addApiFunctionByName("DrawSphereEx");
core.addApiFunctionByName("DrawSphereWires");
core.addApiFunctionByName("DrawCylinder");
core.addApiFunctionByName("DrawCylinderEx");
core.addApiFunctionByName("DrawCylinderWires");
core.addApiFunctionByName("DrawCylinderWiresEx");
core.addApiFunctionByName("DrawCapsule");
core.addApiFunctionByName("DrawCapsuleWires");
core.addApiFunctionByName("DrawPlane");
core.addApiFunctionByName("DrawRay");
core.addApiFunctionByName("DrawGrid");
// model management functions
core.addApiFunctionByName("LoadModel");
core.addApiFunctionByName("LoadModelFromMesh");
core.addApiFunctionByName("IsModelReady");
core.addApiFunctionByName("UnloadModel");
core.addApiFunctionByName("GetModelBoundingBox");
// model drawing functions
core.addApiFunctionByName("DrawModel");
core.addApiFunctionByName("DrawModelEx");
core.addApiFunctionByName("DrawModelWires");
core.addApiFunctionByName("DrawModelWiresEx");
core.addApiFunctionByName("DrawBoundingBox");
core.addApiFunctionByName("DrawBillboard");
core.addApiFunctionByName("DrawBillboardRec");
core.addApiFunctionByName("DrawBillboardPro");
// Mesh management functions
core.addApiFunctionByName("UploadMesh");
core.addApiFunctionByName("UpdateMeshBuffer");
core.addApiFunctionByName("UnloadMesh");
core.addApiFunctionByName("DrawMesh");
core.addApiFunctionByName("DrawMeshInstanced");
core.addApiFunctionByName("ExportMesh");
core.addApiFunctionByName("GetMeshBoundingBox");
core.addApiFunctionByName("GenMeshTangents");
// Mesh generation functions
core.addApiFunctionByName("GenMeshPoly");
core.addApiFunctionByName("GenMeshPlane");
core.addApiFunctionByName("GenMeshCube");
core.addApiFunctionByName("GenMeshSphere");
core.addApiFunctionByName("GenMeshHemiSphere");
core.addApiFunctionByName("GenMeshCylinder");
core.addApiFunctionByName("GenMeshCone");
core.addApiFunctionByName("GenMeshTorus");
core.addApiFunctionByName("GenMeshKnot");
core.addApiFunctionByName("GenMeshHeightmap");
core.addApiFunctionByName("GenMeshCubicmap");
// Material loading/unloading functions
// core.addApiFunctionByName("LoadMaterials")
core.addApiFunctionByName("LoadMaterialDefault");
core.addApiFunctionByName("IsMaterialReady");
core.addApiFunctionByName("UnloadMaterial");
core.addApiFunctionByName("SetMaterialTexture");
core.addApiFunctionByName("SetModelMaterial");
core.addApiFunctionByName("SetModelMeshMaterial");
// Model animations loading/unloading functions
// core.addApiFunctionByName("LoadModelAnimations")
// core.addApiFunctionByName("UpdateModelAnimation")
// core.addApiFunctionByName("UnloadModelAnimation")
// core.addApiFunctionByName("UnloadModelAnimations")
// core.addApiFunctionByName("IsModelAnimationValid")
// Collision detection functions
core.addApiFunctionByName("CheckCollisionSpheres");
core.addApiFunctionByName("CheckCollisionBoxes");
core.addApiFunctionByName("CheckCollisionBoxSphere");
core.addApiFunctionByName("GetRayCollisionSphere");
core.addApiFunctionByName("GetRayCollisionBox");
core.addApiFunctionByName("GetRayCollisionMesh");
core.addApiFunctionByName("GetRayCollisionTriangle");
core.addApiFunctionByName("GetRayCollisionQuad");
// module: raudio
// Audio device management functions
core.addApiFunctionByName("InitAudioDevice");
core.addApiFunctionByName("CloseAudioDevice");
core.addApiFunctionByName("IsAudioDeviceReady");
core.addApiFunctionByName("SetMasterVolume");
// Wave/Sound loading/unloading functions
core.addApiFunctionByName("LoadWave");
core.addApiFunctionByName("LoadWaveFromMemory");
core.addApiFunctionByName("IsWaveReady");
core.addApiFunctionByName("LoadSound");
core.addApiFunctionByName("LoadSoundFromWave");
core.addApiFunctionByName("IsSoundReady");
core.addApiFunctionByName("UpdateSound");
core.addApiFunctionByName("UnloadWave");
core.addApiFunctionByName("UnloadSound");
core.addApiFunctionByName("ExportWave");
// core.addApiFunctionByName("ExportWaveAsCode")
// Wave/Sound management functions // Wave/Sound management functions
core.addApiFunctionByName("PlaySound"); ignore("LoadWaveSamples");
core.addApiFunctionByName("StopSound"); ignore("UnloadWaveSamples");
core.addApiFunctionByName("PauseSound"); ignore("LoadMusicStreamFromMemory");
core.addApiFunctionByName("ResumeSound"); ignore("LoadAudioStream");
core.addApiFunctionByName("IsSoundPlaying"); ignore("IsAudioStreamReady");
core.addApiFunctionByName("SetSoundVolume"); ignore("UnloadAudioStream");
core.addApiFunctionByName("SetSoundPitch"); ignore("UpdateAudioStream");
core.addApiFunctionByName("SetSoundPan"); ignore("IsAudioStreamProcessed");
core.addApiFunctionByName("WaveCopy"); ignore("PlayAudioStream");
core.addApiFunctionByName("WaveCrop"); ignore("PauseAudioStream");
core.addApiFunctionByName("WaveFormat"); ignore("ResumeAudioStream");
// core.addApiFunctionByName("LoadWaveSamples") ignore("IsAudioStreamPlaying");
// core.addApiFunctionByName("UnloadWaveSamples") ignore("StopAudioStream");
// Music management functions ignore("SetAudioStreamVolume");
core.addApiFunctionByName("LoadMusicStream"); ignore("SetAudioStreamPitch");
// core.addApiFunctionByName("LoadMusicStreamFromMemory") ignore("SetAudioStreamPan");
core.addApiFunctionByName("IsMusicReady"); ignore("SetAudioStreamBufferSizeDefault");
core.addApiFunctionByName("UnloadMusicStream"); ignore("SetAudioStreamCallback");
core.addApiFunctionByName("PlayMusicStream"); ignore("AttachAudioStreamProcessor");
core.addApiFunctionByName("IsMusicStreamPlaying"); ignore("DetachAudioStreamProcessor");
core.addApiFunctionByName("UpdateMusicStream"); ignore("AttachAudioMixedProcessor");
core.addApiFunctionByName("StopMusicStream"); ignore("DetachAudioMixedProcessor");
core.addApiFunctionByName("PauseMusicStream"); ignore("Vector3OrthoNormalize");
core.addApiFunctionByName("ResumeMusicStream"); ignore("Vector3ToFloatV");
core.addApiFunctionByName("SeekMusicStream"); ignore("MatrixToFloatV");
core.addApiFunctionByName("SetMusicVolume"); ignore("QuaternionToAxisAngle");
core.addApiFunctionByName("SetMusicPitch");
core.addApiFunctionByName("SetMusicPan");
core.addApiFunctionByName("GetMusicTimeLength");
core.addApiFunctionByName("GetMusicTimePlayed");
// AudioStream management functions
// core.addApiFunctionByName("LoadAudioStream")
// core.addApiFunctionByName("IsAudioStreamReady")
// core.addApiFunctionByName("UnloadAudioStream")
// core.addApiFunctionByName("UpdateAudioStream")
// core.addApiFunctionByName("IsAudioStreamProcessed")
// core.addApiFunctionByName("PlayAudioStream")
// core.addApiFunctionByName("PauseAudioStream")
// core.addApiFunctionByName("ResumeAudioStream")
// core.addApiFunctionByName("IsAudioStreamPlaying")
// core.addApiFunctionByName("StopAudioStream")
// core.addApiFunctionByName("SetAudioStreamVolume")
// core.addApiFunctionByName("SetAudioStreamPitch")
// core.addApiFunctionByName("SetAudioStreamPan")
// core.addApiFunctionByName("SetAudioStreamBufferSizeDefault")
// core.addApiFunctionByName("SetAudioStreamCallback")
// core.addApiFunctionByName("AttachAudioStreamProcessor")
// core.addApiFunctionByName("DetachAudioStreamProcessor")
// core.addApiFunctionByName("AttachAudioMixedProcessor")
// core.addApiFunctionByName("DetachAudioMixedProcessor")
// module: raymath
core.addApiFunctionByName("Clamp");
core.addApiFunctionByName("Lerp");
core.addApiFunctionByName("Normalize");
core.addApiFunctionByName("Remap");
core.addApiFunctionByName("Wrap");
core.addApiFunctionByName("FloatEquals");
core.addApiFunctionByName("Vector2Zero");
core.addApiFunctionByName("Vector2One");
core.addApiFunctionByName("Vector2Add");
core.addApiFunctionByName("Vector2AddValue");
core.addApiFunctionByName("Vector2Subtract");
core.addApiFunctionByName("Vector2SubtractValue");
core.addApiFunctionByName("Vector2Length");
core.addApiFunctionByName("Vector2LengthSqr");
core.addApiFunctionByName("Vector2DotProduct");
core.addApiFunctionByName("Vector2Distance");
core.addApiFunctionByName("Vector2DistanceSqr");
core.addApiFunctionByName("Vector2Angle");
core.addApiFunctionByName("Vector2LineAngle");
core.addApiFunctionByName("Vector2Scale");
core.addApiFunctionByName("Vector2Multiply");
core.addApiFunctionByName("Vector2Negate");
core.addApiFunctionByName("Vector2Divide");
core.addApiFunctionByName("Vector2Normalize");
core.addApiFunctionByName("Vector2Transform");
core.addApiFunctionByName("Vector2Lerp");
core.addApiFunctionByName("Vector2Reflect");
core.addApiFunctionByName("Vector2Rotate");
core.addApiFunctionByName("Vector2MoveTowards");
core.addApiFunctionByName("Vector2Invert");
core.addApiFunctionByName("Vector2Clamp");
core.addApiFunctionByName("Vector2ClampValue");
core.addApiFunctionByName("Vector2Equals");
core.addApiFunctionByName("Vector3Zero");
core.addApiFunctionByName("Vector3One");
core.addApiFunctionByName("Vector3Add");
core.addApiFunctionByName("Vector3AddValue");
core.addApiFunctionByName("Vector3Subtract");
core.addApiFunctionByName("Vector3SubtractValue");
core.addApiFunctionByName("Vector3Scale");
core.addApiFunctionByName("Vector3Multiply");
core.addApiFunctionByName("Vector3CrossProduct");
core.addApiFunctionByName("Vector3Perpendicular");
core.addApiFunctionByName("Vector3Length");
core.addApiFunctionByName("Vector3LengthSqr");
core.addApiFunctionByName("Vector3DotProduct");
core.addApiFunctionByName("Vector3Distance");
core.addApiFunctionByName("Vector3DistanceSqr");
core.addApiFunctionByName("Vector3Angle");
core.addApiFunctionByName("Vector3Negate");
core.addApiFunctionByName("Vector3Divide");
core.addApiFunctionByName("Vector3Normalize");
//core.addApiFunctionByName("Vector3OrthoNormalize")
core.addApiFunctionByName("Vector3Transform");
core.addApiFunctionByName("Vector3RotateByQuaternion");
core.addApiFunctionByName("Vector3RotateByAxisAngle");
core.addApiFunctionByName("Vector3Lerp");
core.addApiFunctionByName("Vector3Reflect");
core.addApiFunctionByName("Vector3Min");
core.addApiFunctionByName("Vector3Max");
core.addApiFunctionByName("Vector3Barycenter");
core.addApiFunctionByName("Vector3Unproject");
//core.addApiFunctionByName("Vector3ToFloatV")
core.addApiFunctionByName("Vector3Invert");
core.addApiFunctionByName("Vector3Clamp");
core.addApiFunctionByName("Vector3ClampValue");
core.addApiFunctionByName("Vector3Equals");
core.addApiFunctionByName("Vector3Refract");
core.addApiFunctionByName("MatrixDeterminant");
core.addApiFunctionByName("MatrixTrace");
core.addApiFunctionByName("MatrixTranspose");
core.addApiFunctionByName("MatrixInvert");
core.addApiFunctionByName("MatrixIdentity");
core.addApiFunctionByName("MatrixAdd");
core.addApiFunctionByName("MatrixSubtract");
core.addApiFunctionByName("MatrixMultiply");
core.addApiFunctionByName("MatrixTranslate");
core.addApiFunctionByName("MatrixRotate");
core.addApiFunctionByName("MatrixRotateX");
core.addApiFunctionByName("MatrixRotateY");
core.addApiFunctionByName("MatrixRotateZ");
core.addApiFunctionByName("MatrixRotateXYZ");
core.addApiFunctionByName("MatrixRotateZYX");
core.addApiFunctionByName("MatrixScale");
core.addApiFunctionByName("MatrixFrustum");
core.addApiFunctionByName("MatrixPerspective");
core.addApiFunctionByName("MatrixOrtho");
core.addApiFunctionByName("MatrixLookAt");
//core.addApiFunctionByName("MatrixToFloatV")
core.addApiFunctionByName("QuaternionAdd");
core.addApiFunctionByName("QuaternionAddValue");
core.addApiFunctionByName("QuaternionSubtract");
core.addApiFunctionByName("QuaternionSubtractValue");
core.addApiFunctionByName("QuaternionIdentity");
core.addApiFunctionByName("QuaternionLength");
core.addApiFunctionByName("QuaternionNormalize");
core.addApiFunctionByName("QuaternionInvert");
core.addApiFunctionByName("QuaternionMultiply");
core.addApiFunctionByName("QuaternionScale");
core.addApiFunctionByName("QuaternionDivide");
core.addApiFunctionByName("QuaternionLerp");
core.addApiFunctionByName("QuaternionNlerp");
core.addApiFunctionByName("QuaternionSlerp");
core.addApiFunctionByName("QuaternionFromVector3ToVector3");
core.addApiFunctionByName("QuaternionFromMatrix");
core.addApiFunctionByName("QuaternionToMatrix");
core.addApiFunctionByName("QuaternionFromAxisAngle");
//core.addApiFunctionByName("QuaternionToAxisAngle")
core.addApiFunctionByName("QuaternionFromEuler");
core.addApiFunctionByName("QuaternionToEuler");
core.addApiFunctionByName("QuaternionTransform");
core.addApiFunctionByName("QuaternionEquals");
core.exportGlobalConstant("DEG2RAD", "(PI/180.0)"); core.exportGlobalConstant("DEG2RAD", "(PI/180.0)");
core.exportGlobalConstant("RAD2DEG", "(180.0/PI)"); core.exportGlobalConstant("RAD2DEG", "(180.0/PI)");
// module: rcamera ignore("GuiDropdownBox");
core.addApiFunctionByName("GetCameraForward"); ignore("GuiSpinner");
core.addApiFunctionByName("GetCameraUp"); ignore("GuiValueBox");
core.addApiFunctionByName("GetCameraRight"); ignore("GuiListView");
core.addApiFunctionByName("CameraMoveForward"); ignore("GuiListViewEx");
core.addApiFunctionByName("CameraMoveUp"); ignore("GuiTextInputBox");
core.addApiFunctionByName("CameraMoveRight"); ignore("GuiGetIcons");
core.addApiFunctionByName("CameraMoveToTarget"); ignore("GuiTabBar");
core.addApiFunctionByName("CameraYaw"); ignore("GuiLoadIcons");
core.addApiFunctionByName("CameraPitch");
core.addApiFunctionByName("CameraRoll");
core.addApiFunctionByName("GetCameraViewMatrix");
core.addApiFunctionByName("GetCameraProjectionMatrix");
// module: rgui
core.addApiFunctionByName("GuiEnable");
core.addApiFunctionByName("GuiDisable");
core.addApiFunctionByName("GuiLock");
core.addApiFunctionByName("GuiUnlock");
core.addApiFunctionByName("GuiIsLocked");
core.addApiFunctionByName("GuiFade");
core.addApiFunctionByName("GuiSetState");
core.addApiFunctionByName("GuiGetState");
core.addApiFunctionByName("GuiSetFont");
core.addApiFunctionByName("GuiGetFont");
core.addApiFunctionByName("GuiSetStyle");
core.addApiFunctionByName("GuiGetStyle");
core.addApiFunctionByName("GuiWindowBox");
core.addApiFunctionByName("GuiGroupBox");
core.addApiFunctionByName("GuiLine");
core.addApiFunctionByName("GuiPanel");
core.addApiFunctionByName("GuiScrollPanel");
core.addApiFunctionByName("GuiLabel");
core.addApiFunctionByName("GuiButton");
core.addApiFunctionByName("GuiLabelButton");
core.addApiFunctionByName("GuiToggle");
core.addApiFunctionByName("GuiToggleGroup");
core.addApiFunctionByName("GuiCheckBox");
core.addApiFunctionByName("GuiComboBox");
//core.addApiFunctionByName("GuiDropdownBox")
//core.addApiFunctionByName("GuiSpinner")
//core.addApiFunctionByName("GuiValueBox")
core.addApiFunctionByName("GuiTextBox");
//core.addApiFunctionByName("GuiTextBoxMulti")
core.addApiFunctionByName("GuiSlider");
core.addApiFunctionByName("GuiSliderBar");
core.addApiFunctionByName("GuiProgressBar");
core.addApiFunctionByName("GuiStatusBar");
core.addApiFunctionByName("GuiDummyRec");
core.addApiFunctionByName("GuiGrid");
//core.addApiFunctionByName("GuiListView")
//core.addApiFunctionByName("GuiListViewEx")
core.addApiFunctionByName("GuiMessageBox");
//core.addApiFunctionByName("GuiTextInputBox")
core.addApiFunctionByName("GuiColorPicker");
core.addApiFunctionByName("GuiColorPanel");
core.addApiFunctionByName("GuiColorBarAlpha");
core.addApiFunctionByName("GuiColorBarHue");
core.addApiFunctionByName("GuiLoadStyle");
core.addApiFunctionByName("GuiLoadStyleDefault");
core.addApiFunctionByName("GuiIconText");
core.addApiFunctionByName("GuiDrawIcon");
//core.addApiFunctionByName("GuiGetIcons")
//core.addApiFunctionByName("GuiGetIconData")
//core.addApiFunctionByName("GuiSetIconData")
core.addApiFunctionByName("GuiSetIconScale");
// module: rlights
// TODO: Parse and support light struct // TODO: Parse and support light struct
// core.addApiFunctionByName("CreateLight") ignore("CreateLight");
// core.addApiFunctionByName("UpdateLightValues") ignore("UpdateLightValues");
// module: reasings api.structs.forEach(x => core.addApiStruct(x));
core.addApiFunctionByName("EaseLinearNone"); api.functions.forEach(x => core.addApiFunction(x));
core.addApiFunctionByName("EaseLinearIn");
core.addApiFunctionByName("EaseLinearOut");
core.addApiFunctionByName("EaseLinearInOut");
core.addApiFunctionByName("EaseSineIn");
core.addApiFunctionByName("EaseSineOut");
core.addApiFunctionByName("EaseSineInOut");
core.addApiFunctionByName("EaseCircIn");
core.addApiFunctionByName("EaseCircOut");
core.addApiFunctionByName("EaseCircInOut");
core.addApiFunctionByName("EaseCubicIn");
core.addApiFunctionByName("EaseCubicOut");
core.addApiFunctionByName("EaseCubicInOut");
core.addApiFunctionByName("EaseQuadIn");
core.addApiFunctionByName("EaseQuadOut");
core.addApiFunctionByName("EaseQuadInOut");
core.addApiFunctionByName("EaseExpoIn");
core.addApiFunctionByName("EaseExpoOut");
core.addApiFunctionByName("EaseExpoInOut");
core.addApiFunctionByName("EaseBackIn");
core.addApiFunctionByName("EaseBounceOut");
core.addApiFunctionByName("EaseBounceInOut");
core.addApiFunctionByName("EaseElasticIn");
api.defines.filter(x => x.type === "COLOR").map(x => ({ name: x.name, description: x.description, values: (x.value.match(/\{([^}]+)\}/) || "")[1].split(',').map(x => x.trim()) })).forEach(x => { api.defines.filter(x => x.type === "COLOR").map(x => ({ name: x.name, description: x.description, values: (x.value.match(/\{([^}]+)\}/) || "")[1].split(',').map(x => x.trim()) })).forEach(x => {
core.exportGlobalStruct("Color", x.name, x.values, x.description); core.exportGlobalStruct("Color", x.name, x.values, x.description);
}); });
core.addAllEnums(); api.enums.forEach(x => core.addEnum(x));
// api.enums.find(x => x.name === "KeyboardKey")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "MouseButton")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "ConfigFlags")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "BlendMode")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "TraceLogLevel")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "MouseCursor")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "PixelFormat")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "CameraProjection")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "CameraMode")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "ShaderLocationIndex")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "ShaderUniformDataType")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
// api.enums.find(x => x.name === "MaterialMapIndex")?.values.forEach(x => core.exportGlobalConstant(x.name, x.description))
core.exportGlobalConstant("MATERIAL_MAP_DIFFUSE", "Albedo material (same as: MATERIAL_MAP_DIFFUSE"); core.exportGlobalConstant("MATERIAL_MAP_DIFFUSE", "Albedo material (same as: MATERIAL_MAP_DIFFUSE");
core.exportGlobalConstant("MATERIAL_MAP_SPECULAR", "Metalness material (same as: MATERIAL_MAP_SPECULAR)"); core.exportGlobalConstant("MATERIAL_MAP_SPECULAR", "Metalness material (same as: MATERIAL_MAP_SPECULAR)");
core.writeTo("src/bindings/js_raylib_core.h"); core.writeTo("src/bindings/js_raylib_core.h");
core.typings.writeTo("examples/lib.raylib.d.ts"); core.typings.writeTo("examples/lib.raylib.d.ts");
const ignored = api.functions.filter(x => x.binding?.ignore).length;
console.log(`Converted ${api.functions.length - ignored} function. ${ignored} ignored`);
console.log("Success!");
} }
main(); main();

File diff suppressed because it is too large Load Diff