This commit is contained in:
nub31
2025-09-29 16:23:39 +02:00
parent 933c52ac1e
commit 428d69d242
13 changed files with 568 additions and 474 deletions

View File

@@ -21,7 +21,7 @@ public static class Archive
var errors = await process.StandardError.ReadToEndAsync();
if (!string.IsNullOrWhiteSpace(errors))
{
await Console.Error.WriteLineAsync("ar error when archiving:\n" + errors);
await Console.Error.WriteLineAsync(errors);
}
return process.ExitCode == 0;

View File

@@ -22,7 +22,7 @@ public static class GCC
var errors = await process.StandardError.ReadToEndAsync();
if (!string.IsNullOrWhiteSpace(errors))
{
await Console.Error.WriteLineAsync("gcc error when assembling:\n" + errors);
await Console.Error.WriteLineAsync(errors);
}
return process.ExitCode == 0;

View File

@@ -22,7 +22,7 @@ public static class QBE
var errors = await process.StandardError.ReadToEndAsync();
if (!string.IsNullOrWhiteSpace(errors))
{
await Console.Error.WriteLineAsync("qbe error:\n" + errors);
await Console.Error.WriteLineAsync(errors);
}
return process.ExitCode == 0;

View File

@@ -118,7 +118,7 @@ public class Diagnostic
var contextEndLine = Math.Min(lines.Length, endLine + CONTEXT_LINES);
var numberPadding = contextEndLine.ToString().Length;
var codePadding = lines.Skip(contextStartLine - 1).Take(contextEndLine - contextStartLine).Max(x => x.Length);
var codePadding = lines.Skip(contextStartLine - 1).Take(contextEndLine - contextStartLine + 1).Max(x => x.Length);
sb.Append('╭');
sb.Append(new string('─', numberPadding + 2));
@@ -144,16 +144,16 @@ public class Diagnostic
if (i >= startLine && i <= endLine)
{
var markerStartColumn = 1;
var markerEndColumn = line.Length + 1;
var markerEndColumn = line.Length;
if (i == startLine)
{
markerStartColumn = Span.Value.Start.Column;
markerStartColumn = Math.Min(Span.Value.Start.Column, 1);
}
if (i == endLine)
{
markerEndColumn = Span.Value.End.Column;
markerEndColumn = Math.Min(Span.Value.End.Column, line.Length);
}
var markerLength = markerEndColumn - markerStartColumn;

View File

@@ -34,4 +34,12 @@ public class Module
.Where(x => x.Exported || includePrivate)
.ToList();
}
public List<GlobalVariableSyntax> GlobalVariables(bool includePrivate)
{
return _definitions
.OfType<GlobalVariableSyntax>()
.Where(x => x.Exported || includePrivate)
.ToList();
}
}

View File

@@ -86,6 +86,7 @@ public sealed class Parser
{
Symbol.Func => ParseFunc(startIndex, exported, null),
Symbol.Struct => ParseStruct(startIndex, exported),
Symbol.Let => ParseGlobalVariable(startIndex, exported),
_ => throw new ParseException(Diagnostic
.Error($"Expected 'func' or 'struct' but found '{keyword.Symbol}'")
.WithHelp("Valid definition keywords are 'func' and 'struct'")
@@ -113,6 +114,22 @@ public sealed class Parser
return definitions;
}
private GlobalVariableSyntax ParseGlobalVariable(int startIndex, bool exported)
{
var name = ExpectIdentifier();
TypeSyntax? type = null;
if (TryExpectSymbol(Symbol.Colon))
{
type = ParseType();
}
ExpectSymbol(Symbol.Assign);
var value = ParseExpression();
return new GlobalVariableSyntax(GetTokens(startIndex), name.Value, exported, type, value);
}
private FuncSignatureSyntax ParseFuncSignature()
{
var startIndex = _tokenIndex;

View File

@@ -17,3 +17,5 @@ public record StructFuncSyntax(List<Token> Tokens, string Name, string? Hook, Fu
public record StructSyntax(List<Token> Tokens, string Name, bool Exported, List<StructFieldSyntax> Fields, List<StructFuncSyntax> Functions) : DefinitionSyntax(Tokens, Name, Exported);
public record StructTemplateSyntax(List<Token> Tokens, List<string> TemplateArguments, string Name, bool Exported, List<StructFieldSyntax> Fields, List<StructFuncSyntax> Functions) : DefinitionSyntax(Tokens, Name, Exported);
public record GlobalVariableSyntax(List<Token> Tokens, string Name, bool Exported, TypeSyntax? ExplicitType, ExpressionSyntax Value) : DefinitionSyntax(Tokens, Name, Exported);

View File

@@ -5,6 +5,8 @@ namespace NubLang.Tokenization;
public enum LiteralKind
{
Integer,
Hex,
Binary,
Float,
String,
Bool

View File

@@ -159,6 +159,51 @@ public sealed class Tokenizer
var isFloat = false;
var buffer = string.Empty;
if (current == '0' && Peek(1) is 'x')
{
buffer += "0x";
Next();
Next();
while (Peek() != null && Uri.IsHexDigit(Peek()!.Value))
{
buffer += Peek()!.Value;
Next();
}
if (buffer.Length <= 2)
{
throw new TokenizerException(Diagnostic
.Error("Invalid hex literal, no digits found")
.At(_fileName, _line, _column)
.Build());
}
return new LiteralToken(_fileName, CreateSpan(lineStart, columnStart), LiteralKind.Hex, buffer);
}
if (current == '0' && Peek(1) is 'b')
{
buffer += "0b";
Next();
Next();
while (Peek() != null && (Peek() == '0' || Peek() == '1'))
{
buffer += Peek()!.Value;
Next();
}
if (buffer.Length <= 2)
{
throw new TokenizerException(Diagnostic
.Error("Invalid binary literal, no digits found")
.At(_fileName, _line, _column)
.Build());
}
return new LiteralToken(_fileName, CreateSpan(lineStart, columnStart), LiteralKind.Binary, buffer);
}
buffer += current;
while (Peek() != null)
{
var next = Peek()!.Value;
@@ -187,7 +232,12 @@ public sealed class Tokenizer
}
}
return new LiteralToken(_fileName, CreateSpan(lineStart, columnStart), isFloat ? LiteralKind.Float : LiteralKind.Integer, buffer);
return new LiteralToken(
_fileName,
CreateSpan(lineStart, columnStart),
isFloat ? LiteralKind.Float : LiteralKind.Integer,
buffer
);
}
if (current == '"')

View File

@@ -12,4 +12,6 @@ public record StructFieldNode(string Name, NubType Type, ExpressionNode? Value)
public record StructFuncNode(string Name, string? Hook, FuncSignatureNode Signature, BlockNode Body) : Node;
public record StructNode(string Module, string Name, List<StructFieldNode> Fields, List<StructFuncNode> Functions) : DefinitionNode(Module, Name);
public record StructNode(string Module, string Name, List<StructFieldNode> Fields, List<StructFuncNode> Functions) : DefinitionNode(Module, Name);
public record GlobalVariableNode(string Module, string Name, ExpressionNode Value) : DefinitionNode(Module, Name);

View File

@@ -46,27 +46,33 @@ public sealed class TypeChecker
Definitions.Clear();
ReferencedStructTypes.Clear();
foreach (var definition in _syntaxTree.Definitions)
using (BeginRootScope(_syntaxTree.Metadata.ModuleName))
{
try
foreach (var definition in _syntaxTree.Definitions)
{
switch (definition)
try
{
case FuncSyntax funcSyntax:
Definitions.Add(CheckFuncDefinition(funcSyntax));
break;
case StructSyntax structSyntax:
Definitions.Add(CheckStructDefinition(structSyntax));
break;
case StructTemplateSyntax:
break;
default:
throw new ArgumentOutOfRangeException();
switch (definition)
{
case FuncSyntax funcSyntax:
Definitions.Add(CheckFuncDefinition(funcSyntax));
break;
case StructSyntax structSyntax:
Definitions.Add(CheckStructDefinition(structSyntax));
break;
case GlobalVariableSyntax globalVariableSyntax:
Definitions.Add(CheckGlobalVariable(globalVariableSyntax));
break;
case StructTemplateSyntax:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
catch (TypeCheckerException e)
{
Diagnostics.Add(e.Diagnostic);
}
}
catch (TypeCheckerException e)
{
Diagnostics.Add(e.Diagnostic);
}
}
}
@@ -85,9 +91,41 @@ public sealed class TypeChecker
return new ScopeDisposer(this);
}
private ScopeDisposer BeginRootScope(string module)
private ScopeDisposer BeginRootScope(string moduleName)
{
_scopes.Push(new Scope(module));
if (!_visibleModules.TryGetValue(moduleName, out var moduleScope))
{
throw new TypeCheckerException(Diagnostic.Error($"Module with name {moduleName} not found").Build());
}
var scope = new Scope(moduleName);
_scopes.Push(scope);
foreach (var globalVariable in moduleScope.GlobalVariables(true))
{
NubType? type;
if (globalVariable.ExplicitType != null)
{
type = ResolveType(globalVariable.ExplicitType);
var valueExpression = CheckExpression(globalVariable.Value, type);
if (valueExpression.Type != ResolveType(globalVariable.ExplicitType))
{
throw new TypeCheckerException(Diagnostic
.Error("Value does not match explicit type of global variable")
.At(globalVariable.Value)
.Build());
}
}
else
{
type = CheckExpression(globalVariable.Value).Type;
}
scope.DeclareVariable(new Variable(globalVariable.Name, type, VariableKind.LValue));
}
return new ScopeDisposer(this);
}
@@ -105,30 +143,27 @@ public sealed class TypeChecker
private StructNode CheckStructDefinition(StructSyntax node)
{
using (BeginRootScope(_syntaxTree.Metadata.ModuleName))
{
var fieldTypes = node.Fields
.Select(x => new NubStructFieldType(x.Name, ResolveType(x.Type), x.Value != null))
.ToList();
var fieldTypes = node.Fields
.Select(x => new NubStructFieldType(x.Name, ResolveType(x.Type), x.Value != null))
.ToList();
var fieldFunctions = node.Functions
.Select(x =>
{
var parameters = x.Signature.Parameters.Select(y => ResolveType(y.Type)).ToList();
var returnType = ResolveType(x.Signature.ReturnType);
return new NubStructFuncType(x.Name, x.Hook, parameters, returnType);
})
.ToList();
var fieldFunctions = node.Functions
.Select(x =>
{
var parameters = x.Signature.Parameters.Select(y => ResolveType(y.Type)).ToList();
var returnType = ResolveType(x.Signature.ReturnType);
return new NubStructFuncType(x.Name, x.Hook, parameters, returnType);
})
.ToList();
var structType = new NubStructType(CurrentScope.Module, node.Name, fieldTypes, fieldFunctions);
var structType = new NubStructType(CurrentScope.Module, node.Name, fieldTypes, fieldFunctions);
CurrentScope.DeclareVariable(new Variable("this", structType, VariableKind.RValue));
CurrentScope.DeclareVariable(new Variable("this", structType, VariableKind.RValue));
var fields = node.Fields.Select(CheckStructField).ToList();
var functions = node.Functions.Select(CheckStructFunc).ToList();
var fields = node.Fields.Select(CheckStructField).ToList();
var functions = node.Functions.Select(CheckStructFunc).ToList();
return new StructNode(CurrentScope.Module, node.Name, fields, functions);
}
return new StructNode(CurrentScope.Module, node.Name, fields, functions);
}
private StructFuncNode CheckStructFunc(StructFuncSyntax function)
@@ -157,42 +192,44 @@ public sealed class TypeChecker
private FuncNode CheckFuncDefinition(FuncSyntax node)
{
using (BeginRootScope(_syntaxTree.Metadata.ModuleName))
foreach (var parameter in node.Signature.Parameters)
{
foreach (var parameter in node.Signature.Parameters)
{
CurrentScope.DeclareVariable(new Variable(parameter.Name, ResolveType(parameter.Type), VariableKind.RValue));
}
var signature = CheckFuncSignature(node.Signature);
BlockNode? body = null;
if (node.Body != null)
{
_funcReturnTypes.Push(signature.ReturnType);
body = CheckBlock(node.Body);
if (!AlwaysReturns(body))
{
if (signature.ReturnType is NubVoidType)
{
body.Statements.Add(new ReturnNode(null));
}
else
{
Diagnostics.Add(Diagnostic
.Error("Not all code paths return a value")
.At(node.Body)
.Build());
}
}
_funcReturnTypes.Pop();
}
return new FuncNode(CurrentScope.Module, node.Name, node.ExternSymbol, signature, body);
CurrentScope.DeclareVariable(new Variable(parameter.Name, ResolveType(parameter.Type), VariableKind.RValue));
}
var signature = CheckFuncSignature(node.Signature);
BlockNode? body = null;
if (node.Body != null)
{
_funcReturnTypes.Push(signature.ReturnType);
body = CheckBlock(node.Body);
if (!AlwaysReturns(body))
{
if (signature.ReturnType is NubVoidType)
{
body.Statements.Add(new ReturnNode(null));
}
else
{
Diagnostics.Add(Diagnostic
.Error("Not all code paths return a value")
.At(node.Body)
.Build());
}
}
_funcReturnTypes.Pop();
}
return new FuncNode(CurrentScope.Module, node.Name, node.ExternSymbol, signature, body);
}
private GlobalVariableNode CheckGlobalVariable(GlobalVariableSyntax node)
{
return new GlobalVariableNode(CurrentScope.Module, node.Name, CheckExpression(node.Value));
}
private AssignmentNode CheckAssignment(AssignmentSyntax statement)
@@ -701,6 +738,19 @@ public sealed class TypeChecker
var includePrivate = expression.Module == CurrentScope.Module;
var globalVariable = module.GlobalVariables(includePrivate).FirstOrDefault(x => x.Name == expression.Name);
if (globalVariable != null)
{
// todo(nub31): This should be done in the global scope
NubType? type = null;
if (globalVariable.ExplicitType != null)
{
type = ResolveType(globalVariable.ExplicitType);
}
return CheckExpression(globalVariable.Value, type);
}
// First, look for the exported function in the specified module
var function = module.Functions(includePrivate).FirstOrDefault(x => x.Name == expression.Name);
if (function != null)
@@ -733,8 +783,8 @@ public sealed class TypeChecker
{
return floatType.Width switch
{
32 => new Float32LiteralNode(floatType, float.Parse(expression.Value)),
64 => new Float64LiteralNode(floatType, double.Parse(expression.Value)),
32 => new Float32LiteralNode(floatType, float.Parse(expression.Value, CultureInfo.InvariantCulture)),
64 => new Float64LiteralNode(floatType, double.Parse(expression.Value, CultureInfo.InvariantCulture)),
_ => throw new ArgumentOutOfRangeException()
};
}
@@ -749,6 +799,30 @@ public sealed class TypeChecker
? new Float32LiteralNode(type, float.Parse(expression.Value, CultureInfo.InvariantCulture))
: new Float64LiteralNode(type, double.Parse(expression.Value, CultureInfo.InvariantCulture));
}
case LiteralKind.Hex:
{
if (expectedType is NubIntType intType)
{
return intType.Signed
? new IntLiteralNode(intType, Convert.ToInt64(expression.Value, 16))
: new UIntLiteralNode(intType, Convert.ToUInt64(expression.Value, 16));
}
var type = new NubIntType(true, 64);
return new IntLiteralNode(type, Convert.ToInt64(expression.Value, 16));
}
case LiteralKind.Binary:
{
if (expectedType is NubIntType intType)
{
return intType.Signed
? new IntLiteralNode(intType, Convert.ToInt64(expression.Value[2..], 2))
: new UIntLiteralNode(intType, Convert.ToUInt64(expression.Value[2..], 2));
}
var type = new NubIntType(true, 64);
return new IntLiteralNode(type, Convert.ToInt64(expression.Value.Substring(2), 2));
}
case LiteralKind.String:
{
return expectedType switch

View File

@@ -5,7 +5,7 @@ module "main"
extern "main" func main(args: []cstring): i64
{
raylib::SetConfigFlags(raylib::ConfigFlags::VSYNC_HINT)
raylib::SetConfigFlags(raylib::FLAG_VSYNC_HINT)
raylib::InitWindow(1600, 900, "Hi from nub-lang")
raylib::SetTargetFPS(240)
@@ -45,7 +45,8 @@ extern "main" func main(args: []cstring): i64
raylib::BeginDrawing()
{
raylib::ClearBackground(bgColor);
raylib::ClearBackground(bgColor)
raylib::DrawFPS(10, 10)
raylib::DrawRectangle(x, y, width, height, color)
}
raylib::EndDrawing()

View File

@@ -1,34 +1,34 @@
module "raylib"
// export let PI = 3.14159265358979323846
export let PI = 3.14159265358979323846
// export let LIGHTGRAY = struct Color { r = 200, g = 200, b = 200, a = 255 }
// export let GRAY = struct Color { r = 130, g = 130, b = 130, a = 255 }
// export let DARKGRAY = struct Color { r = 80, g = 80, b = 80, a = 255 }
// export let YELLOW = struct Color { r = 253, g = 249, b = 0, a = 255 }
// export let GOLD = struct Color { r = 255, g = 203, b = 0, a = 255 }
// export let ORANGE = struct Color { r = 255, g = 161, b = 0, a = 255 }
// export let PINK = struct Color { r = 255, g = 109, b = 194, a = 255 }
// export let RED = struct Color { r = 230, g = 41, b = 55, a = 255 }
// export let MAROON = struct Color { r = 190, g = 33, b = 55, a = 255 }
// export let GREEN = struct Color { r = 0, g = 228, b = 48, a = 255 }
// export let LIME = struct Color { r = 0, g = 158, b = 47, a = 255 }
// export let DARKGREEN = struct Color { r = 0, g = 117, b = 44, a = 255 }
// export let SKYBLUE = struct Color { r = 102, g = 191, b = 255, a = 255 }
// export let BLUE = struct Color { r = 0, g = 121, b = 241, a = 255 }
// export let DARKBLUE = struct Color { r = 0, g = 82, b = 172, a = 255 }
// export let PURPLE = struct Color { r = 200, g = 122, b = 255, a = 255 }
// export let VIOLET = struct Color { r = 135, g = 60, b = 190, a = 255 }
// export let DARKPURPLE = struct Color { r = 112, g = 31, b = 126, a = 255 }
// export let BEIGE = struct Color { r = 211, g = 176, b = 131, a = 255 }
// export let BROWN = struct Color { r = 127, g = 106, b = 79, a = 255 }
// export let DARKBROWN = struct Color { r = 76, g = 63, b = 47, a = 255 }
export let LIGHTGRAY = struct Color { r = 200 g = 200 b = 200 a = 255 }
export let GRAY = struct Color { r = 130 g = 130 b = 130 a = 255 }
export let DARKGRAY = struct Color { r = 80 g = 80 b = 80 a = 255 }
export let YELLOW = struct Color { r = 253 g = 249 b = 0 a = 255 }
export let GOLD = struct Color { r = 255 g = 203 b = 0 a = 255 }
export let ORANGE = struct Color { r = 255 g = 161 b = 0 a = 255 }
export let PINK = struct Color { r = 255 g = 109 b = 194 a = 255 }
export let RED = struct Color { r = 230 g = 41 b = 55 a = 255 }
export let MAROON = struct Color { r = 190 g = 33 b = 55 a = 255 }
export let GREEN = struct Color { r = 0 g = 228 b = 48 a = 255 }
export let LIME = struct Color { r = 0 g = 158 b = 47 a = 255 }
export let DARKGREEN = struct Color { r = 0 g = 117 b = 44 a = 255 }
export let SKYBLUE = struct Color { r = 102 g = 191 b = 255 a = 255 }
export let BLUE = struct Color { r = 0 g = 121 b = 241 a = 255 }
export let DARKBLUE = struct Color { r = 0 g = 82 b = 172 a = 255 }
export let PURPLE = struct Color { r = 200 g = 122 b = 255 a = 255 }
export let VIOLET = struct Color { r = 135 g = 60 b = 190 a = 255 }
export let DARKPURPLE = struct Color { r = 112 g = 31 b = 126 a = 255 }
export let BEIGE = struct Color { r = 211 g = 176 b = 131 a = 255 }
export let BROWN = struct Color { r = 127 g = 106 b = 79 a = 255 }
export let DARKBROWN = struct Color { r = 76 g = 63 b = 47 a = 255 }
// export let WHITE = struct Color { r = 255, g = 255, b = 255, a = 255 }
// export let BLACK = struct Color { r = 0, g = 0, b = 0, a = 255 }
// export let BLANK = struct Color { r = 0, g = 0, b = 0, a = 0 }
// export let MAGENTA = struct Color { r = 255, g = 0, b = 255, a = 255 }
// export let RAYWHITE = struct Color { r = 245, g = 245, b = 245, a = 255 }
export let WHITE = struct Color { r = 255 g = 255 b = 255 a = 255 }
export let BLACK = struct Color { r = 0 g = 0 b = 0 a = 255 }
export let BLANK = struct Color { r = 0 g = 0 b = 0 a = 0 }
export let MAGENTA = struct Color { r = 255 g = 0 b = 255 a = 255 }
export let RAYWHITE = struct Color { r = 245 g = 245 b = 245 a = 255 }
export struct Vector2
{
@@ -382,388 +382,326 @@ export struct AutomationEventList
events: ^AutomationEvent
}
// export enum ConfigFlags
// {
// VSYNC_HINT = 0x00000040
// FULLSCREEN_MODE = 0x00000002
// WINDOW_RESIZABLE = 0x00000004
// WINDOW_UNDECORATED = 0x00000008
// WINDOW_HIDDEN = 0x00000080
// WINDOW_MINIMIZED = 0x00000200
// WINDOW_MAXIMIZED = 0x00000400
// WINDOW_UNFOCUSED = 0x00000800
// WINDOW_TOPMOST = 0x00001000
// WINDOW_ALWAYS_RUN = 0x00000100
// WINDOW_TRANSPARENT = 0x00000010
// WINDOW_HIGHDPI = 0x00002000
// WINDOW_MOUSE_PASSTHROUGH = 0x00004000
// BORDERLESS_WINDOWED_MODE = 0x00008000
// MSAA_4X_HINT = 0x00000020
// INTERLACED_HINT = 0x00010000
// }
export let FLAG_VSYNC_HINT: u32 = 0x00000040
export let FLAG_FULLSCREEN_MODE: u32 = 0x00000002
export let FLAG_WINDOW_RESIZABLE: u32 = 0x00000004
export let FLAG_WINDOW_UNDECORATED: u32 = 0x00000008
export let FLAG_WINDOW_HIDDEN: u32 = 0x00000080
export let FLAG_WINDOW_MINIMIZED: u32 = 0x00000200
export let FLAG_WINDOW_MAXIMIZED: u32 = 0x00000400
export let FLAG_WINDOW_UNFOCUSED: u32 = 0x00000800
export let FLAG_WINDOW_TOPMOST: u32 = 0x00001000
export let FLAG_WINDOW_ALWAYS_RUN: u32 = 0x00000100
export let FLAG_WINDOW_TRANSPARENT: u32 = 0x00000010
export let FLAG_WINDOW_HIGHDPI: u32 = 0x00002000
export let FLAG_WINDOW_MOUSE_PASSTHROUGH: u32 = 0x00004000
export let FLAG_BORDERLESS_WINDOWED_MODE: u32 = 0x00008000
export let FLAG_MSAA_4X_HINT: u32 = 0x00000020
export let FLAG_INTERLACED_HINT: u32 = 0x00010000
export let LOG_ALL: i32 = 0
export let LOG_TRACE: i32 = 1
export let LOG_DEBUG: i32 = 2
export let LOG_INFO: i32 = 3
export let LOG_WARNING: i32 = 4
export let LOG_ERROR: i32 = 5
export let LOG_FATAL: i32 = 6
export let LOG_NONE: i32 = 7
// export enum TraceLogLevel
// {
// LOG_ALL = 0
// LOG_TRACE
// LOG_DEBUG
// LOG_INFO
// LOG_WARNING
// LOG_ERROR
// LOG_FATAL
// LOG_NONE
// }
export let KEY_NULL: i32 = 0
export let KEY_APOSTROPHE: i32 = 39
export let KEY_COMMA: i32 = 44
export let KEY_MINUS: i32 = 45
export let KEY_PERIOD: i32 = 46
export let KEY_SLASH: i32 = 47
export let KEY_ZERO: i32 = 48
export let KEY_ONE: i32 = 49
export let KEY_TWO: i32 = 50
export let KEY_THREE: i32 = 51
export let KEY_FOUR: i32 = 52
export let KEY_FIVE: i32 = 53
export let KEY_SIX: i32 = 54
export let KEY_SEVEN: i32 = 55
export let KEY_EIGHT: i32 = 56
export let KEY_NINE: i32 = 57
export let KEY_SEMICOLON: i32 = 59
export let KEY_EQUAL: i32 = 61
export let KEY_A: i32 = 65
export let KEY_B: i32 = 66
export let KEY_C: i32 = 67
export let KEY_D: i32 = 68
export let KEY_E: i32 = 69
export let KEY_F: i32 = 70
export let KEY_G: i32 = 71
export let KEY_H: i32 = 72
export let KEY_I: i32 = 73
export let KEY_J: i32 = 74
export let KEY_K: i32 = 75
export let KEY_L: i32 = 76
export let KEY_M: i32 = 77
export let KEY_N: i32 = 78
export let KEY_O: i32 = 79
export let KEY_P: i32 = 80
export let KEY_Q: i32 = 81
export let KEY_R: i32 = 82
export let KEY_S: i32 = 83
export let KEY_T: i32 = 84
export let KEY_U: i32 = 85
export let KEY_V: i32 = 86
export let KEY_W: i32 = 87
export let KEY_X: i32 = 88
export let KEY_Y: i32 = 89
export let KEY_Z: i32 = 90
export let KEY_LEFT_BRACKET: i32 = 91
export let KEY_BACKSLASH: i32 = 92
export let KEY_RIGHT_BRACKET: i32 = 93
export let KEY_GRAVE: i32 = 96
export let KEY_SPACE: i32 = 32
export let KEY_ESCAPE: i32 = 256
export let KEY_ENTER: i32 = 257
export let KEY_TAB: i32 = 258
export let KEY_BACKSPACE: i32 = 259
export let KEY_INSERT: i32 = 260
export let KEY_DELETE: i32 = 261
export let KEY_RIGHT: i32 = 262
export let KEY_LEFT: i32 = 263
export let KEY_DOWN: i32 = 264
export let KEY_UP: i32 = 265
export let KEY_PAGE_UP: i32 = 266
export let KEY_PAGE_DOWN: i32 = 267
export let KEY_HOME: i32 = 268
export let KEY_END: i32 = 269
export let KEY_CAPS_LOCK: i32 = 280
export let KEY_SCROLL_LOCK: i32 = 281
export let KEY_NUM_LOCK: i32 = 282
export let KEY_PRINT_SCREEN: i32 = 283
export let KEY_PAUSE: i32 = 284
export let KEY_F1: i32 = 290
export let KEY_F2: i32 = 291
export let KEY_F3: i32 = 292
export let KEY_F4: i32 = 293
export let KEY_F5: i32 = 294
export let KEY_F6: i32 = 295
export let KEY_F7: i32 = 296
export let KEY_F8: i32 = 297
export let KEY_F9: i32 = 298
export let KEY_F10: i32 = 299
export let KEY_F11: i32 = 300
export let KEY_F12: i32 = 301
export let KEY_LEFT_SHIFT: i32 = 340
export let KEY_LEFT_CONTROL: i32 = 341
export let KEY_LEFT_ALT: i32 = 342
export let KEY_LEFT_SUPER: i32 = 343
export let KEY_RIGHT_SHIFT: i32 = 344
export let KEY_RIGHT_CONTROL: i32 = 345
export let KEY_RIGHT_ALT: i32 = 346
export let KEY_RIGHT_SUPER: i32 = 347
export let KEY_KB_MENU: i32 = 348
export let KEY_KP_0: i32 = 320
export let KEY_KP_1: i32 = 321
export let KEY_KP_2: i32 = 322
export let KEY_KP_3: i32 = 323
export let KEY_KP_4: i32 = 324
export let KEY_KP_5: i32 = 325
export let KEY_KP_6: i32 = 326
export let KEY_KP_7: i32 = 327
export let KEY_KP_8: i32 = 328
export let KEY_KP_9: i32 = 329
export let KEY_KP_DECIMAL: i32 = 330
export let KEY_KP_DIVIDE: i32 = 331
export let KEY_KP_MULTIPLY: i32 = 332
export let KEY_KP_SUBTRACT: i32 = 333
export let KEY_KP_ADD: i32 = 334
export let KEY_KP_ENTER: i32 = 335
export let KEY_KP_EQUAL: i32 = 336
export let KEY_BACK: i32 = 4
export let KEY_MENU: i32 = 5
export let KEY_VOLUME_UP: i32 = 24
export let KEY_VOLUME_DOWN: i32 = 25
// export enum KeyboardKey
// {
// NULL = 0
// APOSTROPHE = 39
// COMMA = 44
// MINUS = 45
// PERIOD = 46
// SLASH = 47
// ZERO = 48
// ONE = 49
// TWO = 50
// THREE = 51
// FOUR = 52
// FIVE = 53
// SIX = 54
// SEVEN = 55
// EIGHT = 56
// NINE = 57
// SEMICOLON = 59
// EQUAL = 61
// A = 65
// B = 66
// C = 67
// D = 68
// E = 69
// F = 70
// G = 71
// H = 72
// I = 73
// J = 74
// K = 75
// L = 76
// M = 77
// N = 78
// O = 79
// P = 80
// Q = 81
// R = 82
// S = 83
// T = 84
// U = 85
// V = 86
// W = 87
// X = 88
// Y = 89
// Z = 90
// LEFT_BRACKET = 91
// BACKSLASH = 92
// RIGHT_BRACKET = 93
// GRAVE = 96
// SPACE = 32
// ESCAPE = 256
// ENTER = 257
// TAB = 258
// BACKSPACE = 259
// INSERT = 260
// DELETE = 261
// RIGHT = 262
// LEFT = 263
// DOWN = 264
// UP = 265
// PAGE_UP = 266
// PAGE_DOWN = 267
// HOME = 268
// END = 269
// CAPS_LOCK = 280
// SCROLL_LOCK = 281
// NUM_LOCK = 282
// PRINT_SCREEN = 283
// PAUSE = 284
// F1 = 290
// F2 = 291
// F3 = 292
// F4 = 293
// F5 = 294
// F6 = 295
// F7 = 296
// F8 = 297
// F9 = 298
// F10 = 299
// F11 = 300
// F12 = 301
// LEFT_SHIFT = 340
// LEFT_CONTROL = 341
// LEFT_ALT = 342
// LEFT_SUPER = 343
// RIGHT_SHIFT = 344
// RIGHT_CONTROL = 345
// RIGHT_ALT = 346
// RIGHT_SUPER = 347
// KB_MENU = 348
// KP_0 = 320
// KP_1 = 321
// KP_2 = 322
// KP_3 = 323
// KP_4 = 324
// KP_5 = 325
// KP_6 = 326
// KP_7 = 327
// KP_8 = 328
// KP_9 = 329
// KP_DECIMAL = 330
// KP_DIVIDE = 331
// KP_MULTIPLY = 332
// KP_SUBTRACT = 333
// KP_ADD = 334
// KP_ENTER = 335
// KP_EQUAL = 336
// BACK = 4
// MENU = 5
// VOLUME_UP = 24
// VOLUME_DOWN = 25
// }
export let MOUSE_BUTTON_LEFT: i32 = 0
export let MOUSE_BUTTON_RIGHT: i32 = 1
export let MOUSE_BUTTON_MIDDLE: i32 = 2
export let MOUSE_BUTTON_SIDE: i32 = 3
export let MOUSE_BUTTON_EXTRA: i32 = 4
export let MOUSE_BUTTON_FORWARD: i32 = 5
export let MOUSE_BUTTON_BACK: i32 = 6
// export enum MouseButton
// {
// LEFT = 0
// RIGHT = 1
// MIDDLE = 2
// SIDE = 3
// EXTRA = 4
// FORWARD = 5
// BACK = 6
// }
export let MOUSE_CURSOR_DEFAULT: i32 = 0
export let MOUSE_CURSOR_ARROW: i32 = 1
export let MOUSE_CURSOR_IBEAM: i32 = 2
export let MOUSE_CURSOR_CROSSHAIR: i32 = 3
export let MOUSE_CURSOR_POINTING_HAND: i32 = 4
export let MOUSE_CURSOR_RESIZE_EW: i32 = 5
export let MOUSE_CURSOR_RESIZE_NS: i32 = 6
export let MOUSE_CURSOR_RESIZE_NWSE: i32 = 7
export let MOUSE_CURSOR_RESIZE_NESW: i32 = 8
export let MOUSE_CURSOR_RESIZE_ALL: i32 = 9
export let MOUSE_CURSOR_NOT_ALLOWED: i32 = 10
// export enum MouseCursor
// {
// DEFAULT = 0
// ARROW = 1
// IBEAM = 2
// CROSSHAIR = 3
// POINTING_HAND = 4
// RESIZE_EW = 5
// RESIZE_NS = 6
// RESIZE_NWSE = 7
// RESIZE_NESW = 8
// RESIZE_ALL = 9
// NOT_ALLOWED = 10
// }
export let GAMEPAD_BUTTON_UNKNOWN: i32 = 0
export let GAMEPAD_BUTTON_LEFT_FACE_UP: i32 = 1
export let GAMEPAD_BUTTON_LEFT_FACE_RIGHT: i32 = 2
export let GAMEPAD_BUTTON_LEFT_FACE_DOWN: i32 = 3
export let GAMEPAD_BUTTON_LEFT_FACE_LEFT: i32 = 4
export let GAMEPAD_BUTTON_RIGHT_FACE_UP: i32 = 5
export let GAMEPAD_BUTTON_RIGHT_FACE_RIGHT: i32 = 6
export let GAMEPAD_BUTTON_RIGHT_FACE_DOWN: i32 = 7
export let GAMEPAD_BUTTON_RIGHT_FACE_LEFT: i32 = 8
export let GAMEPAD_BUTTON_LEFT_TRIGGER_1: i32 = 9
export let GAMEPAD_BUTTON_LEFT_TRIGGER_2: i32 = 10
export let GAMEPAD_BUTTON_RIGHT_TRIGGER_1: i32 = 11
export let GAMEPAD_BUTTON_RIGHT_TRIGGER_2: i32 = 12
export let GAMEPAD_BUTTON_MIDDLE_LEFT: i32 = 13
export let GAMEPAD_BUTTON_MIDDLE: i32 = 14
export let GAMEPAD_BUTTON_MIDDLE_RIGHT: i32 = 15
export let GAMEPAD_BUTTON_LEFT_THUMB: i32 = 16
export let GAMEPAD_BUTTON_RIGHT_THUMB: i32 = 17
// export enum GamepadButton
// {
// UNKNOWN = 0
// LEFT_FACE_UP
// LEFT_FACE_RIGHT
// LEFT_FACE_DOWN
// LEFT_FACE_LEFT
// RIGHT_FACE_UP
// RIGHT_FACE_RIGHT
// RIGHT_FACE_DOWN
// RIGHT_FACE_LEFT
// LEFT_TRIGGER_1
// LEFT_TRIGGER_2
// RIGHT_TRIGGER_1
// RIGHT_TRIGGER_2
// MIDDLE_LEFT
// MIDDLE
// MIDDLE_RIGHT
// LEFT_THUMB
// RIGHT_THUMB
// }
export let GAMEPAD_AXIS_LEFT_X: i32 = 0
export let GAMEPAD_AXIS_LEFT_Y: i32 = 1
export let GAMEPAD_AXIS_RIGHT_X: i32 = 2
export let GAMEPAD_AXIS_RIGHT_Y: i32 = 3
export let GAMEPAD_AXIS_LEFT_TRIGGER: i32 = 4
export let GAMEPAD_AXIS_RIGHT_TRIGGER: i32 = 5
// export enum GamepadAxis
// {
// LEFT_X = 0
// LEFT_Y = 1
// RIGHT_X = 2
// RIGHT_Y = 3
// LEFT_TRIGGER = 4
// RIGHT_TRIGGER = 5
// }
export let MATERIAL_MAP_ALBEDO: i32 = 0
export let MATERIAL_MAP_METALNESS: i32 = 1
export let MATERIAL_MAP_NORMAL: i32 = 2
export let MATERIAL_MAP_ROUGHNESS: i32 = 3
export let MATERIAL_MAP_OCCLUSION: i32 = 4
export let MATERIAL_MAP_EMISSION: i32 = 5
export let MATERIAL_MAP_HEIGHT: i32 = 6
export let MATERIAL_MAP_CUBEMAP: i32 = 7
export let MATERIAL_MAP_IRRADIANCE: i32 = 8
export let MATERIAL_MAP_PREFILTER: i32 = 9
export let MATERIAL_MAP_BRDF: i32 = 10
// export enum MaterialMapIndex
// {
// ALBEDO = 0
// METALNESS
// NORMAL
// ROUGHNESS
// OCCLUSION
// EMISSION
// HEIGHT
// CUBEMAP
// IRRADIANCE
// PREFILTER
// BRDF
// }
export let SHADER_LOC_VERTEX_POSITION: i32 = 0
export let SHADER_LOC_VERTEX_TEXCOORD01: i32 = 1
export let SHADER_LOC_VERTEX_TEXCOORD02: i32 = 2
export let SHADER_LOC_VERTEX_NORMAL: i32 = 3
export let SHADER_LOC_VERTEX_TANGENT: i32 = 4
export let SHADER_LOC_VERTEX_COLOR: i32 = 5
export let SHADER_LOC_MATRIX_MVP: i32 = 6
export let SHADER_LOC_MATRIX_VIEW: i32 = 7
export let SHADER_LOC_MATRIX_PROJECTION: i32 = 8
export let SHADER_LOC_MATRIX_MODEL: i32 = 9
export let SHADER_LOC_MATRIX_NORMAL: i32 = 10
export let SHADER_LOC_VECTOR_VIEW: i32 = 11
export let SHADER_LOC_COLOR_DIFFUSE: i32 = 12
export let SHADER_LOC_COLOR_SPECULAR: i32 = 13
export let SHADER_LOC_COLOR_AMBIENT: i32 = 14
export let SHADER_LOC_MAP_ALBEDO: i32 = 15
export let SHADER_LOC_MAP_METALNESS: i32 = 16
export let SHADER_LOC_MAP_NORMAL: i32 = 17
export let SHADER_LOC_MAP_ROUGHNESS: i32 = 18
export let SHADER_LOC_MAP_OCCLUSION: i32 = 19
export let SHADER_LOC_MAP_EMISSION: i32 = 20
export let SHADER_LOC_MAP_HEIGHT: i32 = 21
export let SHADER_LOC_MAP_CUBEMAP: i32 = 22
export let SHADER_LOC_MAP_IRRADIANCE: i32 = 23
export let SHADER_LOC_MAP_PREFILTER: i32 = 24
export let SHADER_LOC_MAP_BRDF: i32 = 25
export let SHADER_LOC_VERTEX_BONEIDS: i32 = 26
export let SHADER_LOC_VERTEX_BONEWEIGHTS: i32 = 27
export let SHADER_LOC_BONE_MATRICES: i32 = 28
// export enum ShaderLocationIndex
// {
// VERTEX_POSITION = 0
// VERTEX_TEXCOORD01
// VERTEX_TEXCOORD02
// VERTEX_NORMAL
// VERTEX_TANGENT
// VERTEX_COLOR
// MATRIX_MVP
// MATRIX_VIEW
// MATRIX_PROJECTION
// MATRIX_MODEL
// MATRIX_NORMAL
// VECTOR_VIEW
// COLOR_DIFFUSE
// COLOR_SPECULAR
// COLOR_AMBIENT
// MAP_ALBEDO
// MAP_METALNESS
// MAP_NORMAL
// MAP_ROUGHNESS
// MAP_OCCLUSION
// MAP_EMISSION
// MAP_HEIGHT
// MAP_CUBEMAP
// MAP_IRRADIANCE
// MAP_PREFILTER
// MAP_BRDF
// VERTEX_BONEIDS
// VERTEX_BONEWEIGHTS
// BONE_MATRICES
// }
export let SHADER_UNIFORM_FLOAT: i32 = 0
export let SHADER_UNIFORM_VEC2: i32 = 1
export let SHADER_UNIFORM_VEC3: i32 = 2
export let SHADER_UNIFORM_VEC4: i32 = 3
export let SHADER_UNIFORM_INT: i32 = 4
export let SHADER_UNIFORM_IVEC2: i32 = 5
export let SHADER_UNIFORM_IVEC3: i32 = 6
export let SHADER_UNIFORM_IVEC4: i32 = 7
export let SHADER_UNIFORM_SAMPLER2D: i32 = 8
// export enum ShaderUniformDataType {
// FLOAT = 0
// VEC2
// VEC3
// VEC4
// INT
// IVEC2
// IVEC3
// IVEC4
// SAMPLER2D
// }
export let SHADER_ATTRIB_FLOAT: i32 = 0
export let SHADER_ATTRIB_VEC2: i32 = 1
export let SHADER_ATTRIB_VEC3: i32 = 2
export let SHADER_ATTRIB_VEC4: i32 = 3
// export enum ShaderAttributeDataType {
// FLOAT = 0
// VEC2
// VEC3
// VEC4
// }
export let PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: i32 = 1
export let PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: i32 = 2
export let PIXELFORMAT_UNCOMPRESSED_R5G6B5: i32 = 3
export let PIXELFORMAT_UNCOMPRESSED_R8G8B8: i32 = 4
export let PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: i32 = 5
export let PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: i32 = 6
export let PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: i32 = 7
export let PIXELFORMAT_UNCOMPRESSED_R32: i32 = 8
export let PIXELFORMAT_UNCOMPRESSED_R32G32B32: i32 = 9
export let PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: i32 = 10
export let PIXELFORMAT_UNCOMPRESSED_R16: i32 = 11
export let PIXELFORMAT_UNCOMPRESSED_R16G16B16: i32 = 12
export let PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: i32 = 13
export let PIXELFORMAT_COMPRESSED_DXT1_RGB: i32 = 14
export let PIXELFORMAT_COMPRESSED_DXT1_RGBA: i32 = 15
export let PIXELFORMAT_COMPRESSED_DXT3_RGBA: i32 = 16
export let PIXELFORMAT_COMPRESSED_DXT5_RGBA: i32 = 17
export let PIXELFORMAT_COMPRESSED_ETC1_RGB: i32 = 18
export let PIXELFORMAT_COMPRESSED_ETC2_RGB: i32 = 19
export let PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: i32 = 20
export let PIXELFORMAT_COMPRESSED_PVRT_RGB: i32 = 21
export let PIXELFORMAT_COMPRESSED_PVRT_RGBA: i32 = 22
export let PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: i32 = 23
export let PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: i32 = 24
// export enum PixelFormat
// {
// UNCOMPRESSED_GRAYSCALE = 1
// UNCOMPRESSED_GRAY_ALPHA
// UNCOMPRESSED_R5G6B5
// UNCOMPRESSED_R8G8B8
// UNCOMPRESSED_R5G5B5A1
// UNCOMPRESSED_R4G4B4A4
// UNCOMPRESSED_R8G8B8A8
// UNCOMPRESSED_R32
// UNCOMPRESSED_R32G32B32
// UNCOMPRESSED_R32G32B32A32
// UNCOMPRESSED_R16
// UNCOMPRESSED_R16G16B16
// UNCOMPRESSED_R16G16B16A16
// COMPRESSED_DXT1_RGB
// COMPRESSED_DXT1_RGBA
// COMPRESSED_DXT3_RGBA
// COMPRESSED_DXT5_RGBA
// COMPRESSED_ETC1_RGB
// COMPRESSED_ETC2_RGB
// COMPRESSED_ETC2_EAC_RGBA
// COMPRESSED_PVRT_RGB
// COMPRESSED_PVRT_RGBA
// COMPRESSED_ASTC_4x4_RGBA
// COMPRESSED_ASTC_8x8_RGBA
// }
export let TEXTURE_FILTER_POINT: i32 = 0
export let TEXTURE_FILTER_BILINEAR: i32 = 1
export let TEXTURE_FILTER_TRILINEAR: i32 = 2
export let TEXTURE_FILTER_ANISOTROPIC_4X: i32 = 3
export let TEXTURE_FILTER_ANISOTROPIC_8X: i32 = 4
export let TEXTURE_FILTER_ANISOTROPIC_16X: i32 = 5
// export enum TextureFilter
// {
// POINT = 0
// BILINEAR
// TRILINEAR
// ANISOTROPIC_4X
// ANISOTROPIC_8X
// ANISOTROPIC_16X
// }
export let TEXTURE_WRAP_REPEAT: i32 = 0
export let TEXTURE_WRAP_CLAMP: i32 = 1
export let TEXTURE_WRAP_MIRROR_REPEAT: i32 = 2
export let TEXTURE_WRAP_MIRROR_CLAMP: i32 = 3
// export enum TextureWrap
// {
// REPEAT = 0
// CLAMP
// MIRROR_REPEAT
// MIRROR_CLAMP
// }
export let CUBEMAP_LAYOUT_AUTO_DETECT: i32 = 0
export let CUBEMAP_LAYOUT_LINE_VERTICAL: i32 = 1
export let CUBEMAP_LAYOUT_LINE_HORIZONTAL: i32 = 2
export let CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR: i32 = 3
export let CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE: i32 = 4
// export enum CubemapLayout
// {
// AUTO_DETECT = 0
// LINE_VERTICAL
// LINE_HORIZONTAL
// CROSS_THREE_BY_FOUR
// CROSS_FOUR_BY_THREE
// }
export let FONT_DEFAULT: i32 = 0
export let FONT_BITMAP: i32 = 1
export let FONT_SDF: i32 = 2
// export enum FontType
// {
// FONT_DEFAULT = 0
// FONT_BITMAP
// FONT_SDF
// }
export let BLEND_ALPHA: i32 = 0
export let BLEND_ADDITIVE: i32 = 1
export let BLEND_MULTIPLIED: i32 = 2
export let BLEND_ADD_COLORS: i32 = 3
export let BLEND_SUBTRACT_COLORS: i32 = 4
export let BLEND_ALPHA_PREMULTIPLY: i32 = 5
export let BLEND_CUSTOM: i32 = 6
export let BLEND_CUSTOM_SEPARATE: i32 = 7
// export enum BlendMode
// {
// BLEND_ALPHA = 0,
// BLEND_ADDITIVE,
// BLEND_MULTIPLIED,
// BLEND_ADD_COLORS,
// BLEND_SUBTRACT_COLORS,
// BLEND_ALPHA_PREMULTIPLY,
// BLEND_CUSTOM,
// BLEND_CUSTOM_SEPARATE
// }
export let GESTURE_NONE: i32 = 0
export let GESTURE_TAP: i32 = 1
export let GESTURE_DOUBLETAP: i32 = 2
export let GESTURE_HOLD: i32 = 4
export let GESTURE_DRAG: i32 = 8
export let GESTURE_SWIPE_RIGHT: i32 = 16
export let GESTURE_SWIPE_LEFT: i32 = 32
export let GESTURE_SWIPE_UP: i32 = 64
export let GESTURE_SWIPE_DOWN: i32 = 128
export let GESTURE_PINCH_IN: i32 = 256
export let GESTURE_PINCH_OUT: i32 = 512
// export enum Gesture
// {
// GESTURE_NONE = 0
// GESTURE_TAP = 1
// GESTURE_DOUBLETAP = 2
// GESTURE_HOLD = 4
// GESTURE_DRAG = 8
// GESTURE_SWIPE_RIGHT = 16
// GESTURE_SWIPE_LEFT = 32
// GESTURE_SWIPE_UP = 64
// GESTURE_SWIPE_DOWN = 128
// GESTURE_PINCH_IN = 256
// GESTURE_PINCH_OUT = 512
// }
export let CAMERA_CUSTOM: i32 = 0
export let CAMERA_FREE: i32 = 1
export let CAMERA_ORBITAL: i32 = 2
export let CAMERA_FIRST_PERSON: i32 = 3
export let CAMERA_THIRD_PERSON: i32 = 4
// export enum CameraMode
// {
// CAMERA_CUSTOM = 0
// CAMERA_FREE
// CAMERA_ORBITAL
// CAMERA_FIRST_PERSON
// CAMERA_THIRD_PERSON
// }
export let CAMERA_PERSPECTIVE = 0
export let CAMERA_ORTHOGRAPHIC = 1
// export enum CameraProjection
// {
// CAMERA_PERSPECTIVE = 0
// CAMERA_ORTHOGRAPHIC
// }
// export enum NPatchLayout
// {
// NPATCH_NINE_PATCH = 0
// NPATCH_THREE_PATCH_VERTICAL
// NPATCH_THREE_PATCH_HORIZONTAL
// }
export let NPATCH_NINE_PATCH = 0
export let NPATCH_THREE_PATCH_VERTICAL = 1
export let NPATCH_THREE_PATCH_HORIZONTAL = 2
export extern "InitWindow" func InitWindow(width: i32, height: i32, title: cstring)
export extern "CloseWindow" func CloseWindow()