mirror of https://github.com/mode777/rayjs.git
				
				
				
			Refactor binding generation
This commit is contained in:
		
							parent
							
								
									1947483541
								
							
						
					
					
						commit
						8049204120
					
				| 
						 | 
					@ -1,49 +0,0 @@
 | 
				
			||||||
import { RayLibApi, RayLibFunction, RayLibStruct, RayLibType } from "./interfaces"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export class ApiFunction{
 | 
					 | 
				
			||||||
    constructor(private api: RayLibFunction){
 | 
					 | 
				
			||||||
        api.params = api.params || []
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    get name() { return this.api.name }
 | 
					 | 
				
			||||||
    get argc() { return this.api.params?.length || 0 }
 | 
					 | 
				
			||||||
    get params() { return this.api.params || [] }
 | 
					 | 
				
			||||||
    get returnType() { return this.api.returnType }
 | 
					 | 
				
			||||||
    set returnType(v) { this.api.returnType = v }
 | 
					 | 
				
			||||||
    get description() { return this.api.description }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export class ApiStruct{
 | 
					 | 
				
			||||||
    constructor(private api: RayLibStruct){
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    get name() { return this.api.name }
 | 
					 | 
				
			||||||
    get fields() { return this.api.fields || [] }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export class ApiDescription{
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    constructor(private api: RayLibApi){
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    getAliases(name: string) {
 | 
					 | 
				
			||||||
        return this.api.aliases.filter(x => x.type === name).map(x => x.name)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    getFunction(name: string){
 | 
					 | 
				
			||||||
        const f = this.api.functions.find(x => x.name === name) 
 | 
					 | 
				
			||||||
        if(!f) return null
 | 
					 | 
				
			||||||
        return new ApiFunction(f)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    getStruct(name: string){
 | 
					 | 
				
			||||||
        const s = this.api.structs.find(x => x.name === name)
 | 
					 | 
				
			||||||
        if(!s) return null
 | 
					 | 
				
			||||||
        return new ApiStruct(s)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    getEnums(){
 | 
					 | 
				
			||||||
        return this.api.enums
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,21 +1,26 @@
 | 
				
			||||||
import { readFileSync, writeFileSync } from "fs";
 | 
					import { readFileSync, writeFileSync } from "fs";
 | 
				
			||||||
import { RayLibApi, RayLibFunction, RayLibType } from "./interfaces";
 | 
					import { RayLibApi, RayLibFunction, RayLibStruct } from "./interfaces";
 | 
				
			||||||
import { ApiDescription, ApiFunction } from "./api";
 | 
					 | 
				
			||||||
import { RayLibHeader } from "./raylib-header";
 | 
					import { RayLibHeader } from "./raylib-header";
 | 
				
			||||||
import { HeaderParser } from "./header-parser";
 | 
					import { HeaderParser } from "./header-parser";
 | 
				
			||||||
 | 
					import { RayLibAlias } from "./interfaces";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function getFunction(funList: RayLibFunction[], name: string){
 | 
				
			||||||
 | 
					    return funList.find(x => x.name === name) 
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function getStruct(strList: RayLibStruct[], name: string){
 | 
				
			||||||
 | 
					    return strList.find(x => x.name === name) 
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function getAliases(aliasList: RayLibAlias[], name: string) {
 | 
				
			||||||
 | 
					    return aliasList.filter(x => x.type === name).map(x => x.name)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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'))
 | 
					    const api = <RayLibApi>JSON.parse(readFileSync("thirdparty/raylib/parser/output/raylib_api.json", 'utf8'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    api.functions.push({
 | 
					 | 
				
			||||||
        name: "SetModelMaterial",
 | 
					 | 
				
			||||||
        description: "Replace material in slot materialIndex",
 | 
					 | 
				
			||||||
        returnType: "void",
 | 
					 | 
				
			||||||
        params: [{type: "Model *",name:"model"},{type:"int",name:"materialIndex"},{type:"Material",name:"material"}]
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const parser = new HeaderParser()
 | 
					    const parser = new HeaderParser()
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    const rmathHeader = readFileSync("thirdparty/raylib/src/raymath.h","utf8");
 | 
					    const rmathHeader = readFileSync("thirdparty/raylib/src/raymath.h","utf8");
 | 
				
			||||||
| 
						 | 
					@ -40,12 +45,18 @@ function main(){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const reasingsHeader = readFileSync("include/reasings.h","utf8");
 | 
					    const reasingsHeader = readFileSync("include/reasings.h","utf8");
 | 
				
			||||||
    const reasingsFunctions = parser.parseFunctions(reasingsHeader);
 | 
					    const reasingsFunctions = parser.parseFunctions(reasingsHeader);
 | 
				
			||||||
    //reasingsFunctions.forEach(x => console.log(`core.addApiFunctionByName("${x.name}")`))
 | 
					 | 
				
			||||||
    reasingsFunctions.forEach(x => api.functions.push(x))
 | 
					    reasingsFunctions.forEach(x => api.functions.push(x))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const apiDesc = new ApiDescription(api)
 | 
					    // Custom Rayjs functions
 | 
				
			||||||
 | 
					    api.functions.push({
 | 
				
			||||||
 | 
					        name: "SetModelMaterial",
 | 
				
			||||||
 | 
					        description: "Replace material in slot materialIndex",
 | 
				
			||||||
 | 
					        returnType: "void",
 | 
				
			||||||
 | 
					        params: [{type: "Model *",name:"model"},{type:"int",name:"materialIndex"},{type:"Material",name:"material"}]
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    const core = new RayLibHeader("raylib_core", apiDesc)
 | 
					    // Define a new header
 | 
				
			||||||
 | 
					    const core = new RayLibHeader("raylib_core")
 | 
				
			||||||
    core.includes.include("raymath.h")
 | 
					    core.includes.include("raymath.h")
 | 
				
			||||||
    core.includes.include("rcamera.h")
 | 
					    core.includes.include("rcamera.h")
 | 
				
			||||||
    core.includes.line("#define RAYGUI_IMPLEMENTATION")
 | 
					    core.includes.line("#define RAYGUI_IMPLEMENTATION")
 | 
				
			||||||
| 
						 | 
					@ -54,7 +65,7 @@ function main(){
 | 
				
			||||||
    core.includes.include("rlights.h")
 | 
					    core.includes.include("rlights.h")
 | 
				
			||||||
    core.includes.include("reasings.h")
 | 
					    core.includes.include("reasings.h")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    core.addApiStructByName("Color", {
 | 
					    getStruct(api.structs, "Color")!.binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            r: { get: true, set: true },
 | 
					            r: { get: true, set: true },
 | 
				
			||||||
            g: { get: true, set: true },
 | 
					            g: { get: true, set: true },
 | 
				
			||||||
| 
						 | 
					@ -62,8 +73,8 @@ function main(){
 | 
				
			||||||
            a: { get: true, set: true },
 | 
					            a: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("Rectangle", {
 | 
					    getStruct(api.structs, "Rectangle")!.binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            x: { get: true, set: true },
 | 
					            x: { get: true, set: true },
 | 
				
			||||||
            y: { get: true, set: true },
 | 
					            y: { get: true, set: true },
 | 
				
			||||||
| 
						 | 
					@ -71,39 +82,40 @@ function main(){
 | 
				
			||||||
            height: { get: true, set: true },
 | 
					            height: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true
 | 
				
			||||||
    })
 | 
					    }    
 | 
				
			||||||
    core.addApiStructByName("Vector2", {
 | 
					    getStruct(api.structs, "Vector2")!.binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            x: { get: true, set: true },
 | 
					            x: { get: true, set: true },
 | 
				
			||||||
            y: { get: true, set: true },
 | 
					            y: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("Vector3", {
 | 
					    getStruct(api.structs, "Vector3")!.binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            x: { get: true, set: true },
 | 
					            x: { get: true, set: true },
 | 
				
			||||||
            y: { get: true, set: true },
 | 
					            y: { get: true, set: true },
 | 
				
			||||||
            z: { get: true, set: true },
 | 
					            z: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("Vector4", {
 | 
					    getStruct(api.structs, "Vector4")!.binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            x: { get: true, set: true },
 | 
					            x: { get: true, set: true },
 | 
				
			||||||
            y: { get: true, set: true },
 | 
					            y: { get: true, set: true },
 | 
				
			||||||
            z: { get: true, set: true },
 | 
					            z: { get: true, set: true },
 | 
				
			||||||
            w: { get: true, set: true },
 | 
					            w: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true,
 | 
				
			||||||
    })
 | 
					        aliases: getAliases(api.aliases, "Vector4")
 | 
				
			||||||
    core.addApiStructByName("Ray", {
 | 
					    }
 | 
				
			||||||
 | 
					    getStruct(api.structs, "Ray")!.binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            position: { get: false, set: true },
 | 
					            position: { get: false, set: true },
 | 
				
			||||||
            direction: { get: false, set: true },
 | 
					            direction: { get: false, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("RayCollision", {
 | 
					    getStruct(api.structs, "RayCollision")!.binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            hit: { get: true, set: false },
 | 
					            hit: { get: true, set: false },
 | 
				
			||||||
            distance: { get: true, set: false },
 | 
					            distance: { get: true, set: false },
 | 
				
			||||||
| 
						 | 
					@ -111,8 +123,8 @@ function main(){
 | 
				
			||||||
            normal: { get: true, set: false },
 | 
					            normal: { get: true, set: false },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: false
 | 
					        createConstructor: false
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("Camera2D",{
 | 
					    getStruct(api.structs, "Camera2D")!.binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            offset: { get: true, set: true },
 | 
					            offset: { get: true, set: true },
 | 
				
			||||||
            target: { get: true, set: true },
 | 
					            target: { get: true, set: true },
 | 
				
			||||||
| 
						 | 
					@ -120,8 +132,8 @@ function main(){
 | 
				
			||||||
            zoom: { get: true, set: true },
 | 
					            zoom: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("Camera3D",{
 | 
					    getStruct(api.structs, "Camera3D")!.binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            position: { get: true, set: true },
 | 
					            position: { get: true, set: true },
 | 
				
			||||||
            target: { get: true, set: true },
 | 
					            target: { get: true, set: true },
 | 
				
			||||||
| 
						 | 
					@ -129,20 +141,21 @@ function main(){
 | 
				
			||||||
            fovy: { get: true, set: true },
 | 
					            fovy: { get: true, set: true },
 | 
				
			||||||
            projection: { get: true, set: true },
 | 
					            projection: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true,
 | 
				
			||||||
    })
 | 
					        aliases: getAliases(api.aliases, "Camera3D")
 | 
				
			||||||
    core.addApiStructByName("BoundingBox",{
 | 
					    }
 | 
				
			||||||
 | 
					    getStruct(api.structs, "BoundingBox")!.binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            min: { get: true, set: true },
 | 
					            min: { get: true, set: true },
 | 
				
			||||||
            max: { get: true, set: true },
 | 
					            max: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("Matrix",{
 | 
					    getStruct(api.structs, "Matrix")!.binding = {
 | 
				
			||||||
        properties: {},
 | 
					        properties: {},
 | 
				
			||||||
        createConstructor: false
 | 
					        createConstructor: false
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("NPatchInfo",{
 | 
					    getStruct(api.structs, "NPatchInfo")!.binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            source: { get: true, set: true },
 | 
					            source: { get: true, set: true },
 | 
				
			||||||
            left: { get: true, set: true },
 | 
					            left: { get: true, set: true },
 | 
				
			||||||
| 
						 | 
					@ -152,8 +165,8 @@ function main(){
 | 
				
			||||||
            layout: { get: true, set: true },
 | 
					            layout: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("Image", { 
 | 
					    getStruct(api.structs, "Image")!.binding = { 
 | 
				
			||||||
        properties: { 
 | 
					        properties: { 
 | 
				
			||||||
            //data: { set: true },
 | 
					            //data: { set: true },
 | 
				
			||||||
            width: { get: true }, 
 | 
					            width: { get: true }, 
 | 
				
			||||||
| 
						 | 
					@ -162,8 +175,8 @@ function main(){
 | 
				
			||||||
            format: { get: true }
 | 
					            format: { get: true }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadImage"
 | 
					        //destructor: "UnloadImage"
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("Wave", { 
 | 
					    getStruct(api.structs, "Wave")!.binding = { 
 | 
				
			||||||
        properties: { 
 | 
					        properties: { 
 | 
				
			||||||
            frameCount: { get: true }, 
 | 
					            frameCount: { get: true }, 
 | 
				
			||||||
            sampleRate: { get: true },
 | 
					            sampleRate: { get: true },
 | 
				
			||||||
| 
						 | 
					@ -171,22 +184,22 @@ function main(){
 | 
				
			||||||
            channels: { get: true }
 | 
					            channels: { get: true }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadWave"
 | 
					        //destructor: "UnloadWave"
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("Sound", { 
 | 
					    getStruct(api.structs, "Sound")!.binding = { 
 | 
				
			||||||
        properties: { 
 | 
					        properties: { 
 | 
				
			||||||
            frameCount: { get: true }
 | 
					            frameCount: { get: true }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadSound"
 | 
					        //destructor: "UnloadSound"
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("Music", { 
 | 
					    getStruct(api.structs, "Music")!.binding = { 
 | 
				
			||||||
        properties: { 
 | 
					        properties: { 
 | 
				
			||||||
            frameCount: { get: true },
 | 
					            frameCount: { get: true },
 | 
				
			||||||
            looping: { get: true, set: true },
 | 
					            looping: { get: true, set: true },
 | 
				
			||||||
            ctxType: { get: true },
 | 
					            ctxType: { get: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadMusicStream"
 | 
					        //destructor: "UnloadMusicStream"
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("Model", { 
 | 
					    getStruct(api.structs, "Model")!.binding = { 
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            transform: { get: true, set: true },
 | 
					            transform: { get: true, set: true },
 | 
				
			||||||
            meshCount: { get: true },
 | 
					            meshCount: { get: true },
 | 
				
			||||||
| 
						 | 
					@ -194,8 +207,8 @@ function main(){
 | 
				
			||||||
            boneCount: { get: true },
 | 
					            boneCount: { get: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadModel"
 | 
					        //destructor: "UnloadModel"
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("Mesh", { 
 | 
					    getStruct(api.structs, "Mesh")!.binding = { 
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            vertexCount: { get: true, set: true },
 | 
					            vertexCount: { get: true, set: true },
 | 
				
			||||||
            triangleCount: { get: true, set: true },
 | 
					            triangleCount: { get: true, set: true },
 | 
				
			||||||
| 
						 | 
					@ -214,139 +227,68 @@ function main(){
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createEmptyConstructor: true
 | 
					        createEmptyConstructor: true
 | 
				
			||||||
        //destructor: "UnloadMesh"
 | 
					        //destructor: "UnloadMesh"
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("Shader", { 
 | 
					    getStruct(api.structs, "Shader")!.binding = { 
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            id: { get: true }
 | 
					            id: { get: true }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadShader"
 | 
					        //destructor: "UnloadShader"
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("Texture", { 
 | 
					    getStruct(api.structs, "Texture")!.binding = { 
 | 
				
			||||||
        properties: { 
 | 
					        properties: { 
 | 
				
			||||||
            width: { get: true }, 
 | 
					            width: { get: true }, 
 | 
				
			||||||
            height: { get: true },
 | 
					            height: { get: true },
 | 
				
			||||||
            mipmaps: { get: true },
 | 
					            mipmaps: { get: true },
 | 
				
			||||||
            format: { get: true },
 | 
					            format: { get: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        aliases: getAliases(api.aliases, "Texture")
 | 
				
			||||||
        //destructor: "UnloadTexture"
 | 
					        //destructor: "UnloadTexture"
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("Font", { 
 | 
					    getStruct(api.structs, "Font")!.binding = { 
 | 
				
			||||||
        properties: { 
 | 
					        properties: { 
 | 
				
			||||||
            baseSize: { get: true },
 | 
					            baseSize: { get: true },
 | 
				
			||||||
            glyphCount: { get: true },
 | 
					            glyphCount: { get: true },
 | 
				
			||||||
            glyphPadding: { get: true },
 | 
					            glyphPadding: { get: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadFont"
 | 
					        //destructor: "UnloadFont"
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("RenderTexture", { 
 | 
					    getStruct(api.structs, "RenderTexture")!.binding = { 
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            id: { get: true }
 | 
					            id: { get: true }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        aliases: getAliases(api.aliases, "RenderTexture")
 | 
				
			||||||
        //destructor: "UnloadRenderTexture"
 | 
					        //destructor: "UnloadRenderTexture"
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("MaterialMap", { 
 | 
					    getStruct(api.structs, "MaterialMap")!.binding = { 
 | 
				
			||||||
        properties: { 
 | 
					        properties: { 
 | 
				
			||||||
            texture: { set: true },
 | 
					            texture: { set: true },
 | 
				
			||||||
            color: { set: true, get: true },
 | 
					            color: { set: true, get: true },
 | 
				
			||||||
            value: { get: true, set: true }
 | 
					            value: { get: true, set: true }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadMaterialMap"
 | 
					        //destructor: "UnloadMaterialMap"
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
    core.addApiStructByName("Material", { 
 | 
					    getStruct(api.structs, "Material")!.binding = { 
 | 
				
			||||||
        properties: { 
 | 
					        properties: { 
 | 
				
			||||||
            shader: { set: true }
 | 
					            shader: { set: true }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadMaterial"
 | 
					        //destructor: "UnloadMaterial"
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Window-related functions
 | 
					    getFunction(api.functions, "SetWindowIcons")!.binding = { ignore: true }
 | 
				
			||||||
    core.addApiFunctionByName("InitWindow")
 | 
					    getFunction(api.functions, "GetWindowHandle")!.binding = { ignore: true }
 | 
				
			||||||
    core.addApiFunctionByName("WindowShouldClose")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("CloseWindow")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsWindowReady")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsWindowFullscreen")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsWindowHidden")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsWindowMinimized")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsWindowMaximized")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsWindowFocused")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsWindowResized")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsWindowState")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetWindowState")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("ClearWindowState")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("ToggleFullscreen")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("MaximizeWindow")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("MinimizeWindow")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("RestoreWindow")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetWindowIcon")
 | 
					 | 
				
			||||||
    // SetWindowIcons
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetWindowTitle")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetWindowPosition")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetWindowMonitor")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetWindowMinSize")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetWindowSize")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetWindowOpacity")
 | 
					 | 
				
			||||||
    // GetWindowHandle
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetScreenWidth")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetScreenHeight")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetRenderWidth")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetRenderHeight")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMonitorCount")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetCurrentMonitor")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMonitorPosition")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMonitorWidth")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMonitorHeight")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMonitorPhysicalWidth")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMonitorPhysicalHeight")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMonitorRefreshRate")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetWindowPosition")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetWindowScaleDPI")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMonitorName")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetClipboardText")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetClipboardText")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("EnableEventWaiting")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("DisableEventWaiting")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 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 }
 | 
				
			||||||
 | 
					    getFunction(api.functions, "PollInputEvents")!.binding = { ignore: true }
 | 
				
			||||||
 | 
					    getFunction(api.functions, "WaitTime")!.binding = { ignore: true }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // Cursor-related functions
 | 
					    getFunction(api.functions, "BeginVrStereoMode")!.binding = { ignore: true }
 | 
				
			||||||
    core.addApiFunctionByName("ShowCursor")
 | 
					    getFunction(api.functions, "EndVrStereoMode")!.binding = { ignore: true }
 | 
				
			||||||
    core.addApiFunctionByName("HideCursor")
 | 
					    getFunction(api.functions, "LoadVrStereoConfig")!.binding = { ignore: true }
 | 
				
			||||||
    core.addApiFunctionByName("IsCursorHidden")
 | 
					    getFunction(api.functions, "UnloadVrStereoConfig")!.binding = { ignore: true }
 | 
				
			||||||
    core.addApiFunctionByName("EnableCursor")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("DisableCursor")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsCursorOnScreen")
 | 
					 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // Drawing related functions
 | 
					    getFunction(api.functions, "SetShaderValue")!.binding = { body: (gen) => {
 | 
				
			||||||
    core.addApiFunctionByName("ClearBackground")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("BeginDrawing")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("EndDrawing", null, { before: fun => fun.call("app_update_quickjs", []) })
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("BeginMode2D")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("EndMode2D")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("BeginMode3D")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("EndMode3D")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("BeginTextureMode")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("EndTextureMode")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("BeginShaderMode")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("EndShaderMode")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("BeginBlendMode")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("EndBlendMode")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("BeginScissorMode")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("EndScissorMode")
 | 
					 | 
				
			||||||
    //core.addApiFunctionByName("BeginVrStereoMode")
 | 
					 | 
				
			||||||
    //core.addApiFunctionByName("EndVrStereoMode")
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    // VR Stereo config options
 | 
					 | 
				
			||||||
    //core.addApiFunctionByName("LoadVrStereoConfig")
 | 
					 | 
				
			||||||
    //core.addApiFunctionByName("UnloadVrStereoConfig")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Shader Management
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("LoadShader")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("LoadShaderFromMemory")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsShaderReady")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetShaderLocation")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetShaderLocationAttrib")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetShaderValue", null, { 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)
 | 
				
			||||||
        gen.declare("value","void *", false, "NULL")
 | 
					        gen.declare("value","void *", false, "NULL")
 | 
				
			||||||
| 
						 | 
					@ -373,32 +315,9 @@ function main(){
 | 
				
			||||||
        b.returnExp("JS_EXCEPTION")
 | 
					        b.returnExp("JS_EXCEPTION")
 | 
				
			||||||
        gen.call("SetShaderValue", ["shader","locIndex","value","uniformType"])
 | 
					        gen.call("SetShaderValue", ["shader","locIndex","value","uniformType"])
 | 
				
			||||||
        gen.returnExp("JS_UNDEFINED")
 | 
					        gen.returnExp("JS_UNDEFINED")
 | 
				
			||||||
    }})
 | 
					    }} 
 | 
				
			||||||
    // core.addApiFunctionByName("SetShaderValueV")
 | 
					    getFunction(api.functions, "SetShaderValueV")!.binding = { ignore: true }
 | 
				
			||||||
    core.addApiFunctionByName("SetShaderValueMatrix")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetShaderValueTexture")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("UnloadShader")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // ScreenSpaceRelatedFunctions
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMouseRay")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetCameraMatrix")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetCameraMatrix2D")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetWorldToScreen")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetScreenToWorld2D")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetWorldToScreenEx")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetWorldToScreen2D")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Timing related functions
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetTargetFPS")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetFPS")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetFrameTime")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetTime")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Misc functions
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetRandomValue")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetRandomSeed")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("TakeScreenshot")
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetConfigFlags")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const traceLog = apiDesc.getFunction("TraceLog")
 | 
					    const traceLog = apiDesc.getFunction("TraceLog")
 | 
				
			||||||
    if(!traceLog) throw new Error("TraceLog not found")
 | 
					    if(!traceLog) throw new Error("TraceLog not found")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,23 @@
 | 
				
			||||||
 | 
					import { QuickJsGenerator } from "./quickjs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface StructBindingOptions {
 | 
				
			||||||
 | 
					    properties?: { [key:string]: { get?:boolean, set?:boolean } },
 | 
				
			||||||
 | 
					    destructor?: RayLibFunction,
 | 
				
			||||||
 | 
					    construct?: string, 
 | 
				
			||||||
 | 
					    createConstructor?: boolean
 | 
				
			||||||
 | 
					    createEmptyConstructor?: boolean,
 | 
				
			||||||
 | 
					    aliases?: string[]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface FuncBindingOptions {
 | 
				
			||||||
 | 
					    before?: (gen: QuickJsGenerator) => void,
 | 
				
			||||||
 | 
					    after?: (gen: QuickJsGenerator) => void,
 | 
				
			||||||
 | 
					    customizeCall?: string,
 | 
				
			||||||
 | 
					    body?: (gen: QuickJsGenerator) => void,
 | 
				
			||||||
 | 
					    jsName?: string,
 | 
				
			||||||
 | 
					    ignore?: boolean
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export type RayLibType = "void" | "const char *" | "bool" | "float" | "unsigned char" | "void *" | "int" | "usigned int" | "Texture" | "Rectangle" | "Image" | "Rectangle *" | "GylphInfo *" | "Texture2D" | "Vector3" | "Vector2" | "float *" | "unsigned char *" | "unsigned short *" | "unsigned int *" | "Shader" | "MaterialMap *" | "float[4]" | "Vector3"
 | 
					export type RayLibType = "void" | "const char *" | "bool" | "float" | "unsigned char" | "void *" | "int" | "usigned int" | "Texture" | "Rectangle" | "Image" | "Rectangle *" | "GylphInfo *" | "Texture2D" | "Vector3" | "Vector2" | "float *" | "unsigned char *" | "unsigned short *" | "unsigned int *" | "Shader" | "MaterialMap *" | "float[4]" | "Vector3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface RayLibDefine {
 | 
					export interface RayLibDefine {
 | 
				
			||||||
| 
						 | 
					@ -16,7 +36,8 @@ export interface RayLibFieldDescription {
 | 
				
			||||||
export interface RayLibStruct {
 | 
					export interface RayLibStruct {
 | 
				
			||||||
    name: string,
 | 
					    name: string,
 | 
				
			||||||
    description: string,
 | 
					    description: string,
 | 
				
			||||||
    fields: RayLibFieldDescription[]
 | 
					    fields: RayLibFieldDescription[],
 | 
				
			||||||
 | 
					    binding?: StructBindingOptions
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface RayLibEnumValue {
 | 
					export interface RayLibEnumValue {
 | 
				
			||||||
| 
						 | 
					@ -40,7 +61,8 @@ export interface RayLibFunction {
 | 
				
			||||||
    name: string,
 | 
					    name: string,
 | 
				
			||||||
    description: string,
 | 
					    description: string,
 | 
				
			||||||
    returnType: RayLibType | string,
 | 
					    returnType: RayLibType | string,
 | 
				
			||||||
    params?: RayLibParamDescription[]
 | 
					    params?: RayLibParamDescription[],
 | 
				
			||||||
 | 
					    binding?: FuncBindingOptions
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface RayLibAlias {
 | 
					export interface RayLibAlias {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,37 +1,27 @@
 | 
				
			||||||
import { ApiDescription, ApiFunction, ApiStruct } from "./api"
 | 
					 | 
				
			||||||
import { CodeGenerator } from "./generation"
 | 
					import { CodeGenerator } from "./generation"
 | 
				
			||||||
 | 
					import { RayLibEnum, RayLibFunction, RayLibStruct } from "./interfaces"
 | 
				
			||||||
import { QuickJsGenerator, QuickJsHeader } from "./quickjs"
 | 
					import { QuickJsGenerator, QuickJsHeader } from "./quickjs"
 | 
				
			||||||
import { TypeScriptDeclaration } from "./typescript"
 | 
					import { TypeScriptDeclaration } from "./typescript"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface StructBindingOptions {
 | 
					 | 
				
			||||||
    properties?: { [key:string]: { get?:boolean, set?:boolean } },
 | 
					 | 
				
			||||||
    destructor?: string,
 | 
					 | 
				
			||||||
    construct?: string, 
 | 
					 | 
				
			||||||
    createConstructor?: boolean
 | 
					 | 
				
			||||||
    createEmptyConstructor?: boolean
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface FuncBindingOptions {
 | 
					 | 
				
			||||||
    before?: (gen: QuickJsGenerator) => void,
 | 
					 | 
				
			||||||
    after?: (gen: QuickJsGenerator) => void,
 | 
					 | 
				
			||||||
    customizeCall?: string,
 | 
					 | 
				
			||||||
    body?: (gen: QuickJsGenerator) => void
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class RayLibHeader extends QuickJsHeader {
 | 
					export class RayLibHeader extends QuickJsHeader {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    typings = new TypeScriptDeclaration()
 | 
					    typings = new TypeScriptDeclaration()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor(name: string, private api: ApiDescription){
 | 
					    constructor(name: string){
 | 
				
			||||||
        super(name)
 | 
					        super(name)
 | 
				
			||||||
        this.includes.include("raylib.h")
 | 
					        this.includes.include("raylib.h")
 | 
				
			||||||
        //this.includes.line("#define RAYMATH_IMPLEMENTATION")
 | 
					        //this.includes.line("#define RAYMATH_IMPLEMENTATION")
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    addApiFunction(api: ApiFunction, jsName: string | null = null, options: FuncBindingOptions = {}){
 | 
					    addApiFunction(api: RayLibFunction){
 | 
				
			||||||
        const jName = jsName || api.name.charAt(0).toLowerCase() + api.name.slice(1)
 | 
					        const options = api.binding || {}
 | 
				
			||||||
 | 
					        if(options.ignore) return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const jName = options.jsName || api.name.charAt(0).toLowerCase() + api.name.slice(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const fun = this.functions.jsBindingFunction(jName)
 | 
					        const fun = this.functions.jsBindingFunction(jName)
 | 
				
			||||||
        if(options.body) {
 | 
					        if(options.body) {
 | 
				
			||||||
| 
						 | 
					@ -39,6 +29,7 @@ export class RayLibHeader extends QuickJsHeader {
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            if(options.before) options.before(fun)
 | 
					            if(options.before) options.before(fun)
 | 
				
			||||||
            // read parameters
 | 
					            // read parameters
 | 
				
			||||||
 | 
					            api.params = api.params || []
 | 
				
			||||||
            for (let i = 0; i < api.params.length; i++) {
 | 
					            for (let i = 0; i < api.params.length; i++) {
 | 
				
			||||||
                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)
 | 
				
			||||||
| 
						 | 
					@ -62,25 +53,20 @@ export class RayLibHeader extends QuickJsHeader {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // add binding to function declaration
 | 
					        // add binding to function declaration
 | 
				
			||||||
        this.moduleFunctionList.jsFuncDef(jName, api.argc, fun.getTag("_name"))
 | 
					        this.moduleFunctionList.jsFuncDef(jName, api.params?.length ?? 0, fun.getTag("_name"))
 | 
				
			||||||
        this.typings.addFunction(jName,api)
 | 
					        this.typings.addFunction(jName,api)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    addApiFunctionByName(name: string, jsName: string | null = null, options: FuncBindingOptions = {}){
 | 
					    addEnum(renum: RayLibEnum){
 | 
				
			||||||
        const func = this.api.getFunction(name)
 | 
					        renum.values.forEach(x => this.exportGlobalConstant(x.name, x.description))      
 | 
				
			||||||
        if(func === null) throw new Error("Function not in API: " + name)
 | 
					 | 
				
			||||||
        this.addApiFunction(func, jsName, options)
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    addAllEnums(){
 | 
					    addApiStruct(struct: RayLibStruct){
 | 
				
			||||||
        this.api.getEnums().forEach(x => x.values.forEach(y => this.exportGlobalConstant(y.name, y.description)))        
 | 
					        const options = struct.binding || {}
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    addApiStruct(struct: ApiStruct, destructor: ApiFunction | null, options?: StructBindingOptions){
 | 
					 | 
				
			||||||
        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)
 | 
				
			||||||
        this.api.getAliases(struct.name).forEach(x => this.registerStruct(x, classId))
 | 
					        options.aliases?.forEach(x => this.registerStruct(x, classId))
 | 
				
			||||||
        const finalizer = this.structs.jsStructFinalizer(classId, struct.name, (gen,ptr) => destructor && gen.call(destructor.name, ["*"+ptr]))
 | 
					        const finalizer = this.structs.jsStructFinalizer(classId, struct.name, (gen,ptr) => options.destructor && gen.call(options.destructor.name, ["*"+ptr]))
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        const propDeclarations = this.structs.createGenerator()
 | 
					        const propDeclarations = this.structs.createGenerator()
 | 
				
			||||||
        if(options && options.properties){
 | 
					        if(options && options.properties){
 | 
				
			||||||
| 
						 | 
					@ -129,15 +115,4 @@ export class RayLibHeader extends QuickJsHeader {
 | 
				
			||||||
        this.moduleEntry.statement(`JS_AddModuleExport(ctx, m, "${name}")`)
 | 
					        this.moduleEntry.statement(`JS_AddModuleExport(ctx, m, "${name}")`)
 | 
				
			||||||
        this.typings.constants.tsDeclareConstant(name, "number", description)
 | 
					        this.typings.constants.tsDeclareConstant(name, "number", description)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    addApiStructByName(structName: string, options?: StructBindingOptions){
 | 
					 | 
				
			||||||
        const struct = this.api.getStruct(structName)
 | 
					 | 
				
			||||||
        if(!struct) throw new Error("Struct not in API: "+ structName)
 | 
					 | 
				
			||||||
        let destructor: ApiFunction | null = null
 | 
					 | 
				
			||||||
        if(options?.destructor){
 | 
					 | 
				
			||||||
            destructor = this.api.getFunction(options.destructor)
 | 
					 | 
				
			||||||
            if(!destructor) throw new Error("Destructor func not in API: "+ options.destructor)
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        this.addApiStruct(struct, destructor, options)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,99 +0,0 @@
 | 
				
			||||||
/******/ (() => { // webpackBootstrap
 | 
					 | 
				
			||||||
/******/ 	"use strict";
 | 
					 | 
				
			||||||
/******/ 	var __webpack_modules__ = ({
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/***/ "./src/game.ts":
 | 
					 | 
				
			||||||
/*!*********************!*\
 | 
					 | 
				
			||||||
  !*** ./src/game.ts ***!
 | 
					 | 
				
			||||||
  \*********************/
 | 
					 | 
				
			||||||
/***/ ((__unused_webpack_module, exports) => {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
 | 
					 | 
				
			||||||
exports.Game = void 0;
 | 
					 | 
				
			||||||
class Game {
 | 
					 | 
				
			||||||
    constructor(width, height, title) {
 | 
					 | 
				
			||||||
        this.width = width;
 | 
					 | 
				
			||||||
        this.height = height;
 | 
					 | 
				
			||||||
        this.title = title;
 | 
					 | 
				
			||||||
        this.clearColor = RAYWHITE;
 | 
					 | 
				
			||||||
        this.quit = false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    run() {
 | 
					 | 
				
			||||||
        initWindow(this.width, this.height, this.title);
 | 
					 | 
				
			||||||
        setTargetFPS(60);
 | 
					 | 
				
			||||||
        this.load();
 | 
					 | 
				
			||||||
        while (!(this.quit = windowShouldClose())) {
 | 
					 | 
				
			||||||
            this.update();
 | 
					 | 
				
			||||||
            beginDrawing();
 | 
					 | 
				
			||||||
            clearBackground(this.clearColor);
 | 
					 | 
				
			||||||
            this.draw();
 | 
					 | 
				
			||||||
            endDrawing();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        this.unload();
 | 
					 | 
				
			||||||
        closeWindow();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
exports.Game = Game;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/***/ })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/******/ 	});
 | 
					 | 
				
			||||||
/************************************************************************/
 | 
					 | 
				
			||||||
/******/ 	// The module cache
 | 
					 | 
				
			||||||
/******/ 	var __webpack_module_cache__ = {};
 | 
					 | 
				
			||||||
/******/ 	
 | 
					 | 
				
			||||||
/******/ 	// The require function
 | 
					 | 
				
			||||||
/******/ 	function __webpack_require__(moduleId) {
 | 
					 | 
				
			||||||
/******/ 		// Check if module is in cache
 | 
					 | 
				
			||||||
/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
 | 
					 | 
				
			||||||
/******/ 		if (cachedModule !== undefined) {
 | 
					 | 
				
			||||||
/******/ 			return cachedModule.exports;
 | 
					 | 
				
			||||||
/******/ 		}
 | 
					 | 
				
			||||||
/******/ 		// Create a new module (and put it into the cache)
 | 
					 | 
				
			||||||
/******/ 		var module = __webpack_module_cache__[moduleId] = {
 | 
					 | 
				
			||||||
/******/ 			// no module.id needed
 | 
					 | 
				
			||||||
/******/ 			// no module.loaded needed
 | 
					 | 
				
			||||||
/******/ 			exports: {}
 | 
					 | 
				
			||||||
/******/ 		};
 | 
					 | 
				
			||||||
/******/ 	
 | 
					 | 
				
			||||||
/******/ 		// Execute the module function
 | 
					 | 
				
			||||||
/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
 | 
					 | 
				
			||||||
/******/ 	
 | 
					 | 
				
			||||||
/******/ 		// Return the exports of the module
 | 
					 | 
				
			||||||
/******/ 		return module.exports;
 | 
					 | 
				
			||||||
/******/ 	}
 | 
					 | 
				
			||||||
/******/ 	
 | 
					 | 
				
			||||||
/************************************************************************/
 | 
					 | 
				
			||||||
var __webpack_exports__ = {};
 | 
					 | 
				
			||||||
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
 | 
					 | 
				
			||||||
(() => {
 | 
					 | 
				
			||||||
var exports = __webpack_exports__;
 | 
					 | 
				
			||||||
/*!**********************!*\
 | 
					 | 
				
			||||||
  !*** ./src/index.ts ***!
 | 
					 | 
				
			||||||
  \**********************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
 | 
					 | 
				
			||||||
const game_1 = __webpack_require__(/*! ./game */ "./src/game.ts");
 | 
					 | 
				
			||||||
class MyGame extends game_1.Game {
 | 
					 | 
				
			||||||
    draw() {
 | 
					 | 
				
			||||||
        throw new Error("Method not implemented.");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    update() {
 | 
					 | 
				
			||||||
        throw new Error("Method not implemented.");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    load() {
 | 
					 | 
				
			||||||
        throw new Error("Method not implemented.");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    unload() {
 | 
					 | 
				
			||||||
        throw new Error("Method not implemented.");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
const game = new MyGame(800, 450, "Typescript Game");
 | 
					 | 
				
			||||||
game.run();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
})();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/******/ })()
 | 
					 | 
				
			||||||
;
 | 
					 | 
				
			||||||
| 
						 | 
					@ -2,64 +2,6 @@
 | 
				
			||||||
/******/ 	"use strict";
 | 
					/******/ 	"use strict";
 | 
				
			||||||
/******/ 	var __webpack_modules__ = ({
 | 
					/******/ 	var __webpack_modules__ = ({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/***/ "./src/api.ts":
 | 
					 | 
				
			||||||
/*!********************!*\
 | 
					 | 
				
			||||||
  !*** ./src/api.ts ***!
 | 
					 | 
				
			||||||
  \********************/
 | 
					 | 
				
			||||||
/***/ ((__unused_webpack_module, exports) => {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
 | 
					 | 
				
			||||||
exports.ApiDescription = exports.ApiStruct = exports.ApiFunction = void 0;
 | 
					 | 
				
			||||||
class ApiFunction {
 | 
					 | 
				
			||||||
    constructor(api) {
 | 
					 | 
				
			||||||
        this.api = api;
 | 
					 | 
				
			||||||
        api.params = api.params || [];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    get name() { return this.api.name; }
 | 
					 | 
				
			||||||
    get argc() { return this.api.params?.length || 0; }
 | 
					 | 
				
			||||||
    get params() { return this.api.params || []; }
 | 
					 | 
				
			||||||
    get returnType() { return this.api.returnType; }
 | 
					 | 
				
			||||||
    set returnType(v) { this.api.returnType = v; }
 | 
					 | 
				
			||||||
    get description() { return this.api.description; }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
exports.ApiFunction = ApiFunction;
 | 
					 | 
				
			||||||
class ApiStruct {
 | 
					 | 
				
			||||||
    constructor(api) {
 | 
					 | 
				
			||||||
        this.api = api;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    get name() { return this.api.name; }
 | 
					 | 
				
			||||||
    get fields() { return this.api.fields || []; }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
exports.ApiStruct = ApiStruct;
 | 
					 | 
				
			||||||
class ApiDescription {
 | 
					 | 
				
			||||||
    constructor(api) {
 | 
					 | 
				
			||||||
        this.api = api;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    getAliases(name) {
 | 
					 | 
				
			||||||
        return this.api.aliases.filter(x => x.type === name).map(x => x.name);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    getFunction(name) {
 | 
					 | 
				
			||||||
        const f = this.api.functions.find(x => x.name === name);
 | 
					 | 
				
			||||||
        if (!f)
 | 
					 | 
				
			||||||
            return null;
 | 
					 | 
				
			||||||
        return new ApiFunction(f);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    getStruct(name) {
 | 
					 | 
				
			||||||
        const s = this.api.structs.find(x => x.name === name);
 | 
					 | 
				
			||||||
        if (!s)
 | 
					 | 
				
			||||||
            return null;
 | 
					 | 
				
			||||||
        return new ApiStruct(s);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    getEnums() {
 | 
					 | 
				
			||||||
        return this.api.enums;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
exports.ApiDescription = ApiDescription;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/***/ }),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/***/ "./src/generation.ts":
 | 
					/***/ "./src/generation.ts":
 | 
				
			||||||
/*!***************************!*\
 | 
					/*!***************************!*\
 | 
				
			||||||
  !*** ./src/generation.ts ***!
 | 
					  !*** ./src/generation.ts ***!
 | 
				
			||||||
| 
						 | 
					@ -698,15 +640,17 @@ exports.RayLibHeader = void 0;
 | 
				
			||||||
const quickjs_1 = __webpack_require__(/*! ./quickjs */ "./src/quickjs.ts");
 | 
					const quickjs_1 = __webpack_require__(/*! ./quickjs */ "./src/quickjs.ts");
 | 
				
			||||||
const typescript_1 = __webpack_require__(/*! ./typescript */ "./src/typescript.ts");
 | 
					const typescript_1 = __webpack_require__(/*! ./typescript */ "./src/typescript.ts");
 | 
				
			||||||
class RayLibHeader extends quickjs_1.QuickJsHeader {
 | 
					class RayLibHeader extends quickjs_1.QuickJsHeader {
 | 
				
			||||||
    constructor(name, api) {
 | 
					    constructor(name) {
 | 
				
			||||||
        super(name);
 | 
					        super(name);
 | 
				
			||||||
        this.api = api;
 | 
					 | 
				
			||||||
        this.typings = new typescript_1.TypeScriptDeclaration();
 | 
					        this.typings = new typescript_1.TypeScriptDeclaration();
 | 
				
			||||||
        this.includes.include("raylib.h");
 | 
					        this.includes.include("raylib.h");
 | 
				
			||||||
        //this.includes.line("#define RAYMATH_IMPLEMENTATION")
 | 
					        //this.includes.line("#define RAYMATH_IMPLEMENTATION")
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    addApiFunction(api, jsName = null, options = {}) {
 | 
					    addApiFunction(api) {
 | 
				
			||||||
        const jName = jsName || api.name.charAt(0).toLowerCase() + api.name.slice(1);
 | 
					        const options = api.binding || {};
 | 
				
			||||||
 | 
					        if (options.ignore)
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        const jName = options.jsName || api.name.charAt(0).toLowerCase() + api.name.slice(1);
 | 
				
			||||||
        const fun = this.functions.jsBindingFunction(jName);
 | 
					        const fun = this.functions.jsBindingFunction(jName);
 | 
				
			||||||
        if (options.body) {
 | 
					        if (options.body) {
 | 
				
			||||||
            options.body(fun);
 | 
					            options.body(fun);
 | 
				
			||||||
| 
						 | 
					@ -715,6 +659,7 @@ class RayLibHeader extends quickjs_1.QuickJsHeader {
 | 
				
			||||||
            if (options.before)
 | 
					            if (options.before)
 | 
				
			||||||
                options.before(fun);
 | 
					                options.before(fun);
 | 
				
			||||||
            // read parameters
 | 
					            // read parameters
 | 
				
			||||||
 | 
					            api.params = api.params || [];
 | 
				
			||||||
            for (let i = 0; i < api.params.length; i++) {
 | 
					            for (let i = 0; i < api.params.length; i++) {
 | 
				
			||||||
                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);
 | 
				
			||||||
| 
						 | 
					@ -742,23 +687,18 @@ class RayLibHeader extends quickjs_1.QuickJsHeader {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        // add binding to function declaration
 | 
					        // add binding to function declaration
 | 
				
			||||||
        this.moduleFunctionList.jsFuncDef(jName, api.argc, fun.getTag("_name"));
 | 
					        this.moduleFunctionList.jsFuncDef(jName, api.params?.length ?? 0, fun.getTag("_name"));
 | 
				
			||||||
        this.typings.addFunction(jName, api);
 | 
					        this.typings.addFunction(jName, api);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    addApiFunctionByName(name, jsName = null, options = {}) {
 | 
					    addEnum(renum) {
 | 
				
			||||||
        const func = this.api.getFunction(name);
 | 
					        renum.values.forEach(x => this.exportGlobalConstant(x.name, x.description));
 | 
				
			||||||
        if (func === null)
 | 
					 | 
				
			||||||
            throw new Error("Function not in API: " + name);
 | 
					 | 
				
			||||||
        this.addApiFunction(func, jsName, options);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    addAllEnums() {
 | 
					    addApiStruct(struct) {
 | 
				
			||||||
        this.api.getEnums().forEach(x => x.values.forEach(y => this.exportGlobalConstant(y.name, y.description)));
 | 
					        const options = struct.binding || {};
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    addApiStruct(struct, destructor, options) {
 | 
					 | 
				
			||||||
        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);
 | 
				
			||||||
        this.api.getAliases(struct.name).forEach(x => this.registerStruct(x, classId));
 | 
					        options.aliases?.forEach(x => this.registerStruct(x, classId));
 | 
				
			||||||
        const finalizer = this.structs.jsStructFinalizer(classId, struct.name, (gen, ptr) => destructor && gen.call(destructor.name, ["*" + ptr]));
 | 
					        const finalizer = this.structs.jsStructFinalizer(classId, struct.name, (gen, ptr) => options.destructor && gen.call(options.destructor.name, ["*" + ptr]));
 | 
				
			||||||
        const propDeclarations = this.structs.createGenerator();
 | 
					        const propDeclarations = this.structs.createGenerator();
 | 
				
			||||||
        if (options && options.properties) {
 | 
					        if (options && options.properties) {
 | 
				
			||||||
            for (const field of Object.keys(options.properties)) {
 | 
					            for (const field of Object.keys(options.properties)) {
 | 
				
			||||||
| 
						 | 
					@ -803,18 +743,6 @@ class RayLibHeader extends quickjs_1.QuickJsHeader {
 | 
				
			||||||
        this.moduleEntry.statement(`JS_AddModuleExport(ctx, m, "${name}")`);
 | 
					        this.moduleEntry.statement(`JS_AddModuleExport(ctx, m, "${name}")`);
 | 
				
			||||||
        this.typings.constants.tsDeclareConstant(name, "number", description);
 | 
					        this.typings.constants.tsDeclareConstant(name, "number", description);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    addApiStructByName(structName, options) {
 | 
					 | 
				
			||||||
        const struct = this.api.getStruct(structName);
 | 
					 | 
				
			||||||
        if (!struct)
 | 
					 | 
				
			||||||
            throw new Error("Struct not in API: " + structName);
 | 
					 | 
				
			||||||
        let destructor = null;
 | 
					 | 
				
			||||||
        if (options?.destructor) {
 | 
					 | 
				
			||||||
            destructor = this.api.getFunction(options.destructor);
 | 
					 | 
				
			||||||
            if (!destructor)
 | 
					 | 
				
			||||||
                throw new Error("Destructor func not in API: " + options.destructor);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        this.addApiStruct(struct, destructor, options);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
exports.RayLibHeader = RayLibHeader;
 | 
					exports.RayLibHeader = RayLibHeader;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -985,18 +913,20 @@ var exports = __webpack_exports__;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
 | 
					Object.defineProperty(exports, "__esModule", ({ value: true }));
 | 
				
			||||||
const fs_1 = __webpack_require__(/*! fs */ "fs");
 | 
					const fs_1 = __webpack_require__(/*! fs */ "fs");
 | 
				
			||||||
const api_1 = __webpack_require__(/*! ./api */ "./src/api.ts");
 | 
					 | 
				
			||||||
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");
 | 
				
			||||||
 | 
					function getFunction(funList, name) {
 | 
				
			||||||
 | 
					    return funList.find(x => x.name === name);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					function getStruct(strList, name) {
 | 
				
			||||||
 | 
					    return strList.find(x => x.name === name);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					function getAliases(aliasList, name) {
 | 
				
			||||||
 | 
					    return aliasList.filter(x => x.type === name).map(x => x.name);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
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'));
 | 
					    const api = JSON.parse((0, fs_1.readFileSync)("thirdparty/raylib/parser/output/raylib_api.json", 'utf8'));
 | 
				
			||||||
    api.functions.push({
 | 
					 | 
				
			||||||
        name: "SetModelMaterial",
 | 
					 | 
				
			||||||
        description: "Replace material in slot materialIndex",
 | 
					 | 
				
			||||||
        returnType: "void",
 | 
					 | 
				
			||||||
        params: [{ type: "Model *", name: "model" }, { type: "int", name: "materialIndex" }, { type: "Material", name: "material" }]
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    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);
 | 
				
			||||||
| 
						 | 
					@ -1016,10 +946,16 @@ function main() {
 | 
				
			||||||
    api.functions.push(rlightsFunctions[1]);
 | 
					    api.functions.push(rlightsFunctions[1]);
 | 
				
			||||||
    const reasingsHeader = (0, fs_1.readFileSync)("include/reasings.h", "utf8");
 | 
					    const reasingsHeader = (0, fs_1.readFileSync)("include/reasings.h", "utf8");
 | 
				
			||||||
    const reasingsFunctions = parser.parseFunctions(reasingsHeader);
 | 
					    const reasingsFunctions = parser.parseFunctions(reasingsHeader);
 | 
				
			||||||
    //reasingsFunctions.forEach(x => console.log(`core.addApiFunctionByName("${x.name}")`))
 | 
					 | 
				
			||||||
    reasingsFunctions.forEach(x => api.functions.push(x));
 | 
					    reasingsFunctions.forEach(x => api.functions.push(x));
 | 
				
			||||||
    const apiDesc = new api_1.ApiDescription(api);
 | 
					    // Custom Rayjs functions
 | 
				
			||||||
    const core = new raylib_header_1.RayLibHeader("raylib_core", apiDesc);
 | 
					    api.functions.push({
 | 
				
			||||||
 | 
					        name: "SetModelMaterial",
 | 
				
			||||||
 | 
					        description: "Replace material in slot materialIndex",
 | 
				
			||||||
 | 
					        returnType: "void",
 | 
				
			||||||
 | 
					        params: [{ type: "Model *", name: "model" }, { type: "int", name: "materialIndex" }, { type: "Material", name: "material" }]
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    // Define a new header
 | 
				
			||||||
 | 
					    const core = new raylib_header_1.RayLibHeader("raylib_core");
 | 
				
			||||||
    core.includes.include("raymath.h");
 | 
					    core.includes.include("raymath.h");
 | 
				
			||||||
    core.includes.include("rcamera.h");
 | 
					    core.includes.include("rcamera.h");
 | 
				
			||||||
    core.includes.line("#define RAYGUI_IMPLEMENTATION");
 | 
					    core.includes.line("#define RAYGUI_IMPLEMENTATION");
 | 
				
			||||||
| 
						 | 
					@ -1027,7 +963,7 @@ function main() {
 | 
				
			||||||
    core.includes.line("#define RLIGHTS_IMPLEMENTATION");
 | 
					    core.includes.line("#define RLIGHTS_IMPLEMENTATION");
 | 
				
			||||||
    core.includes.include("rlights.h");
 | 
					    core.includes.include("rlights.h");
 | 
				
			||||||
    core.includes.include("reasings.h");
 | 
					    core.includes.include("reasings.h");
 | 
				
			||||||
    core.addApiStructByName("Color", {
 | 
					    getStruct(api.structs, "Color").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            r: { get: true, set: true },
 | 
					            r: { get: true, set: true },
 | 
				
			||||||
            g: { get: true, set: true },
 | 
					            g: { get: true, set: true },
 | 
				
			||||||
| 
						 | 
					@ -1035,8 +971,8 @@ function main() {
 | 
				
			||||||
            a: { get: true, set: true },
 | 
					            a: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("Rectangle", {
 | 
					    getStruct(api.structs, "Rectangle").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            x: { get: true, set: true },
 | 
					            x: { get: true, set: true },
 | 
				
			||||||
            y: { get: true, set: true },
 | 
					            y: { get: true, set: true },
 | 
				
			||||||
| 
						 | 
					@ -1044,39 +980,40 @@ function main() {
 | 
				
			||||||
            height: { get: true, set: true },
 | 
					            height: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("Vector2", {
 | 
					    getStruct(api.structs, "Vector2").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            x: { get: true, set: true },
 | 
					            x: { get: true, set: true },
 | 
				
			||||||
            y: { get: true, set: true },
 | 
					            y: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("Vector3", {
 | 
					    getStruct(api.structs, "Vector3").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            x: { get: true, set: true },
 | 
					            x: { get: true, set: true },
 | 
				
			||||||
            y: { get: true, set: true },
 | 
					            y: { get: true, set: true },
 | 
				
			||||||
            z: { get: true, set: true },
 | 
					            z: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("Vector4", {
 | 
					    getStruct(api.structs, "Vector4").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            x: { get: true, set: true },
 | 
					            x: { get: true, set: true },
 | 
				
			||||||
            y: { get: true, set: true },
 | 
					            y: { get: true, set: true },
 | 
				
			||||||
            z: { get: true, set: true },
 | 
					            z: { get: true, set: true },
 | 
				
			||||||
            w: { get: true, set: true },
 | 
					            w: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true,
 | 
				
			||||||
    });
 | 
					        aliases: getAliases(api.aliases, "Vector4")
 | 
				
			||||||
    core.addApiStructByName("Ray", {
 | 
					    };
 | 
				
			||||||
 | 
					    getStruct(api.structs, "Ray").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            position: { get: false, set: true },
 | 
					            position: { get: false, set: true },
 | 
				
			||||||
            direction: { get: false, set: true },
 | 
					            direction: { get: false, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("RayCollision", {
 | 
					    getStruct(api.structs, "RayCollision").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            hit: { get: true, set: false },
 | 
					            hit: { get: true, set: false },
 | 
				
			||||||
            distance: { get: true, set: false },
 | 
					            distance: { get: true, set: false },
 | 
				
			||||||
| 
						 | 
					@ -1084,8 +1021,8 @@ function main() {
 | 
				
			||||||
            normal: { get: true, set: false },
 | 
					            normal: { get: true, set: false },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: false
 | 
					        createConstructor: false
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("Camera2D", {
 | 
					    getStruct(api.structs, "Camera2D").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            offset: { get: true, set: true },
 | 
					            offset: { get: true, set: true },
 | 
				
			||||||
            target: { get: true, set: true },
 | 
					            target: { get: true, set: true },
 | 
				
			||||||
| 
						 | 
					@ -1093,8 +1030,8 @@ function main() {
 | 
				
			||||||
            zoom: { get: true, set: true },
 | 
					            zoom: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("Camera3D", {
 | 
					    getStruct(api.structs, "Camera3D").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            position: { get: true, set: true },
 | 
					            position: { get: true, set: true },
 | 
				
			||||||
            target: { get: true, set: true },
 | 
					            target: { get: true, set: true },
 | 
				
			||||||
| 
						 | 
					@ -1102,20 +1039,21 @@ function main() {
 | 
				
			||||||
            fovy: { get: true, set: true },
 | 
					            fovy: { get: true, set: true },
 | 
				
			||||||
            projection: { get: true, set: true },
 | 
					            projection: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true,
 | 
				
			||||||
    });
 | 
					        aliases: getAliases(api.aliases, "Camera3D")
 | 
				
			||||||
    core.addApiStructByName("BoundingBox", {
 | 
					    };
 | 
				
			||||||
 | 
					    getStruct(api.structs, "BoundingBox").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            min: { get: true, set: true },
 | 
					            min: { get: true, set: true },
 | 
				
			||||||
            max: { get: true, set: true },
 | 
					            max: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("Matrix", {
 | 
					    getStruct(api.structs, "Matrix").binding = {
 | 
				
			||||||
        properties: {},
 | 
					        properties: {},
 | 
				
			||||||
        createConstructor: false
 | 
					        createConstructor: false
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("NPatchInfo", {
 | 
					    getStruct(api.structs, "NPatchInfo").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            source: { get: true, set: true },
 | 
					            source: { get: true, set: true },
 | 
				
			||||||
            left: { get: true, set: true },
 | 
					            left: { get: true, set: true },
 | 
				
			||||||
| 
						 | 
					@ -1125,8 +1063,8 @@ function main() {
 | 
				
			||||||
            layout: { get: true, set: true },
 | 
					            layout: { get: true, set: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createConstructor: true
 | 
					        createConstructor: true
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("Image", {
 | 
					    getStruct(api.structs, "Image").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            //data: { set: true },
 | 
					            //data: { set: true },
 | 
				
			||||||
            width: { get: true },
 | 
					            width: { get: true },
 | 
				
			||||||
| 
						 | 
					@ -1135,8 +1073,8 @@ function main() {
 | 
				
			||||||
            format: { get: true }
 | 
					            format: { get: true }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadImage"
 | 
					        //destructor: "UnloadImage"
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("Wave", {
 | 
					    getStruct(api.structs, "Wave").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            frameCount: { get: true },
 | 
					            frameCount: { get: true },
 | 
				
			||||||
            sampleRate: { get: true },
 | 
					            sampleRate: { get: true },
 | 
				
			||||||
| 
						 | 
					@ -1144,22 +1082,22 @@ function main() {
 | 
				
			||||||
            channels: { get: true }
 | 
					            channels: { get: true }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadWave"
 | 
					        //destructor: "UnloadWave"
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("Sound", {
 | 
					    getStruct(api.structs, "Sound").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            frameCount: { get: true }
 | 
					            frameCount: { get: true }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadSound"
 | 
					        //destructor: "UnloadSound"
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("Music", {
 | 
					    getStruct(api.structs, "Music").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            frameCount: { get: true },
 | 
					            frameCount: { get: true },
 | 
				
			||||||
            looping: { get: true, set: true },
 | 
					            looping: { get: true, set: true },
 | 
				
			||||||
            ctxType: { get: true },
 | 
					            ctxType: { get: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadMusicStream"
 | 
					        //destructor: "UnloadMusicStream"
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("Model", {
 | 
					    getStruct(api.structs, "Model").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            transform: { get: true, set: true },
 | 
					            transform: { get: true, set: true },
 | 
				
			||||||
            meshCount: { get: true },
 | 
					            meshCount: { get: true },
 | 
				
			||||||
| 
						 | 
					@ -1167,8 +1105,8 @@ function main() {
 | 
				
			||||||
            boneCount: { get: true },
 | 
					            boneCount: { get: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadModel"
 | 
					        //destructor: "UnloadModel"
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("Mesh", {
 | 
					    getStruct(api.structs, "Mesh").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            vertexCount: { get: true, set: true },
 | 
					            vertexCount: { get: true, set: true },
 | 
				
			||||||
            triangleCount: { get: true, set: true },
 | 
					            triangleCount: { get: true, set: true },
 | 
				
			||||||
| 
						 | 
					@ -1187,133 +1125,64 @@ function main() {
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        createEmptyConstructor: true
 | 
					        createEmptyConstructor: true
 | 
				
			||||||
        //destructor: "UnloadMesh"
 | 
					        //destructor: "UnloadMesh"
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("Shader", {
 | 
					    getStruct(api.structs, "Shader").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            id: { get: true }
 | 
					            id: { get: true }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadShader"
 | 
					        //destructor: "UnloadShader"
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("Texture", {
 | 
					    getStruct(api.structs, "Texture").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            width: { get: true },
 | 
					            width: { get: true },
 | 
				
			||||||
            height: { get: true },
 | 
					            height: { get: true },
 | 
				
			||||||
            mipmaps: { get: true },
 | 
					            mipmaps: { get: true },
 | 
				
			||||||
            format: { get: true },
 | 
					            format: { get: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        aliases: getAliases(api.aliases, "Texture")
 | 
				
			||||||
        //destructor: "UnloadTexture"
 | 
					        //destructor: "UnloadTexture"
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("Font", {
 | 
					    getStruct(api.structs, "Font").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            baseSize: { get: true },
 | 
					            baseSize: { get: true },
 | 
				
			||||||
            glyphCount: { get: true },
 | 
					            glyphCount: { get: true },
 | 
				
			||||||
            glyphPadding: { get: true },
 | 
					            glyphPadding: { get: true },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadFont"
 | 
					        //destructor: "UnloadFont"
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("RenderTexture", {
 | 
					    getStruct(api.structs, "RenderTexture").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            id: { get: true }
 | 
					            id: { get: true }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        aliases: getAliases(api.aliases, "RenderTexture")
 | 
				
			||||||
        //destructor: "UnloadRenderTexture"
 | 
					        //destructor: "UnloadRenderTexture"
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("MaterialMap", {
 | 
					    getStruct(api.structs, "MaterialMap").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            texture: { set: true },
 | 
					            texture: { set: true },
 | 
				
			||||||
            color: { set: true, get: true },
 | 
					            color: { set: true, get: true },
 | 
				
			||||||
            value: { get: true, set: true }
 | 
					            value: { get: true, set: true }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadMaterialMap"
 | 
					        //destructor: "UnloadMaterialMap"
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    core.addApiStructByName("Material", {
 | 
					    getStruct(api.structs, "Material").binding = {
 | 
				
			||||||
        properties: {
 | 
					        properties: {
 | 
				
			||||||
            shader: { set: true }
 | 
					            shader: { set: true }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        //destructor: "UnloadMaterial"
 | 
					        //destructor: "UnloadMaterial"
 | 
				
			||||||
    });
 | 
					    };
 | 
				
			||||||
    // Window-related functions
 | 
					    getFunction(api.functions, "SetWindowIcons").binding = { ignore: true };
 | 
				
			||||||
    core.addApiFunctionByName("InitWindow");
 | 
					    getFunction(api.functions, "GetWindowHandle").binding = { ignore: true };
 | 
				
			||||||
    core.addApiFunctionByName("WindowShouldClose");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("CloseWindow");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsWindowReady");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsWindowFullscreen");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsWindowHidden");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsWindowMinimized");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsWindowMaximized");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsWindowFocused");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsWindowResized");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsWindowState");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetWindowState");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("ClearWindowState");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("ToggleFullscreen");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("MaximizeWindow");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("MinimizeWindow");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("RestoreWindow");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetWindowIcon");
 | 
					 | 
				
			||||||
    // SetWindowIcons
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetWindowTitle");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetWindowPosition");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetWindowMonitor");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetWindowMinSize");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetWindowSize");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetWindowOpacity");
 | 
					 | 
				
			||||||
    // GetWindowHandle
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetScreenWidth");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetScreenHeight");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetRenderWidth");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetRenderHeight");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMonitorCount");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetCurrentMonitor");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMonitorPosition");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMonitorWidth");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMonitorHeight");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMonitorPhysicalWidth");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMonitorPhysicalHeight");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMonitorRefreshRate");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetWindowPosition");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetWindowScaleDPI");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMonitorName");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetClipboardText");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetClipboardText");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("EnableEventWaiting");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("DisableEventWaiting");
 | 
					 | 
				
			||||||
    // Custom frame control functions
 | 
					    // Custom frame control functions
 | 
				
			||||||
    // NOT SUPPORTED BECAUSE NEEDS COMPILER FLAG
 | 
					    // NOT SUPPORTED BECAUSE NEEDS COMPILER FLAG
 | 
				
			||||||
    // Cursor-related functions
 | 
					    getFunction(api.functions, "SwapScreenBuffer").binding = { ignore: true };
 | 
				
			||||||
    core.addApiFunctionByName("ShowCursor");
 | 
					    getFunction(api.functions, "PollInputEvents").binding = { ignore: true };
 | 
				
			||||||
    core.addApiFunctionByName("HideCursor");
 | 
					    getFunction(api.functions, "WaitTime").binding = { ignore: true };
 | 
				
			||||||
    core.addApiFunctionByName("IsCursorHidden");
 | 
					    getFunction(api.functions, "BeginVrStereoMode").binding = { ignore: true };
 | 
				
			||||||
    core.addApiFunctionByName("EnableCursor");
 | 
					    getFunction(api.functions, "EndVrStereoMode").binding = { ignore: true };
 | 
				
			||||||
    core.addApiFunctionByName("DisableCursor");
 | 
					    getFunction(api.functions, "LoadVrStereoConfig").binding = { ignore: true };
 | 
				
			||||||
    core.addApiFunctionByName("IsCursorOnScreen");
 | 
					    getFunction(api.functions, "UnloadVrStereoConfig").binding = { ignore: true };
 | 
				
			||||||
    // Drawing related functions
 | 
					    getFunction(api.functions, "SetShaderValue").binding = { body: (gen) => {
 | 
				
			||||||
    core.addApiFunctionByName("ClearBackground");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("BeginDrawing");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("EndDrawing", null, { before: fun => fun.call("app_update_quickjs", []) });
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("BeginMode2D");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("EndMode2D");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("BeginMode3D");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("EndMode3D");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("BeginTextureMode");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("EndTextureMode");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("BeginShaderMode");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("EndShaderMode");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("BeginBlendMode");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("EndBlendMode");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("BeginScissorMode");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("EndScissorMode");
 | 
					 | 
				
			||||||
    //core.addApiFunctionByName("BeginVrStereoMode")
 | 
					 | 
				
			||||||
    //core.addApiFunctionByName("EndVrStereoMode")
 | 
					 | 
				
			||||||
    // VR Stereo config options
 | 
					 | 
				
			||||||
    //core.addApiFunctionByName("LoadVrStereoConfig")
 | 
					 | 
				
			||||||
    //core.addApiFunctionByName("UnloadVrStereoConfig")
 | 
					 | 
				
			||||||
    // Shader Management
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("LoadShader");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("LoadShaderFromMemory");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("IsShaderReady");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetShaderLocation");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetShaderLocationAttrib");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetShaderValue", null, { 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);
 | 
				
			||||||
            gen.declare("value", "void *", false, "NULL");
 | 
					            gen.declare("value", "void *", false, "NULL");
 | 
				
			||||||
| 
						 | 
					@ -1340,29 +1209,8 @@ function main() {
 | 
				
			||||||
            b.returnExp("JS_EXCEPTION");
 | 
					            b.returnExp("JS_EXCEPTION");
 | 
				
			||||||
            gen.call("SetShaderValue", ["shader", "locIndex", "value", "uniformType"]);
 | 
					            gen.call("SetShaderValue", ["shader", "locIndex", "value", "uniformType"]);
 | 
				
			||||||
            gen.returnExp("JS_UNDEFINED");
 | 
					            gen.returnExp("JS_UNDEFINED");
 | 
				
			||||||
        } });
 | 
					        } };
 | 
				
			||||||
    // core.addApiFunctionByName("SetShaderValueV")
 | 
					    getFunction(api.functions, "SetShaderValueV").binding = { ignore: true };
 | 
				
			||||||
    core.addApiFunctionByName("SetShaderValueMatrix");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetShaderValueTexture");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("UnloadShader");
 | 
					 | 
				
			||||||
    // ScreenSpaceRelatedFunctions
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetMouseRay");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetCameraMatrix");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetCameraMatrix2D");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetWorldToScreen");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetScreenToWorld2D");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetWorldToScreenEx");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetWorldToScreen2D");
 | 
					 | 
				
			||||||
    // Timing related functions
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetTargetFPS");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetFPS");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetFrameTime");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetTime");
 | 
					 | 
				
			||||||
    // Misc functions
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("GetRandomValue");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetRandomSeed");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("TakeScreenshot");
 | 
					 | 
				
			||||||
    core.addApiFunctionByName("SetConfigFlags");
 | 
					 | 
				
			||||||
    const traceLog = apiDesc.getFunction("TraceLog");
 | 
					    const traceLog = apiDesc.getFunction("TraceLog");
 | 
				
			||||||
    if (!traceLog)
 | 
					    if (!traceLog)
 | 
				
			||||||
        throw new Error("TraceLog not found");
 | 
					        throw new Error("TraceLog not found");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue