Compare commits
32 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ddb0f080f3 | ||
|
|
b96f714f22 | ||
|
|
b8a21470fc | ||
|
|
48b813ad36 | ||
|
|
daaec28b5d | ||
|
|
7cb156b910 | ||
|
|
ac56035be7 | ||
|
|
b25cc02fd8 | ||
|
|
46a1aa6700 | ||
|
|
4b313cf4ed | ||
|
|
a6b7203ed9 | ||
|
|
ea0dd268a4 | ||
|
|
96a14c26b3 | ||
|
|
7833594f5d | ||
|
|
ec0bed434e | ||
|
|
0c3fcd44b2 | ||
|
|
8df705981f | ||
|
|
0ed3a3c6af | ||
|
|
4477777217 | ||
|
|
c49fa62979 | ||
|
|
9e775e554d | ||
|
|
69d62caaff | ||
|
|
d425083303 | ||
|
|
d561d1edee | ||
|
|
c79d018ea4 | ||
|
|
f922d49f55 | ||
|
|
71ba9e8549 | ||
|
|
578435dcd6 | ||
|
|
ebf750f2fd | ||
|
|
24aea17963 | ||
|
|
b3d695eddc | ||
|
|
e60f8cfe32 |
3478 changed files with 4905241 additions and 4508 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -1,4 +1 @@
|
||||||
nimcache/
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
/godot/apigen/apigen
|
|
||||||
/godot/apigen/apigen.exe
|
|
||||||
|
|
|
||||||
16
.vscode/settings.json
vendored
16
.vscode/settings.json
vendored
|
|
@ -1,16 +0,0 @@
|
||||||
{
|
|
||||||
"editor.tabSize": 2,
|
|
||||||
"editor.rulers": [80],
|
|
||||||
"editor.insertSpaces": true,
|
|
||||||
"editor.detectIndentation": false,
|
|
||||||
"files.eol": "\n",
|
|
||||||
"files.trimTrailingWhitespace": true,
|
|
||||||
"nim.project": ["godot/core/godot.nim",
|
|
||||||
"godot/apigen/apigen.nim"],
|
|
||||||
"nim.buildOnSave": false,
|
|
||||||
"nim.lintOnSave": true,
|
|
||||||
"nim.licenseString": "# Copyright 2017 Xored Software, Inc.\n\n",
|
|
||||||
"files.exclude": {
|
|
||||||
"**/nimcache/**": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
20
LICENSE
20
LICENSE
|
|
@ -1,20 +0,0 @@
|
||||||
godot-nim - Nim bindings for Godot Engine
|
|
||||||
|
|
||||||
The MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2017 Xored Software Inc.
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
|
||||||
associated documentation files (the "Software"), to deal in the Software without restriction,
|
|
||||||
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial
|
|
||||||
portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
|
||||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
|
|
||||||
THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
14
README.md
14
README.md
|
|
@ -1,14 +0,0 @@
|
||||||
# Nim bindings for Godot Engine
|
|
||||||
|
|
||||||
Nim bindings for Godot 3.0 based on [GDNative](https://godotengine.org/article/dlscript-here).
|
|
||||||
|
|
||||||
## Links
|
|
||||||
|
|
||||||
- [Godot Engine](http://www.godotengine.org/)
|
|
||||||
- [Nim](http://nim-lang.org/)
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
This project is licensed under the MIT license. Read [LICENSE](https://github.com/pragmagic/godot-nim/blob/master/LICENSE) file for details.
|
|
||||||
|
|
||||||
Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
[Package]
|
|
||||||
name: "godot"
|
|
||||||
version: "0.1.0"
|
|
||||||
author: "Xored Software, Inc."
|
|
||||||
description: "Godot Engine bindings"
|
|
||||||
license: "MIT"
|
|
||||||
srcDir: "godot"
|
|
||||||
|
|
@ -1,862 +0,0 @@
|
||||||
# Copyright 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
import streams, json, ospaths, strutils, times, sets, tables
|
|
||||||
import sequtils, algorithm
|
|
||||||
import compiler / [ast, renderer, idents, astalgo]
|
|
||||||
|
|
||||||
proc ident(ident: string): PNode =
|
|
||||||
result = newNode(nkIdent)
|
|
||||||
result.ident = getIdent(ident)
|
|
||||||
|
|
||||||
proc addChain(node: PNode, others: varargs[PNode]): PNode {.discardable.} =
|
|
||||||
for other in others:
|
|
||||||
node.add(other)
|
|
||||||
result = node
|
|
||||||
|
|
||||||
proc newIdentDefs(name, typ: PNode,
|
|
||||||
defaultVal: PNode = nil): PNode =
|
|
||||||
result = newNode(nkIdentDefs)
|
|
||||||
result.add(name)
|
|
||||||
result.add(typ)
|
|
||||||
if defaultVal.isNil:
|
|
||||||
result.add(newNode(nkEmpty))
|
|
||||||
else:
|
|
||||||
result.add(defaultVal)
|
|
||||||
|
|
||||||
proc newProc(name: PNode, params: openArray[PNode], body = newNode(nkEmpty),
|
|
||||||
procType = nkProcDef): PNode =
|
|
||||||
result = newNode(procType)
|
|
||||||
result.add(name)
|
|
||||||
result.add(newNode(nkEmpty))
|
|
||||||
result.add(newNode(nkEmpty))
|
|
||||||
let formalParams = newNode(nkFormalParams)
|
|
||||||
for param in params:
|
|
||||||
formalParams.add(param)
|
|
||||||
result.add(formalParams)
|
|
||||||
result.add(newNode(nkEmpty))
|
|
||||||
result.add(newNode(nkEmpty))
|
|
||||||
result.add(body)
|
|
||||||
|
|
||||||
proc newIfStmt(condition, body: PNode): PNode =
|
|
||||||
result = newNode(nkIfStmt)
|
|
||||||
let branch = newNode(nkElifBranch)
|
|
||||||
result.add(branch)
|
|
||||||
branch.add(condition)
|
|
||||||
branch.add(body)
|
|
||||||
|
|
||||||
proc newCall(theProc: PNode, args: varargs[PNode]): PNode =
|
|
||||||
result = newNode(nkCall)
|
|
||||||
result.add(theProc)
|
|
||||||
for arg in args:
|
|
||||||
result.add(arg)
|
|
||||||
|
|
||||||
proc newCall(theProc: string, args: varargs[PNode]): PNode =
|
|
||||||
newCall(ident(theProc), args)
|
|
||||||
|
|
||||||
proc newStrLit(s: string): PNode =
|
|
||||||
result = newNode(nkStrLit)
|
|
||||||
result.strVal = s
|
|
||||||
|
|
||||||
proc newRStrLit(s: string): PNode =
|
|
||||||
result = newNode(nkRStrLit)
|
|
||||||
result.strVal = s
|
|
||||||
|
|
||||||
proc newCStringLit(s: string): PNode =
|
|
||||||
newNode(nkCallStrLit).addChain(ident("cstring"), newRStrLit(s))
|
|
||||||
|
|
||||||
proc newIntLit(val: BiggestInt): PNode =
|
|
||||||
result = newNode(nkIntLit)
|
|
||||||
result.intVal = val
|
|
||||||
|
|
||||||
proc newInt64Lit(val: BiggestInt): PNode =
|
|
||||||
result = newNode(nkInt64Lit)
|
|
||||||
result.intVal = val
|
|
||||||
|
|
||||||
proc newFloatLit(val: BiggestFloat): PNode =
|
|
||||||
result = newNode(nkFloatLit)
|
|
||||||
result.floatVal = val
|
|
||||||
|
|
||||||
proc newFloat64Lit(val: BiggestFloat): PNode =
|
|
||||||
result = newNode(nkFloat64Lit)
|
|
||||||
result.floatVal = val
|
|
||||||
|
|
||||||
proc newNilLit(): PNode =
|
|
||||||
result = newNode(nkNilLit)
|
|
||||||
|
|
||||||
proc newDotExpr(left, right: PNode): PNode =
|
|
||||||
result = newNode(nkDotExpr)
|
|
||||||
result.add(left)
|
|
||||||
result.add(right)
|
|
||||||
|
|
||||||
proc newCommand(left, right: PNode): PNode =
|
|
||||||
result = newNode(nkCommand)
|
|
||||||
result.add(left)
|
|
||||||
result.add(right)
|
|
||||||
|
|
||||||
proc newInfix(left, op, right: PNode): PNode =
|
|
||||||
result = newNode(nkInfix)
|
|
||||||
result.add(op)
|
|
||||||
result.add(left)
|
|
||||||
result.add(right)
|
|
||||||
|
|
||||||
proc newInfix(left: PNode, op: string, right: PNode): PNode =
|
|
||||||
newInfix(left, ident(op), right)
|
|
||||||
|
|
||||||
proc postfix(left: PNode, op: string): PNode =
|
|
||||||
result = newNode(nkPostfix)
|
|
||||||
result.add(ident(op))
|
|
||||||
result.add(left)
|
|
||||||
|
|
||||||
proc newExprColonExpr(key, value: PNode): PNode =
|
|
||||||
newNode(nkExprColonExpr).addChain(key, value)
|
|
||||||
|
|
||||||
proc pragma(key: PNode, value: PNode): PNode =
|
|
||||||
newNode(nkPragma).addChain(key, value)
|
|
||||||
|
|
||||||
proc newBracketExpr(first, bracket: PNode): PNode =
|
|
||||||
newNode(nkBracketExpr).addChain(first, bracket)
|
|
||||||
|
|
||||||
proc newEmptyNode(): PNode =
|
|
||||||
newNode(nkEmpty)
|
|
||||||
|
|
||||||
type GodotType = ref object
|
|
||||||
name: string
|
|
||||||
godotName: string
|
|
||||||
baseName: string
|
|
||||||
doc: string
|
|
||||||
derivedCount: int
|
|
||||||
isSingleton: bool
|
|
||||||
jsonNode: JsonNode
|
|
||||||
|
|
||||||
proc findCommonRoot(typeRegistry: Table[string, GodotType],
|
|
||||||
types: seq[string]): string =
|
|
||||||
if types.len == 0: return "Object"
|
|
||||||
var chains = newSeq[seq[string]](types.len)
|
|
||||||
for idx, typ in types:
|
|
||||||
chains[idx] = newSeq[string]()
|
|
||||||
chains[idx].add(typ)
|
|
||||||
var curTyp = typeRegistry[typ]
|
|
||||||
while curTyp.baseName != "NimGodotObject":
|
|
||||||
chains[idx].add(curTyp.baseName)
|
|
||||||
curTyp = typeRegistry[curTyp.baseName]
|
|
||||||
chains[idx].reverse()
|
|
||||||
|
|
||||||
var idx = 0
|
|
||||||
while true:
|
|
||||||
var curType: string
|
|
||||||
var allEqual = true
|
|
||||||
for chain in chains:
|
|
||||||
if idx >= chain.len:
|
|
||||||
allEqual = false
|
|
||||||
break
|
|
||||||
if curType.isNil:
|
|
||||||
curType = chain[idx]
|
|
||||||
elif curType != chain[idx]:
|
|
||||||
allEqual = false
|
|
||||||
break
|
|
||||||
if allEqual:
|
|
||||||
result = curType
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
inc idx
|
|
||||||
|
|
||||||
proc incDerivedCount(types: var Table[string, GodotType],
|
|
||||||
className: string) =
|
|
||||||
let typ = types.getOrDefault(className)
|
|
||||||
if not typ.isNil:
|
|
||||||
inc typ.derivedCount
|
|
||||||
types.incDerivedCount(typ.baseName)
|
|
||||||
|
|
||||||
proc toNimType(godotType: string): string =
|
|
||||||
case godotType:
|
|
||||||
of "float": "float64"
|
|
||||||
of "int": "int64"
|
|
||||||
of "String": "string"
|
|
||||||
of "File": "godottypes.File"
|
|
||||||
else: godotType
|
|
||||||
|
|
||||||
proc toNimType(types: Table[string, GodotType], godotType: string): string =
|
|
||||||
let origType =
|
|
||||||
if godotType.contains(','):
|
|
||||||
findCommonRoot(types, godotType.split(','))
|
|
||||||
else:
|
|
||||||
godotType
|
|
||||||
result = toNimType(origType)
|
|
||||||
|
|
||||||
proc toNimStyle(name: string): string =
|
|
||||||
result = newStringOfCap(name.len + 1)
|
|
||||||
var i = 0
|
|
||||||
var makeUpperCase: bool
|
|
||||||
while i < name.len:
|
|
||||||
if name[i] == '_':
|
|
||||||
if result.len != 0:
|
|
||||||
makeUpperCase = true
|
|
||||||
elif name[i] != '/': # remove slashes
|
|
||||||
if makeUpperCase:
|
|
||||||
result.add(name[i].toUpperAscii())
|
|
||||||
makeUpperCase = false
|
|
||||||
else:
|
|
||||||
result.add(name[i])
|
|
||||||
inc i
|
|
||||||
|
|
||||||
while isKeyword(getIdent(result)):
|
|
||||||
result.add(result[result.len - 1])
|
|
||||||
|
|
||||||
if result == "result":
|
|
||||||
result = "resultVal"
|
|
||||||
|
|
||||||
proc newRefTypeNode(typeSection: PNode, typ, base, doc: string,
|
|
||||||
isExported = true) =
|
|
||||||
let typeDef = newNode(nkTypeDef)
|
|
||||||
typeSection.add(typeDef)
|
|
||||||
if isExported:
|
|
||||||
typeDef.add(postfix(ident(typ), "*"))
|
|
||||||
else:
|
|
||||||
typeDef.add(ident(typ))
|
|
||||||
|
|
||||||
typeDef.add(newNode(nkEmpty)) # generic
|
|
||||||
let objTy = newNode(nkObjectTy)
|
|
||||||
let refTy = newNode(nkRefTy)
|
|
||||||
refTy.add(objTy)
|
|
||||||
typeDef.add(refTy)
|
|
||||||
|
|
||||||
objTy.add(newNode(nkEmpty))
|
|
||||||
let inherit = newNode(nkOfInherit)
|
|
||||||
inherit.add(ident(base))
|
|
||||||
objTy.add(inherit)
|
|
||||||
|
|
||||||
if not doc.isNil:
|
|
||||||
let recList = newNode(nkRecList)
|
|
||||||
let docNode = newNode(nkCommentStmt)
|
|
||||||
docNode.comment = doc
|
|
||||||
recList.add(docNode)
|
|
||||||
objTy.add(recList)
|
|
||||||
else:
|
|
||||||
objTy.add(newNode(nkEmpty))
|
|
||||||
|
|
||||||
proc makeConstSection(constObj: JsonNode): PNode =
|
|
||||||
if constObj.len == 0:
|
|
||||||
return newNode(nkEmpty)
|
|
||||||
|
|
||||||
result = newNode(nkConstSection)
|
|
||||||
for field, val in constObj:
|
|
||||||
let def = newNode(nkConstDef)
|
|
||||||
def.add(postfix(ident(field), "*"))
|
|
||||||
def.add(newNode(nkEmpty)) # infer type
|
|
||||||
var valNode: PNode
|
|
||||||
if val.kind == JInt:
|
|
||||||
valNode = newInt64Lit(val.num)
|
|
||||||
# valNode.intVal = val.num
|
|
||||||
elif val.kind == JFloat:
|
|
||||||
valNode = newFloat64Lit(val.fnum)
|
|
||||||
elif val.kind == JBool:
|
|
||||||
valNode = ident($val.bval)
|
|
||||||
elif val.kind == JString:
|
|
||||||
valNode = newNode(nkStrLit)
|
|
||||||
valNode.strVal = val.str
|
|
||||||
else:
|
|
||||||
raise newException(ValueError, "Unexpected constant kind: " & $val.kind)
|
|
||||||
def.add(valNode)
|
|
||||||
result.add(def)
|
|
||||||
|
|
||||||
type MethodArg = tuple[name, typ: string, defaultVal: JsonNode, isVarargs: bool]
|
|
||||||
|
|
||||||
const standardTypes = toSet(
|
|
||||||
["bool", "cint", "int", "uint8", "int8", "uint16", "int16", "uint32", "int32",
|
|
||||||
"uint64",
|
|
||||||
"int64", "float32", "cfloat", "float64", "GodotString", "Vector2", "Rect2",
|
|
||||||
"Vector3", "Transform2D", "Plane", "Quat", "Rect3", "Basis", "Transform",
|
|
||||||
"Color", "NodePath", "RID", "Dictionary", "Array", "PoolByteArray",
|
|
||||||
"PoolIntArray", "PoolRealArray", "PoolStringArray", "PoolVector2Array",
|
|
||||||
"PoolVector3Array", "PoolColorArray", "Variant"])
|
|
||||||
|
|
||||||
const smallIntTypes = toSet(["uint8", "int8", "uint16", "int16", "uint32", "int32",
|
|
||||||
"cint", "int", "Error"])
|
|
||||||
const int64Types = toSet(["uint64", "int64"])
|
|
||||||
const intTypes = union(smallIntTypes, int64Types)
|
|
||||||
const float64Types = toSet(["float64", "cdouble"])
|
|
||||||
const float32Types = toSet(["float32", "cfloat"])
|
|
||||||
const floatTypes = union(float64Types, float32Types)
|
|
||||||
const arrayTypes = toSet(["Array", "PoolByteArray",
|
|
||||||
"PoolIntArray", "PoolRealArray", "PoolStringArray", "PoolVector2Array",
|
|
||||||
"PoolVector3Array", "PoolColorArray"])
|
|
||||||
|
|
||||||
proc newNilCheck(ident, toAssign: PNode): PNode =
|
|
||||||
newIfStmt(newCall("isNil", ident),
|
|
||||||
newNode(nkAsgn).addChain(ident).addChain(
|
|
||||||
toAssign
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
proc singletonName(typ: string): PNode =
|
|
||||||
ident("singleton" & typ)
|
|
||||||
|
|
||||||
proc makeDefaultValue(arg: MethodArg): PNode =
|
|
||||||
result = newEmptyNode()
|
|
||||||
if not arg.defaultVal.isNil:
|
|
||||||
if arg.typ == "bool":
|
|
||||||
result = ident(arg.defaultVal.str.toLowerAscii())
|
|
||||||
elif arg.typ in intTypes:
|
|
||||||
result = newInt64Lit(parseBiggestInt(arg.defaultVal.str))
|
|
||||||
elif arg.typ == "string" or arg.typ == "NodePath":
|
|
||||||
result = newStrLit(arg.defaultVal.str)
|
|
||||||
elif arg.typ in floatTypes:
|
|
||||||
result = newFloatLit(parseFloat(arg.defaultVal.str))
|
|
||||||
elif arg.defaultVal.str == "Null":
|
|
||||||
if arg.typ == "Variant":
|
|
||||||
result = newCall("variant")
|
|
||||||
else:
|
|
||||||
result = newNilLit()
|
|
||||||
elif arg.typ == "Color":
|
|
||||||
result = newCall("initColor",
|
|
||||||
arg.defaultVal.str.split(',').mapIt(newFloatLit(parseFloat(it))))
|
|
||||||
# elif arg.typ in arrayTypes and (arg.defaultVal.str == "[]" or
|
|
||||||
# arg.defaultVal.str == "[" & arg.typ & "]"):
|
|
||||||
# result = newCall("init" & arg.typ)
|
|
||||||
elif arg.typ == "RID" and arg.defaultVal.str == "[RID]":
|
|
||||||
result = newCall("initRID")
|
|
||||||
elif arg.typ == "Vector2" or arg.typ == "Vector3" or arg.typ == "Rect2":
|
|
||||||
let parts = arg.defaultVal.str.replace("(", "").replace(")", "").
|
|
||||||
replace(" ", "").
|
|
||||||
split(",").mapIt(newFloatLit(parseFloat(it)))
|
|
||||||
if arg.typ.endsWith("r2"):
|
|
||||||
result = newCall("vec2", parts)
|
|
||||||
elif arg.typ.endsWith('3'):
|
|
||||||
result = newCall("vec3", parts)
|
|
||||||
else:
|
|
||||||
result = newCall("initRect2", parts)
|
|
||||||
elif arg.defaultVal.str == "[Object:null]":
|
|
||||||
result = newNilLit()
|
|
||||||
elif arg.typ != "Transform" and arg.typ != "Transform2D" and
|
|
||||||
arg.typ != "Variant" and arg.typ notin arrayTypes: # TODO
|
|
||||||
raise newException(
|
|
||||||
ValueError,
|
|
||||||
"Cannot build default value from $# ($#)" %
|
|
||||||
[$arg.defaultVal, arg.typ])
|
|
||||||
|
|
||||||
proc doGenerateMethod(tree: PNode, methodBindRegistry: var HashSet[string],
|
|
||||||
name: PNode, godotMethodName: string,
|
|
||||||
typ: GodotType, args: seq[MethodArg],
|
|
||||||
returnType: string, isVirtual,
|
|
||||||
isBase, withImplementation: bool) =
|
|
||||||
var body: PNode
|
|
||||||
if not withImplementation:
|
|
||||||
body = newNode(nkEmpty)
|
|
||||||
else:
|
|
||||||
var methodBindName = toNimStyle(
|
|
||||||
typ.name & "_" & godotMethodName & "_method_bind")
|
|
||||||
if methodBindName[0].isUpperAscii():
|
|
||||||
methodBindName[0] = methodBindName[0].toLowerAscii()
|
|
||||||
if methodBindName notin methodBindRegistry:
|
|
||||||
let methodBindDecl = newNode(nkVarSection).addChain(
|
|
||||||
newIdentDefs(
|
|
||||||
newNode(nkPragmaExpr).addChain(
|
|
||||||
ident(methodBindName)).addChain(
|
|
||||||
newNode(nkPragma).addChain(ident("threadvar"))),
|
|
||||||
newNode(nkPtrTy).addChain(ident("GodotMethodBind"))
|
|
||||||
))
|
|
||||||
tree.add(methodBindDecl)
|
|
||||||
methodBindRegistry.incl(methodBindName)
|
|
||||||
|
|
||||||
let nilCheck = newNilCheck(ident(methodBindName),
|
|
||||||
newCall("getMethod", newCStringLit(typ.godotName),
|
|
||||||
newCStringLit(godotMethodName))
|
|
||||||
)
|
|
||||||
let vars = newNode(nkVarSection)
|
|
||||||
var varargsName: string
|
|
||||||
var isVarargs: bool
|
|
||||||
var staticArgsLen: int
|
|
||||||
var argLenNode = newIntLit(0)
|
|
||||||
let argsName = ident("argsToPassToGodot")
|
|
||||||
if args.len > 0:
|
|
||||||
for arg in args:
|
|
||||||
if arg.isVarargs:
|
|
||||||
varargsName = arg.name
|
|
||||||
isVarargs = true
|
|
||||||
vars.add(newIdentDefs(ident("callError"), ident("VariantCallError")))
|
|
||||||
break
|
|
||||||
let argsAlloc = newNode(nkCast).addChain(
|
|
||||||
newNode(nkPtrTy).addChain(
|
|
||||||
newNode(nkBracketExpr).addChain(
|
|
||||||
ident("array"), ident("MAX_ARG_COUNT"),
|
|
||||||
if isVarargs: ident("Variant") else: ident("pointer"))))
|
|
||||||
staticArgsLen = if varargsName.isNil: args.len
|
|
||||||
else: args.len - 1
|
|
||||||
if not varargsName.isNil:
|
|
||||||
argLenNode = newCall("cint",
|
|
||||||
newInfix(newIntLit(staticArgsLen),
|
|
||||||
ident("+"),
|
|
||||||
newDotExpr(ident(varargsName), ident("len"))))
|
|
||||||
argsAlloc.add(newCall("godotAlloc", newCall("cint", newInfix(
|
|
||||||
newCall("sizeof", ident("Variant")), ident("*"),
|
|
||||||
newNode(nkPar).addChain(argLenNode))))
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
argLenNode = newCall("cint", newIntLit(staticArgsLen))
|
|
||||||
vars.add(newIdentDefs(
|
|
||||||
ident("argsStatic"),
|
|
||||||
newNode(nkBracketExpr).addChain(
|
|
||||||
ident("array"), newIntLit(staticArgsLen), ident("pointer")),
|
|
||||||
newNode(nkEmpty)))
|
|
||||||
argsAlloc.add(newCommand(ident("addr"), ident("argsStatic")))
|
|
||||||
vars.add(newIdentDefs(argsName, newNode(nkEmpty), argsAlloc))
|
|
||||||
|
|
||||||
let argConversions = newNode(nkStmtList)
|
|
||||||
for idx, arg in args:
|
|
||||||
var argName = ident(arg.name)
|
|
||||||
if arg.isVarargs:
|
|
||||||
argName = newNode(nkBracketExpr).addChain(
|
|
||||||
ident(varargsName),
|
|
||||||
newInfix(ident("idx"), ident("-"), newIntLit(staticArgsLen)))
|
|
||||||
let argIdx = if arg.isVarargs: ident("idx") else: newIntLit(idx)
|
|
||||||
let isStandardType = arg.typ in standardTypes
|
|
||||||
let convArg = if not varargsName.isNil: newCall("toGodot", argName)
|
|
||||||
elif isStandardType: newCall("unsafeAddr", argName)
|
|
||||||
elif arg.typ == "string": newCall("unsafeAddr",
|
|
||||||
ident("argToPassToGodot" & $idx))
|
|
||||||
else: ident("argToPassToGodot" & $idx) # object
|
|
||||||
if not isStandardType and arg.isVarargs:
|
|
||||||
raise newException(ValueError,
|
|
||||||
"Non-standard type $# for varargs params of method $# of type $#" %
|
|
||||||
[arg.typ, godotMethodName, typ.godotName])
|
|
||||||
if not isStandardType:
|
|
||||||
if arg.typ == "string":
|
|
||||||
argConversions.add(newNode(nkLetSection).addChain(
|
|
||||||
newIdentDefs(ident("argToPassToGodot" & $idx), newEmptyNode(),
|
|
||||||
newCall("toGodotString", argName))))
|
|
||||||
else:
|
|
||||||
argConversions.add(newNode(nkLetSection).addChain(
|
|
||||||
newIdentDefs(ident("argToPassToGodot" & $idx), newEmptyNode(),
|
|
||||||
newDotExpr(argName, ident("godotObject")))))
|
|
||||||
let argAsgn = newNode(nkAsgn).addChain(
|
|
||||||
newNode(nkBracketExpr).addChain(
|
|
||||||
newNode(nkBracketExpr).addChain(argsName), argIdx),
|
|
||||||
convArg
|
|
||||||
)
|
|
||||||
if not arg.isVarargs:
|
|
||||||
argConversions.add(
|
|
||||||
argAsgn
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
argConversions.add(newNode(nkVarSection).addChain(
|
|
||||||
newIdentDefs(ident("idx"), newNode(nkEmpty), newIntLit(staticArgsLen))))
|
|
||||||
let argLoop = newNode(nkWhileStmt)
|
|
||||||
argConversions.add(argLoop)
|
|
||||||
argLoop.add(newInfix(ident("idx"), ident("<"), argLenNode)
|
|
||||||
)
|
|
||||||
argLoop.add(argAsgn)
|
|
||||||
argLoop.add(newCommand(ident("inc"), ident("idx")))
|
|
||||||
|
|
||||||
let retName = if isVarargs: "callRet" else: "ptrCallRet"
|
|
||||||
let theCall = newCall(
|
|
||||||
newDotExpr(ident(methodBindName),
|
|
||||||
ident(if isVarargs: "call" else: "ptrCall")),
|
|
||||||
newDotExpr(ident("self"), ident("godotObject")),
|
|
||||||
if args.len > 0: argsName else: newNode(nkNilLit),
|
|
||||||
argLenNode,
|
|
||||||
if not isVarargs: ident(retName) else: ident("callError")
|
|
||||||
)
|
|
||||||
if not isVarargs:
|
|
||||||
theCall.sons.delete(3)
|
|
||||||
let freeCall = newCall("godotFree", argsName)
|
|
||||||
body = newNode(nkStmtList)
|
|
||||||
if typ.isSingleton:
|
|
||||||
let varName = singletonName(typ.name)
|
|
||||||
body.add(newNilCheck(varName, newCall(
|
|
||||||
newBracketExpr(ident("getSingleton"), ident(typ.name)))))
|
|
||||||
body.add(newNode(nkLetSection).addChain(newIdentDefs(
|
|
||||||
ident("self"), newNode(nkEmpty), varName
|
|
||||||
)))
|
|
||||||
if not varargsName.isNil:
|
|
||||||
body.add(
|
|
||||||
pragma(ident("push"), newExprColonExpr(
|
|
||||||
newBracketExpr(ident("warning"), ident("Destructor")),
|
|
||||||
ident("off"))))
|
|
||||||
body.add(nilCheck)
|
|
||||||
body.add(vars)
|
|
||||||
body.add(argConversions)
|
|
||||||
if not isVarargs:
|
|
||||||
let retPtrDecl = newNode(nkVarSection).addChain(
|
|
||||||
newIdentDefs(ident(retName), ident("pointer"), newEmptyNode())
|
|
||||||
)
|
|
||||||
body.add(retPtrDecl)
|
|
||||||
var isVariantRet: bool
|
|
||||||
var isConversionRet: bool
|
|
||||||
var isObjRet: bool
|
|
||||||
var isStringRet: bool
|
|
||||||
let retValIdent = if not isVarargs: ident("ptrCallVal") else: ident(retName)
|
|
||||||
if not returnType.isNil and varargsName.isNil:
|
|
||||||
var addrToAssign = newCall("addr", ident("ptrCallVal"))
|
|
||||||
if returnType in smallIntTypes:
|
|
||||||
isConversionRet = true
|
|
||||||
body.add(newNode(nkVarSection).addChain(newIdentDefs(
|
|
||||||
retValIdent, ident("int64"),
|
|
||||||
)))
|
|
||||||
elif returnType in float32Types:
|
|
||||||
isConversionRet = true
|
|
||||||
body.add(newNode(nkVarSection).addChain(newIdentDefs(
|
|
||||||
retValIdent, ident("float64"),
|
|
||||||
)))
|
|
||||||
elif returnType in standardTypes:
|
|
||||||
addrToAssign = newCall("addr", ident("result"))
|
|
||||||
elif returnType == "string":
|
|
||||||
isStringRet = true
|
|
||||||
body.add(newNode(nkVarSection).addChain(newIdentDefs(
|
|
||||||
retValIdent, ident("GodotString"),
|
|
||||||
)))
|
|
||||||
else:
|
|
||||||
isObjRet = true
|
|
||||||
body.add(newNode(nkVarSection).addChain(newIdentDefs(
|
|
||||||
retValIdent, newNode(nkPtrTy).addChain(ident("GodotObject")),
|
|
||||||
)))
|
|
||||||
body.add(newNode(nkAsgn).addChain(ident(retName), addrToAssign))
|
|
||||||
|
|
||||||
if not isVarargs:
|
|
||||||
body.add(theCall)
|
|
||||||
else:
|
|
||||||
if not returnType.isNil:
|
|
||||||
isVariantRet = true
|
|
||||||
let callStmt = newNode(nkLetSection).addChain(
|
|
||||||
newIdentDefs(
|
|
||||||
newNode(nkPragmaExpr).addChain(
|
|
||||||
ident(retName), newNode(nkPragma).addChain(ident("used"))),
|
|
||||||
newNode(nkEmpty), theCall))
|
|
||||||
body.add(callStmt)
|
|
||||||
# if not returnType.isNil and not varargsName.isNil:
|
|
||||||
# body.add(newCall("fromGodot", ident("result"), ident(retName)))
|
|
||||||
# body.add(newCall("deinit", ident(retName)))
|
|
||||||
if args.len > 0 and not varargsName.isNil:
|
|
||||||
body.add(freeCall)
|
|
||||||
if not varargsName.isNil:
|
|
||||||
let errCheck = newIfStmt(
|
|
||||||
newInfix(newDotExpr(ident("callError"), ident("error")), ident("!="),
|
|
||||||
newDotExpr(ident("VariantCallErrorType"), ident("OK"))),
|
|
||||||
newNode(nkRaiseStmt).addChain(
|
|
||||||
newCall("newCallError", ident("callError")))
|
|
||||||
)
|
|
||||||
body.add(errCheck)
|
|
||||||
if isVariantRet:
|
|
||||||
let convErrDef = newNode(nkLetSection).addChain(
|
|
||||||
newIdentDefs(ident("convErr"), newNode(nkEmpty),
|
|
||||||
newCall("fromGodot", ident("result"), retValIdent)))
|
|
||||||
let convCheck = newIfStmt(
|
|
||||||
newInfix(ident("convErr"), ident("!="),
|
|
||||||
newDotExpr(ident("ConversionResult"), ident("OK"))),
|
|
||||||
newNode(nkRaiseStmt).addChain(
|
|
||||||
newCall("newConversionError", ident("convErr")))
|
|
||||||
)
|
|
||||||
body.add(convErrDef)
|
|
||||||
body.add(convCheck)
|
|
||||||
if not isVarargs and (isVariantRet or isStringRet):
|
|
||||||
# varargs use call with "let" so destructor is invoked
|
|
||||||
body.add(newCall("deinit", retValIdent))
|
|
||||||
elif isConversionRet:
|
|
||||||
body.add(newNode(nkAsgn).addChain(ident("result"),
|
|
||||||
newCall(returnType, retValIdent)))
|
|
||||||
elif isObjRet:
|
|
||||||
body.add(newNode(nkAsgn).addChain(ident("result"),
|
|
||||||
newCall(newBracketExpr(ident("asNimGodotObject"),
|
|
||||||
newCall("type", ident("result"))), retValIdent)))
|
|
||||||
elif isStringRet:
|
|
||||||
body.add(newNode(nkAsgn).addChain(ident("result"),
|
|
||||||
newCall("$", retValIdent)))
|
|
||||||
if not varargsName.isNil:
|
|
||||||
body.add(
|
|
||||||
pragma(ident("push"), newExprColonExpr(
|
|
||||||
newBracketExpr(ident("warning"), ident("Destructor")),
|
|
||||||
ident("on"))))
|
|
||||||
|
|
||||||
let procType = if isVirtual: nkMethodDef
|
|
||||||
else: nkProcDef
|
|
||||||
var params = newSeqOfCap[PNode](args.len + 2)
|
|
||||||
if not returnType.isNil:
|
|
||||||
params.add(ident(returnType))
|
|
||||||
else:
|
|
||||||
params.add(newNode(nkEmpty))
|
|
||||||
if not typ.isSingleton:
|
|
||||||
params.add(newIdentDefs(ident("self"), ident(toNimType(typ.name))))
|
|
||||||
|
|
||||||
for arg in args:
|
|
||||||
if arg.isVarargs:
|
|
||||||
params.add(newIdentDefs(ident(arg.name),
|
|
||||||
newNode(nkBracketExpr).addChain(ident("varargs"), ident(arg.typ))))
|
|
||||||
else:
|
|
||||||
let defaultValue = arg.makeDefaultValue()
|
|
||||||
params.add(newIdentDefs(ident(arg.name), ident(arg.typ), defaultValue))
|
|
||||||
let procDecl = newProc(if not withImplementation: postfix(name, "*")
|
|
||||||
else: name,
|
|
||||||
params, body, procType)
|
|
||||||
if not withImplementation:
|
|
||||||
let pragma = newNode(nkPragma)
|
|
||||||
pragma.add(ident("gcsafe"))
|
|
||||||
pragma.add(newNode(nkExprColonExpr).addChain(ident("locks"),
|
|
||||||
newIntLit(0)))
|
|
||||||
if isVirtual and isBase:
|
|
||||||
pragma.add(ident("base"))
|
|
||||||
procDecl.sons[4] = pragma
|
|
||||||
tree.add(procDecl)
|
|
||||||
|
|
||||||
proc generateMethod(tree: PNode, methodBindRegistry: var HashSet[string],
|
|
||||||
name: PNode, godotMethodName: string,
|
|
||||||
typ: GodotType, args: seq[MethodArg],
|
|
||||||
returnType: string, isVirtual, isBase, withImplementation: bool) =
|
|
||||||
doGenerateMethod(
|
|
||||||
tree, methodBindRegistry, name, godotMethodName, typ,
|
|
||||||
args, returnType, isVirtual, isBase, withImplementation)
|
|
||||||
|
|
||||||
proc makeProperty(types: Table[string, GodotType], tree: PNode,
|
|
||||||
methodBindRegistry: var HashSet[string],
|
|
||||||
typ: GodotType,
|
|
||||||
propertyObj: JsonNode, withImplementation: bool) =
|
|
||||||
let getterNameStr = toNimStyle(propertyObj["name"].str)
|
|
||||||
let getterName = ident(toNimStyle(propertyObj["name"].str))
|
|
||||||
let setterName = newNode(nkAccQuoted).addChain(ident(getterNameStr & "="))
|
|
||||||
|
|
||||||
let nimType = toNimType(types, propertyObj["type"].str)
|
|
||||||
generateMethod(tree, methodBindRegistry,
|
|
||||||
getterName, propertyObj["getter"].str, typ,
|
|
||||||
@[], nimType, isVirtual = false,
|
|
||||||
isBase = false, withImplementation)
|
|
||||||
generateMethod(tree, methodBindRegistry,
|
|
||||||
setterName, propertyObj["setter"].str, typ,
|
|
||||||
@[("val", nimType, JsonNode(nil), false)],
|
|
||||||
nil, isVirtual = false, isBase = false, withImplementation)
|
|
||||||
|
|
||||||
proc makeMethod(types: Table[string, GodotType], tree: PNode,
|
|
||||||
methodBindRegistry: var HashSet[string],
|
|
||||||
typ: GodotType, methodObj: JsonNode,
|
|
||||||
withImplementation: bool) =
|
|
||||||
let returnType = if methodObj["return_type"].str != "void":
|
|
||||||
toNimType(types, methodObj["return_type"].str)
|
|
||||||
else: nil
|
|
||||||
|
|
||||||
for prop in typ.jsonNode["properties"]:
|
|
||||||
if prop["getter"].str == methodObj["name"].str or
|
|
||||||
prop["setter"].str == methodObj["name"].str:
|
|
||||||
return
|
|
||||||
|
|
||||||
var args = newSeqOfCap[MethodArg](methodObj["arguments"].len + 1)
|
|
||||||
var origArgs = methodObj["arguments"]
|
|
||||||
var isBase = methodObj["is_virtual"].bval
|
|
||||||
if methodObj["is_virtual"].bval:
|
|
||||||
proc getMethod(typNode: JsonNode, methName: string): JsonNode =
|
|
||||||
for meth in typNode["methods"]:
|
|
||||||
if meth["is_virtual"].bval and
|
|
||||||
meth["name"].str == methName: return meth
|
|
||||||
var curTyp = types.getOrDefault(typ.baseName)
|
|
||||||
while not curTyp.isNil:
|
|
||||||
let meth = curTyp.jsonNode.getMethod(methodObj["name"].str)
|
|
||||||
if not meth.isNil:
|
|
||||||
origArgs = meth["arguments"]
|
|
||||||
isBase = false
|
|
||||||
curTyp = types.getOrDefault(curTyp.baseName)
|
|
||||||
|
|
||||||
for arg in origArgs:
|
|
||||||
let typ = toNimType(types, arg["type"].str)
|
|
||||||
let defaultVal = if arg["has_default_value"].bval: arg["default_value"]
|
|
||||||
else: nil
|
|
||||||
args.add((toNimStyle(arg["name"].str), typ,
|
|
||||||
defaultVal, false))
|
|
||||||
if methodObj["has_varargs"].bval:
|
|
||||||
args.add(("variantArgs", "Variant", JsonNode(nil), true))
|
|
||||||
|
|
||||||
let godotName = methodObj["name"].str
|
|
||||||
generateMethod(tree, methodBindRegistry,
|
|
||||||
ident(toNimStyle(godotName)), methodObj["name"].str,
|
|
||||||
typ, args,
|
|
||||||
returnType, methodObj["is_virtual"].bval, isBase,
|
|
||||||
withImplementation)
|
|
||||||
|
|
||||||
proc addAttributeToDoc(doc: var string, propName, propValue: string) =
|
|
||||||
if doc.len > 0:
|
|
||||||
doc.add("\n")
|
|
||||||
doc.add(propName & ": " & propValue)
|
|
||||||
|
|
||||||
const classAttributes = ["singleton", "instanciable", "is_reference"]
|
|
||||||
|
|
||||||
proc typeNameToModuleName(name: string): string =
|
|
||||||
var wasUpperOrDigit = true
|
|
||||||
result = newStringOfCap(name.len + 10)
|
|
||||||
for idx, c in name:
|
|
||||||
if c.isUpperAscii() or c.isDigit():
|
|
||||||
if not wasUpperOrDigit or idx > 0 and idx < name.len - 1 and
|
|
||||||
name[idx + 1].isLowerAscii():
|
|
||||||
result.add('_')
|
|
||||||
result.add(c.toLowerAscii())
|
|
||||||
wasUpperOrDigit = true
|
|
||||||
else:
|
|
||||||
result.add(c)
|
|
||||||
wasUpperOrDigit = false
|
|
||||||
if result == "object":
|
|
||||||
# keyword
|
|
||||||
result = "objects"
|
|
||||||
if result == "os":
|
|
||||||
# to avoid clash with stdlib
|
|
||||||
result = "gd_os"
|
|
||||||
|
|
||||||
proc newRegisterClassNode(typ: GodotType): PNode =
|
|
||||||
newCall("registerClass",
|
|
||||||
ident(typ.name),
|
|
||||||
newCStringLit(typ.godotName),
|
|
||||||
ident("true") # isNative
|
|
||||||
)
|
|
||||||
|
|
||||||
proc genSingletonDecl(typ: string): PNode =
|
|
||||||
result = newNode(nkVarSection)
|
|
||||||
let name = singletonName(typ)
|
|
||||||
let threadvar = newNode(nkPragma).addChain(ident("threadvar"))
|
|
||||||
result.add(newIdentDefs(newNode(nkPragmaExpr).addChain(name, threadvar),
|
|
||||||
ident(typ)))
|
|
||||||
|
|
||||||
proc shouldExport(typ: GodotType, types: Table[string, GodotType]): bool =
|
|
||||||
var curTyp = typ
|
|
||||||
while not curTyp.isNil and not curTyp.isSingleton:
|
|
||||||
curTyp = types.getOrDefault(curTyp.baseName)
|
|
||||||
result = curTyp.isNil
|
|
||||||
|
|
||||||
proc genTypeFile*(types: var Table[string, GodotType], targetDir: string) =
|
|
||||||
for typ in types.values():
|
|
||||||
types.incDerivedCount(typ.baseName)
|
|
||||||
|
|
||||||
var sortedTypes = toSeq(types.values())
|
|
||||||
sortedTypes.sort do (x, y: GodotType) -> int:
|
|
||||||
cmp(y.derivedCount, x.derivedCount)
|
|
||||||
|
|
||||||
let godotApiTypesTree = newNode(nkStmtList)
|
|
||||||
godotApiTypesTree.add(newNode(nkImportStmt).addChain(ident("godot")))
|
|
||||||
let typeSection = newNode(nkTypeSection)
|
|
||||||
godotApiTypesTree.add(typeSection)
|
|
||||||
|
|
||||||
for typ in sortedTypes:
|
|
||||||
if not typ.shouldExport(types): continue
|
|
||||||
newRefTypeNode(typeSection, typ.name, typ.baseName, typ.doc)
|
|
||||||
|
|
||||||
for typ in sortedTypes:
|
|
||||||
if not typ.shouldExport(types): continue
|
|
||||||
let regNode = newCall("registerClass",
|
|
||||||
ident(typ.name),
|
|
||||||
newCStringLit(typ.godotName),
|
|
||||||
ident("true") # isNative
|
|
||||||
)
|
|
||||||
godotApiTypesTree.add(regNode)
|
|
||||||
|
|
||||||
renderModule(godotApiTypesTree, targetDir / "godottypes.nim")
|
|
||||||
|
|
||||||
proc genApi*(targetDir: string, apiJsonFile: string) =
|
|
||||||
let apiJson = parseJson(newFileStream(apiJsonFile),
|
|
||||||
apiJsonFile.extractFilename())
|
|
||||||
var megaImport = newStringOfCap(64 * 1024)
|
|
||||||
|
|
||||||
var types = initTable[string, GodotType]()
|
|
||||||
for obj in apiJson:
|
|
||||||
let godotClassName = obj["name"].str
|
|
||||||
let className = godotClassName.replace("_", "")
|
|
||||||
var baseClassName = obj["base_class"].str
|
|
||||||
baseClassName = toNimType(baseClassName.replace("_", ""))
|
|
||||||
if baseClassName.isNil or baseClassName.len == 0:
|
|
||||||
baseClassName = "NimGodotObject"
|
|
||||||
var doc = ""
|
|
||||||
for attr in classAttributes:
|
|
||||||
if attr in obj:
|
|
||||||
addAttributeToDoc(doc, attr, $obj[attr])
|
|
||||||
types[className] = GodotType(
|
|
||||||
name: className,
|
|
||||||
godotName: godotClassName,
|
|
||||||
baseName: baseClassName,
|
|
||||||
doc: doc,
|
|
||||||
jsonNode: obj,
|
|
||||||
isSingleton: obj["singleton"].bval
|
|
||||||
)
|
|
||||||
for typ in types.values():
|
|
||||||
let tree = newNode(nkStmtList)
|
|
||||||
let importStmt = newNode(nkImportStmt)
|
|
||||||
importStmt.add(ident("godot"))
|
|
||||||
importStmt.add(ident("godottypes"))
|
|
||||||
importStmt.add(newDotExpr(ident("core"), ident("godotcore")))
|
|
||||||
tree.add(importStmt)
|
|
||||||
let exportStmt = newNode(nkExportStmt)
|
|
||||||
exportStmt.add(ident("godottypes"))
|
|
||||||
tree.add(exportStmt)
|
|
||||||
|
|
||||||
var methodBindRegsitry = initSet[string]()
|
|
||||||
let obj = typ.jsonNode
|
|
||||||
if typ.baseName != "NimGodotObject":
|
|
||||||
let baseModule = typeNameToModuleName(typ.baseName)
|
|
||||||
let baseModuleNode = if getIdent(baseModule).isKeyword:
|
|
||||||
newStrLit(baseModule & ".nim")
|
|
||||||
else:
|
|
||||||
ident(baseModule)
|
|
||||||
importStmt.add(baseModuleNode)
|
|
||||||
exportStmt.add(baseModuleNode)
|
|
||||||
let constSection = makeConstSection(obj["constants"])
|
|
||||||
if constSection.kind != nkEmpty:
|
|
||||||
# renderer doesn't properly render empty stmt after type section
|
|
||||||
tree.add(makeConstSection(obj["constants"]))
|
|
||||||
|
|
||||||
if typ.isSingleton:
|
|
||||||
let typeDecl = newNode(nkTypeSection)
|
|
||||||
newRefTypeNode(typeDecl, typ.name, typ.baseName, typ.doc,
|
|
||||||
isExported = false)
|
|
||||||
tree.add(typeDecl)
|
|
||||||
tree.add(newRegisterClassNode(typ))
|
|
||||||
tree.add(genSingletonDecl(typ.name))
|
|
||||||
|
|
||||||
# first, generate declarations only for ease of
|
|
||||||
# human readability of the file
|
|
||||||
for property in obj["properties"]:
|
|
||||||
makeProperty(types, tree, methodBindRegsitry, typ, property,
|
|
||||||
withImplementation = false)
|
|
||||||
for meth in obj["methods"]:
|
|
||||||
makeMethod(types, tree, methodBindRegsitry, typ,
|
|
||||||
meth, withImplementation = false)
|
|
||||||
|
|
||||||
for property in obj["properties"]:
|
|
||||||
makeProperty(types, tree, methodBindRegsitry, typ,
|
|
||||||
property, withImplementation = true)
|
|
||||||
for meth in obj["methods"]:
|
|
||||||
makeMethod(types, tree, methodBindRegsitry, typ, meth,
|
|
||||||
withImplementation = true)
|
|
||||||
|
|
||||||
let moduleName = typeNameToModuleName(typ.name)
|
|
||||||
renderModule(tree, targetDir / moduleName & ".nim")
|
|
||||||
|
|
||||||
megaImport.add("import \"" & moduleName & "\"\n")
|
|
||||||
|
|
||||||
genTypeFile(types, targetDir)
|
|
||||||
|
|
||||||
writeFile(targetDir / "godotall.nim", megaImport)
|
|
||||||
|
|
||||||
when isMainModule:
|
|
||||||
import os
|
|
||||||
|
|
||||||
const usage = slurp("usage.txt")
|
|
||||||
|
|
||||||
proc main() =
|
|
||||||
if paramCount() < 2:
|
|
||||||
echo usage
|
|
||||||
quit(-1)
|
|
||||||
let godotBin = paramStr(1)
|
|
||||||
let targetDir = paramStr(2)
|
|
||||||
|
|
||||||
if not dirExists(targetDir):
|
|
||||||
echo "The specified directory does not exist"
|
|
||||||
quit(-1)
|
|
||||||
if not fileExists(godotBin):
|
|
||||||
echo "Invalid godot binary path"
|
|
||||||
quit(-1)
|
|
||||||
|
|
||||||
let jsonFile = targetDir / "api.json"
|
|
||||||
if fileExists(jsonFile) and
|
|
||||||
godotBin.getLastModificationTime() <= jsonFile.getLastModificationTime():
|
|
||||||
echo "api.json if up to date - doing nothing."
|
|
||||||
return
|
|
||||||
|
|
||||||
discard execShellCmd(
|
|
||||||
"\"" & godotBin & "\" --gdnative-generate-json-api \"" & jsonFile & "\"")
|
|
||||||
if not fileExists(jsonFile):
|
|
||||||
echo "Failed to generate api.json"
|
|
||||||
quit(-1)
|
|
||||||
|
|
||||||
genApi(targetDir, jsonFile)
|
|
||||||
|
|
||||||
main()
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
Tool for wrapping Godot API into Nim
|
|
||||||
|
|
||||||
apigen [godot binary path] [target directory]
|
|
||||||
|
|
@ -1,145 +0,0 @@
|
||||||
# Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
import hashes
|
|
||||||
import godotbase, poolarray, variant, strings
|
|
||||||
|
|
||||||
proc initArray(dest: var Array) {.
|
|
||||||
importc: "godot_array_new", header: "godot_array.h".}
|
|
||||||
proc initArray(dest: var Array; pca: PoolColorArray) {.
|
|
||||||
importc: "godot_array_new_pool_coloarray",
|
|
||||||
header: "godot_array.h".}
|
|
||||||
proc initArray(dest: var Array; pv3a: PoolVector3Array) {.
|
|
||||||
importc: "godot_array_new_pool_vector3_array",
|
|
||||||
header: "godot_array.h".}
|
|
||||||
proc initArray(dest: var Array; pv2a: PoolVector2Array) {.
|
|
||||||
importc: "godot_array_new_pool_vector2_array",
|
|
||||||
header: "godot_array.h".}
|
|
||||||
proc initArray(dest: var Array; psa: PoolStringArray) {.
|
|
||||||
importc: "godot_array_new_pool_string_array",
|
|
||||||
header: "godot_array.h".}
|
|
||||||
proc initArray(dest: var Array; pra: PoolRealArray) {.
|
|
||||||
importc: "godot_array_new_pool_real_array",
|
|
||||||
header: "godot_array.h".}
|
|
||||||
proc initArray(dest: var Array; pia: PoolIntArray) {.
|
|
||||||
importc: "godot_array_new_pool_int_array",
|
|
||||||
header: "godot_array.h".}
|
|
||||||
proc initArray(dest: var Array; pba: PoolByteArray) {.
|
|
||||||
importc: "godot_array_new_pool_byte_array",
|
|
||||||
header: "godot_array.h".}
|
|
||||||
|
|
||||||
proc initArray*(): Array {.inline.} =
|
|
||||||
initArray(result)
|
|
||||||
|
|
||||||
proc initArray*(pca: PoolColorArray): Array {.inline.} =
|
|
||||||
initArray(result, pca)
|
|
||||||
|
|
||||||
proc initArray*(pv3a: PoolVector3Array): Array {.inline.} =
|
|
||||||
initArray(result, pv3a)
|
|
||||||
|
|
||||||
proc initArray*(pv2a: PoolVector2Array): Array {.inline.} =
|
|
||||||
initArray(result, pv2a)
|
|
||||||
|
|
||||||
proc initArray*(psa: PoolStringArray): Array {.inline.} =
|
|
||||||
initArray(result, psa)
|
|
||||||
|
|
||||||
proc initArray*(pra: PoolRealArray): Array {.inline.} =
|
|
||||||
initArray(result, pra)
|
|
||||||
|
|
||||||
proc initArray*(pia: PoolIntArray): Array {.inline.} =
|
|
||||||
initArray(result, pia)
|
|
||||||
|
|
||||||
proc initArray*(pba: PoolByteArray): Array {.inline.} =
|
|
||||||
initArray(result, pba)
|
|
||||||
|
|
||||||
proc `[]=`*(self: var Array; idx: cint;
|
|
||||||
value: Variant) {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_array_set", header: "godot_array.h".}
|
|
||||||
proc `[]`*(self: Array; idx: cint): Variant {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_array_get", header: "godot_array.h".}
|
|
||||||
proc mget*(self: var Array; idx: cint): ptr Variant {.
|
|
||||||
importc: "godot_array_operator_index", header: "godot_array.h".}
|
|
||||||
|
|
||||||
proc add*(self: var Array; value: Variant) {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_array_append", header: "godot_array.h".}
|
|
||||||
proc clear*(self: var Array) {.importc: "godot_array_clear",
|
|
||||||
header: "godot_array.h".}
|
|
||||||
proc count*(self: Array; value: Variant): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_array_count", header: "godot_array.h".}
|
|
||||||
proc isEmpty*(self: Array): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_array_empty", header: "godot_array.h".}
|
|
||||||
proc erase*(self: var Array; value: Variant) {.
|
|
||||||
importc: "godot_array_erase", header: "godot_array.h".}
|
|
||||||
proc first*(self: Array): Variant {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_array_front", header: "godot_array.h".}
|
|
||||||
proc last*(self: Array): Variant {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_array_back", header: "godot_array.h".}
|
|
||||||
proc find*(self: Array; what: Variant;
|
|
||||||
f: cint): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_array_find", header: "godot_array.h".}
|
|
||||||
proc findLast*(self: Array; what: Variant): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_array_find_last", header: "godot_array.h".}
|
|
||||||
proc contains*(self: Array; value: Variant): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_array_has", header: "godot_array.h".}
|
|
||||||
|
|
||||||
proc godotHash*(self: Array): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_array_hash", header: "godot_array.h".}
|
|
||||||
proc hash*(self: Array): Hash {.inline.} =
|
|
||||||
hash(godotHash(self))
|
|
||||||
|
|
||||||
proc insert*(self: var Array; pos: cint;
|
|
||||||
value: Variant) {.
|
|
||||||
importc: "godot_array_insert", header: "godot_array.h".}
|
|
||||||
proc reverse*(self: var Array) {.importc: "godot_array_invert",
|
|
||||||
header: "godot_array.h".}
|
|
||||||
proc popLast*(self: var Array): Variant {.
|
|
||||||
importc: "godot_array_pop_back", header: "godot_array.h".}
|
|
||||||
proc popFirst*(self: var Array): Variant {.
|
|
||||||
importc: "godot_array_pop_front", header: "godot_array.h".}
|
|
||||||
proc addLast*(self: var Array; value: Variant) {.
|
|
||||||
importc: "godot_array_push_back", header: "godot_array.h".}
|
|
||||||
proc addFirst*(self: var Array; value: Variant) {.
|
|
||||||
importc: "godot_array_push_front", header: "godot_array.h".}
|
|
||||||
|
|
||||||
proc delete*(self: var Array; idx: cint) {.
|
|
||||||
importc: "godot_array_remove", header: "godot_array.h".}
|
|
||||||
proc setLen*(self: var Array; size: cint) {.
|
|
||||||
importc: "godot_array_resize", header: "godot_array.h".}
|
|
||||||
proc rfind*(self: Array; what: Variant;
|
|
||||||
f: cint): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_array_rfind", header: "godot_array.h".}
|
|
||||||
proc len*(self: Array): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_array_size", header: "godot_array.h".}
|
|
||||||
proc sort*(self: var Array) {.importc: "godot_array_sort",
|
|
||||||
header: "godot_array.h".}
|
|
||||||
proc sortCustom*(self: var Array; obj: var GodotObject;
|
|
||||||
funcName: GodotString) {.
|
|
||||||
importc: "godot_array_sort_custom", header: "godot_array.h".}
|
|
||||||
|
|
||||||
iterator items*(arr: Array): Variant =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield arr[i]
|
|
||||||
|
|
||||||
iterator mitems*(arr: var Array): var Variant =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield arr.mget(i)[]
|
|
||||||
|
|
||||||
iterator pairs*(arr: Array): tuple[key: cint, val: Variant] =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield (i, arr[i])
|
|
||||||
|
|
||||||
iterator mpairs*(arr: var Array): tuple[key: cint, val: var Variant] =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield (i, arr.mget(i)[])
|
|
||||||
|
|
@ -1,140 +0,0 @@
|
||||||
# Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
import godotbase, vector3, quat, strings
|
|
||||||
|
|
||||||
type
|
|
||||||
Basis* {.importc: "godot_basis", header: "godot_basis.h", byref.} = object
|
|
||||||
|
|
||||||
proc initBasis(dest: var Basis) {.importc: "godot_basis_new",
|
|
||||||
header: "godot_basis.h".}
|
|
||||||
proc initBasis(dest: var Basis;
|
|
||||||
xAxis: Vector3;
|
|
||||||
yAxis: Vector3;
|
|
||||||
zAxis: Vector3) {.
|
|
||||||
importc: "godot_basis_new_with_rows", header: "godot_basis.h".}
|
|
||||||
proc initBasis(dest: var Basis;
|
|
||||||
euler: Quat) {.
|
|
||||||
importc: "godot_basis_new_with_euler_quat", header: "godot_basis.h".}
|
|
||||||
proc initBasis(dest: var Basis; axis: Vector3; phi: float32) {.
|
|
||||||
importc: "godot_basis_new_with_axis_and_angle", header: "godot_basis.h".}
|
|
||||||
proc initBasis(dest: var Basis; euler: Vector3) {.
|
|
||||||
importc: "godot_basis_new_with_euler", header: "godot_basis.h".}
|
|
||||||
|
|
||||||
proc initBasis*(): Basis {.inline.} =
|
|
||||||
initBasis(result)
|
|
||||||
|
|
||||||
proc initBasis*(xAxis, yAxis, zAxis: Vector3): Basis {.inline.} =
|
|
||||||
initBasis(result, xAxis, yAxis, zAxis)
|
|
||||||
|
|
||||||
proc initBasis*(euler: Quat): Basis {.inline.} =
|
|
||||||
initBasis(result, euler)
|
|
||||||
|
|
||||||
proc initBasis*(axis: Vector3, phi: float32): Basis {.inline.} =
|
|
||||||
initBasis(result, axis, phi)
|
|
||||||
|
|
||||||
proc initBasis*(euler: Vector3): Basis {.inline.} =
|
|
||||||
initBasis(result, euler)
|
|
||||||
|
|
||||||
proc toGodotString*(self: Basis): GodotString {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_as_string", header: "godot_basis.h".}
|
|
||||||
|
|
||||||
proc `$`*(self: Basis): string {.inline.} =
|
|
||||||
$self.toGodotString()
|
|
||||||
|
|
||||||
proc inverse*(self: Basis): Basis {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_inverse", header: "godot_basis.h".}
|
|
||||||
proc transposed*(self: Basis): Basis {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_transposed", header: "godot_basis.h".}
|
|
||||||
proc orthonormalized*(self: Basis): Basis {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_orthonormalized", header: "godot_basis.h".}
|
|
||||||
proc determinant*(self: Basis): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_determinant", header: "godot_basis.h".}
|
|
||||||
proc rotated*(self: Basis; axis: Vector3;
|
|
||||||
phi: float32): Basis {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_rotated", header: "godot_basis.h".}
|
|
||||||
proc scaled*(self: Basis; scale: Vector3): Basis {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_scaled", header: "godot_basis.h".}
|
|
||||||
|
|
||||||
proc setScale*(self: var Basis; scale: Vector3) {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_set_scale", header: "godot_basis.h".}
|
|
||||||
proc setRotationEuler*(self: var Basis;
|
|
||||||
euler: Vector3) {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_set_rotation_euler", header: "godot_basis.h".}
|
|
||||||
proc setRotationAxisAngle*(self: var Basis; axis: Vector3; angle: float32) {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_set_rotation_axis_angle", header: "godot_basis.h".}
|
|
||||||
|
|
||||||
proc scale*(self: Basis): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_get_scale", header: "godot_basis.h".}
|
|
||||||
proc euler*(self: Basis): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_get_euler", header: "godot_basis.h".}
|
|
||||||
|
|
||||||
proc tdotx*(self: Basis; x: Vector3): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_tdotx", header: "godot_basis.h".}
|
|
||||||
proc tdoty*(self: Basis; y: Vector3): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_tdoty", header: "godot_basis.h".}
|
|
||||||
proc tdotz*(self: Basis; z: Vector3): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_tdotz", header: "godot_basis.h".}
|
|
||||||
|
|
||||||
proc xform*(self: Basis; v: Vector3): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_xform", header: "godot_basis.h".}
|
|
||||||
proc xformInv*(self: Basis; v: Vector3): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_xform_inv", header: "godot_basis.h".}
|
|
||||||
|
|
||||||
proc orthogonalIndex*(self: Basis): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_get_orthogonal_index", header: "godot_basis.h".}
|
|
||||||
|
|
||||||
proc godot_basis_get_elements(self: Basis;
|
|
||||||
elements: var array[3, Vector3]) {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_get_elements", header: "godot_basis.h".}
|
|
||||||
|
|
||||||
proc elements*(self: Basis): array[3, Vector3] {.inline.} =
|
|
||||||
godot_basis_get_elements(self, result)
|
|
||||||
|
|
||||||
proc `[]`*(self: Basis; axis: range[0..2]): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_get_axis", header: "godot_basis.h".}
|
|
||||||
proc `[]=`*(self: var Basis; axis: range[0..2];
|
|
||||||
value: Vector3) {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_set_axis", header: "godot_basis.h".}
|
|
||||||
proc row*(self: Basis; row: cint): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_get_row", header: "godot_basis.h".}
|
|
||||||
proc setRow*(self: var Basis; row: cint;
|
|
||||||
value: Vector3) {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_set_row", header: "godot_basis.h".}
|
|
||||||
proc `==`*(self: Basis; b: Basis): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_operator_equal", header: "godot_basis.h".}
|
|
||||||
proc `+`*(self: Basis; b: Basis): Basis {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_operator_add", header: "godot_basis.h".}
|
|
||||||
proc `-`*(self: Basis; b: Basis): Basis {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_operator_substract", header: "godot_basis.h".}
|
|
||||||
proc `*`*(self: Basis; b: Basis): Basis {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_operator_multiply_vector", header: "godot_basis.h".}
|
|
||||||
proc `*`*(self: Basis; b: float32): Basis {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_basis_operator_multiply_scalar", header: "godot_basis.h".}
|
|
||||||
|
|
@ -1,76 +0,0 @@
|
||||||
# Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
import godotbase, strings
|
|
||||||
|
|
||||||
type
|
|
||||||
Color* {.importc: "godot_color", header: "godot_color.h", byref.} = object
|
|
||||||
|
|
||||||
proc initColor(dest: var Color; r, g, b, a: float32) {.
|
|
||||||
importc: "godot_color_new_rgba", header: "godot_color.h".}
|
|
||||||
proc initColor(dest: var Color; r, g, b: float32) {.
|
|
||||||
importc: "godot_color_new_rgb",
|
|
||||||
header: "godot_color.h".}
|
|
||||||
|
|
||||||
proc initColor*(r, g, b, a: float32): Color {.inline.} =
|
|
||||||
initColor(result, r, g, b, a)
|
|
||||||
|
|
||||||
proc initColor*(r, g, b: float32): Color {.inline.} =
|
|
||||||
initColor(result, r, g, b)
|
|
||||||
|
|
||||||
proc r*(self: Color): float32 {.
|
|
||||||
importc: "godot_color_get_r", header: "godot_color.h".}
|
|
||||||
proc `r=`*(self: var Color; r: float32) {.
|
|
||||||
importc: "godot_color_set_r", header: "godot_color.h".}
|
|
||||||
proc g*(self: Color): float32 {.
|
|
||||||
importc: "godot_color_get_g", header: "godot_color.h".}
|
|
||||||
proc `g=`*(self: var Color; g: float32) {.
|
|
||||||
importc: "godot_color_set_g", header: "godot_color.h".}
|
|
||||||
proc b*(self: Color): float32 {.
|
|
||||||
importc: "godot_color_get_b", header: "godot_color.h".}
|
|
||||||
proc `b=`*(self: var Color; b: float32) {.
|
|
||||||
importc: "godot_color_set_b", header: "godot_color.h".}
|
|
||||||
proc a*(self: Color): float32 {.
|
|
||||||
importc: "godot_color_get_a", header: "godot_color.h".}
|
|
||||||
proc `a=`*(self: var Color; a: float32) {.
|
|
||||||
importc: "godot_color_set_a", header: "godot_color.h".}
|
|
||||||
|
|
||||||
proc h*(self: Color): float32 {.
|
|
||||||
importc: "godot_color_get_h", header: "godot_color.h".}
|
|
||||||
proc s*(self: Color): float32 {.
|
|
||||||
importc: "godot_color_get_s", header: "godot_color.h".}
|
|
||||||
proc v*(self: Color): float32 {.
|
|
||||||
importc: "godot_color_get_v", header: "godot_color.h".}
|
|
||||||
|
|
||||||
proc toGodotString*(self: Color): GodotString {.
|
|
||||||
importc: "godot_color_as_string", header: "godot_color.h".}
|
|
||||||
proc `$`*(self: Color): string {.inline.} =
|
|
||||||
$self.toGodotString()
|
|
||||||
|
|
||||||
proc toHtml*(self: Color; with_alpha: bool): GodotString {.
|
|
||||||
importc: "godot_color_to_html", header: "godot_color.h".}
|
|
||||||
|
|
||||||
proc to32CInt(self: Color): cint {.
|
|
||||||
importc: "godot_color_to_32", header: "godot_color.h".}
|
|
||||||
proc toARGB32CInt(self: Color): cint {.
|
|
||||||
importc: "godot_color_to_ARGB32", header: "godot_color.h".}
|
|
||||||
|
|
||||||
proc to32*(self: Color): uint32 {.inline.}=
|
|
||||||
cast[uint32](to32CInt(self))
|
|
||||||
proc toARGB32*(self: Color): uint32 {.inline.} =
|
|
||||||
cast[uint32](toARGB32CInt(self))
|
|
||||||
|
|
||||||
proc gray*(self: Color): float32 {.
|
|
||||||
importc: "godot_color_gray", header: "godot_color.h".}
|
|
||||||
proc inverted*(self: Color): Color {.
|
|
||||||
importc: "godot_color_inverted", header: "godot_color.h".}
|
|
||||||
proc contrasted*(self: Color): Color {.
|
|
||||||
importc: "godot_color_contrasted", header: "godot_color.h".}
|
|
||||||
proc lerp*(self: Color; b: Color; t: float32): Color {.
|
|
||||||
importc: "godot_color_linear_interpolate", header: "godot_color.h".}
|
|
||||||
proc blend*(self: Color; over: Color): Color {.
|
|
||||||
importc: "godot_color_blend", header: "godot_color.h".}
|
|
||||||
|
|
||||||
proc `==`*(self, b: Color): bool {.
|
|
||||||
importc: "godot_color_operator_equal", header: "godot_color.h".}
|
|
||||||
proc `<`*(self, b: Color): bool {.
|
|
||||||
importc: "godot_color_operator_less", header: "godot_color.h".}
|
|
||||||
|
|
@ -1,81 +0,0 @@
|
||||||
# Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
import hashes
|
|
||||||
import godotbase, arrays, variant, strings
|
|
||||||
|
|
||||||
type
|
|
||||||
Dictionary* {.importc: "godot_dictionary",
|
|
||||||
header: "godot_dictionary.h", byref.} = object
|
|
||||||
|
|
||||||
proc initDictionary(dest: var Dictionary;
|
|
||||||
src: Dictionary) {.
|
|
||||||
importc: "godot_dictionary_new_copy",
|
|
||||||
header: "godot_dictionary.h".}
|
|
||||||
|
|
||||||
proc deinit(self: var Dictionary) {.
|
|
||||||
importc: "godot_dictionary_destroy", header: "godot_dictionary.h".}
|
|
||||||
|
|
||||||
proc `=`(self: var Dictionary, other: Dictionary) {.inline.} =
|
|
||||||
initDictionary(self, other)
|
|
||||||
|
|
||||||
proc `=destroy`(self: Dictionary) {.inline.} =
|
|
||||||
unsafeAddr(self)[].deinit()
|
|
||||||
|
|
||||||
proc initDictionary(dest: var Dictionary) {.
|
|
||||||
importc: "godot_dictionary_new", header: "godot_dictionary.h".}
|
|
||||||
proc initDictionary*(): Dictionary {.inline.} =
|
|
||||||
initDictionary(result)
|
|
||||||
|
|
||||||
proc len*(self: Dictionary): cint {.
|
|
||||||
importc: "godot_dictionary_size", header: "godot_dictionary.h".}
|
|
||||||
proc isEmpty*(self: Dictionary): bool {.
|
|
||||||
importc: "godot_dictionary_empty", header: "godot_dictionary.h".}
|
|
||||||
proc clear*(self: var Dictionary) {.
|
|
||||||
importc: "godot_dictionary_clear", header: "godot_dictionary.h".}
|
|
||||||
proc contains*(self: Dictionary; key: Variant): bool {.
|
|
||||||
importc: "godot_dictionary_has",
|
|
||||||
header: "godot_dictionary.h".}
|
|
||||||
proc contains*(self: Dictionary; keys: Array): bool {.
|
|
||||||
importc: "godot_dictionary_has_all",
|
|
||||||
header: "godot_dictionary.h".}
|
|
||||||
proc del*(self: var Dictionary; key: Variant) {.
|
|
||||||
importc: "godot_dictionary_erase", header: "godot_dictionary.h".}
|
|
||||||
|
|
||||||
proc godotHash*(self: Dictionary): cint {.
|
|
||||||
importc: "godot_dictionary_hash", header: "godot_dictionary.h".}
|
|
||||||
proc hash*(self: Dictionary): Hash {.inline.} =
|
|
||||||
hash(godotHash(self))
|
|
||||||
|
|
||||||
proc keys*(self: Dictionary): Array {.
|
|
||||||
importc: "godot_dictionary_keys", header: "godot_dictionary.h".}
|
|
||||||
proc values*(self: Dictionary): Array {.
|
|
||||||
importc: "godot_dictionary_values", header: "godot_dictionary.h".}
|
|
||||||
proc `[]`*(self: Dictionary; key: Variant): Variant {.
|
|
||||||
importc: "godot_dictionary_get", header: "godot_dictionary.h".}
|
|
||||||
proc `[]=`*(self: var Dictionary; key, value: Variant) {.
|
|
||||||
importc: "godot_dictionary_set",
|
|
||||||
header: "godot_dictionary.h".}
|
|
||||||
proc mget*(self: var Dictionary; key: Variant): ptr Variant {.
|
|
||||||
importc: "godot_dictionary_operator_index",
|
|
||||||
header: "godot_dictionary.h".}
|
|
||||||
|
|
||||||
proc `==`*(self, other: Dictionary): bool {.
|
|
||||||
importc: "godot_dictionary_operator_equal",
|
|
||||||
header: "godot_dictionary.h".}
|
|
||||||
|
|
||||||
proc toJson*(self: Dictionary): GodotString {.
|
|
||||||
importc: "godot_dictionary_to_json", header: "godot_dictionary.h".}
|
|
||||||
|
|
||||||
iterator keys*(dict: Dictionary): Variant =
|
|
||||||
let keyArr = dict.keys()
|
|
||||||
for key in keyArr:
|
|
||||||
yield key
|
|
||||||
|
|
||||||
iterator values*(dict: Dictionary): Variant =
|
|
||||||
let valArr = dict.values()
|
|
||||||
for val in valArr:
|
|
||||||
yield val
|
|
||||||
|
|
||||||
iterator pairs*(dict: Dictionary): tuple[key, val: Variant] =
|
|
||||||
for key in keys(dict):
|
|
||||||
yield (key, dict[key])
|
|
||||||
|
|
@ -1,107 +0,0 @@
|
||||||
# Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
type
|
|
||||||
Error* {.importc: "godot_error", header: "../godot.h",
|
|
||||||
size: sizeof(cint), pure.} = enum
|
|
||||||
OK,
|
|
||||||
Failed, ## Generic fail error
|
|
||||||
Unavailable, ## What is requested is unsupported/unavailable
|
|
||||||
Unconfigured, ## The object being used hasnt been properly set up yet
|
|
||||||
Unauthorized, ## Missing credentials for requested resource
|
|
||||||
ParameterRangeError, ## Parameter given out of range (5)
|
|
||||||
OutOfMemory, ## Out of memory
|
|
||||||
FileNotFound,
|
|
||||||
FileBadDrive,
|
|
||||||
FileBadPath,
|
|
||||||
FileNoPermission, ## (10)
|
|
||||||
FileAlreadyInUse,
|
|
||||||
FileCantOpen,
|
|
||||||
FileCantWrite,
|
|
||||||
FileCantRead,
|
|
||||||
FileUnrecognized, ## (15)
|
|
||||||
FileCorrupt,
|
|
||||||
FileMissingDependencies,
|
|
||||||
FileEOF,
|
|
||||||
CantOpen, ## Can't open a resource/socket/file
|
|
||||||
CantCreate, ## (20)
|
|
||||||
QueryFailed,
|
|
||||||
AlreadyInUse,
|
|
||||||
Locked, ## resource is locked
|
|
||||||
Timeout,
|
|
||||||
CantConnect, ## (25)
|
|
||||||
CantResolve,
|
|
||||||
ConnectionError,
|
|
||||||
CantAquireResource,
|
|
||||||
CantFork,
|
|
||||||
InvalidData, ## Data passed is invalid (30)
|
|
||||||
InvalidParameter, ## Parameter passed is invalid
|
|
||||||
AlreadyExists, ## When adding, item already exists
|
|
||||||
DoesNotExist, ## When retrieving/erasing, it item does not exist
|
|
||||||
DatabaseCantRead, ## Database is full
|
|
||||||
DatabaseCantWrite, ## Database is full (35)
|
|
||||||
CompilationFailed,
|
|
||||||
MethodNotFound,
|
|
||||||
LinkFailed,
|
|
||||||
ScriptFailed,
|
|
||||||
CyclicLink, ## (40)
|
|
||||||
InvalidDeclaration,
|
|
||||||
DuplicateSymbol,
|
|
||||||
PauseError,
|
|
||||||
Busy,
|
|
||||||
Skip, ## (45)
|
|
||||||
Help, ## user requested help!!
|
|
||||||
Bug,
|
|
||||||
## a bug in the software certainly happened, due to a double
|
|
||||||
## check failing or unexpected behavior.
|
|
||||||
PrinterOnFire, ## the parallel port printer is engulfed in flames
|
|
||||||
WTF ## shit happens, has never been used, though
|
|
||||||
|
|
||||||
const MAX_ARG_COUNT* = 128
|
|
||||||
|
|
||||||
type
|
|
||||||
GodotObject* {.importc: "godot_object", header: "../godot.h".} = object
|
|
||||||
Array* {.importc: "godot_array", header: "godot_array.h", byref.} = object
|
|
||||||
Variant* {.importc: "godot_variant",
|
|
||||||
header: "godot_variant.h", byref.} = object
|
|
||||||
|
|
||||||
proc initArray(dest: var Array, src: Array) {.
|
|
||||||
importc: "godot_array_new_copy",
|
|
||||||
header: "godot_array.h".}
|
|
||||||
|
|
||||||
proc deinit(self: var Array) {.importc: "godot_array_destroy",
|
|
||||||
header: "godot_array.h".}
|
|
||||||
|
|
||||||
proc `=`(self: var Array, other: Array) {.inline.} =
|
|
||||||
initArray(self, other)
|
|
||||||
|
|
||||||
proc `=destroy`(self: Array) {.inline.} =
|
|
||||||
unsafeAddr(self).deinit()
|
|
||||||
|
|
||||||
proc initVariant(dest: var Variant; src: Variant) {.
|
|
||||||
importc: "godot_variant_new_copy", header: "godot_variant.h".}
|
|
||||||
|
|
||||||
proc deinit*(self: var Variant) {.
|
|
||||||
importc: "godot_variant_destroy", header: "godot_variant.h".}
|
|
||||||
|
|
||||||
proc `=`(self: var Variant, other: Variant) {.inline.} =
|
|
||||||
initVariant(self, other)
|
|
||||||
|
|
||||||
proc `=destroy`(self: Variant) {.inline.} =
|
|
||||||
unsafeAddr(self).deinit()
|
|
||||||
|
|
||||||
# System Functions
|
|
||||||
|
|
||||||
proc godotAlloc*(bytes: cint): pointer {.
|
|
||||||
importc: "godot_alloc", header: "../godot.h".}
|
|
||||||
## Allocates the specified number of bytes.
|
|
||||||
## Using this instead of stdlib proc will help Godot track how much memory
|
|
||||||
## is in use in debug mode.
|
|
||||||
proc godotRealloc*(p: pointer; bytes: cint): pointer {.
|
|
||||||
importc: "godot_realloc", header: "../godot.h".}
|
|
||||||
## Reallocates the pointer for the specified number of bytes.
|
|
||||||
## Using this instead of stdlib proc will help Godot track how much memory
|
|
||||||
## is in use in debug mode.
|
|
||||||
proc godotFree*(p: pointer) {.importc: "godot_free", header: "../godot.h".}
|
|
||||||
## Frees the memory pointed to by the pointer.
|
|
||||||
## Using this instead of stdlib proc will help Godot track how much memory
|
|
||||||
## is in use in debug mode.
|
|
||||||
|
|
@ -1,296 +0,0 @@
|
||||||
# Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
import godotbase
|
|
||||||
import strings, vector2, rect2, vector3, transform2d, plane, quat
|
|
||||||
import rect3, basis, transform, color, nodepath, rid
|
|
||||||
import dictionary, arrays, poolarray, variant
|
|
||||||
|
|
||||||
export godotbase, strings, vector2, rect2, vector3, transform2d, plane, quat,
|
|
||||||
rect3, basis, transform, color, nodepath, rid, dictionary, arrays,
|
|
||||||
poolarray, variant
|
|
||||||
|
|
||||||
# MethodBind API
|
|
||||||
|
|
||||||
type
|
|
||||||
GodotMethodBind* {.importc: "godot_method_bind",
|
|
||||||
header: "../godot.h".} = object
|
|
||||||
|
|
||||||
proc getMethod*(className: cstring; methodName: cstring): ptr GodotMethodBind {.
|
|
||||||
importc: "godot_method_bind_get_method", header: "../godot.h".}
|
|
||||||
proc ptrCall*(methodBind: ptr GodotMethodBind;
|
|
||||||
instance: ptr GodotObject;
|
|
||||||
args: ptr array[MAX_ARG_COUNT, pointer];
|
|
||||||
ret: pointer) {.
|
|
||||||
importc: "godot_method_bind_ptrcall", header: "../godot.h".}
|
|
||||||
proc call*(methodBind: ptr GodotMethodBind;
|
|
||||||
instance: ptr GodotObject;
|
|
||||||
args: ptr array[MAX_ARG_COUNT, Variant]; argCount: cint;
|
|
||||||
callError: var VariantCallError): Variant {.
|
|
||||||
importc: "godot_method_bind_call", header: "../godot.h".}
|
|
||||||
|
|
||||||
var getClassMethodBind {.threadvar.}: ptr GodotMethodBind
|
|
||||||
proc getClassName*(o: ptr GodotObject): string =
|
|
||||||
if getClassMethodBind.isNil:
|
|
||||||
getClassMethodBind = getMethod(cstring"Object", cstring"get_class")
|
|
||||||
var ret: GodotString
|
|
||||||
getClassMethodBind.ptrCall(o, nil, addr ret)
|
|
||||||
result = $ret
|
|
||||||
|
|
||||||
# Script API
|
|
||||||
|
|
||||||
type
|
|
||||||
GodotNativeInitOptions* {.importc: "godot_native_init_options",
|
|
||||||
header: "../godot.h".} = object
|
|
||||||
inEditor* {.importc: "in_editor".}: bool
|
|
||||||
coreApiHash* {.importc: "core_api_hash".}: uint64
|
|
||||||
editorApiHash* {.importc: "editor_api_hash".}: uint64
|
|
||||||
noApiHash* {.importc: "no_api_hash".}: uint64
|
|
||||||
|
|
||||||
GodotNativeTerminateOptions* {.importc: "godot_native_terminate_options",
|
|
||||||
header: "../godot.h".} = object
|
|
||||||
inEditor* {.importc: "in_editor".}: bool
|
|
||||||
|
|
||||||
GodotMethodRPCMode* {.importc: "godot_method_rpc_mode", header: "../godot.h",
|
|
||||||
size: sizeof(cint), pure.} = enum
|
|
||||||
Disabled,
|
|
||||||
Remote,
|
|
||||||
Sync,
|
|
||||||
Master,
|
|
||||||
Slave
|
|
||||||
|
|
||||||
GodotMethodAttributes* {.importc: "godot_method_attributes",
|
|
||||||
header: "../godot.h".} = object
|
|
||||||
rpcMode* {.importc: "rpc_type".}: GodotMethodRPCMode
|
|
||||||
|
|
||||||
GodotPropertyHint* {.importc: "godot_property_hint", header: "../godot.h",
|
|
||||||
size: sizeof(cint), pure.} = enum
|
|
||||||
None, ## no hint provided.
|
|
||||||
Range, ## hint_text = "min,max,step,slider; // slider is optional"
|
|
||||||
ExpRange, ## hint_text = "min,max,step", exponential edit
|
|
||||||
Enum, ## hint_text= "val1,val2,val3,etc"
|
|
||||||
ExpEasing, ## exponential easing funciton (Math::ease)
|
|
||||||
Length, ## hint_text= "length" (as integer)
|
|
||||||
SpriteFrame,
|
|
||||||
KeyAccel, ## hint_text= "length" (as integer)
|
|
||||||
Flags, ## hint_text= "flag1,flag2,etc" (as bit flags)
|
|
||||||
Layers2DRender,
|
|
||||||
Layers2DPhysics,
|
|
||||||
Layers3DRender,
|
|
||||||
Layers3DPhysics,
|
|
||||||
File, ## a file path must be passed, hint_text (optionally)
|
|
||||||
## is a filter "*.png,*.wav,*.doc,"
|
|
||||||
Dir, ## a directort path must be passed
|
|
||||||
GlobalFile, ## a file path must be passed, hint_text (optionally) is a
|
|
||||||
## filter "*.png,*.wav,*.doc,"
|
|
||||||
GlobalDir, ## a directort path must be passed
|
|
||||||
ResourceType, ## a resource object type
|
|
||||||
MultilineText, ## used for string properties that can contain multiple lines
|
|
||||||
ColorNoAlpha, ## used for ignoring alpha component when editing a color
|
|
||||||
ImageCompressLossy,
|
|
||||||
ImageCompressLossless,
|
|
||||||
ObjectId,
|
|
||||||
TypeString, ## a type string, the hint is the base type to choose
|
|
||||||
NodePathToEditedNode, ## so something else can provide this
|
|
||||||
## (used in scripts)
|
|
||||||
MethodOfVariantType, ## a method of a type
|
|
||||||
MethodOfBaseType, ## a method of a base type
|
|
||||||
MethodOfInstance, ## a method of an instance
|
|
||||||
MethodOfScript, ## a method of a script & base
|
|
||||||
PropertyOfVariantType, ## a property of a type
|
|
||||||
PropertyOfBaseType, ## a property of a base type
|
|
||||||
PropertyOfInstance, ## a property of an instance
|
|
||||||
PropertyOfScript, ## a property of a script & base
|
|
||||||
PropertyHintMax
|
|
||||||
|
|
||||||
const
|
|
||||||
GODOT_PROPERTY_USAGE_STORAGE_VALUE = 1.cint
|
|
||||||
GODOT_PROPERTY_USAGE_EDITOR_VALUE = 2.cint
|
|
||||||
GODOT_PROPERTY_USAGE_NETWORK_VALUE = 4.cint
|
|
||||||
GODOT_PROPERTY_USAGE_EDITOR_HELPER_VALUE = 8.cint
|
|
||||||
GODOT_PROPERTY_USAGE_CHECKABLE_VALUE = 16.cint
|
|
||||||
GODOT_PROPERTY_USAGE_CHECKED_VALUE = 32.cint
|
|
||||||
GODOT_PROPERTY_USAGE_INTERNATIONALIZED_VALUE = 64.cint
|
|
||||||
GODOT_PROPERTY_USAGE_GROUP_VALUE = 128.cint
|
|
||||||
GODOT_PROPERTY_USAGE_CATEGORY_VALUE = 256.cint
|
|
||||||
GODOT_PROPERTY_USAGE_STORE_IF_NONZERO_VALUE = 512.cint
|
|
||||||
GODOT_PROPERTY_USAGE_STORE_IF_NONONE_VALUE = 1024.cint
|
|
||||||
GODOT_PROPERTY_USAGE_NO_INSTANCE_STATE_VALUE = 2048.cint
|
|
||||||
GODOT_PROPERTY_USAGE_RESTART_IF_CHANGED_VALUE = 4096.cint
|
|
||||||
GODOT_PROPERTY_USAGE_SCRIPT_VARIABLE_VALUE = 8192.cint
|
|
||||||
GODOT_PROPERTY_USAGE_STORE_IF_NULL_VALUE = 16384.cint
|
|
||||||
GODOT_PROPERTY_USAGE_ANIMATE_AS_TRIGGER_VALUE = 32768.cint
|
|
||||||
GODOT_PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED_VALUE = 65536.cint
|
|
||||||
|
|
||||||
GODOT_PROPERTY_USAGE_DEFAULT_VALUE: cint =
|
|
||||||
GODOT_PROPERTY_USAGE_STORAGE_VALUE or GODOT_PROPERTY_USAGE_EDITOR_VALUE or
|
|
||||||
GODOT_PROPERTY_USAGE_NETWORK_VALUE
|
|
||||||
GODOT_PROPERTY_USAGE_DEFAULT_INTL_VALUE: cint =
|
|
||||||
GODOT_PROPERTY_USAGE_STORAGE_VALUE or
|
|
||||||
GODOT_PROPERTY_USAGE_EDITOR_VALUE or GODOT_PROPERTY_USAGE_NETWORK_VALUE or
|
|
||||||
GODOT_PROPERTY_USAGE_INTERNATIONALIZED_VALUE
|
|
||||||
GODOT_PROPERTY_USAGE_NOEDITOR_VALUE: cint =
|
|
||||||
GODOT_PROPERTY_USAGE_STORAGE_VALUE or GODOT_PROPERTY_USAGE_NETWORK_VALUE
|
|
||||||
|
|
||||||
type
|
|
||||||
GodotPropertyUsageFlags* {.importc: "godot_property_usage_flags",
|
|
||||||
header: "../godot.h", size: sizeof(cint),
|
|
||||||
pure.} = enum
|
|
||||||
Storage = GODOT_PROPERTY_USAGE_STORAGE_VALUE
|
|
||||||
Editor = GODOT_PROPERTY_USAGE_EDITOR_VALUE
|
|
||||||
Network = GODOT_PROPERTY_USAGE_NETWORK_VALUE
|
|
||||||
NoEditor = GODOT_PROPERTY_USAGE_NOEDITOR_VALUE
|
|
||||||
Default = GODOT_PROPERTY_USAGE_DEFAULT_VALUE
|
|
||||||
EditorHelper = GODOT_PROPERTY_USAGE_EDITOR_HELPER_VALUE
|
|
||||||
Checkable = GODOT_PROPERTY_USAGE_CHECKABLE_VALUE
|
|
||||||
## used for editing global variables
|
|
||||||
Checked = GODOT_PROPERTY_USAGE_CHECKED_VALUE
|
|
||||||
## used for editing global variables
|
|
||||||
Internationalized = GODOT_PROPERTY_USAGE_INTERNATIONALIZED_VALUE
|
|
||||||
## hint for internationalized strings
|
|
||||||
DefaultIntl = GODOT_PROPERTY_USAGE_DEFAULT_INTL_VALUE
|
|
||||||
Group = GODOT_PROPERTY_USAGE_GROUP_VALUE
|
|
||||||
## used for grouping props in the editor
|
|
||||||
Category = GODOT_PROPERTY_USAGE_CATEGORY_VALUE
|
|
||||||
NonZero = GODOT_PROPERTY_USAGE_STORE_IF_NONZERO_VALUE
|
|
||||||
## only store if nonzero
|
|
||||||
NonOne = GODOT_PROPERTY_USAGE_STORE_IF_NONONE_VALUE
|
|
||||||
## only store if false
|
|
||||||
NoInstanceState = GODOT_PROPERTY_USAGE_NO_INSTANCE_STATE_VALUE
|
|
||||||
RestartIfChanged = GODOT_PROPERTY_USAGE_RESTART_IF_CHANGED_VALUE
|
|
||||||
ScriptVariable = GODOT_PROPERTY_USAGE_SCRIPT_VARIABLE_VALUE
|
|
||||||
StoreIfNull = GODOT_PROPERTY_USAGE_STORE_IF_NULL_VALUE
|
|
||||||
AnimateAsTrigger = GODOT_PROPERTY_USAGE_ANIMATE_AS_TRIGGER_VALUE
|
|
||||||
UpdateAllIfModified = GODOT_PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED_VALUE
|
|
||||||
|
|
||||||
GodotPropertyAttributes* {.importc: "godot_property_attributes",
|
|
||||||
header: "../godot.h", bycopy.} = object
|
|
||||||
rsetType* {.importc: "rset_type".}: GodotMethodRPCMode
|
|
||||||
typ* {.importc: "type".}: cint
|
|
||||||
hint* {.importc: "hint".}: GodotPropertyHint
|
|
||||||
hintString* {.importc: "hint_string".}: GodotString
|
|
||||||
usage* {.importc: "usage".}: GodotPropertyUsageFlags
|
|
||||||
defaultValue* {.importc: "default_value".}: Variant
|
|
||||||
|
|
||||||
GodotInstanceCreateFunc* {.importc: "godot_instance_create_func",
|
|
||||||
header: "../godot.h", bycopy.} = object
|
|
||||||
createFunc* {.importc: "create_func".}:
|
|
||||||
proc (obj: ptr GodotObject; methodData: pointer): pointer {.noconv.}
|
|
||||||
## returns user data
|
|
||||||
methodData* {.importc: "method_data".}: pointer
|
|
||||||
freeFunc* {.importc: "free_func".}: proc (a2: pointer) {.noconv.}
|
|
||||||
|
|
||||||
GodotInstanceDestroyFunc* {.importc: "godot_instance_destroy_func",
|
|
||||||
header: "../godot.h", bycopy.} = object
|
|
||||||
destroyFunc* {.importc: "destroy_func".}:
|
|
||||||
proc (obj: ptr GodotObject; methodData: pointer;
|
|
||||||
userData: pointer) {.noconv.}
|
|
||||||
methodData* {.importc: "method_data".}: pointer
|
|
||||||
freeFunc* {.importc: "free_func".}: proc (a2: pointer) {.noconv.}
|
|
||||||
|
|
||||||
proc godotScriptRegisterClass*(name, base: cstring;
|
|
||||||
create_func: GodotInstanceCreateFunc;
|
|
||||||
destroy_func: GodotInstanceDestroyFunc) {.
|
|
||||||
importc: "godot_script_register_class", header: "../godot.h".}
|
|
||||||
proc godotScriptRegisterToolClass*(name, base: cstring;
|
|
||||||
createFunc: GodotInstanceCreateFunc;
|
|
||||||
destroyFunc: GodotInstanceDestroyFunc) {.
|
|
||||||
importc: "godot_script_register_tool_class", header: "../godot.h".}
|
|
||||||
type
|
|
||||||
GodotInstanceMethod* {.importc: "godot_instance_method",
|
|
||||||
header: "../godot.h", bycopy.} = object
|
|
||||||
meth* {.importc: "method".}:
|
|
||||||
proc (obj: ptr GodotObject; methodData: pointer;
|
|
||||||
userData: pointer; numArgs: cint;
|
|
||||||
args: var ptr array[MAX_ARG_COUNT, Variant]): Variant {.noconv.}
|
|
||||||
methodData* {.importc: "method_data".}: pointer
|
|
||||||
freeFunc* {.importc: "free_func".}: proc (a2: pointer) {.noconv.}
|
|
||||||
|
|
||||||
proc godotScriptRegisterMethod*(name: cstring; function_name: cstring;
|
|
||||||
attr: GodotMethodAttributes;
|
|
||||||
meth: GodotInstanceMethod) {.
|
|
||||||
importc: "godot_script_register_method", header: "../godot.h".}
|
|
||||||
type
|
|
||||||
GodotPropertySetFunc* {.importc: "godot_property_set_func",
|
|
||||||
header: "../godot.h", bycopy.} = object
|
|
||||||
setFunc* {.importc: "set_func".}: proc (obj: ptr GodotObject;
|
|
||||||
methodData: pointer;
|
|
||||||
userData: pointer;
|
|
||||||
value: Variant) {.noconv.}
|
|
||||||
methodData* {.importc: "method_data".}: pointer
|
|
||||||
freeFunc* {.importc: "free_func".}: proc (a2: pointer) {.noconv.}
|
|
||||||
|
|
||||||
GodotPropertyGetFunc* {.importc: "godot_property_get_func",
|
|
||||||
header: "../godot.h", bycopy.} = object
|
|
||||||
getFunc* {.importc: "get_func".}:
|
|
||||||
proc (obj: ptr GodotObject; methodData: pointer;
|
|
||||||
userData: pointer): Variant {.noconv.}
|
|
||||||
methodData* {.importc: "method_data".}: pointer
|
|
||||||
freeFunc* {.importc: "free_func".}: proc (a2: pointer) {.noconv.}
|
|
||||||
|
|
||||||
proc godotScriptRegisterProperty*(name: cstring; path: cstring;
|
|
||||||
attr: var GodotPropertyAttributes;
|
|
||||||
setFunc: GodotPropertySetFunc;
|
|
||||||
getFunc: GodotPropertyGetFunc) {.
|
|
||||||
importc: "godot_script_register_property", header: "../godot.h".}
|
|
||||||
|
|
||||||
type
|
|
||||||
GodotSignalArgument* {.importc: "godot_signal_argument",
|
|
||||||
header: "../godot.h", bycopy.} = object
|
|
||||||
name* {.importc: "name".}: GodotString
|
|
||||||
typ* {.importc: "type".}: cint
|
|
||||||
hint* {.importc: "hint".}: GodotPropertyHint
|
|
||||||
hintString* {.importc: "hint_string".}: GodotString
|
|
||||||
usage* {.importc: "usage".}: GodotPropertyUsageFlags
|
|
||||||
defaultValue* {.importc: "default_value".}: Variant
|
|
||||||
|
|
||||||
GodotSignal* {.importc: "godot_signal", header: "../godot.h".} = object
|
|
||||||
name* {.importc: "name".}: GodotString
|
|
||||||
numArgs* {.importc: "num_args".}: cint
|
|
||||||
args* {.importc: "args".}: ptr GodotSignalArgument
|
|
||||||
numDefaultArgs* {.importc: "num_default_args".}: cint
|
|
||||||
defaultArgs* {.importc: "default_args".}: ptr Variant
|
|
||||||
|
|
||||||
proc godotScriptRegisterSignal*(name: cstring; signal: GodotSignal) {.
|
|
||||||
importc: "godot_script_register_signal", header: "../godot.h".}
|
|
||||||
proc getUserdata*(instance: ptr GodotObject): pointer {.
|
|
||||||
importc: "godot_native_get_userdata", header: "../godot.h".}
|
|
||||||
|
|
||||||
type
|
|
||||||
GodotClassConstructor* = proc (): ptr GodotObject {.gcsafe, noconv.}
|
|
||||||
|
|
||||||
proc getClassConstructor*(className: cstring): GodotClassConstructor {.
|
|
||||||
importc: "godot_get_class_constructor", header: "../godot.h".}
|
|
||||||
proc getGlobalConstants*(): Dictionary {.
|
|
||||||
importc: "godot_get_global_constants", header: "../godot.h".}
|
|
||||||
proc godotNew*(p_classname: cstring): ptr GodotObject {.
|
|
||||||
importc: "godot_new", header: "../godot.h".}
|
|
||||||
proc godotStackBottom*(): pointer {.
|
|
||||||
importc: "godot_get_stack_bottom", header: "../godot.h".}
|
|
||||||
|
|
||||||
proc deinit*(o: ptr GodotObject) {.
|
|
||||||
importc: "godot_object_destroy", header: "../godot.h".}
|
|
||||||
|
|
||||||
# print using Godot's error handler list
|
|
||||||
|
|
||||||
proc godotPrintError(description: cstring; function: cstring; file: cstring;
|
|
||||||
line: cint) {.
|
|
||||||
importc: "godot_print_error", header: "../godot.h".}
|
|
||||||
|
|
||||||
proc godotPrintWarning(description: cstring; function: cstring;
|
|
||||||
file: cstring; line: cint) {.
|
|
||||||
importc: "godot_print_warning", header: "../godot.h".}
|
|
||||||
|
|
||||||
proc godotPrint(message: GodotString) {.
|
|
||||||
importc: "godot_print", header: "../godot.h".}
|
|
||||||
|
|
||||||
proc print*(message: string) {.inline.} =
|
|
||||||
let s = message.toGodotString()
|
|
||||||
godotPrint(s)
|
|
||||||
|
|
||||||
template printWarning*(warn: typed) =
|
|
||||||
let (filename, line) = instantiationInfo()
|
|
||||||
godotPrintWarning(cstring($warn), nil, cstring(filename), line.cint)
|
|
||||||
|
|
||||||
template printError*(err: typed) =
|
|
||||||
let (filename, line) = instantiationInfo()
|
|
||||||
godotPrintError(cstring($err), nil, cstring(filename), line.cint)
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
# Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
import godotbase, strings
|
|
||||||
|
|
||||||
type
|
|
||||||
NodePath* {.importc: "godot_node_path",
|
|
||||||
header: "godot_node_path.h", byref.} = object
|
|
||||||
|
|
||||||
proc initNodePath(dest: var NodePath; s: GodotString) {.
|
|
||||||
importc: "godot_node_path_new", header: "godot_node_path.h".}
|
|
||||||
proc initNodePath(dest: var NodePath;
|
|
||||||
src: NodePath) {.
|
|
||||||
importc: "godot_node_path_new_copy", header: "godot_node_path.h".}
|
|
||||||
proc deinit(self: var NodePath) {.
|
|
||||||
importc: "godot_node_path_destroy", header: "godot_node_path.h".}
|
|
||||||
|
|
||||||
proc initNodePath*(s: string): NodePath {.inline.} =
|
|
||||||
initNodePath(result, s.toGodotString())
|
|
||||||
|
|
||||||
proc `=destroy`(self: NodePath) {.inline.} =
|
|
||||||
unsafeAddr(self).deinit()
|
|
||||||
|
|
||||||
proc `=`(self: var NodePath, other: NodePath) {.inline.} =
|
|
||||||
initNodePath(self, other)
|
|
||||||
|
|
||||||
proc toGodotString*(self: NodePath): GodotString {.
|
|
||||||
importc: "godot_node_path_as_string", header: "godot_node_path.h".}
|
|
||||||
proc `$`*(self: NodePath): string {.inline.} =
|
|
||||||
let s = self.toGodotString()
|
|
||||||
result = $s
|
|
||||||
|
|
||||||
proc isAbsolute*(self: NodePath): bool {.
|
|
||||||
importc: "godot_node_path_is_absolute", header: "godot_node_path.h".}
|
|
||||||
proc nameCount*(self: NodePath): cint {.
|
|
||||||
importc: "godot_node_path_get_name_count",
|
|
||||||
header: "godot_node_path.h".}
|
|
||||||
proc getName*(self: NodePath; idx: cint): GodotString {.
|
|
||||||
importc: "godot_node_path_get_name", header: "godot_node_path.h".}
|
|
||||||
proc subnameCount*(self: NodePath): cint {.
|
|
||||||
importc: "godot_node_path_get_subname_count",
|
|
||||||
header: "godot_node_path.h".}
|
|
||||||
proc getSubname*(self: NodePath; idx: cint): GodotString {.
|
|
||||||
importc: "godot_node_path_get_subname",
|
|
||||||
header: "godot_node_path.h".}
|
|
||||||
proc property*(self: NodePath): GodotString {.
|
|
||||||
importc: "godot_node_path_get_property", header: "godot_node_path.h".}
|
|
||||||
proc isEmpty*(self: NodePath): bool {.
|
|
||||||
importc: "godot_node_path_is_empty", header: "godot_node_path.h".}
|
|
||||||
|
|
||||||
proc `==`*(a, b: NodePath): bool {.
|
|
||||||
importc: "godot_node_path_operator_equal",
|
|
||||||
header: "godot_node_path.h".}
|
|
||||||
|
|
||||||
converter fromString*(s: string): NodePath =
|
|
||||||
initNodePath(result, s.toGodotString())
|
|
||||||
|
|
@ -1,84 +0,0 @@
|
||||||
# Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
import godotbase, vector3, strings
|
|
||||||
|
|
||||||
type
|
|
||||||
Plane* {.importc: "godot_plane", header: "godot_plane.h", byref.} = object
|
|
||||||
|
|
||||||
proc initPlane(dest: var Plane; a, b, c, d: float32) {.
|
|
||||||
importc: "godot_plane_new_with_reals", header: "godot_plane.h".}
|
|
||||||
proc initPlane(dest: var Plane; v1, v2, v3: Vector3) {.
|
|
||||||
importc: "godot_plane_new_with_vectors",
|
|
||||||
header: "godot_plane.h".}
|
|
||||||
proc initPlane(dest: var Plane; normal: Vector3; d: float32) {.
|
|
||||||
importc: "godot_plane_new_with_normal",
|
|
||||||
header: "godot_plane.h".}
|
|
||||||
|
|
||||||
proc initPlane*(a, b, c, d: float32): Plane =
|
|
||||||
initPlane(result, a, b, c, d)
|
|
||||||
|
|
||||||
proc initPlane*(v1, v2, v3: Vector3): Plane =
|
|
||||||
initPlane(result, v1, v2, v3)
|
|
||||||
|
|
||||||
proc initPlane*(normal: Vector3; d: float32): Plane =
|
|
||||||
initPlane(result, normal, d)
|
|
||||||
|
|
||||||
proc toGodotString*(self: Plane): GodotString {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_plane_as_string", header: "godot_plane.h".}
|
|
||||||
proc `$`*(self: Plane): string {.inline.} =
|
|
||||||
$self.toGodotString()
|
|
||||||
|
|
||||||
proc normalized*(self: Plane): Plane {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_plane_normalized", header: "godot_plane.h".}
|
|
||||||
proc center*(self: Plane): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_plane_center", header: "godot_plane.h".}
|
|
||||||
proc getAnyPoint*(self: Plane): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_plane_get_any_point", header: "godot_plane.h".}
|
|
||||||
proc isPointOver*(self: Plane; point: Vector3): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_plane_is_point_over",
|
|
||||||
header: "godot_plane.h".}
|
|
||||||
proc distanceTo*(self: Plane; point: Vector3): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_plane_distance_to", header: "godot_plane.h".}
|
|
||||||
proc contains*(self: Plane; point: Vector3;
|
|
||||||
epsilon: float32): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_plane_has_point", header: "godot_plane.h".}
|
|
||||||
proc project*(self: Plane; point: Vector3): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_plane_project", header: "godot_plane.h".}
|
|
||||||
proc intersect3*(self: Plane; dest: var Vector3;
|
|
||||||
b, c: Plane): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_plane_intersect_3",
|
|
||||||
header: "godot_plane.h".}
|
|
||||||
proc intersectsRay*(self: Plane; dest: var Vector3;
|
|
||||||
v, dir: Vector3): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_plane_intersects_ray",
|
|
||||||
header: "godot_plane.h".}
|
|
||||||
proc intersectsSegment*(self: Plane; dest: var Vector3;
|
|
||||||
segmentBegin, segmentEnd: Vector3): bool {.
|
|
||||||
noSideEffect, importc: "godot_plane_intersects_segment",
|
|
||||||
header: "godot_plane.h".}
|
|
||||||
proc `-`*(self: Plane): Plane {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_plane_operator_neg", header: "godot_plane.h".}
|
|
||||||
proc `==`*(a, b: Plane): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_plane_operator_equal", header: "godot_plane.h".}
|
|
||||||
proc normal*(self: Plane): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_plane_get_normal", header: "godot_plane.h".}
|
|
||||||
proc `normal=`*(self: var Plane; normal: Vector3) {.
|
|
||||||
importc: "godot_plane_set_normal", header: "godot_plane.h".}
|
|
||||||
proc d*(self: Plane): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_plane_get_d", header: "godot_plane.h".}
|
|
||||||
proc `d=`*(self: var Plane; d: float32) {.
|
|
||||||
importc: "godot_plane_set_d", header: "godot_plane.h".}
|
|
||||||
|
|
@ -1,476 +0,0 @@
|
||||||
# Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
import godotbase, color, vector2, vector3, strings
|
|
||||||
|
|
||||||
type
|
|
||||||
PoolByteArray* {.importc: "godot_pool_byte_array",
|
|
||||||
header: "godot_pool_arrays.h", byref.} = object
|
|
||||||
PoolIntArray* {.importc: "godot_pool_int_array",
|
|
||||||
header: "godot_pool_arrays.h", byref.} = object
|
|
||||||
PoolRealArray* {.importc: "godot_pool_real_array",
|
|
||||||
header: "godot_pool_arrays.h", byref.} = object
|
|
||||||
PoolStringArray* {.importc: "godot_pool_string_array",
|
|
||||||
header: "godot_pool_arrays.h", byref.} = object
|
|
||||||
PoolVector2Array* {.importc: "godot_pool_vector2_array",
|
|
||||||
header: "godot_pool_arrays.h", byref.} = object
|
|
||||||
PoolVector3Array* {.importc: "godot_pool_vector3_array",
|
|
||||||
header: "godot_pool_arrays.h", byref.} = object
|
|
||||||
PoolColorArray* {.importc: "godot_pool_color_array",
|
|
||||||
header: "godot_pool_arrays.h", byref.} = object
|
|
||||||
|
|
||||||
# byte
|
|
||||||
|
|
||||||
proc initPoolByteArray(dest: var PoolByteArray) {.
|
|
||||||
importc: "godot_pool_byte_array_new", header: "godot_pool_arrays.h".}
|
|
||||||
proc initPoolByteArray(dest: var PoolByteArray;
|
|
||||||
src: PoolByteArray) {.
|
|
||||||
importc: "godot_pool_byte_array_new_copy",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc initPoolByteArray(dest: var PoolByteArray; arr: Array) {.
|
|
||||||
importc: "godot_pool_byte_array_new_with_array",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
proc deinit(self: var PoolByteArray) {.
|
|
||||||
importc: "godot_pool_byte_array_destroy", header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
proc initPoolByteArray*(): PoolByteArray {.inline.} =
|
|
||||||
initPoolByteArray(result)
|
|
||||||
|
|
||||||
proc initPoolByteArray*(arr: Array): PoolByteArray {.inline.} =
|
|
||||||
initPoolByteArray(result, arr)
|
|
||||||
|
|
||||||
proc `=`(self: var PoolByteArray, other: PoolByteArray) {.inline.} =
|
|
||||||
initPoolByteArray(self, other)
|
|
||||||
|
|
||||||
proc `=destroy`(self: PoolByteArray) {.inline.} =
|
|
||||||
unsafeAddr(self).deinit()
|
|
||||||
|
|
||||||
proc add*(self: var PoolByteArray;
|
|
||||||
data: uint8) {.
|
|
||||||
importc: "godot_pool_byte_array_append", header: "godot_pool_arrays.h".}
|
|
||||||
proc addFirst*(self: var PoolByteArray, data: uint8) {.
|
|
||||||
importc: "godot_pool_byte_array_push_back", header: "godot_pool_arrays.h".}
|
|
||||||
proc add*(self: var PoolByteArray;
|
|
||||||
arr: PoolByteArray) {.
|
|
||||||
importc: "godot_pool_byte_array_append_array",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc insert*(self: var PoolByteArray; idx: cint;
|
|
||||||
data: uint8): Error {.
|
|
||||||
importc: "godot_pool_byte_array_insert", header: "godot_pool_arrays.h".}
|
|
||||||
proc delete*(self: var PoolByteArray; idx: cint) {.
|
|
||||||
importc: "godot_pool_byte_array_remove", header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
proc reverse*(self: var PoolByteArray) {.
|
|
||||||
importc: "godot_pool_byte_array_invert", header: "godot_pool_arrays.h".}
|
|
||||||
proc setLen*(self: var PoolByteArray; size: cint) {.
|
|
||||||
importc: "godot_pool_byte_array_resize", header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
proc `[]=`*(self: var PoolByteArray; idx: cint; data: uint8) {.
|
|
||||||
importc: "godot_pool_byte_array_set", header: "godot_pool_arrays.h".}
|
|
||||||
proc `[]`*(self: PoolByteArray; idx: cint): uint8 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_pool_byte_array_get",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc len*(self: PoolByteArray): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_pool_byte_array_size", header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
iterator items*(arr: PoolByteArray): byte =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield arr[i]
|
|
||||||
|
|
||||||
iterator pairs*(arr: PoolByteArray): tuple[key: cint, val: byte] =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield (i, arr[i])
|
|
||||||
|
|
||||||
proc initPoolIntArray(dest: var PoolIntArray) {.
|
|
||||||
importc: "godot_pool_int_array_new", header: "godot_pool_arrays.h".}
|
|
||||||
proc initPoolIntArray(dest: var PoolIntArray;
|
|
||||||
src: PoolIntArray) {.
|
|
||||||
importc: "godot_pool_int_array_new_copy", header: "godot_pool_arrays.h".}
|
|
||||||
proc initPoolIntArray(dest: var PoolIntArray;
|
|
||||||
arr: Array) {.
|
|
||||||
importc: "godot_pool_int_array_new_with_array",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc deinit(self: var PoolIntArray) {.
|
|
||||||
importc: "godot_pool_int_array_destroy", header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
proc initPoolIntArray*(): PoolIntArray {.inline.} =
|
|
||||||
initPoolIntArray(result)
|
|
||||||
|
|
||||||
proc initPoolIntArray*(arr: Array): PoolIntArray {.inline.} =
|
|
||||||
initPoolIntArray(result, arr)
|
|
||||||
|
|
||||||
proc `=`(self: var PoolIntArray, other: PoolIntArray) {.inline.} =
|
|
||||||
initPoolIntArray(self, other)
|
|
||||||
|
|
||||||
proc `=destroy`(self: PoolIntArray) {.inline.} =
|
|
||||||
unsafeAddr(self).deinit()
|
|
||||||
|
|
||||||
proc add*(self: var PoolIntArray; data: cint) {.
|
|
||||||
importc: "godot_pool_int_array_append", header: "godot_pool_arrays.h".}
|
|
||||||
proc addFirst*(self: var PoolIntArray; data: cint) {.
|
|
||||||
importc: "godot_pool_int_array_push_back", header: "godot_pool_arrays.h".}
|
|
||||||
proc add*(self: var PoolIntArray; arr: PoolIntArray) {.
|
|
||||||
importc: "godot_pool_int_array_append_array",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc insert*(self: var PoolIntArray; idx: cint;
|
|
||||||
data: cint): Error {.
|
|
||||||
importc: "godot_pool_int_array_insert", header: "godot_pool_arrays.h".}
|
|
||||||
proc delete*(self: var PoolIntArray; idx: cint) {.
|
|
||||||
importc: "godot_pool_int_array_remove", header: "godot_pool_arrays.h".}
|
|
||||||
proc reverse*(self: var PoolIntArray) {.
|
|
||||||
importc: "godot_pool_int_array_invert", header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
proc setLen*(self: var PoolIntArray; size: cint) {.
|
|
||||||
importc: "godot_pool_int_array_resize", header: "godot_pool_arrays.h".}
|
|
||||||
proc `[]=`*(self: var PoolIntArray; idx: cint; data: cint) {.
|
|
||||||
importc: "godot_pool_int_array_set", header: "godot_pool_arrays.h".}
|
|
||||||
proc `[]`*(self: PoolIntArray; idx: cint): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_pool_int_array_get",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc len*(self: PoolIntArray): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_pool_int_array_size",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
iterator items*(arr: PoolIntArray): cint =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield arr[i]
|
|
||||||
|
|
||||||
iterator pairs*(arr: PoolIntArray): tuple[key: cint, val: cint] =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield (i, arr[i])
|
|
||||||
|
|
||||||
# Real
|
|
||||||
|
|
||||||
proc initPoolRealArray(dest: var PoolRealArray) {.
|
|
||||||
importc: "godot_pool_real_array_new", header: "godot_pool_arrays.h".}
|
|
||||||
proc initPoolRealArray(dest: var PoolRealArray;
|
|
||||||
src: PoolRealArray) {.
|
|
||||||
importc: "godot_pool_real_array_new_copy",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc initPoolRealArray(dest: var PoolRealArray; arr: Array) {.
|
|
||||||
importc: "godot_pool_real_array_new_with_array",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
proc deinit(self: var PoolRealArray) {.
|
|
||||||
importc: "godot_pool_real_array_destroy", header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
proc initPoolRealArray*(): PoolRealArray {.inline.} =
|
|
||||||
initPoolRealArray(result)
|
|
||||||
|
|
||||||
proc initPoolRealArray*(arr: Array): PoolRealArray {.inline.} =
|
|
||||||
initPoolRealArray(result, arr)
|
|
||||||
|
|
||||||
proc `=`(self: var PoolRealArray, other: PoolRealArray) {.inline.} =
|
|
||||||
initPoolRealArray(self, other)
|
|
||||||
|
|
||||||
proc `=destroy`(self: PoolRealArray) {.inline.} =
|
|
||||||
unsafeAddr(self).deinit()
|
|
||||||
|
|
||||||
proc add*(self: var PoolRealArray; data: float32) {.
|
|
||||||
importc: "godot_pool_real_array_append",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc addFirst*(self: var PoolRealArray; data: float32) {.
|
|
||||||
importc: "godot_pool_real_array_push_back", header: "godot_pool_arrays.h".}
|
|
||||||
proc add*(self: var PoolRealArray; arr: PoolRealArray) {.
|
|
||||||
importc: "godot_pool_real_array_append_array",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc insert*(self: var PoolRealArray;
|
|
||||||
idx: cint; data: float32): Error {.
|
|
||||||
importc: "godot_pool_real_array_insert", header: "godot_pool_arrays.h".}
|
|
||||||
proc delete*(self: var PoolRealArray; idx: cint) {.
|
|
||||||
importc: "godot_pool_real_array_remove", header: "godot_pool_arrays.h".}
|
|
||||||
proc reverse*(self: var PoolRealArray) {.
|
|
||||||
importc: "godot_pool_real_array_invert", header: "godot_pool_arrays.h".}
|
|
||||||
proc setLen*(self: var PoolRealArray; size: cint) {.
|
|
||||||
importc: "godot_pool_real_array_resize", header: "godot_pool_arrays.h".}
|
|
||||||
proc `[]=`*(self: var PoolRealArray; idx: cint; data: float32) {.
|
|
||||||
importc: "godot_pool_real_array_set", header: "godot_pool_arrays.h".}
|
|
||||||
proc `[]`*(self: PoolRealArray; idx: cint): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_pool_real_array_get",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc len*(self: PoolRealArray): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_pool_real_array_size", header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
iterator items*(arr: PoolRealArray): float32 =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield arr[i]
|
|
||||||
|
|
||||||
iterator pairs*(arr: PoolRealArray): tuple[key: cint, val: float32] =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield (i, arr[i])
|
|
||||||
|
|
||||||
# String
|
|
||||||
|
|
||||||
proc initPoolStringArray(dest: var PoolStringArray) {.
|
|
||||||
importc: "godot_pool_string_array_new", header: "godot_pool_arrays.h".}
|
|
||||||
proc initPoolStringArray(dest: var PoolStringArray;
|
|
||||||
src: PoolStringArray) {.
|
|
||||||
importc: "godot_pool_string_array_new_copy",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc initPoolStringArray(dest: var PoolStringArray; arr: Array) {.
|
|
||||||
importc: "godot_pool_string_array_new_with_array",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
proc deinit(self: var PoolStringArray) {.
|
|
||||||
importc: "godot_pool_string_array_destroy",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
proc initPoolStringArray*(): PoolStringArray {.inline.} =
|
|
||||||
initPoolStringArray(result)
|
|
||||||
|
|
||||||
proc initPoolStringArray*(arr: Array): PoolStringArray {.inline.} =
|
|
||||||
initPoolStringArray(result, arr)
|
|
||||||
|
|
||||||
proc `=`(self: var PoolStringArray, other: PoolStringArray) {.inline.} =
|
|
||||||
initPoolStringArray(self, other)
|
|
||||||
|
|
||||||
proc `=destroy`(self: PoolStringArray) {.inline.} =
|
|
||||||
unsafeAddr(self).deinit()
|
|
||||||
|
|
||||||
proc add*(self: var PoolStringArray; data: GodotString) {.
|
|
||||||
importc: "godot_pool_string_array_append",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc addFirst*(self: var PoolStringArray; data: GodotString) {.
|
|
||||||
importc: "godot_pool_string_array_push_back",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc add*(self: var PoolStringArray; arr: PoolStringArray) {.
|
|
||||||
importc: "godot_pool_string_array_append_array",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc insert*(self: var PoolStringArray;
|
|
||||||
idx: cint; data: GodotString): Error {.
|
|
||||||
importc: "godot_pool_string_array_insert",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc delete*(self: var PoolStringArray; idx: cint) {.
|
|
||||||
importc: "godot_pool_string_array_remove", header: "godot_pool_arrays.h".}
|
|
||||||
proc reverse*(self: var PoolStringArray) {.
|
|
||||||
importc: "godot_pool_string_array_invert", header: "godot_pool_arrays.h".}
|
|
||||||
proc setLen*(self: var PoolStringArray; size: cint) {.
|
|
||||||
importc: "godot_pool_string_array_resize", header: "godot_pool_arrays.h".}
|
|
||||||
proc `[]=`*(self: var PoolStringArray; idx: cint;
|
|
||||||
data: GodotString) {.
|
|
||||||
importc: "godot_pool_string_array_set",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc `[]`*(self: PoolStringArray; idx: cint): GodotString {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_pool_string_array_get",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc len*(self: PoolStringArray): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_pool_string_array_size",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
iterator items*(arr: PoolStringArray): GodotString =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield arr[i]
|
|
||||||
|
|
||||||
iterator pairs*(arr: PoolStringArray): tuple[key: cint, val: GodotString] =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield (i, arr[i])
|
|
||||||
|
|
||||||
# Vector2
|
|
||||||
|
|
||||||
proc initPoolVector2Array(dest: var PoolVector2Array) {.
|
|
||||||
importc: "godot_pool_vector2_array_new", header: "godot_pool_arrays.h".}
|
|
||||||
proc initPoolVector2Array(dest: var PoolVector2Array;
|
|
||||||
src: PoolVector2Array) {.
|
|
||||||
importc: "godot_pool_vector2_array_new_copy",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc initPoolVector2Array(dest: var PoolVector2Array; arr: Array) {.
|
|
||||||
importc: "godot_pool_vector2_array_new_with_array",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
proc deinit(self: var PoolVector2Array) {.
|
|
||||||
importc: "godot_pool_vector2_array_destroy", header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
proc initPoolVector2Array*(): PoolVector2Array {.inline.} =
|
|
||||||
initPoolVector2Array(result)
|
|
||||||
|
|
||||||
proc initPoolVector2Array*(arr: Array): PoolVector2Array {.inline.} =
|
|
||||||
initPoolVector2Array(result, arr)
|
|
||||||
|
|
||||||
proc `=`(self: var PoolVector2Array, other: PoolVector2Array) {.inline.} =
|
|
||||||
initPoolVector2Array(self, other)
|
|
||||||
|
|
||||||
proc `=destroy`(self: PoolVector2Array) {.inline.} =
|
|
||||||
unsafeAddr(self).deinit()
|
|
||||||
|
|
||||||
proc add*(self: var PoolVector2Array; data: Vector2) {.
|
|
||||||
importc: "godot_pool_vector2_array_append",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc addFirst*(self: var PoolVector2Array; data: Vector2) {.
|
|
||||||
importc: "godot_pool_vector2_array_push_back",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc add*(self: var PoolVector2Array;
|
|
||||||
arr: PoolVector2Array) {.
|
|
||||||
importc: "godot_pool_vector2_array_append_array",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc insert*(self: var PoolVector2Array;
|
|
||||||
idx: cint; data: Vector2): Error {.
|
|
||||||
importc: "godot_pool_vector2_array_insert",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc delete*(self: var PoolVector2Array; idx: cint) {.
|
|
||||||
importc: "godot_pool_vector2_array_remove", header: "godot_pool_arrays.h".}
|
|
||||||
proc reverse*(self: var PoolVector2Array) {.
|
|
||||||
importc: "godot_pool_vector2_array_invert",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc setLen*(self: var PoolVector2Array; size: cint) {.
|
|
||||||
importc: "godot_pool_vector2_array_resize", header: "godot_pool_arrays.h".}
|
|
||||||
proc `[]=`*(self: var PoolVector2Array; idx: cint;
|
|
||||||
data: ptr Vector2) {.
|
|
||||||
importc: "godot_pool_vector2_array_set", header: "godot_pool_arrays.h".}
|
|
||||||
proc `[]`*(self: PoolVector2Array; idx: cint): Vector2 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_pool_vector2_array_get", header: "godot_pool_arrays.h".}
|
|
||||||
proc len*(self: PoolVector2Array): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_pool_vector2_array_size", header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
iterator items*(arr: PoolVector2Array): Vector2 =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield arr[i]
|
|
||||||
|
|
||||||
iterator pairs*(arr: PoolVector2Array): tuple[key: cint, val: Vector2] =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield (i, arr[i])
|
|
||||||
|
|
||||||
# Vector3
|
|
||||||
|
|
||||||
proc initPoolVector3Array*(dest: var PoolVector3Array) {.
|
|
||||||
importc: "godot_pool_vector3_array_new", header: "godot_pool_arrays.h".}
|
|
||||||
proc initPoolVector3Array*(dest: var PoolVector3Array;
|
|
||||||
src: PoolVector3Array) {.
|
|
||||||
importc: "godot_pool_vector3_array_new_copy",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc initPoolVector3Array*(dest: var PoolVector3Array; arr: Array) {.
|
|
||||||
importc: "godot_pool_vector3_array_new_with_array",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
proc deinit(self: var PoolVector3Array) {.
|
|
||||||
importc: "godot_pool_vector3_array_destroy",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
proc initPoolVector3Array*(): PoolVector3Array {.inline.} =
|
|
||||||
initPoolVector3Array(result)
|
|
||||||
|
|
||||||
proc initPoolVector3Array*(arr: Array): PoolVector3Array {.inline.} =
|
|
||||||
initPoolVector3Array(result, arr)
|
|
||||||
|
|
||||||
proc `=`(self: var PoolVector3Array, other: PoolVector3Array) {.inline.} =
|
|
||||||
initPoolVector3Array(self, other)
|
|
||||||
|
|
||||||
proc `=destroy`(self: PoolVector3Array) {.inline.} =
|
|
||||||
unsafeAddr(self).deinit()
|
|
||||||
|
|
||||||
proc add*(self: var PoolVector3Array;
|
|
||||||
data: Vector3) {.
|
|
||||||
importc: "godot_pool_vector3_array_append",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc addFirst*(self: var PoolVector3Array;
|
|
||||||
data: Vector3) {.
|
|
||||||
importc: "godot_pool_vector3_array_push_back",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc add*(self: var PoolVector3Array;
|
|
||||||
arr: PoolVector3Array) {.
|
|
||||||
importc: "godot_pool_vector3_array_append_array",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc insert*(self: var PoolVector3Array;
|
|
||||||
idx: cint; data: Vector3): Error {.
|
|
||||||
importc: "godot_pool_vector3_array_insert",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc delete*(self: var PoolVector3Array; idx: cint) {.
|
|
||||||
importc: "godot_pool_vector3_array_remove", header: "godot_pool_arrays.h".}
|
|
||||||
proc reverse*(self: var PoolVector3Array) {.
|
|
||||||
importc: "godot_pool_vector3_array_invert", header: "godot_pool_arrays.h".}
|
|
||||||
proc setLen*(self: var PoolVector3Array; size: cint) {.
|
|
||||||
importc: "godot_pool_vector3_array_resize", header: "godot_pool_arrays.h".}
|
|
||||||
proc `[]=`*(self: var PoolVector3Array;
|
|
||||||
idx: cint; data: Vector3) {.
|
|
||||||
importc: "godot_pool_vector3_array_set",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc `[]`*(self: PoolVector3Array;
|
|
||||||
idx: cint): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_pool_vector3_array_get",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc len*(self: PoolVector3Array): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_pool_vector3_array_size",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
iterator items*(arr: PoolVector3Array): Vector3 =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield arr[i]
|
|
||||||
|
|
||||||
iterator pairs*(arr: PoolVector3Array): tuple[key: cint, val: Vector3] =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield (i, arr[i])
|
|
||||||
|
|
||||||
# Color
|
|
||||||
|
|
||||||
proc initPoolColorArray(dest: var PoolColorArray) {.
|
|
||||||
importc: "godot_pool_color_array_new", header: "godot_pool_arrays.h".}
|
|
||||||
proc initPoolColorArray(dest: var PoolColorArray;
|
|
||||||
src: PoolColorArray) {.
|
|
||||||
importc: "godot_pool_color_array_new_copy",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc initPoolColorArray(dest: var PoolColorArray; arr: Array) {.
|
|
||||||
importc: "godot_pool_color_array_new_with_array",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
proc deinit(self: var PoolColorArray) {.
|
|
||||||
importc: "godot_pool_color_array_destroy", header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
proc initPoolColorArray*(): PoolColorArray {.inline.} =
|
|
||||||
initPoolColorArray(result)
|
|
||||||
|
|
||||||
proc initPoolColorArray*(arr: Array): PoolColorArray {.inline.} =
|
|
||||||
initPoolColorArray(result, arr)
|
|
||||||
|
|
||||||
proc `=`(self: var PoolColorArray, other: PoolColorArray) {.inline.} =
|
|
||||||
initPoolColorArray(self, other)
|
|
||||||
|
|
||||||
proc `=destroy`(self: PoolColorArray) {.inline.} =
|
|
||||||
unsafeAddr(self).deinit()
|
|
||||||
|
|
||||||
proc add*(self: var PoolColorArray; data: Color) {.
|
|
||||||
importc: "godot_pool_color_array_append",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc addFirst*(self: var PoolColorArray; data: Color) {.
|
|
||||||
importc: "godot_pool_color_array_push_back",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc add*(self: var PoolColorArray; arr: PoolColorArray) {.
|
|
||||||
importc: "godot_pool_color_array_append_array",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc insert*(self: var PoolColorArray;
|
|
||||||
idx: cint; data: Color): Error {.
|
|
||||||
importc: "godot_pool_color_array_insert",
|
|
||||||
header: "godot_pool_arrays.h".}
|
|
||||||
proc delete*(self: var PoolColorArray; idx: cint) {.
|
|
||||||
importc: "godot_pool_color_array_remove", header: "godot_pool_arrays.h".}
|
|
||||||
proc reverse*(self: var PoolColorArray) {.
|
|
||||||
importc: "godot_pool_color_array_invert", header: "godot_pool_arrays.h".}
|
|
||||||
proc setLen*(self: var PoolColorArray; size: cint) {.
|
|
||||||
importc: "godot_pool_color_array_resize", header: "godot_pool_arrays.h".}
|
|
||||||
proc `[]=`*(self: var PoolColorArray; idx: cint;
|
|
||||||
data: Color) {.
|
|
||||||
importc: "godot_pool_color_array_set", header: "godot_pool_arrays.h".}
|
|
||||||
proc `[]`*(self: PoolColorArray; idx: cint): Color {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_pool_color_array_get", header: "godot_pool_arrays.h".}
|
|
||||||
proc len*(self: PoolColorArray): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_pool_color_array_size", header: "godot_pool_arrays.h".}
|
|
||||||
|
|
||||||
iterator items*(arr: PoolColorArray): Color =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield arr[i]
|
|
||||||
|
|
||||||
iterator pairs*(arr: PoolColorArray): tuple[key: cint, val: Color] =
|
|
||||||
for i in 0..<arr.len:
|
|
||||||
yield (i, arr[i])
|
|
||||||
|
|
@ -1,114 +0,0 @@
|
||||||
# Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
import godotbase, vector3, strings
|
|
||||||
|
|
||||||
type
|
|
||||||
Quat* {.importc: "godot_quat", header: "godot_quat.h", byref.} = object
|
|
||||||
|
|
||||||
proc initQuat(dest: var Quat; x, y, z, w: float32) {.
|
|
||||||
importc: "godot_quat_new", header: "godot_quat.h".}
|
|
||||||
proc initQuat(dest: var Quat; axis: Vector3; angle: float32) {.
|
|
||||||
importc: "godot_quat_new_with_axis_angle",
|
|
||||||
header: "godot_quat.h".}
|
|
||||||
|
|
||||||
proc initQuat*(x, y, z, w: float32): Quat {.inline.} =
|
|
||||||
initQuat(result, x, y, z, w)
|
|
||||||
|
|
||||||
proc initQuat*(axis: Vector3; angle: float32): Quat {.inline.} =
|
|
||||||
initQuat(result, axis, angle)
|
|
||||||
|
|
||||||
proc x*(self: Quat): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_get_x", header: "godot_quat.h".}
|
|
||||||
proc `x=`*(self: var Quat; val: float32) {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_set_x", header: "godot_quat.h".}
|
|
||||||
proc y*(self: Quat): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_get_y", header: "godot_quat.h".}
|
|
||||||
proc `y=`*(self: var Quat; val: float32) {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_set_y", header: "godot_quat.h".}
|
|
||||||
proc z*(self: Quat): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_get_z", header: "godot_quat.h".}
|
|
||||||
proc `z=`*(self: var Quat; val: float32) {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_set_z", header: "godot_quat.h".}
|
|
||||||
proc w*(self: Quat): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_get_w", header: "godot_quat.h".}
|
|
||||||
proc `w=`*(self: var Quat; val: float32) {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_set_w", header: "godot_quat.h".}
|
|
||||||
|
|
||||||
proc toGodotString*(self: Quat): GodotString {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_as_string", header: "godot_quat.h".}
|
|
||||||
proc `$`*(self: Quat): string {.inline.} =
|
|
||||||
$self.toGodotString()
|
|
||||||
|
|
||||||
proc length*(self: Quat): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_length", header: "godot_quat.h".}
|
|
||||||
proc lengthSquared*(self: Quat): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_length_squared", header: "godot_quat.h".}
|
|
||||||
proc normalized*(self: Quat): Quat {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_normalized", header: "godot_quat.h".}
|
|
||||||
proc isNormalized*(self: Quat): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_is_normalized", header: "godot_quat.h".}
|
|
||||||
proc inverse*(self: Quat): Quat {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_inverse", header: "godot_quat.h".}
|
|
||||||
proc dot*(a, b: Quat): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_dot", header: "godot_quat.h".}
|
|
||||||
proc xform*(self: Quat; v: Vector3): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_xform", header: "godot_quat.h".}
|
|
||||||
proc slerp*(self: Quat; b: Quat; t: float32): Quat {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_slerp", header: "godot_quat.h".}
|
|
||||||
proc slerpni*(self: Quat; b: Quat; t: float32): Quat {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_slerpni", header: "godot_quat.h".}
|
|
||||||
proc cubicSlerp*(self, b, pre_a, post_b: Quat;
|
|
||||||
t: float32): Quat {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_cubic_slerp",
|
|
||||||
header: "godot_quat.h".}
|
|
||||||
proc `*`*(a: Quat, b: float32): Quat {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_operator_multiply",
|
|
||||||
header: "godot_quat.h".}
|
|
||||||
proc `*=`*(a: var Quat, b: float32) {.inline.} =
|
|
||||||
a = a * b
|
|
||||||
|
|
||||||
proc `+`*(a, b: Quat): Quat {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_operator_add", header: "godot_quat.h".}
|
|
||||||
proc `+=`*(a: var Quat, b: Quat) {.inline.} =
|
|
||||||
a = a + b
|
|
||||||
|
|
||||||
proc `-`*(a, b: Quat): Quat {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_operator_substract",
|
|
||||||
header: "godot_quat.h".}
|
|
||||||
proc `-=`* (a: var Quat, b: Quat) {.inline.} =
|
|
||||||
a = a - b
|
|
||||||
|
|
||||||
proc `/`*(self: Quat; b: float32): Quat {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_operator_divide", header: "godot_quat.h".}
|
|
||||||
proc `/=`*(self: var Quat, b: float32) {.inline.} =
|
|
||||||
self = self / b
|
|
||||||
|
|
||||||
proc `==`*(a, b: Quat): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_operator_equal", header: "godot_quat.h".}
|
|
||||||
proc `-`*(self: Quat): Quat {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_quat_operator_neg", header: "godot_quat.h".}
|
|
||||||
|
|
@ -1,68 +0,0 @@
|
||||||
# Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
import godotbase, vector2, strings
|
|
||||||
|
|
||||||
type
|
|
||||||
Rect2* {.importc: "godot_rect2", header: "godot_rect2.h", byref.} = object
|
|
||||||
|
|
||||||
proc initRect2(dest: var Rect2; pos, size: Vector2) {.
|
|
||||||
importc: "godot_rect2_new_with_position_and_size",
|
|
||||||
header: "godot_rect2.h".}
|
|
||||||
proc initRect2(dest: var Rect2; x, y, sizeX, sizeY: float32) {.
|
|
||||||
importc: "godot_rect2_new", header: "godot_rect2.h".}
|
|
||||||
|
|
||||||
proc initRect2*(pos, size: Vector2): Rect2 {.inline.} =
|
|
||||||
initRect2(result, pos, size)
|
|
||||||
|
|
||||||
proc initRect2*(x, y, sizeX, sizeY: float32): Rect2 {.inline.} =
|
|
||||||
initRect2(result, x, y, sizeX, sizeY)
|
|
||||||
|
|
||||||
proc toGodotString*(self: Rect2): GodotString {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect2_as_string", header: "godot_rect2.h".}
|
|
||||||
proc `$`*(self: Rect2): string {.inline.} =
|
|
||||||
$self.toGodotString()
|
|
||||||
|
|
||||||
proc area*(self: Rect2): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect2_get_area", header: "godot_rect2.h".}
|
|
||||||
proc intersects*(a, b: Rect2): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect2_intersects", header: "godot_rect2.h".}
|
|
||||||
proc encloses*(a, b: Rect2): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect2_encloses", header: "godot_rect2.h".}
|
|
||||||
proc hasNoArea*(self: Rect2): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect2_has_no_area", header: "godot_rect2.h".}
|
|
||||||
proc clip*(a, b: Rect2): Rect2 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect2_clip", header: "godot_rect2.h".}
|
|
||||||
proc merge*(a, b: Rect2): Rect2 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect2_merge", header: "godot_rect2.h".}
|
|
||||||
proc contains*(self: Rect2; point: Vector2): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect2_has_point", header: "godot_rect2.h".}
|
|
||||||
proc grow*(self: Rect2; by: float32): Rect2 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect2_grow", header: "godot_rect2.h".}
|
|
||||||
proc expand*(self: Rect2; to: Vector2): Rect2 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect2_expand", header: "godot_rect2.h".}
|
|
||||||
proc `==`*(a, b: Rect2): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect2_operator_equal",
|
|
||||||
header: "godot_rect2.h".}
|
|
||||||
proc position*(self: Rect2): Vector2 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect2_get_position", header: "godot_rect2.h".}
|
|
||||||
proc size*(self: Rect2): Vector2 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect2_get_size", header: "godot_rect2.h".}
|
|
||||||
proc setPosition*(self: var Rect2; pos: Vector2) {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect2_set_position", header: "godot_rect2.h".}
|
|
||||||
proc setSize*(self: var Rect2; size: Vector2) {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect2_set_size", header: "godot_rect2.h".}
|
|
||||||
|
|
@ -1,100 +0,0 @@
|
||||||
# Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
import godotbase, plane, vector3, strings
|
|
||||||
|
|
||||||
type
|
|
||||||
Rect3* {.importc: "godot_rect3", header: "godot_rect3.h", byref.} = object
|
|
||||||
|
|
||||||
proc initRect3(dest: var Rect3; pos, size: Vector3) {.
|
|
||||||
importc: "godot_rect3_new", header: "godot_rect3.h".}
|
|
||||||
|
|
||||||
proc initRect3*(pos, size: Vector3): Rect3 {.inline.} =
|
|
||||||
initRect3(result, pos, size)
|
|
||||||
|
|
||||||
proc position*(self: Rect3): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_get_position", header: "godot_rect3.h".}
|
|
||||||
proc setPosition*(self: var Rect3; v: Vector3) {.
|
|
||||||
noSideEffect
|
|
||||||
importc: "godot_rect3_set_position", header: "godot_rect3.h".}
|
|
||||||
proc size*(self: Rect3): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_get_size", header: "godot_rect3.h".}
|
|
||||||
proc setSize*(self: var Rect3; v: Vector3) {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_set_size", header: "godot_rect3.h".}
|
|
||||||
proc toGodotString*(self: Rect3): GodotString {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_as_string", header: "godot_rect3.h".}
|
|
||||||
proc `$`*(self: Rect3): string {.inline.} =
|
|
||||||
$self.toGodotString()
|
|
||||||
proc area*(self: Rect3): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_get_area", header: "godot_rect3.h".}
|
|
||||||
proc hasNoArea*(self: Rect3): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_has_no_area", header: "godot_rect3.h".}
|
|
||||||
proc hasNoSurface*(self: Rect3): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_has_no_surface", header: "godot_rect3.h".}
|
|
||||||
proc intersects*(a, b: Rect3): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_intersects", header: "godot_rect3.h".}
|
|
||||||
proc encloses*(self, other: Rect3): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_encloses", header: "godot_rect3.h".}
|
|
||||||
proc merge*(self, other: Rect3): Rect3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_merge", header: "godot_rect3.h".}
|
|
||||||
proc intersection*(self, other: Rect3): Rect3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_intersection", header: "godot_rect3.h".}
|
|
||||||
proc intersectsPlane*(self: Rect3; plane: Plane): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_intersects_plane",
|
|
||||||
header: "godot_rect3.h".}
|
|
||||||
proc intersectsSegment*(self: Rect3; start, to: Vector3): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_intersects_segment",
|
|
||||||
header: "godot_rect3.h".}
|
|
||||||
proc contains*(self: Rect3; point: Vector3): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_has_point", header: "godot_rect3.h".}
|
|
||||||
proc getSupport*(self: Rect3; dir: Vector3): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_get_support", header: "godot_rect3.h".}
|
|
||||||
proc getLongestAxis*(self: Rect3): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_get_longest_axis", header: "godot_rect3.h".}
|
|
||||||
proc getLongestAxisIndex*(self: Rect3): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_get_longest_axis_index",
|
|
||||||
header: "godot_rect3.h".}
|
|
||||||
proc getLongestAxisSize*(self: Rect3): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_get_longest_axis_size",
|
|
||||||
header: "godot_rect3.h".}
|
|
||||||
proc getShortestAxis*(self: Rect3): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_get_shortest_axis", header: "godot_rect3.h".}
|
|
||||||
proc getShortestAxisIndex*(self: Rect3): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_get_shortest_axis_index",
|
|
||||||
header: "godot_rect3.h".}
|
|
||||||
proc getShortestAxisSize*(self: Rect3): float32 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_get_shortest_axis_size",
|
|
||||||
header: "godot_rect3.h".}
|
|
||||||
proc expand*(self: Rect3; toPoint: Vector3): Rect3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_expand", header: "godot_rect3.h".}
|
|
||||||
proc grow*(self: Rect3; by: float32): Rect3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_grow", header: "godot_rect3.h".}
|
|
||||||
proc getEndpoint*(self: Rect3; idx: cint): Vector3 {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_get_endpoint", header: "godot_rect3.h".}
|
|
||||||
proc `==`*(a, b: Rect3): bool {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rect3_operator_equal",
|
|
||||||
header: "godot_rect3.h".}
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
import godotbase
|
|
||||||
|
|
||||||
type
|
|
||||||
RID* {.importc: "godot_rid", header: "godot_rid.h", byref.} = object
|
|
||||||
|
|
||||||
proc initRID(dest: var RID) {.
|
|
||||||
importc: "godot_rid_new",
|
|
||||||
header: "godot_rid.h".}
|
|
||||||
proc initRID(dest: var RID; obj: ptr GodotObject) {.
|
|
||||||
importc: "godot_rid_new_with_resource", header: "godot_rid.h".}
|
|
||||||
|
|
||||||
proc initRID*(): RID {.inline.} =
|
|
||||||
initRID(result)
|
|
||||||
|
|
||||||
proc initRID*(obj: ptr GodotObject): RID {.inline.} =
|
|
||||||
initRID(result, obj)
|
|
||||||
|
|
||||||
proc idCInt(self: RID): cint {.
|
|
||||||
noSideEffect,
|
|
||||||
importc: "godot_rid_get_id", header: "godot_rid.h".}
|
|
||||||
|
|
||||||
proc id*(self: RID): uint32 {.inline.} =
|
|
||||||
cast[uint32](self.idCInt())
|
|
||||||
|
|
||||||
proc `==`*(a, b: RID): bool {.
|
|
||||||
importc: "godot_rid_operator_equal", header: "godot_rid.h".}
|
|
||||||
proc `<`*(a, b: RID): bool {.
|
|
||||||
importc: "godot_rid_operator_less", header: "godot_rid.h".}
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
# Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
import godotbase
|
|
||||||
|
|
||||||
type
|
|
||||||
GodotString* {.importc: "godot_string", header: "godot_string.h",
|
|
||||||
byref.} = object
|
|
||||||
|
|
||||||
proc initGodotString(dest: var GodotString) {.
|
|
||||||
importc: "godot_string_new", header: "godot_string.h".}
|
|
||||||
proc initGodotString(dest: var GodotString; src: GodotString) {.
|
|
||||||
importc: "godot_string_new_copy", header: "godot_string.h".}
|
|
||||||
proc initGodotString(dest: var GodotString; contents: cstring;
|
|
||||||
size: cint) {.
|
|
||||||
importc: "godot_string_new_data", header: "godot_string.h".}
|
|
||||||
## Initializes ``dest`` from UTF-8 ``contents``
|
|
||||||
proc getData(self: GodotString; dest: cstring;
|
|
||||||
size: var cint) {.
|
|
||||||
noSideEffect
|
|
||||||
importc: "godot_string_get_data",
|
|
||||||
header: "godot_string.h".}
|
|
||||||
## Converts ``self`` into UTF-8 encoding, putting the result into ``dest``.
|
|
||||||
|
|
||||||
proc len*(self: GodotString): cint {.inline.} =
|
|
||||||
## Returns the length of string in bytes if it is represented as UTF-8.
|
|
||||||
getData(self, nil, result)
|
|
||||||
|
|
||||||
proc cstring*(self: GodotString): cstring {.
|
|
||||||
importc: "godot_string_c_str", header: "godot_string.h".}
|
|
||||||
proc `==`*(self, b: GodotString): bool {.
|
|
||||||
importc: "godot_string_operator_equal",
|
|
||||||
header: "godot_string.h".}
|
|
||||||
proc `<`*(self, b: GodotString): bool {.
|
|
||||||
importc: "godot_string_operator_less",
|
|
||||||
header: "godot_string.h".}
|
|
||||||
proc `&`*(self, b: GodotString): GodotString {.
|
|
||||||
importc: "godot_string_operator_plus",
|
|
||||||
header: "godot_string.h".}
|
|
||||||
|
|
||||||
proc deinit*(self: var GodotString) {.importc: "godot_string_destroy",
|
|
||||||
header: "godot_string.h".}
|
|
||||||
proc `=destroy`(self: GodotString) {.inline.} =
|
|
||||||
unsafeAddr(self).deinit()
|
|
||||||
|
|
||||||
proc `=`(self: var GodotString, other: GodotString) {.inline.} =
|
|
||||||
initGodotString(self, other)
|
|
||||||
|
|
||||||
proc `$`*(self: GodotString): string =
|
|
||||||
## Converts the ``GodotString`` into Nim string
|
|
||||||
var length = self.len
|
|
||||||
result = newStringOfCap(length)
|
|
||||||
getData(self, addr result[0], length)
|
|
||||||
result.setLen(length)
|
|
||||||
assert(result[length] == '\0')
|
|
||||||
|
|
||||||
proc toGodotString*(s: string): GodotString {.inline.} =
|
|
||||||
## Converts the Nim string into ``GodotString``
|
|
||||||
initGodotString(result, unsafeAddr s[0], cint(s.len + 1))
|
|
||||||
|
|
@ -1,82 +0,0 @@
|
||||||
# Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
type
|
|
||||||
Transform* {.importc: "godot_transform", header: "godot_transform.h",
|
|
||||||
byref.} = object
|
|
||||||
|
|
||||||
import godotbase, basis, variant, vector3, strings, plane, rect3
|
|
||||||
|
|
||||||
proc initTransform(dest: var Transform) {.
|
|
||||||
importc: "godot_transform_new_identity", header: "godot_transform.h".}
|
|
||||||
## Initializes the ``dest`` as identity transform.
|
|
||||||
proc initTransform(dest: var Transform;
|
|
||||||
xAxis, yAxis, zAxis, origin: Vector3) {.
|
|
||||||
importc: "godot_transform_new_with_axis_origin",
|
|
||||||
header: "godot_transform.h".}
|
|
||||||
proc initTransform(dest: var Transform; basis: Basis;
|
|
||||||
origin: Vector3) {.
|
|
||||||
importc: "godot_transform_new",
|
|
||||||
header: "godot_transform.h".}
|
|
||||||
|
|
||||||
proc initTransform*(): Transform {.inline.} =
|
|
||||||
initTransform(result)
|
|
||||||
|
|
||||||
proc initTransform*(xAxis, yAxis, zAxis,
|
|
||||||
origin: Vector3): Transform {.inline.} =
|
|
||||||
initTransform(result, xAxis, yAxis, zAxis, origin)
|
|
||||||
|
|
||||||
proc initTransform*(basis: Basis, origin: Vector3): Transform {.inline.} =
|
|
||||||
initTransform(result, basis, origin)
|
|
||||||
|
|
||||||
proc basis*(self: Transform): Basis {.
|
|
||||||
importc: "godot_transform_get_basis", header: "godot_transform.h".}
|
|
||||||
proc `basis=`*(self: var Transform; v: Basis) {.
|
|
||||||
importc: "godot_transform_set_basis", header: "godot_transform.h".}
|
|
||||||
proc origin*(self: Transform): Vector3 {.
|
|
||||||
importc: "godot_transform_get_origin", header: "godot_transform.h".}
|
|
||||||
proc `origin=`*(self: var Transform; v: Vector3) {.
|
|
||||||
importc: "godot_transform_set_origin", header: "godot_transform.h".}
|
|
||||||
|
|
||||||
proc toGodotString*(self: Transform): GodotString {.
|
|
||||||
importc: "godot_transform_as_string", header: "godot_transform.h".}
|
|
||||||
proc `$`*(self: Transform): string {.inline.} =
|
|
||||||
$self.toGodotString()
|
|
||||||
|
|
||||||
proc inverse*(self: Transform): Transform {.
|
|
||||||
importc: "godot_transform_inverse", header: "godot_transform.h".}
|
|
||||||
proc affineInverse*(self: Transform): Transform {.
|
|
||||||
importc: "godot_transform_affine_inverse",
|
|
||||||
header: "godot_transform.h".}
|
|
||||||
proc orthonormalized*(self: Transform): Transform {.
|
|
||||||
importc: "godot_transform_orthonormalized",
|
|
||||||
header: "godot_transform.h".}
|
|
||||||
proc rotated*(self: Transform; axis: Vector3;
|
|
||||||
phi: float32): Transform {.
|
|
||||||
importc: "godot_transform_rotated", header: "godot_transform.h".}
|
|
||||||
proc scaled*(self: Transform; scale: Vector3): Transform {.
|
|
||||||
importc: "godot_transform_scaled", header: "godot_transform.h".}
|
|
||||||
proc translated*(self: Transform; offset: Vector3): Transform {.
|
|
||||||
importc: "godot_transform_translated", header: "godot_transform.h".}
|
|
||||||
proc lookingAt*(self: Transform;
|
|
||||||
target, up: Vector3): Transform {.
|
|
||||||
importc: "godot_transform_looking_at", header: "godot_transform.h".}
|
|
||||||
|
|
||||||
proc xformPlane*(self: Transform; v: Plane): Plane {.
|
|
||||||
importc: "godot_transform_xform_plane", header: "godot_transform.h".}
|
|
||||||
proc xformInvPlane*(self: Transform; v: Plane): Plane {.
|
|
||||||
importc: "godot_transform_xform_inv_plane", header: "godot_transform.h".}
|
|
||||||
proc xformVector3*(self: Transform; v: Vector3): Vector3 {.
|
|
||||||
importc: "godot_transform_xform_vector3", header: "godot_transform.h".}
|
|
||||||
proc xformInvVector3*(self: Transform; v: Vector3): Vector3 {.
|
|
||||||
importc: "godot_transform_xform_inv_vector3", header: "godot_transform.h".}
|
|
||||||
proc xformRect3*(self: Transform; v: Vector3): Rect3 {.
|
|
||||||
importc: "godot_transform_xform_rect3", header: "godot_transform.h".}
|
|
||||||
proc xformInvRect3*(self: Transform; v: Vector3): Vector3 {.
|
|
||||||
importc: "godot_transform_xform_inv_rect3", header: "godot_transform.h".}
|
|
||||||
|
|
||||||
proc `==`*(self: Transform; b: Transform): bool {.
|
|
||||||
importc: "godot_transform_operator_equal", header: "godot_transform.h".}
|
|
||||||
proc `*`*(a, b: Transform): Transform {.
|
|
||||||
importc: "godot_transform_operator_multiply", header: "godot_transform.h".}
|
|
||||||
proc `*=`*(a: var Transform, b: Transform) {.inline.} =
|
|
||||||
a = a * b
|
|
||||||
|
|
@ -1,92 +0,0 @@
|
||||||
# Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
type
|
|
||||||
Transform2D* {.importc: "godot_transform2d", header: "godot_transform2d.h",
|
|
||||||
byref.} = object
|
|
||||||
|
|
||||||
import godotbase, strings, variant, vector2, rect2
|
|
||||||
|
|
||||||
proc initTransform2D(dest: var Transform2D) {.
|
|
||||||
importc: "godot_transform2d_new_identity", header: "godot_transform2d.h".}
|
|
||||||
proc initTransform2D(dest: var Transform2D; rot: float32; pos: Vector2) {.
|
|
||||||
importc: "godot_transform2d_new", header: "godot_transform2d.h".}
|
|
||||||
proc initTransform2D(dest: var Transform2D; xAxis, yAxis, origin: Vector2) {.
|
|
||||||
importc: "godot_transform2d_new_axis_origin",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
|
|
||||||
proc initTransform2D*(): Transform2D {.inline.} =
|
|
||||||
initTransform2D(result)
|
|
||||||
|
|
||||||
proc initTransform2D*(rot: float32; pos: Vector2): Transform2D {.inline.} =
|
|
||||||
initTransform2D(result, rot, pos)
|
|
||||||
|
|
||||||
proc initTransform2D*(xAxis, yAxis, origin: Vector2): Transform2D {.inline.} =
|
|
||||||
initTransform2D(result, xAxis, yAxis, origin)
|
|
||||||
|
|
||||||
proc toGodotString*(self: Transform2D): GodotString {.
|
|
||||||
importc: "godot_transform2d_as_string",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
proc `$`*(self: Transform2D): string {.inline.} =
|
|
||||||
$self.toGodotString()
|
|
||||||
|
|
||||||
proc inverse*(self: Transform2D): Transform2D {.
|
|
||||||
importc: "godot_transform2d_inverse", header: "godot_transform2d.h".}
|
|
||||||
proc affineInverse*(self: Transform2D): Transform2D {.
|
|
||||||
importc: "godot_transform2d_affine_inverse",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
proc rotation*(self: Transform2D): float32 {.
|
|
||||||
importc: "godot_transform2d_get_rotation",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
proc origin*(self: Transform2D): Vector2 {.
|
|
||||||
importc: "godot_transform2d_get_origin",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
proc scale*(self: Transform2D): Vector2 {.
|
|
||||||
importc: "godot_transform2d_get_scale",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
proc orthonormalized*(self: Transform2D): Transform2D {.
|
|
||||||
importc: "godot_transform2d_orthonormalized",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
proc rotated*(self: Transform2D; phi: float32): Transform2D {.
|
|
||||||
importc: "godot_transform2d_rotated",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
proc scaled*(self: Transform2D; scale: Vector2): Transform2D {.
|
|
||||||
importc: "godot_transform2d_scaled",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
proc translated*(self: Transform2D;
|
|
||||||
offset: Vector2): Transform2D {.
|
|
||||||
importc: "godot_transform2d_translated",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
proc xformVector2*(self: Transform2D; v: Vector2): Vector2 {.
|
|
||||||
importc: "godot_transform2d_xform_vector2",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
proc xformInvVector2*(self: Transform2D; v: Vector2): Vector2 {.
|
|
||||||
importc: "godot_transform2d_xform_inv_vector2",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
proc basisXformVector2*(self: Transform2D;
|
|
||||||
v: Vector2): Vector2 {.
|
|
||||||
importc: "godot_transform2d_basis_xform_vector2",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
proc basisXformInvVector2*(self: Transform2D;
|
|
||||||
v: Vector2): Vector2 {.
|
|
||||||
importc: "godot_transform2d_basis_xform_inv_vector2",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
proc xformRect2*(self: Transform2D; v: Rect2): Rect2 {.
|
|
||||||
importc: "godot_transform2d_xform_rect2", header: "godot_transform2d.h".}
|
|
||||||
proc xformInvRect2*(self: Transform2D; v: Rect2): Rect2 {.
|
|
||||||
importc: "godot_transform2d_xform_inv_rect2",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
|
|
||||||
proc interpolateWith*(self, m: Transform2D;
|
|
||||||
c: float32): Transform2D {.
|
|
||||||
importc: "godot_transform2d_interpolate_with",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
proc `==`*(a, b: Transform2D): bool {.
|
|
||||||
importc: "godot_transform2d_operator_equal",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
proc `*`*(a, b: Transform2D): Transform2D {.
|
|
||||||
importc: "godot_transform2d_operator_multiply",
|
|
||||||
header: "godot_transform2d.h".}
|
|
||||||
|
|
||||||
proc `*=`*(a: var Transform2D, b: Transform2D) {.inline.} =
|
|
||||||
a = a * b
|
|
||||||
|
|
||||||
|
|
@ -1,298 +0,0 @@
|
||||||
import godotbase
|
|
||||||
|
|
||||||
import arrays, basis, dictionary, nodepath
|
|
||||||
import plane, poolarray, quat, rect2, rect3, rid
|
|
||||||
import strings, transform, transform2d, vector2
|
|
||||||
import vector3, color
|
|
||||||
|
|
||||||
type
|
|
||||||
VariantType* {.importc: "godot_variant_type", header: "godot_variant.h",
|
|
||||||
size: sizeof(cint), pure.} = enum
|
|
||||||
Nil, ## atomic types
|
|
||||||
Bool,
|
|
||||||
Int,
|
|
||||||
Real,
|
|
||||||
String,
|
|
||||||
# math types
|
|
||||||
Vector2, ## 5
|
|
||||||
Rect2,
|
|
||||||
Vector3,
|
|
||||||
Transform2D,
|
|
||||||
Plane,
|
|
||||||
Quat, ## 10
|
|
||||||
Rect3,
|
|
||||||
Basis,
|
|
||||||
Transform, ## misc types
|
|
||||||
Color,
|
|
||||||
NodePath, ## 15
|
|
||||||
RID,
|
|
||||||
Object,
|
|
||||||
Dictionary,
|
|
||||||
Array, ## 20
|
|
||||||
# arrays
|
|
||||||
PoolByteArray,
|
|
||||||
PoolIntArray,
|
|
||||||
PoolRealArray,
|
|
||||||
PoolStringArray,
|
|
||||||
PoolVector2Array, ## 25
|
|
||||||
PoolVector3Array,
|
|
||||||
PoolColorArray
|
|
||||||
|
|
||||||
VariantCallErrorType* {.importc: "godot_variant_call_error_error",
|
|
||||||
header: "godot_variant.h",
|
|
||||||
size: sizeof(cint),
|
|
||||||
pure.} = enum
|
|
||||||
OK,
|
|
||||||
InvalidMethod,
|
|
||||||
InvalidArgument,
|
|
||||||
TooManyArguments,
|
|
||||||
TooFewArguments,
|
|
||||||
InstanceIsNull
|
|
||||||
|
|
||||||
VariantCallError* {.importc: "godot_variant_call_error",
|
|
||||||
header: "godot_variant.h".} = object
|
|
||||||
error* {.importc: "error".}: VariantCallErrorType
|
|
||||||
argument* {.importc: "argument".}: cint
|
|
||||||
expected* {.importc: "expected".}: VariantType
|
|
||||||
|
|
||||||
proc getType*(p: Variant): VariantType {.
|
|
||||||
importc: "godot_variant_get_type", header: "godot_variant.h".}
|
|
||||||
|
|
||||||
proc initNilVariant(dest: var Variant) {.
|
|
||||||
importc: "godot_variant_new_nil", header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; b: bool) {.
|
|
||||||
importc: "godot_variant_new_bool", header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; i: uint64) {.
|
|
||||||
importc: "godot_variant_new_uint", header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; i: int64) {.
|
|
||||||
importc: "godot_variant_new_int", header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; r: cdouble) {.
|
|
||||||
importc: "godot_variant_new_real", header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; s: GodotString) {.
|
|
||||||
importc: "godot_variant_new_string", header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; v2: Vector2) {.
|
|
||||||
importc: "godot_variant_new_vector2", header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; rect2: Rect2) {.
|
|
||||||
importc: "godot_variant_new_rect2", header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; v3: Vector3) {.
|
|
||||||
importc: "godot_variant_new_vector3", header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; t2d: Transform2D) {.
|
|
||||||
importc: "godot_variant_new_transform2d",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; plane: Plane) {.
|
|
||||||
importc: "godot_variant_new_plane", header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; quat: Quat) {.
|
|
||||||
importc: "godot_variant_new_quat", header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; rect3: Rect3) {.
|
|
||||||
importc: "godot_variant_new_rect3", header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; basis: Basis) {.
|
|
||||||
importc: "godot_variant_new_basis", header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant;
|
|
||||||
trans: Transform) {.
|
|
||||||
importc: "godot_variant_new_transform",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; color: Color) {.
|
|
||||||
importc: "godot_variant_new_color", header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; nodePath: NodePath) {.
|
|
||||||
importc: "godot_variant_new_node_path",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; rid: RID) {.
|
|
||||||
importc: "godot_variant_new_rid", header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; obj: ptr GodotObject) {.
|
|
||||||
importc: "godot_variant_new_object", header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; dict: Dictionary) {.
|
|
||||||
importc: "godot_variant_new_dictionary",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; arr: Array) {.
|
|
||||||
importc: "godot_variant_new_array", header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; pba: PoolByteArray) {.
|
|
||||||
importc: "godot_variant_new_pool_byte_array",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; pia: PoolIntArray) {.
|
|
||||||
importc: "godot_variant_new_pool_int_array",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; pra: PoolRealArray) {.
|
|
||||||
importc: "godot_variant_new_pool_real_array",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; psa: PoolStringArray) {.
|
|
||||||
importc: "godot_variant_new_pool_string_array",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; pv2a: PoolVector2Array) {.
|
|
||||||
importc: "godot_variant_new_pool_vector2_array",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; pv3a: PoolVector3Array) {.
|
|
||||||
importc: "godot_variant_new_pool_vector3_array",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
proc initVariant(dest: var Variant; pca: PoolColorArray) {.
|
|
||||||
importc: "godot_variant_new_pool_color_array",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
|
|
||||||
proc variant*(): Variant {.inline.} =
|
|
||||||
initNilVariant(result)
|
|
||||||
|
|
||||||
proc variant*(b: bool): Variant {.inline.} =
|
|
||||||
initVariant(result, b)
|
|
||||||
|
|
||||||
proc variant*(i: uint64): Variant {.inline.} =
|
|
||||||
initVariant(result, i)
|
|
||||||
|
|
||||||
proc variant*(i: int64): Variant {.inline.} =
|
|
||||||
initVariant(result, i)
|
|
||||||
|
|
||||||
proc variant*(r: cdouble): Variant {.inline.} =
|
|
||||||
initVariant(result, r)
|
|
||||||
|
|
||||||
proc variant*(s: GodotString): Variant {.inline.} =
|
|
||||||
initVariant(result, s)
|
|
||||||
|
|
||||||
proc variant*(s: string): Variant {.inline.} =
|
|
||||||
initVariant(result, s.toGodotString())
|
|
||||||
|
|
||||||
proc variant*(v2: Vector2): Variant {.inline.} =
|
|
||||||
initVariant(result, v2)
|
|
||||||
|
|
||||||
proc variant*(rect2: Rect2): Variant {.inline.} =
|
|
||||||
initVariant(result, rect2)
|
|
||||||
|
|
||||||
proc variant*(v3: Vector3): Variant {.inline.} =
|
|
||||||
initVariant(result, v3)
|
|
||||||
|
|
||||||
proc variant*(t2d: Transform2D): Variant {.inline.} =
|
|
||||||
initVariant(result, t2d)
|
|
||||||
|
|
||||||
proc variant*(plane: Plane): Variant {.inline.} =
|
|
||||||
initVariant(result, plane)
|
|
||||||
|
|
||||||
proc variant*(quat: Quat): Variant {.inline.} =
|
|
||||||
initVariant(result, quat)
|
|
||||||
|
|
||||||
proc variant*(rect3: Rect3): Variant {.inline.} =
|
|
||||||
initVariant(result, rect3)
|
|
||||||
|
|
||||||
proc variant*(basis: Basis): Variant {.inline.} =
|
|
||||||
initVariant(result, basis)
|
|
||||||
|
|
||||||
proc variant*(trans: Transform): Variant {.inline.} =
|
|
||||||
initVariant(result, trans)
|
|
||||||
|
|
||||||
proc variant*(color: Color): Variant {.inline.} =
|
|
||||||
initVariant(result, color)
|
|
||||||
|
|
||||||
proc variant*(nodePath: NodePath): Variant {.inline.} =
|
|
||||||
initVariant(result, nodePath)
|
|
||||||
|
|
||||||
proc variant*(rid: RID): Variant {.inline.} =
|
|
||||||
initVariant(result, rid)
|
|
||||||
|
|
||||||
proc variant*(obj: ptr GodotObject): Variant {.inline.} =
|
|
||||||
initVariant(result, obj)
|
|
||||||
|
|
||||||
proc variant*(dict: Dictionary): Variant {.inline.} =
|
|
||||||
initVariant(result, dict)
|
|
||||||
|
|
||||||
proc variant*(arr: Array): Variant {.inline.} =
|
|
||||||
initVariant(result, arr)
|
|
||||||
|
|
||||||
proc variant*(pba: PoolByteArray): Variant {.inline.} =
|
|
||||||
initVariant(result, pba)
|
|
||||||
|
|
||||||
proc variant*(pia: PoolIntArray): Variant {.inline.} =
|
|
||||||
initVariant(result, pia)
|
|
||||||
|
|
||||||
proc variant*(pra: PoolRealArray): Variant {.inline.} =
|
|
||||||
initVariant(result, pra)
|
|
||||||
|
|
||||||
proc variant*(psa: PoolStringArray): Variant {.inline.} =
|
|
||||||
initVariant(result, psa)
|
|
||||||
|
|
||||||
proc variant*(pv2a: PoolVector2Array): Variant {.inline.} =
|
|
||||||
initVariant(result, pv2a)
|
|
||||||
|
|
||||||
proc variant*(pv3a: PoolVector3Array): Variant {.inline.} =
|
|
||||||
initVariant(result, pv3a)
|
|
||||||
|
|
||||||
proc variant*(pca: PoolColorArray): Variant {.inline.} =
|
|
||||||
initVariant(result, pca)
|
|
||||||
|
|
||||||
proc asBool*(self: Variant): bool {.
|
|
||||||
importc: "godot_variant_as_bool", header: "godot_variant.h".}
|
|
||||||
proc asUint*(self: Variant): uint64 {.
|
|
||||||
importc: "godot_variant_as_uint", header: "godot_variant.h".}
|
|
||||||
proc asInt*(self: Variant): int64 {.
|
|
||||||
importc: "godot_variant_as_int", header: "godot_variant.h".}
|
|
||||||
proc asReal*(self: Variant): cdouble {.
|
|
||||||
importc: "godot_variant_as_real", header: "godot_variant.h".}
|
|
||||||
proc asGodotString*(self: Variant): GodotString {.
|
|
||||||
importc: "godot_variant_as_string", header: "godot_variant.h".}
|
|
||||||
|
|
||||||
proc asString*(self: Variant): string =
|
|
||||||
let s = self.asGodotString()
|
|
||||||
result = $s
|
|
||||||
|
|
||||||
proc asVector2*(self: Variant): Vector2 {.
|
|
||||||
importc: "godot_variant_as_vector2", header: "godot_variant.h".}
|
|
||||||
proc asRect2*(self: Variant): Rect2 {.
|
|
||||||
importc: "godot_variant_as_rect2", header: "godot_variant.h".}
|
|
||||||
proc asVector3*(self: Variant): Vector3 {.
|
|
||||||
importc: "godot_variant_as_vector3", header: "godot_variant.h".}
|
|
||||||
proc asTransform2D*(self: Variant): Transform2D {.
|
|
||||||
importc: "godot_variant_as_transform2d", header: "godot_variant.h".}
|
|
||||||
proc asPlane*(self: Variant): Plane {.
|
|
||||||
importc: "godot_variant_as_plane", header: "godot_variant.h".}
|
|
||||||
proc asQuat*(self: Variant): Quat {.
|
|
||||||
importc: "godot_variant_as_quat", header: "godot_variant.h".}
|
|
||||||
proc asRect3*(self: Variant): Rect3 {.
|
|
||||||
importc: "godot_variant_as_rect3", header: "godot_variant.h".}
|
|
||||||
proc asBasis*(self: Variant): Basis {.
|
|
||||||
importc: "godot_variant_as_basis", header: "godot_variant.h".}
|
|
||||||
proc asTransform*(self: Variant): Transform {.
|
|
||||||
importc: "godot_variant_as_transform", header: "godot_variant.h".}
|
|
||||||
proc asColor*(self: Variant): Color {.
|
|
||||||
importc: "godot_variant_as_color", header: "godot_variant.h".}
|
|
||||||
proc asNodePath*(self: Variant): NodePath {.
|
|
||||||
importc: "godot_variant_as_node_path", header: "godot_variant.h".}
|
|
||||||
proc asRid*(self: Variant): RID {.
|
|
||||||
importc: "godot_variant_as_rid", header: "godot_variant.h".}
|
|
||||||
proc asObject*(self: Variant): ptr GodotObject {.
|
|
||||||
importc: "godot_variant_as_object", header: "godot_variant.h".}
|
|
||||||
proc asDictionary*(self: Variant): Dictionary {.
|
|
||||||
importc: "godot_variant_as_dictionary", header: "godot_variant.h".}
|
|
||||||
proc asArray*(self: Variant): Array {.
|
|
||||||
importc: "godot_variant_as_array", header: "godot_variant.h".}
|
|
||||||
proc asPoolByteArray*(self: Variant): PoolByteArray {.
|
|
||||||
importc: "godot_variant_as_pool_byte_array",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
proc asPoolIntArray*(self: Variant): PoolIntArray {.
|
|
||||||
importc: "godot_variant_as_pool_int_array",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
proc asPoolRealArray*(self: Variant): PoolRealArray {.
|
|
||||||
importc: "godot_variant_as_pool_real_array",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
proc asPoolStringArray*(self: Variant): PoolStringArray {.
|
|
||||||
importc: "godot_variant_as_pool_string_array",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
proc asPoolVector2Array*(self: Variant): PoolVector2Array {.
|
|
||||||
importc: "godot_variant_as_pool_vector2_array",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
proc asPoolVector3Array*(self: Variant): PoolVector3Array {.
|
|
||||||
importc: "godot_variant_as_pool_vector3_array",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
proc asPoolColorArray*(self: Variant): PoolColorArray {.
|
|
||||||
importc: "godot_variant_as_pool_color_array",
|
|
||||||
header: "godot_variant.h".}
|
|
||||||
|
|
||||||
proc call*(self: Variant; meth: GodotString;
|
|
||||||
args: var array[MAX_ARG_COUNT, Variant]; argCount: cint;
|
|
||||||
error: var VariantCallError): Variant {.
|
|
||||||
importc: "godot_variant_call", header: "godot_variant.h".}
|
|
||||||
|
|
||||||
proc hasMethod*(self: Variant; meth: GodotString): bool {.
|
|
||||||
importc: "godot_variant_has_method", header: "godot_variant.h".}
|
|
||||||
proc `==`*(self, other: Variant): bool {.
|
|
||||||
importc: "godot_variant_operator_equal", header: "godot_variant.h".}
|
|
||||||
proc `<`*(self, other: Variant): bool {.
|
|
||||||
importc: "godot_variant_operator_less", header: "godot_variant.h".}
|
|
||||||
proc hashCompare*(self, other: Variant): bool {.
|
|
||||||
importc: "godot_variant_hash_compare", header: "godot_variant.h".}
|
|
||||||
proc booleanize*(self: Variant; isValid: var bool): bool {.
|
|
||||||
importc: "godot_variant_booleanize", header: "godot_variant.h".}
|
|
||||||
|
|
@ -1,117 +0,0 @@
|
||||||
# Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
type
|
|
||||||
Vector2* {.importc: "godot_vector2", header: "godot_vector2.h",
|
|
||||||
byref.} = object
|
|
||||||
|
|
||||||
import godotbase, strings
|
|
||||||
|
|
||||||
proc initVector2(dest: var Vector2; x, y: float32) {.
|
|
||||||
importc: "godot_vector2_new", header: "godot_vector2.h".}
|
|
||||||
|
|
||||||
proc vec2*(x, y: float32): Vector2 {.inline.} =
|
|
||||||
initVector2(result, x, y)
|
|
||||||
|
|
||||||
proc toGodotString*(self: Vector2): GodotString {.
|
|
||||||
importc: "godot_vector2_as_string", header: "godot_vector2.h".}
|
|
||||||
proc `$`*(self: Vector2): string {.inline.} =
|
|
||||||
$self.toGodotString()
|
|
||||||
|
|
||||||
proc normalized*(self: Vector2): Vector2 {.
|
|
||||||
importc: "godot_vector2_normalized", header: "godot_vector2.h".}
|
|
||||||
proc length*(self: Vector2): float32 {.
|
|
||||||
importc: "godot_vector2_length", header: "godot_vector2.h".}
|
|
||||||
proc angle*(self: Vector2): float32 {.
|
|
||||||
importc: "godot_vector2_angle", header: "godot_vector2.h".}
|
|
||||||
proc lengthSquared*(self: Vector2): float32 {.
|
|
||||||
importc: "godot_vector2_length_squared", header: "godot_vector2.h".}
|
|
||||||
proc isNormalized*(self: Vector2): bool {.
|
|
||||||
importc: "godot_vector2_is_normalized", header: "godot_vector2.h".}
|
|
||||||
proc distanceTo*(self, to: Vector2): float32 {.
|
|
||||||
importc: "godot_vector2_distance_to",
|
|
||||||
header: "godot_vector2.h".}
|
|
||||||
proc distanceSquaredTo*(self, to: Vector2): float32 {.
|
|
||||||
importc: "godot_vector2_distance_squared_to",
|
|
||||||
header: "godot_vector2.h".}
|
|
||||||
proc angleTo*(self, to: Vector2): float32 {.
|
|
||||||
importc: "godot_vector2_angle_to", header: "godot_vector2.h".}
|
|
||||||
proc angleToPoint*(self, to: Vector2): float32 {.
|
|
||||||
importc: "godot_vector2_angle_to_point",
|
|
||||||
header: "godot_vector2.h".}
|
|
||||||
proc lerp*(self, b: Vector2; t: float32): Vector2 {.
|
|
||||||
importc: "godot_vector2_linear_interpolate",
|
|
||||||
header: "godot_vector2.h".}
|
|
||||||
proc cubicInterpolate*(self, b, pre_a, post_b: Vector2; t: float32): Vector2 {.
|
|
||||||
importc: "godot_vector2_cubic_interpolate",
|
|
||||||
header: "godot_vector2.h".}
|
|
||||||
proc rotated*(self: Vector2; phi: float32): Vector2 {.
|
|
||||||
importc: "godot_vector2_rotated", header: "godot_vector2.h".}
|
|
||||||
proc tangent*(self: Vector2): Vector2 {.
|
|
||||||
importc: "godot_vector2_tangent", header: "godot_vector2.h".}
|
|
||||||
proc floor*(self: Vector2): Vector2 {.
|
|
||||||
importc: "godot_vector2_floor", header: "godot_vector2.h".}
|
|
||||||
proc snapped*(self: Vector2; by: Vector2): Vector2 {.
|
|
||||||
importc: "godot_vector2_snapped", header: "godot_vector2.h".}
|
|
||||||
proc aspect*(self: Vector2): float32 {.
|
|
||||||
importc: "godot_vector2_aspect", header: "godot_vector2.h".}
|
|
||||||
proc dot*(a, b: Vector2): float32 {.
|
|
||||||
importc: "godot_vector2_dot", header: "godot_vector2.h".}
|
|
||||||
proc slide*(self, n: Vector2): Vector2 {.
|
|
||||||
importc: "godot_vector2_slide", header: "godot_vector2.h".}
|
|
||||||
proc bounce*(self, n: Vector2): Vector2 {.
|
|
||||||
importc: "godot_vector2_bounce", header: "godot_vector2.h".}
|
|
||||||
proc reflect*(self, n: Vector2): Vector2 {.
|
|
||||||
importc: "godot_vector2_reflect", header: "godot_vector2.h".}
|
|
||||||
proc abs*(self: Vector2): Vector2 {.
|
|
||||||
importc: "godot_vector2_abs", header: "godot_vector2.h".}
|
|
||||||
proc clamped*(self: Vector2; length: float32): Vector2 {.
|
|
||||||
importc: "godot_vector2_clamped", header: "godot_vector2.h".}
|
|
||||||
|
|
||||||
proc `+`*(a, b: Vector2): Vector2 {.
|
|
||||||
importc: "godot_vector2_operator_add", header: "godot_vector2.h".}
|
|
||||||
proc `+=`*(a: var Vector2, b: Vector2) {.inline.} =
|
|
||||||
a += b
|
|
||||||
|
|
||||||
proc `-`*(a, b: Vector2): Vector2 {.
|
|
||||||
importc: "godot_vector2_operator_substract", header: "godot_vector2.h".}
|
|
||||||
proc `-=`*(a: var Vector2, b: Vector2) {.inline.} =
|
|
||||||
a = a - b
|
|
||||||
|
|
||||||
proc `*`*(a, b: Vector2): Vector2 {.
|
|
||||||
importc: "godot_vector2_operator_multiply_vector",
|
|
||||||
header: "godot_vector2.h".}
|
|
||||||
|
|
||||||
proc `*=`*(a: var Vector2, b: Vector2) {.inline.} =
|
|
||||||
a = a * b
|
|
||||||
|
|
||||||
proc `*`*(self: Vector2, scalar: float32): Vector2 {.
|
|
||||||
importc: "godot_vector2_operator_multiply_scalar",
|
|
||||||
header: "godot_vector2.h".}
|
|
||||||
proc `*=`*(self: var Vector2, scalar: float32) {.inline.} =
|
|
||||||
self = self * scalar
|
|
||||||
|
|
||||||
proc `/`*(a, b: Vector2): Vector2 {.
|
|
||||||
importc: "godot_vector2_operator_divide_vector", header: "godot_vector2.h".}
|
|
||||||
proc `/=`*(a: var Vector2, b: Vector2) {.inline.} =
|
|
||||||
a = a / b
|
|
||||||
|
|
||||||
proc `/`*(self: Vector2; scalar: float32): Vector2 {.
|
|
||||||
importc: "godot_vector2_operator_divide_scalar", header: "godot_vector2.h".}
|
|
||||||
proc `/=`*(self: var Vector2; scalar: float32) {.inline.} =
|
|
||||||
self = self / scalar
|
|
||||||
|
|
||||||
proc `==`*(a, b: Vector2): bool {.
|
|
||||||
importc: "godot_vector2_operator_equal", header: "godot_vector2.h".}
|
|
||||||
proc `<`*(a, b: Vector2): bool {.
|
|
||||||
importc: "godot_vector2_operator_less", header: "godot_vector2.h".}
|
|
||||||
proc `-`*(self: Vector2): Vector2 {.
|
|
||||||
importc: "godot_vector2_operator_neg", header: "godot_vector2.h".}
|
|
||||||
|
|
||||||
proc `x=`*(self: var Vector2; x: float32) {.
|
|
||||||
importc: "godot_vector2_set_x", header: "godot_vector2.h".}
|
|
||||||
proc `y=`*(self: var Vector2; y: float32) {.
|
|
||||||
importc: "godot_vector2_set_y", header: "godot_vector2.h".}
|
|
||||||
proc x*(self: Vector2): float32 {.
|
|
||||||
importc: "godot_vector2_get_x", header: "godot_vector2.h".}
|
|
||||||
proc y*(self: Vector2): float32 {.
|
|
||||||
importc: "godot_vector2_get_y", header: "godot_vector2.h".}
|
|
||||||
|
|
@ -1,148 +0,0 @@
|
||||||
# Copyright (c) 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
type
|
|
||||||
Vector3* {.importc: "godot_vector3", header: "godot_vector3.h",
|
|
||||||
byref.} = object
|
|
||||||
|
|
||||||
import godotbase, basis, strings
|
|
||||||
|
|
||||||
type
|
|
||||||
Vector3Axis {.importc: "godot_vector3_axis", header: "godot_vector3.h",
|
|
||||||
size: sizeof(cint), pure.} = enum
|
|
||||||
X,
|
|
||||||
Y,
|
|
||||||
Z
|
|
||||||
|
|
||||||
proc initVector3*(dest: var Vector3; x, y, z: float32) {.
|
|
||||||
importc: "godot_vector3_new", header: "godot_vector3.h".}
|
|
||||||
|
|
||||||
proc vec3*(x, y, z: float32): Vector3 {.inline.} =
|
|
||||||
initVector3(result, x, y, z)
|
|
||||||
|
|
||||||
proc toGodotString*(self: Vector3): GodotString {.
|
|
||||||
importc: "godot_vector3_as_string", header: "godot_vector3.h".}
|
|
||||||
proc `$`*(self: Vector3): string {.inline.} =
|
|
||||||
$self.toGodotString()
|
|
||||||
|
|
||||||
proc minAxis*(self: Vector3): cint {.
|
|
||||||
importc: "godot_vector3_min_axis", header: "godot_vector3.h".}
|
|
||||||
proc maxAxis*(self: Vector3): cint {.
|
|
||||||
importc: "godot_vector3_max_axis", header: "godot_vector3.h".}
|
|
||||||
proc length*(self: Vector3): float32 {.
|
|
||||||
importc: "godot_vector3_length", header: "godot_vector3.h".}
|
|
||||||
proc lengthSquared*(self: Vector3): float32 {.
|
|
||||||
importc: "godot_vector3_length_squared", header: "godot_vector3.h".}
|
|
||||||
proc isNormalized*(self: Vector3): bool {.
|
|
||||||
importc: "godot_vector3_is_normalized", header: "godot_vector3.h".}
|
|
||||||
proc normalized*(self: Vector3): Vector3 {.
|
|
||||||
importc: "godot_vector3_normalized", header: "godot_vector3.h".}
|
|
||||||
proc inverse*(self: Vector3): Vector3 {.
|
|
||||||
importc: "godot_vector3_inverse", header: "godot_vector3.h".}
|
|
||||||
proc snapped*(self: Vector3; by: float32): Vector3 {.
|
|
||||||
importc: "godot_vector3_snapped", header: "godot_vector3.h".}
|
|
||||||
proc rotated*(self: Vector3; axis: Vector3;
|
|
||||||
phi: float32): Vector3 {.
|
|
||||||
importc: "godot_vector3_rotated", header: "godot_vector3.h".}
|
|
||||||
proc lerp*(self: Vector3; b: Vector3; t: float32): Vector3 {.
|
|
||||||
importc: "godot_vector3_linear_interpolate", header: "godot_vector3.h".}
|
|
||||||
proc cubicInterpolate*(self, b, preA, postB: Vector3;
|
|
||||||
t: float32): Vector3 {.
|
|
||||||
importc: "godot_vector3_cubic_interpolate", header: "godot_vector3.h".}
|
|
||||||
proc dot*(a, b: Vector3): float32 {.
|
|
||||||
importc: "godot_vector3_dot", header: "godot_vector3.h".}
|
|
||||||
proc cross*(a, b: Vector3): Vector3 {.
|
|
||||||
importc: "godot_vector3_cross", header: "godot_vector3.h".}
|
|
||||||
proc outer*(a, b: Vector3): Basis {.
|
|
||||||
importc: "godot_vector3_outer", header: "godot_vector3.h".}
|
|
||||||
proc toDiagonalMatrix*(self: Vector3): Basis {.
|
|
||||||
importc: "godot_vector3_to_diagonal_matrix", header: "godot_vector3.h".}
|
|
||||||
proc abs*(self: Vector3): Vector3 {.
|
|
||||||
importc: "godot_vector3_abs", header: "godot_vector3.h".}
|
|
||||||
proc floor*(self: Vector3): Vector3 {.
|
|
||||||
importc: "godot_vector3_floor", header: "godot_vector3.h".}
|
|
||||||
proc ceil*(self: Vector3): Vector3 {.
|
|
||||||
importc: "godot_vector3_ceil", header: "godot_vector3.h".}
|
|
||||||
proc distanceTo*(a, b: Vector3): float32 {.
|
|
||||||
importc: "godot_vector3_distance_to", header: "godot_vector3.h".}
|
|
||||||
proc distanceSquaredTo*(a, b: Vector3): float32 {.
|
|
||||||
importc: "godot_vector3_distance_squared_to", header: "godot_vector3.h".}
|
|
||||||
proc angleTo*(self, to: Vector3): float32 {.
|
|
||||||
importc: "godot_vector3_angle_to", header: "godot_vector3.h".}
|
|
||||||
proc slide*(self, n: Vector3): Vector3 {.
|
|
||||||
importc: "godot_vector3_slide", header: "godot_vector3.h".}
|
|
||||||
proc bounce*(self, n: Vector3): Vector3 {.
|
|
||||||
importc: "godot_vector3_bounce", header: "godot_vector3.h".}
|
|
||||||
proc reflect*(self, b: Vector3): Vector3 {.
|
|
||||||
importc: "godot_vector3_reflect", header: "godot_vector3.h".}
|
|
||||||
|
|
||||||
proc `+`*(a, b: Vector3): Vector3 {.
|
|
||||||
importc: "godot_vector3_operator_add", header: "godot_vector3.h".}
|
|
||||||
proc `+=`*(a: var Vector3, b: Vector3) {.inline.} =
|
|
||||||
a = a + b
|
|
||||||
|
|
||||||
proc `-`*(a, b: Vector3): Vector3 {.
|
|
||||||
importc: "godot_vector3_operator_substract", header: "godot_vector3.h".}
|
|
||||||
proc `-=`*(a: var Vector3, b: Vector3) {.inline.} =
|
|
||||||
a = a - b
|
|
||||||
|
|
||||||
proc `*`*(a, b: Vector3): Vector3 {.
|
|
||||||
importc: "godot_vector3_operator_multiply_vector",
|
|
||||||
header: "godot_vector3.h".}
|
|
||||||
proc `*=`*(a: var Vector3, b: Vector3) {.inline.}=
|
|
||||||
a = a * b
|
|
||||||
|
|
||||||
proc `*`*(self: Vector3; b: float32): Vector3 {.
|
|
||||||
importc: "godot_vector3_operator_multiply_scalar",
|
|
||||||
header: "godot_vector3.h".}
|
|
||||||
proc `*=`*(a: var Vector3; b: float32) {.inline.} =
|
|
||||||
a = a * b
|
|
||||||
|
|
||||||
proc `/`*(a, b: Vector3): Vector3 {.
|
|
||||||
importc: "godot_vector3_operator_divide_vector",
|
|
||||||
header: "godot_vector3.h".}
|
|
||||||
proc `/=`*(a: var Vector3; b: Vector3) {.inline.} =
|
|
||||||
a = a / b
|
|
||||||
|
|
||||||
proc `/`*(self: Vector3; b: float32): Vector3 {.
|
|
||||||
importc: "godot_vector3_operator_divide_scalar",
|
|
||||||
header: "godot_vector3.h".}
|
|
||||||
proc `/=`*(a: var Vector3; b: float32) {.inline.} =
|
|
||||||
a = a / b
|
|
||||||
|
|
||||||
proc `==`*(a, b: Vector3): bool {.
|
|
||||||
importc: "godot_vector3_operator_equal", header: "godot_vector3.h".}
|
|
||||||
proc `<`*(a, b: Vector3): bool {.
|
|
||||||
importc: "godot_vector3_operator_less", header: "godot_vector3.h".}
|
|
||||||
proc `-`*(self: Vector3): Vector3 {.
|
|
||||||
importc: "godot_vector3_operator_neg", header: "godot_vector3.h".}
|
|
||||||
|
|
||||||
proc setAxis(self: var Vector3; axis: Vector3Axis;
|
|
||||||
val: float32) {.
|
|
||||||
importc: "godot_vector3_set_axis", header: "godot_vector3.h".}
|
|
||||||
proc getAxis(self: Vector3; axis: Vector3Axis): float32 {.
|
|
||||||
importc: "godot_vector3_get_axis", header: "godot_vector3.h".}
|
|
||||||
|
|
||||||
proc `[]`(self: Vector3, idx: range[0..2]): float32 {.inline.} =
|
|
||||||
self.getAxis(Vector3Axis(idx))
|
|
||||||
|
|
||||||
proc `[]=`(self: var Vector3, idx: range[0..2],
|
|
||||||
val: float32): float32 {.inline.} =
|
|
||||||
self.setAxis(Vector3Axis(idx), val)
|
|
||||||
|
|
||||||
proc x*(self: Vector3): float32 {.inline.} =
|
|
||||||
self.getAxis(Vector3Axis.X)
|
|
||||||
|
|
||||||
proc `x=`*(self: var Vector3, val: float32) {.inline.} =
|
|
||||||
self.setAxis(Vector3Axis.X, val)
|
|
||||||
|
|
||||||
proc y*(self: Vector3): float32 {.inline.} =
|
|
||||||
self.getAxis(Vector3Axis.Y)
|
|
||||||
|
|
||||||
proc `y=`*(self: var Vector3, val: float32) {.inline.} =
|
|
||||||
self.setAxis(Vector3Axis.Y, val)
|
|
||||||
|
|
||||||
proc z*(self: Vector3): float32 {.inline.} =
|
|
||||||
self.getAxis(Vector3Axis.Z)
|
|
||||||
|
|
||||||
proc `z=`*(self: var Vector3, val: float32) {.inline.} =
|
|
||||||
self.setAxis(Vector3Axis.Z, val)
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
# Copyright 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
import core.godotbase, core.godotcore
|
|
||||||
import core / [strings, vector2, rect2, vector3, transform2d, plane, quat]
|
|
||||||
import core / [rect3, basis, transform, color, nodepath, rid]
|
|
||||||
import core / [dictionary, arrays, poolarray, variant]
|
|
||||||
|
|
||||||
import nim / [godotmacros, godotnim]
|
|
||||||
|
|
||||||
export godotbase, strings, vector2, rect2, vector3, transform2d, plane, quat,
|
|
||||||
rect3, basis, transform, color, nodepath, rid, dictionary, arrays,
|
|
||||||
poolarray, variant
|
|
||||||
export godotmacros, godotnim
|
|
||||||
|
|
||||||
# from godotcore
|
|
||||||
export print, printWarning, printError
|
|
||||||
|
|
@ -1,472 +0,0 @@
|
||||||
# Copyright 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
import macros, tables, typetraits
|
|
||||||
import "../core/godotcore.nim"
|
|
||||||
import godotnim
|
|
||||||
|
|
||||||
type
|
|
||||||
VarDecl = ref object
|
|
||||||
name: NimNode
|
|
||||||
typ: NimNode
|
|
||||||
defaultValue: NimNode
|
|
||||||
isNoGodot: bool
|
|
||||||
hint: string
|
|
||||||
hintTip: string
|
|
||||||
usage: string
|
|
||||||
|
|
||||||
MethodDecl = ref object
|
|
||||||
name: string
|
|
||||||
args: seq[VarDecl]
|
|
||||||
isVirtual: bool
|
|
||||||
returnType: NimNode
|
|
||||||
nimNode: NimNode
|
|
||||||
isNoGodot: bool
|
|
||||||
|
|
||||||
ObjectDecl = ref object
|
|
||||||
name: string
|
|
||||||
parentName: string
|
|
||||||
fields: seq[VarDecl]
|
|
||||||
methods: seq[MethodDecl]
|
|
||||||
|
|
||||||
ParseError = object of Exception
|
|
||||||
|
|
||||||
template parseError(node: NimNode, msg: string) =
|
|
||||||
raise newException(ParseError, lineinfo(node) & ": " & msg)
|
|
||||||
|
|
||||||
proc extractNames(definition: NimNode):
|
|
||||||
tuple[name, parentName: string] =
|
|
||||||
if definition.kind == nnkIdent:
|
|
||||||
result.name = $(definition.ident)
|
|
||||||
else:
|
|
||||||
if not (definition.kind == nnkInfix and definition[0].ident == !"of"):
|
|
||||||
parseError(definition, "invalid type definition")
|
|
||||||
result.name = $(definition[1].ident)
|
|
||||||
case definition[2].kind:
|
|
||||||
of nnkIdent:
|
|
||||||
result.parentName = $definition[2].ident
|
|
||||||
else:
|
|
||||||
parseError(definition[2], "parent type expected")
|
|
||||||
|
|
||||||
proc newRStrLit(s: string): NimNode {.compileTime.} =
|
|
||||||
result = newNimNode(nnkRStrLit)
|
|
||||||
result.strVal = s
|
|
||||||
|
|
||||||
proc newCStringLit(s: string): NimNode {.compileTime.} =
|
|
||||||
newNimNode(nnkCallStrLit).add(ident("cstring"), newRStrLit(s))
|
|
||||||
|
|
||||||
iterator pragmas(node: NimNode):
|
|
||||||
tuple[key: NimIdent, value: string, index: int] =
|
|
||||||
assert node.kind in {nnkPragma, nnkEmpty}
|
|
||||||
for index in countdown(node.len - 1, 0):
|
|
||||||
if node[index].kind == nnkExprColonExpr:
|
|
||||||
let val = $(node[index][1])
|
|
||||||
yield (node[index][0].ident, val, index)
|
|
||||||
elif node[index].kind == nnkIdent:
|
|
||||||
yield (node[index].ident, nil, index)
|
|
||||||
|
|
||||||
proc hasPragma(statement: NimNode, pname: string): bool =
|
|
||||||
## Checks if the pragma is present in the `statement`
|
|
||||||
if not (RoutineNodes.contains(statement.kind) or
|
|
||||||
statement.kind == nnkPragmaExpr):
|
|
||||||
return false
|
|
||||||
var pragmas = if RoutineNodes.contains(statement.kind): statement.pragma()
|
|
||||||
else: statement[1]
|
|
||||||
let pnameIdent = !pname
|
|
||||||
for ident, val, i in pragmas(pragmas):
|
|
||||||
if ident == pnameIdent:
|
|
||||||
return true
|
|
||||||
|
|
||||||
proc removePragma(statement: NimNode, pname: string): bool =
|
|
||||||
## Removes the pragma from the node and returns whether pragma was removed
|
|
||||||
if not (RoutineNodes.contains(statement.kind) or
|
|
||||||
statement.kind == nnkPragmaExpr):
|
|
||||||
return false
|
|
||||||
var pragmas = if RoutineNodes.contains(statement.kind): statement.pragma()
|
|
||||||
else: statement[1]
|
|
||||||
let pnameIdent = !pname
|
|
||||||
for ident, val, i in pragmas(pragmas):
|
|
||||||
if ident == pnameIdent:
|
|
||||||
pragmas.del(i)
|
|
||||||
return true
|
|
||||||
|
|
||||||
proc removeStrPragma(statement: NimNode,
|
|
||||||
pname: string): string {.compileTime.} =
|
|
||||||
## Removes the pragma from the node and returns value of the pragma
|
|
||||||
## Works for routine nodes or nnkPragmaExpr
|
|
||||||
if not (RoutineNodes.contains(statement.kind) or
|
|
||||||
statement.kind == nnkPragmaExpr):
|
|
||||||
return nil
|
|
||||||
|
|
||||||
result = nil
|
|
||||||
var pragmas = if RoutineNodes.contains(statement.kind): statement.pragma()
|
|
||||||
else: statement[1]
|
|
||||||
let pnameIdent = !pname
|
|
||||||
for ident, val, i in pragmas(pragmas):
|
|
||||||
if ident == pnameIdent:
|
|
||||||
pragmas.del(i)
|
|
||||||
return (if val.isNil: "" else: val)
|
|
||||||
|
|
||||||
proc isExported(node: NimNode): bool {.compileTime.} =
|
|
||||||
if node.kind == nnkPragmaExpr:
|
|
||||||
result = isExported(node[0])
|
|
||||||
elif node.kind == nnkPostfix:
|
|
||||||
result = ($node[0] == "*")
|
|
||||||
|
|
||||||
proc identDefsToVarDecls(identDefs: NimNode): seq[VarDecl] =
|
|
||||||
assert(identDefs.kind == nnkIdentDefs)
|
|
||||||
result = newSeqOfCap[VarDecl](identDefs.len - 2)
|
|
||||||
|
|
||||||
for i in 0..<(identDefs.len - 2):
|
|
||||||
let nameNode = identDefs[i].copyNimTree()
|
|
||||||
let hint = removeStrPragma(nameNode, "hint")
|
|
||||||
let hintTip = removeStrPragma(nameNode, "tip")
|
|
||||||
let usage = removeStrPragma(nameNode, "usage")
|
|
||||||
let isGdExport = removePragma(nameNode, "gdExport")
|
|
||||||
if not nameNode.isExported() and isGdExport:
|
|
||||||
parseError(nameNode, "gdExport is not applicable for private fields")
|
|
||||||
|
|
||||||
let isNoGodot = not nameNode.isExported() or not isGdExport
|
|
||||||
|
|
||||||
result.add(VarDecl(
|
|
||||||
name: if nameNode.kind == nnkPragmaExpr: nameNode[0].basename()
|
|
||||||
else: nameNode.basename(),
|
|
||||||
typ: identDefs[identDefs.len - 2],
|
|
||||||
defaultValue: identDefs[identDefs.len - 1],
|
|
||||||
hint: hint,
|
|
||||||
hintTip: hintTip,
|
|
||||||
isNoGodot: isNoGodot,
|
|
||||||
usage: usage
|
|
||||||
))
|
|
||||||
|
|
||||||
proc parseMethod(meth: NimNode): MethodDecl =
|
|
||||||
assert(meth.kind in {nnkProcDef, nnkMethodDef})
|
|
||||||
let methName = meth[0]
|
|
||||||
let isGdExport = removePragma(meth, "gdExport")
|
|
||||||
if not methName.isExported() and isGdExport:
|
|
||||||
parseError(meth, "gdExport is not applicable for private procs/methods")
|
|
||||||
let isNoGodot = meth.kind != nnkMethodDef and (
|
|
||||||
not methName.isExported() or
|
|
||||||
not isGdExport
|
|
||||||
) or removePragma(meth, "noExport")
|
|
||||||
result = MethodDecl(
|
|
||||||
name: $meth[0].basename,
|
|
||||||
args: newSeq[VarDecl](),
|
|
||||||
returnType: meth[3][0],
|
|
||||||
isVirtual: meth.kind == nnkMethodDef,
|
|
||||||
isNoGodot: isNoGodot,
|
|
||||||
nimNode: meth
|
|
||||||
)
|
|
||||||
for i in 1..<meth[3].len:
|
|
||||||
var identDefs = meth[3][i]
|
|
||||||
result.args.add(identDefsToVarDecls(identDefs))
|
|
||||||
|
|
||||||
proc parseVarSection(decl: NimNode): seq[VarDecl] =
|
|
||||||
assert(decl.kind == nnkVarSection)
|
|
||||||
result = identDefsToVarDecls(decl[0])
|
|
||||||
|
|
||||||
proc parseType(definition, callSite: NimNode): ObjectDecl =
|
|
||||||
let body = callSite[^1]
|
|
||||||
result = ObjectDecl(
|
|
||||||
fields: newSeq[VarDecl](),
|
|
||||||
methods: newSeq[MethodDecl]()
|
|
||||||
)
|
|
||||||
(result.name, result.parentName) = extractNames(definition)
|
|
||||||
if result.parentName.isNil: result.parentName = "Object"
|
|
||||||
for statement in body:
|
|
||||||
case statement.kind:
|
|
||||||
of nnkVarSection:
|
|
||||||
let varSection = parseVarSection(statement)
|
|
||||||
result.fields.add(varSection)
|
|
||||||
of nnkProcDef, nnkMethodDef:
|
|
||||||
let meth = parseMethod(statement)
|
|
||||||
result.methods.add(meth)
|
|
||||||
of nnkCommentStmt:
|
|
||||||
discard
|
|
||||||
else:
|
|
||||||
parseError(statement, "field or method declaration expected")
|
|
||||||
|
|
||||||
macro invokeVarArgs(procIdent, objIdent;
|
|
||||||
minArgs, maxArgs: static[int], numArgsIdent,
|
|
||||||
argSeqIdent; argTypes: seq[NimNode],
|
|
||||||
hasReturnValue: static[bool]): typed =
|
|
||||||
## Produces statement in form:
|
|
||||||
##
|
|
||||||
## .. code-block:: nim
|
|
||||||
## case numArgs:
|
|
||||||
## of 0:
|
|
||||||
## meth(self)
|
|
||||||
## of 1:
|
|
||||||
## let (arg0, err) = godotToNim[ArgT](argSeq[0])
|
|
||||||
## if err != ConversionResult.OK:
|
|
||||||
## error(...)
|
|
||||||
## return
|
|
||||||
## meth(self, arg0)
|
|
||||||
## else:
|
|
||||||
## error(...)
|
|
||||||
|
|
||||||
template conv(procLit, argT, argSeq, idx, argIdent, errIdent) =
|
|
||||||
let (argIdent, errIdent) = godotToNim[argT](argSeq[idx])
|
|
||||||
if errIdent != ConversionResult.OK:
|
|
||||||
let errorKind = if errIdent == ConversionResult.TypeError: "a type error"
|
|
||||||
else: "a range error"
|
|
||||||
printError(
|
|
||||||
"Failed to invoke Nim procedure " & $procLit &
|
|
||||||
": " & errorKind & " has occurred when converting argument " & $idx &
|
|
||||||
" of Godot type " & $argSeq[idx].getType())
|
|
||||||
return
|
|
||||||
|
|
||||||
result = newNimNode(nnkCaseStmt)
|
|
||||||
result.add(numArgsIdent)
|
|
||||||
for i in minArgs..maxArgs:
|
|
||||||
let branch = newNimNode(nnkOfBranch).add(newIntLitNode(i))
|
|
||||||
let branchBody = newStmtList()
|
|
||||||
let invocation = newNimNode(nnkCall)
|
|
||||||
invocation.add(procIdent)
|
|
||||||
invocation.add(objIdent) # self
|
|
||||||
for idx in 0..<i:
|
|
||||||
let argIdent = genSym(nskLet, "arg")
|
|
||||||
let errIdent = genSym(nskLet, "err")
|
|
||||||
let argT = argTypes[idx]
|
|
||||||
branchBody.add(getAst(conv($procIdent, argT,
|
|
||||||
argSeqIdent, idx, argIdent, errIdent)))
|
|
||||||
invocation.add(argIdent)
|
|
||||||
if hasReturnValue:
|
|
||||||
branchBody.add(newNimNode(nnkAsgn).add(ident("result"),
|
|
||||||
newCall("toGodot", invocation)))
|
|
||||||
else:
|
|
||||||
branchBody.add(invocation)
|
|
||||||
branchBody.add(newNimNode(nnkAsgn).add(ident("result"),
|
|
||||||
newCall("variant")))
|
|
||||||
|
|
||||||
branch.add(branchBody)
|
|
||||||
result.add(branch)
|
|
||||||
template printInvokeErr(procName, minArgs, maxArgs, numArgs) =
|
|
||||||
printError(
|
|
||||||
"Failed to invoke Nim procedure " & procName &
|
|
||||||
": expected " & $minArgs & "-" & $maxArgs &
|
|
||||||
" arguments, but got " & $numArgs)
|
|
||||||
|
|
||||||
result.add(newNimNode(nnkElse).add(getAst(
|
|
||||||
printInvokeErr($procIdent.ident, minArgs, maxArgs, numArgsIdent))))
|
|
||||||
|
|
||||||
proc typeError(nimType: cstring, value: string, godotType: VariantType,
|
|
||||||
className: cstring, propertyName: cstring): string =
|
|
||||||
result = "Tried to assign incompatible value " & value & " (" & $godotType &
|
|
||||||
") to field \"" & $propertyName & "\" (" & $nimType & ") of " &
|
|
||||||
$className
|
|
||||||
|
|
||||||
proc rangeError(nimType: cstring, value: string, className: cstring,
|
|
||||||
propertyName: cstring): string =
|
|
||||||
result = "Tried to assign the out-of-range value " & value &
|
|
||||||
" to field \"" & $propertyName & "\" (" & $nimType & ") of " &
|
|
||||||
$className
|
|
||||||
|
|
||||||
|
|
||||||
proc nimDestroyFunc(obj: ptr GodotObject, methData: pointer,
|
|
||||||
userData: pointer) {.noconv.} =
|
|
||||||
let nimObj = cast[ref NimGodotObject](userData)
|
|
||||||
nimObj.removeGodotObject()
|
|
||||||
GC_unref(nimObj)
|
|
||||||
|
|
||||||
template registerGodotClass(classNameIdent, classNameLit,
|
|
||||||
baseNameLit, createFuncIdent) =
|
|
||||||
proc createFuncIdent(obj: ptr GodotObject,
|
|
||||||
methData: pointer): pointer {.noconv.} =
|
|
||||||
let nimObj = new(classNameIdent)
|
|
||||||
setGodotObject(nimObj, obj)
|
|
||||||
GC_ref(nimObj)
|
|
||||||
result = cast[pointer](nimObj)
|
|
||||||
|
|
||||||
let createFuncObj = GodotInstanceCreateFunc(
|
|
||||||
createFunc: createFuncIdent
|
|
||||||
)
|
|
||||||
let destroyFuncObj = GodotInstanceDestroyFunc(
|
|
||||||
destroyFunc: nimDestroyFunc
|
|
||||||
)
|
|
||||||
registerClass(classNameIdent, classNameLit, false)
|
|
||||||
godotScriptRegisterClass(classNameLit, baseNameLit,
|
|
||||||
createFuncObj, destroyFuncObj)
|
|
||||||
|
|
||||||
template registerGodotField(classNameLit, classNameIdent, propNameLit,
|
|
||||||
propNameIdent, propTypeLit, propTypeIdent,
|
|
||||||
setFuncIdent, getFuncIdent, hintTipLit,
|
|
||||||
hintIdent, usageIdent, hasDefaultValue,
|
|
||||||
defaultValueNode) =
|
|
||||||
proc setFuncIdent(obj: ptr GodotObject, methData: pointer,
|
|
||||||
nimPtr: pointer, val: Variant) {.noconv.} =
|
|
||||||
let (nimVal, err) = godotToNim[propTypeIdent](val)
|
|
||||||
case err:
|
|
||||||
of ConversionResult.OK:
|
|
||||||
cast[classNameIdent](nimPtr).propNameIdent = nimVal
|
|
||||||
of ConversionResult.TypeError:
|
|
||||||
let errStr = typeError(propTypeLit, $val, val.getType(),
|
|
||||||
classNameLit, propNameLit)
|
|
||||||
printError(errStr)
|
|
||||||
of ConversionResult.RangeError:
|
|
||||||
let errStr = rangeError(propTypeLit, $val,
|
|
||||||
classNameLit, propNameLit)
|
|
||||||
printError(errStr)
|
|
||||||
|
|
||||||
proc getFuncIdent(obj: ptr GodotObject, methData: pointer,
|
|
||||||
nimPtr: pointer): Variant {.noconv.} =
|
|
||||||
result = nimToGodot(cast[classNameIdent](nimPtr).propNameIdent)
|
|
||||||
|
|
||||||
let setFunc = GodotPropertySetFunc(
|
|
||||||
setFunc: setFuncIdent
|
|
||||||
)
|
|
||||||
let getFunc = GodotPropertyGetFunc(
|
|
||||||
getFunc: getFuncIdent
|
|
||||||
)
|
|
||||||
var attr = GodotPropertyAttributes(
|
|
||||||
typ: ord(godotVariantType(propTypeIdent)),
|
|
||||||
hintString: hintTipLit.toGodotString(),
|
|
||||||
hint: GodotPropertyHint.hintIdent,
|
|
||||||
usage: GodotPropertyUsageFlags.usageIdent
|
|
||||||
)
|
|
||||||
when hasDefaultValue:
|
|
||||||
attr.defaultValue = (defaultValueNode).toGodot()
|
|
||||||
godotScriptRegisterProperty(classNameLit, propNameLit,
|
|
||||||
attr, setFunc, getFunc)
|
|
||||||
static:
|
|
||||||
import strutils
|
|
||||||
proc toGodotStyle(s: string): string {.compileTime.} =
|
|
||||||
result = newStringOfCap(s.len + 10)
|
|
||||||
for c in s:
|
|
||||||
if c.isUpperAscii():
|
|
||||||
result.add('_')
|
|
||||||
result.add(c.toLowerAscii())
|
|
||||||
else:
|
|
||||||
result.add(c)
|
|
||||||
|
|
||||||
proc genType(obj: ObjectDecl): NimNode {.compileTime.} =
|
|
||||||
result = newNimNode(nnkStmtList)
|
|
||||||
|
|
||||||
# 1. Nim type definition
|
|
||||||
let typeDef = newNimNode(nnkTypeDef)
|
|
||||||
result.add(newNimNode(nnkTypeSection).add(typeDef))
|
|
||||||
typeDef.add(postfix(ident(obj.name), "*"))
|
|
||||||
typeDef.add(newEmptyNode())
|
|
||||||
let objTy = newNimNode(nnkObjectTy)
|
|
||||||
typeDef.add(newNimNode(nnkRefTy).add(objTy))
|
|
||||||
objTy.add(newEmptyNode())
|
|
||||||
if obj.parentName.isNil:
|
|
||||||
objTy.add(newEmptyNode())
|
|
||||||
else:
|
|
||||||
objTy.add(newNimNode(nnkOfInherit).add(ident(obj.parentName)))
|
|
||||||
|
|
||||||
let recList = newNimNode(nnkRecList)
|
|
||||||
objTy.add(recList)
|
|
||||||
for decl in obj.fields:
|
|
||||||
if not decl.defaultValue.isNil and decl.defaultValue.kind != nnkEmpty:
|
|
||||||
parseError(decl.defaultValue,
|
|
||||||
"Default values are not supported for fields for now.")
|
|
||||||
recList.add(newIdentDefs(decl.name, decl.typ))
|
|
||||||
|
|
||||||
# 2. {.this: self.} for convenience
|
|
||||||
result.add(newNimNode(nnkPragma).add(newNimNode(nnkExprColonExpr).add(
|
|
||||||
ident("this"), ident("self")
|
|
||||||
)))
|
|
||||||
|
|
||||||
# 3. Nim proc defintions
|
|
||||||
var decls = newSeqOfCap[NimNode](obj.methods.len)
|
|
||||||
for meth in obj.methods:
|
|
||||||
let selfArg = newIdentDefs(ident("self"), ident(obj.name))
|
|
||||||
meth.nimNode.params.insert(1, selfArg)
|
|
||||||
let decl = meth.nimNode.copyNimTree()
|
|
||||||
decl.body = newEmptyNode()
|
|
||||||
decl.addPragma(ident("gcsafe"))
|
|
||||||
decl.addPragma(newNimNode(nnkExprColonExpr).add(ident("locks"),
|
|
||||||
newIntLitNode(0)))
|
|
||||||
decls.add(decl)
|
|
||||||
# add forward declarations first
|
|
||||||
for decl in decls:
|
|
||||||
result.add(decl)
|
|
||||||
for meth in obj.methods:
|
|
||||||
result.add(meth.nimNode)
|
|
||||||
|
|
||||||
# 4. Register Godot object
|
|
||||||
let parentName = if obj.parentName.isNil: newNilLit()
|
|
||||||
else: newStrLitNode(obj.parentName)
|
|
||||||
let classNameLit = newCStringLit(obj.name)
|
|
||||||
let classNameIdent = ident(obj.name)
|
|
||||||
result.add(getAst(
|
|
||||||
registerGodotClass(classNameIdent, classNameLit, parentName,
|
|
||||||
genSym(nskProc, "createFunc"))))
|
|
||||||
|
|
||||||
# 5. Register fields (properties)
|
|
||||||
for field in obj.fields:
|
|
||||||
if field.isNoGodot: continue
|
|
||||||
let hintTip = if field.hintTip.isNil: ""
|
|
||||||
else: field.hintTip
|
|
||||||
let hint = if field.hint.isNil: "None"
|
|
||||||
else: field.hint
|
|
||||||
let usage = if field.usage.isNil: "Default"
|
|
||||||
else: field.usage
|
|
||||||
let hasDefaultValue = not field.defaultValue.isNil and
|
|
||||||
field.defaultValue.kind != nnkEmpty
|
|
||||||
let hintIdent = ident(hint)
|
|
||||||
let usageIdent = ident(usage)
|
|
||||||
result.add(getAst(
|
|
||||||
registerGodotField(classNameLit, classNameIdent,
|
|
||||||
newCStringLit($field.name.basename()),
|
|
||||||
ident(field.name), newCStringLit($field.typ),
|
|
||||||
field.typ, genSym(nskProc, "setFunc"),
|
|
||||||
genSym(nskProc, "getFunc"),
|
|
||||||
newStrLitNode(hintTip), hintIdent, usageIdent,
|
|
||||||
ident($hasDefaultValue), field.defaultValue)))
|
|
||||||
|
|
||||||
# 6. Register methods
|
|
||||||
template registerGodotMethod(classNameLit, classNameIdent, methodNameIdent,
|
|
||||||
methodNameLit, minArgs, maxArgs,
|
|
||||||
argTypes, methFuncIdent, hasReturnValue) =
|
|
||||||
proc methFuncIdent(obj: ptr GodotObject, methodData: pointer,
|
|
||||||
userData: pointer, numArgs: cint,
|
|
||||||
args: var ptr array[MAX_ARG_COUNT, Variant]):
|
|
||||||
Variant {.noconv.} =
|
|
||||||
let self = cast[classNameIdent](userData)
|
|
||||||
when defined(release):
|
|
||||||
invokeVarArgs(methodNameIdent, self, minArgs, maxArgs, numArgs,
|
|
||||||
args, argTypes, hasReturnValue)
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
invokeVarArgs(methodNameIdent, self, minArgs, maxArgs, numArgs,
|
|
||||||
args, argTypes, hasReturnValue)
|
|
||||||
except:
|
|
||||||
let ex = getCurrentException()
|
|
||||||
printError("Unhandled Nim exception (" &
|
|
||||||
$ex.name & "): " &
|
|
||||||
ex.msg & "\n" & ex.getStackTrace())
|
|
||||||
|
|
||||||
let meth = GodotInstanceMethod(
|
|
||||||
meth: methFuncIdent
|
|
||||||
)
|
|
||||||
godotScriptRegisterMethod(classNameLit, methodNameLit,
|
|
||||||
GodotMethodAttributes(), meth)
|
|
||||||
|
|
||||||
for meth in obj.methods:
|
|
||||||
if meth.isNoGodot: continue
|
|
||||||
let maxArgs = meth.args.len
|
|
||||||
var minArgs = maxArgs
|
|
||||||
var argTypes = newSeq[NimNode]()
|
|
||||||
for idx, arg in meth.args:
|
|
||||||
if minArgs == maxArgs and not arg.defaultValue.isNil and
|
|
||||||
arg.defaultValue.kind != nnkEmpty:
|
|
||||||
minArgs = idx
|
|
||||||
argTypes.add(arg.typ)
|
|
||||||
|
|
||||||
let godotMethodName = if meth.isVirtual: "_" & toGodotStyle(meth.name)
|
|
||||||
else: toGodotStyle(meth.name)
|
|
||||||
let hasReturnValueBool = not (meth.returnType.isNil or
|
|
||||||
meth.returnType.kind == nnkEmpty or
|
|
||||||
$meth.returnType == "void")
|
|
||||||
let hasReturnValue = if hasReturnValueBool: ident("true")
|
|
||||||
else: ident("false")
|
|
||||||
result.add(getAst(
|
|
||||||
registerGodotMethod(classNameLit, classNameIdent, ident(meth.name),
|
|
||||||
newCStringLit(godotMethodName), minArgs, maxArgs,
|
|
||||||
argTypes, genSym(nskProc, "methFunc"),
|
|
||||||
hasReturnValue)))
|
|
||||||
|
|
||||||
macro gdobj*(definition: untyped, body: untyped): typed =
|
|
||||||
let typeDef = parseType(definition, callsite())
|
|
||||||
result = genType(typeDef)
|
|
||||||
|
|
@ -1,515 +0,0 @@
|
||||||
# Copyright 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
import tables, typetraits, macros
|
|
||||||
import "../core/godotbase.nim", "../core/godotcore.nim"
|
|
||||||
import "../core/strings.nim", "../core/vector2.nim", "../core/rect2.nim",
|
|
||||||
"../core/vector3.nim", "../core/transform2d.nim",
|
|
||||||
"../core/plane.nim", "../core/quat.nim", "../core/rect3.nim",
|
|
||||||
"../core/basis.nim", "../core/transform.nim", "../core/color.nim",
|
|
||||||
"../core/nodepath.nim", "../core/rid.nim", "../core/dictionary.nim",
|
|
||||||
"../core/arrays.nim", "../core/poolarray.nim", "../core/variant.nim"
|
|
||||||
|
|
||||||
## Definition of NimGodotObject and converters for built-in types.
|
|
||||||
|
|
||||||
type
|
|
||||||
NimGodotObject* = ref object of RootObj
|
|
||||||
godotObject: ptr GodotObject
|
|
||||||
|
|
||||||
ConversionResult* {.pure.} = enum
|
|
||||||
OK,
|
|
||||||
TypeError,
|
|
||||||
## Type mismatch
|
|
||||||
RangeError
|
|
||||||
## Types match, but the value is out of range.
|
|
||||||
## Mainly used for numeric (ordinal) types.
|
|
||||||
|
|
||||||
SomeUnsignedInt = uint8 or uint16 or uint32 or uint64 or uint or cuint
|
|
||||||
SomeSignedInt = int8 or int16 or int32 or int64 or int or cint
|
|
||||||
SomeFloat = float32 or float64 or cfloat
|
|
||||||
|
|
||||||
SomeGodot = bool or Vector2 or Rect2 or Vector3 or
|
|
||||||
Transform2D or Plane or Quat or Rect3 or
|
|
||||||
Basis or Transform or Color or NodePath or
|
|
||||||
RID or GodotObject or Dictionary or Array or
|
|
||||||
PoolByteArray or PoolIntArray or PoolRealArray or
|
|
||||||
PoolStringArray or PoolVector2Array or PoolVector3Array or
|
|
||||||
PoolColorArray or GodotString
|
|
||||||
|
|
||||||
SomeGodotOrNum = SomeGodot or SomeSignedInt or SomeUnsignedInt or SomeFloat
|
|
||||||
|
|
||||||
CallError* = object of Exception
|
|
||||||
err*: VariantCallError
|
|
||||||
|
|
||||||
ObjectInfo = object
|
|
||||||
constructor: proc(): NimGodotObject {.gcsafe, nimcall.}
|
|
||||||
baseNativeClass: cstring
|
|
||||||
isNative: bool
|
|
||||||
|
|
||||||
var classRegistry {.threadvar.}: TableRef[cstring, ObjectInfo]
|
|
||||||
|
|
||||||
static:
|
|
||||||
import sets, strutils
|
|
||||||
var nativeClasses {.compileTime.} = initSet[string]()
|
|
||||||
|
|
||||||
proc godotFinalizer[T: NimGodotObject](obj: T) =
|
|
||||||
# hmm, not sure yet how to deal with references correctly
|
|
||||||
# when T is Reference:
|
|
||||||
# obj.godotObject.deinit()
|
|
||||||
discard
|
|
||||||
|
|
||||||
macro baseNativeType(T: typedesc): cstring =
|
|
||||||
var t = getType(getType(T)[1][1])
|
|
||||||
var baseT: string
|
|
||||||
while true:
|
|
||||||
let typeName = ($t[1][1]).split(':')[0]
|
|
||||||
if typeName in nativeClasses:
|
|
||||||
baseT = typeName
|
|
||||||
break
|
|
||||||
if typeName == "NimGodotObject":
|
|
||||||
break
|
|
||||||
t = getType(t[1][1])
|
|
||||||
if baseT.isNil:
|
|
||||||
result = newNilLit()
|
|
||||||
else:
|
|
||||||
let rStr = newNimNode(nnkRStrLit)
|
|
||||||
rStr.strVal = baseT
|
|
||||||
result = newNimNode(nnkCallStrLit).add(ident("cstring"), rStr)
|
|
||||||
|
|
||||||
template registerClass*(T: typedesc; godotClassName: cstring,
|
|
||||||
isNativeParam: bool) =
|
|
||||||
if classRegistry.isNil:
|
|
||||||
classRegistry = newTable[cstring, ObjectInfo]()
|
|
||||||
let constructor = proc(): NimGodotObject =
|
|
||||||
var t: T
|
|
||||||
new(t, godotFinalizer[T])
|
|
||||||
result = t
|
|
||||||
|
|
||||||
const base = baseNativeType(T)
|
|
||||||
classRegistry[godotClassName] = ObjectInfo(
|
|
||||||
constructor: constructor,
|
|
||||||
baseNativeClass: base,
|
|
||||||
isNative: isNativeParam
|
|
||||||
)
|
|
||||||
when isNativeParam:
|
|
||||||
static:
|
|
||||||
nativeClasses.incl(T.name)
|
|
||||||
|
|
||||||
proc newNimGodotObject[T: NimGodotObject](
|
|
||||||
godotObject: ptr GodotObject, godotClassName: cstring): T =
|
|
||||||
assert(not classRegistry.isNil)
|
|
||||||
assert(not godotObject.isNil)
|
|
||||||
let objInfo = classRegistry.getOrDefault(godotClassName)
|
|
||||||
if objInfo.constructor.isNil:
|
|
||||||
printError("Nim constructor not found for class " & $godotClassName)
|
|
||||||
else:
|
|
||||||
result = T(objInfo.constructor())
|
|
||||||
result.godotObject = godotObject
|
|
||||||
|
|
||||||
proc asNimGodotObject*[T: NimGodotObject](godotObject: ptr GodotObject): T =
|
|
||||||
if godotObject.isNil: return nil
|
|
||||||
let userDataPtr = godotObject.getUserData()
|
|
||||||
if not userDataPtr.isNil:
|
|
||||||
result = cast[T](userDataPtr)
|
|
||||||
if result.godotObject != godotObject:
|
|
||||||
# Could be data from other bindings
|
|
||||||
result = nil
|
|
||||||
if result.isNil:
|
|
||||||
result = newNimGodotObject[T](
|
|
||||||
godotObject, cstring(godotObject.getClassName()))
|
|
||||||
|
|
||||||
proc `as`*[T: NimGodotObject](obj: NimGodotObject, t: typedesc[T]): T =
|
|
||||||
## Converts the ``obj`` into the specified type.
|
|
||||||
## Returns ``nil`` if the conversion cannot be performed
|
|
||||||
## (the ``obj`` is not of the type ``T``)
|
|
||||||
if obj.isNil or not (obj of T):
|
|
||||||
when not defined(release):
|
|
||||||
if not obj.isNil:
|
|
||||||
printError("Failed to cast object to " &
|
|
||||||
t.name & "\n" & getStackTrace())
|
|
||||||
result = nil
|
|
||||||
else:
|
|
||||||
result = T(obj)
|
|
||||||
|
|
||||||
proc getSingletonGodot*(name: cstring): ptr GodotObject {.
|
|
||||||
importc: "godot_global_get_singleton", header: "../godot.h".}
|
|
||||||
|
|
||||||
proc newRStrLit(s: string): NimNode {.compileTime.} =
|
|
||||||
result = newNimNode(nnkRStrLit)
|
|
||||||
result.strVal = s
|
|
||||||
|
|
||||||
static:
|
|
||||||
import strutils
|
|
||||||
macro toGodotName(T: typedesc): cstring =
|
|
||||||
let nameStr: string = (($T.getType()[1][1].symbol).split(':')[0])
|
|
||||||
let godotName = case nameStr:
|
|
||||||
of "File", "Directory", "Thread", "Mutex", "Semaphore":
|
|
||||||
"_" & nameStr
|
|
||||||
else:
|
|
||||||
nameStr
|
|
||||||
|
|
||||||
result = newNimNode(nnkCallStrLit).add(
|
|
||||||
ident("cstring"), newRStrLit(godotName))
|
|
||||||
|
|
||||||
proc getSingleton*[T: NimGodotObject](): T =
|
|
||||||
const godotName = toGodotName(T)
|
|
||||||
let singleton = getSingletonGodot(godotName)
|
|
||||||
if singleton.isNil:
|
|
||||||
printError("Tried to get non-existing singleton of type " & $godotName)
|
|
||||||
else:
|
|
||||||
result = asNimGodotObject[T](singleton)
|
|
||||||
|
|
||||||
proc gdnew*[T: NimGodotObject](): T =
|
|
||||||
const godotName = toGodotName(T)
|
|
||||||
let obj = godotNew(godotName)
|
|
||||||
if obj.isNil:
|
|
||||||
printError("godot_new returned nil for type " & $godotName)
|
|
||||||
result = asNimGodotObject[T](obj)
|
|
||||||
# const godotName = toGodotName(T)
|
|
||||||
# let objInfo = classRegistry.getOrDefault(godotName)
|
|
||||||
# if objInfo.constructor.isNil:
|
|
||||||
# printError("gdnew invoked on unregistered class: " & $godotName)
|
|
||||||
# return
|
|
||||||
# let godotConstructor = getClassConstructor(
|
|
||||||
# if objInfo.isNative: godotName else: objInfo.baseNativeClass)
|
|
||||||
# printError("Base native class for " & T.name & ": " & $objInfo.baseNativeClass)
|
|
||||||
# when not defined(release):
|
|
||||||
# if godotConstructor.isNil:
|
|
||||||
# printError("Failed to obtain Godot constrcutor for type: " & $godotName)
|
|
||||||
# return
|
|
||||||
# let godotObject = godotConstructor()
|
|
||||||
# when not defined(release):
|
|
||||||
# if godotObject.isNil:
|
|
||||||
# printError("Godot constructor returned nil - must never happen")
|
|
||||||
# return
|
|
||||||
# new(result, godotFinalizer[T])
|
|
||||||
# result.setGodotObject(godotObject)
|
|
||||||
|
|
||||||
proc newCallError*(err: VariantCallError): ref CallError =
|
|
||||||
let msg = case err.error:
|
|
||||||
of VariantCallErrorType.OK,
|
|
||||||
VariantCallErrorType.InvalidMethod,
|
|
||||||
VariantCallErrorType.TooManyArguments,
|
|
||||||
VariantCallErrorType.TooFewArguments,
|
|
||||||
VariantCallErrorType.InstanceIsNull:
|
|
||||||
$err.error
|
|
||||||
of VariantCallErrorType.InvalidArgument:
|
|
||||||
"invalid argument at position " & $err.argument & ": expected " &
|
|
||||||
$err.expected
|
|
||||||
|
|
||||||
result = newException(CallError, msg)
|
|
||||||
result.err = err
|
|
||||||
|
|
||||||
proc newConversionError*(err: ConversionResult): ref ValueError =
|
|
||||||
let msg = case err:
|
|
||||||
of ConversionResult.TypeError:
|
|
||||||
"Failed to convert the return value into Nim type"
|
|
||||||
of ConversionResult.RangeError:
|
|
||||||
"The returned value was out of bounds"
|
|
||||||
of ConversionResult.OK:
|
|
||||||
"OK"
|
|
||||||
|
|
||||||
result = newException(ValueError, msg)
|
|
||||||
|
|
||||||
proc removeGodotObject*(nimObj: NimGodotObject) =
|
|
||||||
## Used from destructor
|
|
||||||
nimObj.godotObject = nil
|
|
||||||
|
|
||||||
proc setGodotObject*(nimObj: NimGodotObject, obj: ptr GodotObject) {.inline.} =
|
|
||||||
assert(not obj.isNil)
|
|
||||||
assert(nimObj.godotObject.isNil) # reassignment is not allowed
|
|
||||||
nimObj.godotObject = obj
|
|
||||||
|
|
||||||
proc godotObject*(nimObj: NimGodotObject): ptr GodotObject {.inline.} =
|
|
||||||
nimObj.godotObject
|
|
||||||
|
|
||||||
proc godotVariantType*(T: typedesc[NimGodotObject]): VariantType {.inline.} =
|
|
||||||
VariantType.Object
|
|
||||||
|
|
||||||
proc toGodot*(self: NimGodotObject): Variant {.inline.} =
|
|
||||||
variant(self.godotObject)
|
|
||||||
|
|
||||||
proc fromGodot*[T: NimGodotObject](self: var T,
|
|
||||||
val: Variant): ConversionResult =
|
|
||||||
if val.getType() == VariantType.Object:
|
|
||||||
let objPtr = val.asObject()
|
|
||||||
self = asNimGodotObject[T](objPtr)
|
|
||||||
if self.isNil:
|
|
||||||
result = ConversionResult.TypeError
|
|
||||||
elif val.getType() == VariantType.Nil:
|
|
||||||
self = nil
|
|
||||||
else:
|
|
||||||
result = ConversionResult.TypeError
|
|
||||||
|
|
||||||
proc godotVariantType*(T: typedesc[enum]): VariantType {.inline.} =
|
|
||||||
VariantType.Int
|
|
||||||
|
|
||||||
proc toGodot*[T: enum](self: T): Variant {.inline.} =
|
|
||||||
variant(ord(self))
|
|
||||||
|
|
||||||
proc fromGodot*[T: enum](self: var T, val: Variant): ConversionResult =
|
|
||||||
if val.getType() == VariantType.Int:
|
|
||||||
self = T(val.asInt())
|
|
||||||
else:
|
|
||||||
result = ConversionResult.TypeError
|
|
||||||
|
|
||||||
proc toGodot*(self: Variant): Variant {.inline.} =
|
|
||||||
result = self
|
|
||||||
|
|
||||||
proc fromGodot*(self: var Variant, val: Variant): ConversionResult {.inline.} =
|
|
||||||
self = val
|
|
||||||
|
|
||||||
proc godotVariantType*(T: typedesc[SomeGodotOrNum]): VariantType {.inline.} =
|
|
||||||
when T is SomeSignedInt or T is SomeUnsignedInt:
|
|
||||||
VariantType.Int
|
|
||||||
elif T is bool:
|
|
||||||
VariantType.Bool
|
|
||||||
elif T is SomeFloat:
|
|
||||||
VariantType.Real
|
|
||||||
elif T is string or T is GodotString:
|
|
||||||
VariantType.String
|
|
||||||
elif T is Vector2:
|
|
||||||
VariantType.Vector2
|
|
||||||
elif T is Rect2:
|
|
||||||
VariantType.Rect2
|
|
||||||
elif T is Vector3:
|
|
||||||
VariantType.Vector3
|
|
||||||
elif T is Transform2D:
|
|
||||||
VariantType.Transform2D
|
|
||||||
elif T is Plane:
|
|
||||||
VariantType.Plane
|
|
||||||
elif T is Quat:
|
|
||||||
VariantType.Quat
|
|
||||||
elif T is Rect3:
|
|
||||||
VariantType.Rect3
|
|
||||||
elif T is Basis:
|
|
||||||
VariantType.Basis
|
|
||||||
elif T is Transform:
|
|
||||||
VariantType.Transform
|
|
||||||
elif T is Color:
|
|
||||||
VariantType.Color
|
|
||||||
elif T is NodePath:
|
|
||||||
VariantType.NodePath
|
|
||||||
elif T is RID:
|
|
||||||
VariantType.RID
|
|
||||||
elif T is GodotObject:
|
|
||||||
VariantType.Object
|
|
||||||
elif T is Dictionary:
|
|
||||||
VariantType.Dictionary
|
|
||||||
elif T is Array:
|
|
||||||
VariantType.Array
|
|
||||||
elif T is PoolByteArray:
|
|
||||||
VariantType.PoolByteArray
|
|
||||||
elif T is PoolIntArray:
|
|
||||||
VariantType.PoolIntArray
|
|
||||||
elif T is PoolRealArray:
|
|
||||||
VariantType.PoolRealArray
|
|
||||||
elif T is PoolStringArray:
|
|
||||||
VariantType.PoolStringArray
|
|
||||||
elif T is PoolVector2Array:
|
|
||||||
VariantType.PoolVector2Array
|
|
||||||
elif T is PoolVector3Array:
|
|
||||||
VariantType.PoolVector3Array
|
|
||||||
elif T is PoolColorArray:
|
|
||||||
VariantType.PoolColorArray
|
|
||||||
else:
|
|
||||||
VariantType.Nil
|
|
||||||
|
|
||||||
proc toGodot*[T: SomeGodotOrNum](val: T): Variant {.inline.} =
|
|
||||||
result = variant(val)
|
|
||||||
|
|
||||||
proc fromGodot*[T: SomeSignedInt or SomeUnsignedInt](
|
|
||||||
self: var T, val: Variant): ConversionResult =
|
|
||||||
if val.getType() != VariantType.Int:
|
|
||||||
result = ConversionResult.TypeError
|
|
||||||
else:
|
|
||||||
var intVal: (when T is SomeSignedInt: int64
|
|
||||||
else: uint64)
|
|
||||||
intVal = when T is SomeSignedInt: val.asInt()
|
|
||||||
else: val.asUint()
|
|
||||||
if intVal > high(T) or intVal < low(T):
|
|
||||||
result = ConversionResult.RangeError
|
|
||||||
else:
|
|
||||||
self = T(intVal)
|
|
||||||
|
|
||||||
proc fromGodot*[T: SomeFloat](self: var T, val: Variant): ConversionResult =
|
|
||||||
if val.getType() == VariantType.Real:
|
|
||||||
self = val.asReal()
|
|
||||||
elif val.getType() == VariantType.Int:
|
|
||||||
self = T(val.asInt())
|
|
||||||
else:
|
|
||||||
result = ConversionResult.TypeError
|
|
||||||
|
|
||||||
proc fromGodot*[T: SomeGodot](self: var T, val: Variant): ConversionResult =
|
|
||||||
if godotVariantType(T) != val.getType():
|
|
||||||
return ConversionResult.TypeError
|
|
||||||
when self is bool:
|
|
||||||
self = val.asBool()
|
|
||||||
elif self is Vector2:
|
|
||||||
self = val.asVector2()
|
|
||||||
elif self is Rect2:
|
|
||||||
self = val.asRect2()
|
|
||||||
elif self is Vector3:
|
|
||||||
self = val.asVector3()
|
|
||||||
elif self is Transform2D:
|
|
||||||
self = val.asTransform2D()
|
|
||||||
elif self is Plane:
|
|
||||||
self = val.asPlane()
|
|
||||||
elif self is Quat:
|
|
||||||
self = val.asQuat()
|
|
||||||
elif self is Rect3:
|
|
||||||
self = val.asRect3()
|
|
||||||
elif self is Basis:
|
|
||||||
self = val.asBasis()
|
|
||||||
elif self is Transform:
|
|
||||||
self = val.asTransform()
|
|
||||||
elif self is Color:
|
|
||||||
self = val.asColor()
|
|
||||||
elif self is NodePath:
|
|
||||||
self = val.asNodePath()
|
|
||||||
elif self is RID:
|
|
||||||
self = val.asRID()
|
|
||||||
elif self is ptr GodotObject:
|
|
||||||
self = val.asObject()
|
|
||||||
elif self is Dictionary:
|
|
||||||
self = val.asDictionary()
|
|
||||||
elif self is Array:
|
|
||||||
self = val.asArray()
|
|
||||||
elif self is PoolByteArray:
|
|
||||||
self = val.asPoolByteArray()
|
|
||||||
elif self is PoolIntArray:
|
|
||||||
self = val.asPoolIntArray()
|
|
||||||
elif self is PoolRealArray:
|
|
||||||
self = val.asPoolRealArray()
|
|
||||||
elif self is PoolStringArray:
|
|
||||||
self = val.asPoolStringArray()
|
|
||||||
elif self is PoolVector2Array:
|
|
||||||
self = val.asPoolVector2Array()
|
|
||||||
elif self is PoolVector3Array:
|
|
||||||
self = val.asPoolVector3Array()
|
|
||||||
elif self is PoolColorArray:
|
|
||||||
self = val.asPoolColorArray()
|
|
||||||
elif self is GodotString:
|
|
||||||
self = val.asGodotString()
|
|
||||||
else:
|
|
||||||
# mustn't reach this
|
|
||||||
result = ConversionError.TypeError
|
|
||||||
|
|
||||||
proc godotVariantType*(T: typedesc[string]): VariantType {.inline.} =
|
|
||||||
VariantType.String
|
|
||||||
|
|
||||||
proc toGodot*(s: string): Variant {.inline.} =
|
|
||||||
variant(s.toGodotString())
|
|
||||||
|
|
||||||
proc fromGodot*(s: var string, val: Variant): ConversionResult =
|
|
||||||
if val.getType() != VariantType.String:
|
|
||||||
result = ConversionResult.TypeError
|
|
||||||
else:
|
|
||||||
s = $val.asGodotString()
|
|
||||||
|
|
||||||
proc godotVariantType*(T: typedesc[seq]): VariantType =
|
|
||||||
VariantType.Array
|
|
||||||
|
|
||||||
proc godotVariantType*(T: typedesc[array]): VariantType =
|
|
||||||
VariantType.Array
|
|
||||||
|
|
||||||
proc toGodot*[T](s: openarray[T]): Variant =
|
|
||||||
var arr: Array
|
|
||||||
initArray(arr)
|
|
||||||
mixin toGodot
|
|
||||||
for item in s:
|
|
||||||
arr.add(toGodot(item))
|
|
||||||
result = variant(arr)
|
|
||||||
|
|
||||||
proc fromGodot*[T](s: var seq[T], val: Variant): ConversionResult =
|
|
||||||
if val.getType() != VariantType.Array:
|
|
||||||
result = ConversionResult.TypeError
|
|
||||||
else:
|
|
||||||
let arr = val.asArray()
|
|
||||||
s = newSeq[T](arr.len)
|
|
||||||
for idx, item in arr:
|
|
||||||
mixin fromGodot
|
|
||||||
let convResult = fromGodot(s[idx], item)
|
|
||||||
if convResult != ConversionResult.OK:
|
|
||||||
s = nil
|
|
||||||
return convResult
|
|
||||||
|
|
||||||
proc fromGodot*[T: array](s: var T, val: Variant): ConversionResult =
|
|
||||||
if val.getType() != VariantType.Array:
|
|
||||||
result = ConversionResult.TypeError
|
|
||||||
else:
|
|
||||||
let arr = val.asArray()
|
|
||||||
if s.len != arr.len:
|
|
||||||
return ConversionResult.TypeError
|
|
||||||
for idx, item in arr:
|
|
||||||
mixin fromGodot
|
|
||||||
let convResult = fromGodot(s[idx], item)
|
|
||||||
if convResult != ConversionResult.OK:
|
|
||||||
return convResult
|
|
||||||
|
|
||||||
proc godotVariantType*(T: typedesc[Table|TableRef]): VariantType {.inline.} =
|
|
||||||
VariantType.Dictionary
|
|
||||||
|
|
||||||
proc toGodot*[T: Table or TableRef](t: T): Variant =
|
|
||||||
var dict: Dictionary
|
|
||||||
initDictionary(dict)
|
|
||||||
mixin toGodot
|
|
||||||
for k, v in t.pairs():
|
|
||||||
dict[toGodot(k)] = toGodot(v)
|
|
||||||
result = variant(dict)
|
|
||||||
|
|
||||||
proc fromGodot*[T: Table or TableRef](t: var T, val: Variant): ConversionResult =
|
|
||||||
if val.getType() != VariantType.Dictionary:
|
|
||||||
result = ConversionResult.TypeError
|
|
||||||
else:
|
|
||||||
let dict = val.asDictionary()
|
|
||||||
mixin fromGodot
|
|
||||||
when t is Table:
|
|
||||||
t = initTable[type(t.keys()), type(t.values())]()
|
|
||||||
else:
|
|
||||||
t = newTable[type(t.keys()), type(t.values())]()
|
|
||||||
for k, v in dict:
|
|
||||||
var nimKey: type(t.keys())
|
|
||||||
var nimVal: type(t.values())
|
|
||||||
let keyResult = fromGodot(nimKey, k)
|
|
||||||
if keyResult != ConversionResult.OK:
|
|
||||||
when t is ref:
|
|
||||||
t = nil
|
|
||||||
return keyResult
|
|
||||||
let valResult = fromGodot(nimVal, v)
|
|
||||||
if valResult != ConversionResult.OK:
|
|
||||||
when t is ref:
|
|
||||||
t = nil
|
|
||||||
return valResult
|
|
||||||
t[nimKey] = nimVal
|
|
||||||
|
|
||||||
proc godotToNim*[T](val: Variant): (T, ConversionResult) =
|
|
||||||
mixin fromGodot
|
|
||||||
result[1] = fromGodot(result[0], val)
|
|
||||||
|
|
||||||
proc nimToGodot*[T](val: T): Variant =
|
|
||||||
mixin toGodot
|
|
||||||
when compiles(toGodot(val)):
|
|
||||||
result = toGodot(val)
|
|
||||||
else:
|
|
||||||
printError("Failed to convert Nim value of type " & T.name &
|
|
||||||
" into Variant")
|
|
||||||
initNilVariant(result)
|
|
||||||
|
|
||||||
{.emit: """/*TYPESECTION*/
|
|
||||||
void NimMain(void);
|
|
||||||
N_NOINLINE(void, setStackBottom)(void* thestackbottom);
|
|
||||||
""".}
|
|
||||||
|
|
||||||
const stackIncreases = defined(emscripten)
|
|
||||||
|
|
||||||
proc godot_native_init() {.cdecl, exportc, dynlib.} =
|
|
||||||
let stackBottom = godotStackBottom()
|
|
||||||
{.emit: """
|
|
||||||
NimMain();
|
|
||||||
setStackBottom(`stackBottom`);
|
|
||||||
""".}
|
|
||||||
GC_fullCollect()
|
|
||||||
GC_disable()
|
|
||||||
|
|
||||||
proc godot_native_terminate() {.cdecl, exportc, dynlib.} =
|
|
||||||
discard
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
||||||
# Copyright 2017 Xored Software, Inc.
|
|
||||||
|
|
||||||
import asyncdispatch
|
|
||||||
import godot, node
|
|
||||||
|
|
||||||
gdobj NimRuntime of Node:
|
|
||||||
method process*(delta: float32) =
|
|
||||||
if asyncdispatch.hasPendingOperations():
|
|
||||||
poll(0)
|
|
||||||
GC_step(2000, false, 0)
|
|
||||||
|
|
||||||
when not defined(release):
|
|
||||||
onUnhandledException = proc(errorMsg: string) =
|
|
||||||
printError("Unhandled Nim exception: " & errorMsg)
|
|
||||||
7
index.html
Normal file
7
index.html
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
<html>
|
||||||
|
<head><title>godot-nim docs index</title></head>
|
||||||
|
<body>
|
||||||
|
<h1>Documentation of Nim bindings for Godot Engine (<a href="https://github.com/pragmagic/godot-nim">GitHub</a>)</h1><br/>
|
||||||
|
<a href='master/index.html'>master</a><br/><a href='v0.5.0/index.html'>v0.5.0</a><br/><a href='v0.5.1/index.html'>v0.5.1</a><br/><a href='v0.5.2/index.html'>v0.5.2</a><br/><a href='v0.5.3/index.html'>v0.5.3</a><br/><a href='v0.5.4/index.html'>v0.5.4</a><br/><a href='v0.5.5/index.html'>v0.5.5</a><br/><a href='v0.7.2/index.html'>v0.7.2</a><br/><a href='v0.7.4/index.html'>v0.7.4</a><br/><a href='v0.7.5/index.html'>v0.7.5</a><br/><a href='v0.7.6/index.html'>v0.7.6</a><br/><a href='v0.7.8/index.html'>v0.7.8</a><br/>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
1544
master/aabb.html
Normal file
1544
master/aabb.html
Normal file
File diff suppressed because it is too large
Load diff
1733
master/arrays.html
Normal file
1733
master/arrays.html
Normal file
File diff suppressed because it is too large
Load diff
1956
master/basis.html
Normal file
1956
master/basis.html
Normal file
File diff suppressed because it is too large
Load diff
1455
master/colors.html
Normal file
1455
master/colors.html
Normal file
File diff suppressed because it is too large
Load diff
1568
master/dictionaries.html
Normal file
1568
master/dictionaries.html
Normal file
File diff suppressed because it is too large
Load diff
1268
master/godot.html
Normal file
1268
master/godot.html
Normal file
File diff suppressed because it is too large
Load diff
1445
master/godotapi/a_star.html
Normal file
1445
master/godotapi/a_star.html
Normal file
File diff suppressed because it is too large
Load diff
1382
master/godotapi/accept_dialog.html
Normal file
1382
master/godotapi/accept_dialog.html
Normal file
File diff suppressed because it is too large
Load diff
1448
master/godotapi/animated_sprite.html
Normal file
1448
master/godotapi/animated_sprite.html
Normal file
File diff suppressed because it is too large
Load diff
1378
master/godotapi/animated_sprite_3d.html
Normal file
1378
master/godotapi/animated_sprite_3d.html
Normal file
File diff suppressed because it is too large
Load diff
1691
master/godotapi/animation.html
Normal file
1691
master/godotapi/animation.html
Normal file
File diff suppressed because it is too large
Load diff
1654
master/godotapi/animation_player.html
Normal file
1654
master/godotapi/animation_player.html
Normal file
File diff suppressed because it is too large
Load diff
1909
master/godotapi/animation_tree_player.html
Normal file
1909
master/godotapi/animation_tree_player.html
Normal file
File diff suppressed because it is too large
Load diff
1694
master/godotapi/area.html
Normal file
1694
master/godotapi/area.html
Normal file
File diff suppressed because it is too large
Load diff
1641
master/godotapi/area_2d.html
Normal file
1641
master/godotapi/area_2d.html
Normal file
File diff suppressed because it is too large
Load diff
1632
master/godotapi/array_mesh.html
Normal file
1632
master/godotapi/array_mesh.html
Normal file
File diff suppressed because it is too large
Load diff
1321
master/godotapi/arvr_anchor.html
Normal file
1321
master/godotapi/arvr_anchor.html
Normal file
File diff suppressed because it is too large
Load diff
1268
master/godotapi/arvr_camera.html
Normal file
1268
master/godotapi/arvr_camera.html
Normal file
File diff suppressed because it is too large
Load diff
1353
master/godotapi/arvr_controller.html
Normal file
1353
master/godotapi/arvr_controller.html
Normal file
File diff suppressed because it is too large
Load diff
1480
master/godotapi/arvr_interface.html
Normal file
1480
master/godotapi/arvr_interface.html
Normal file
File diff suppressed because it is too large
Load diff
1268
master/godotapi/arvr_interface_gd_native.html
Normal file
1268
master/godotapi/arvr_interface_gd_native.html
Normal file
File diff suppressed because it is too large
Load diff
1293
master/godotapi/arvr_origin.html
Normal file
1293
master/godotapi/arvr_origin.html
Normal file
File diff suppressed because it is too large
Load diff
1448
master/godotapi/arvr_positional_tracker.html
Normal file
1448
master/godotapi/arvr_positional_tracker.html
Normal file
File diff suppressed because it is too large
Load diff
1480
master/godotapi/arvr_server.html
Normal file
1480
master/godotapi/arvr_server.html
Normal file
File diff suppressed because it is too large
Load diff
1336
master/godotapi/atlas_texture.html
Normal file
1336
master/godotapi/atlas_texture.html
Normal file
File diff suppressed because it is too large
Load diff
1268
master/godotapi/audio_bus_layout.html
Normal file
1268
master/godotapi/audio_bus_layout.html
Normal file
File diff suppressed because it is too large
Load diff
1268
master/godotapi/audio_effect.html
Normal file
1268
master/godotapi/audio_effect.html
Normal file
File diff suppressed because it is too large
Load diff
1294
master/godotapi/audio_effect_amplify.html
Normal file
1294
master/godotapi/audio_effect_amplify.html
Normal file
File diff suppressed because it is too large
Load diff
1268
master/godotapi/audio_effect_band_limit_filter.html
Normal file
1268
master/godotapi/audio_effect_band_limit_filter.html
Normal file
File diff suppressed because it is too large
Load diff
1268
master/godotapi/audio_effect_band_pass_filter.html
Normal file
1268
master/godotapi/audio_effect_band_pass_filter.html
Normal file
File diff suppressed because it is too large
Load diff
1702
master/godotapi/audio_effect_chorus.html
Normal file
1702
master/godotapi/audio_effect_chorus.html
Normal file
File diff suppressed because it is too large
Load diff
1388
master/godotapi/audio_effect_compressor.html
Normal file
1388
master/godotapi/audio_effect_compressor.html
Normal file
File diff suppressed because it is too large
Load diff
1481
master/godotapi/audio_effect_delay.html
Normal file
1481
master/godotapi/audio_effect_delay.html
Normal file
File diff suppressed because it is too large
Load diff
1403
master/godotapi/audio_effect_distortion.html
Normal file
1403
master/godotapi/audio_effect_distortion.html
Normal file
File diff suppressed because it is too large
Load diff
1302
master/godotapi/audio_effect_eq.html
Normal file
1302
master/godotapi/audio_effect_eq.html
Normal file
File diff suppressed because it is too large
Load diff
1268
master/godotapi/audio_effect_eq10.html
Normal file
1268
master/godotapi/audio_effect_eq10.html
Normal file
File diff suppressed because it is too large
Load diff
1268
master/godotapi/audio_effect_eq21.html
Normal file
1268
master/godotapi/audio_effect_eq21.html
Normal file
File diff suppressed because it is too large
Load diff
1268
master/godotapi/audio_effect_eq6.html
Normal file
1268
master/godotapi/audio_effect_eq6.html
Normal file
File diff suppressed because it is too large
Load diff
1376
master/godotapi/audio_effect_filter.html
Normal file
1376
master/godotapi/audio_effect_filter.html
Normal file
File diff suppressed because it is too large
Load diff
1268
master/godotapi/audio_effect_high_pass_filter.html
Normal file
1268
master/godotapi/audio_effect_high_pass_filter.html
Normal file
File diff suppressed because it is too large
Load diff
1268
master/godotapi/audio_effect_high_shelf_filter.html
Normal file
1268
master/godotapi/audio_effect_high_shelf_filter.html
Normal file
File diff suppressed because it is too large
Load diff
1343
master/godotapi/audio_effect_limiter.html
Normal file
1343
master/godotapi/audio_effect_limiter.html
Normal file
File diff suppressed because it is too large
Load diff
1268
master/godotapi/audio_effect_low_pass_filter.html
Normal file
1268
master/godotapi/audio_effect_low_pass_filter.html
Normal file
File diff suppressed because it is too large
Load diff
1268
master/godotapi/audio_effect_low_shelf_filter.html
Normal file
1268
master/godotapi/audio_effect_low_shelf_filter.html
Normal file
File diff suppressed because it is too large
Load diff
1268
master/godotapi/audio_effect_notch_filter.html
Normal file
1268
master/godotapi/audio_effect_notch_filter.html
Normal file
File diff suppressed because it is too large
Load diff
1293
master/godotapi/audio_effect_panner.html
Normal file
1293
master/godotapi/audio_effect_panner.html
Normal file
File diff suppressed because it is too large
Load diff
1356
master/godotapi/audio_effect_phaser.html
Normal file
1356
master/godotapi/audio_effect_phaser.html
Normal file
File diff suppressed because it is too large
Load diff
1295
master/godotapi/audio_effect_pitch_shift.html
Normal file
1295
master/godotapi/audio_effect_pitch_shift.html
Normal file
File diff suppressed because it is too large
Load diff
1399
master/godotapi/audio_effect_reverb.html
Normal file
1399
master/godotapi/audio_effect_reverb.html
Normal file
File diff suppressed because it is too large
Load diff
1327
master/godotapi/audio_effect_stereo_enhance.html
Normal file
1327
master/godotapi/audio_effect_stereo_enhance.html
Normal file
File diff suppressed because it is too large
Load diff
1590
master/godotapi/audio_server.html
Normal file
1590
master/godotapi/audio_server.html
Normal file
File diff suppressed because it is too large
Load diff
1286
master/godotapi/audio_stream.html
Normal file
1286
master/godotapi/audio_stream.html
Normal file
File diff suppressed because it is too large
Load diff
1325
master/godotapi/audio_stream_ogg_vorbis.html
Normal file
1325
master/godotapi/audio_stream_ogg_vorbis.html
Normal file
File diff suppressed because it is too large
Load diff
1268
master/godotapi/audio_stream_playback.html
Normal file
1268
master/godotapi/audio_stream_playback.html
Normal file
File diff suppressed because it is too large
Load diff
1474
master/godotapi/audio_stream_player.html
Normal file
1474
master/godotapi/audio_stream_player.html
Normal file
File diff suppressed because it is too large
Load diff
1476
master/godotapi/audio_stream_player_2d.html
Normal file
1476
master/godotapi/audio_stream_player_2d.html
Normal file
File diff suppressed because it is too large
Load diff
1685
master/godotapi/audio_stream_player_3d.html
Normal file
1685
master/godotapi/audio_stream_player_3d.html
Normal file
File diff suppressed because it is too large
Load diff
1311
master/godotapi/audio_stream_random_pitch.html
Normal file
1311
master/godotapi/audio_stream_random_pitch.html
Normal file
File diff suppressed because it is too large
Load diff
1436
master/godotapi/audio_stream_sample.html
Normal file
1436
master/godotapi/audio_stream_sample.html
Normal file
File diff suppressed because it is too large
Load diff
1339
master/godotapi/back_buffer_copy.html
Normal file
1339
master/godotapi/back_buffer_copy.html
Normal file
File diff suppressed because it is too large
Load diff
1525
master/godotapi/baked_lightmap.html
Normal file
1525
master/godotapi/baked_lightmap.html
Normal file
File diff suppressed because it is too large
Load diff
1409
master/godotapi/baked_lightmap_data.html
Normal file
1409
master/godotapi/baked_lightmap_data.html
Normal file
File diff suppressed because it is too large
Load diff
1503
master/godotapi/base_button.html
Normal file
1503
master/godotapi/base_button.html
Normal file
File diff suppressed because it is too large
Load diff
1345
master/godotapi/bit_map.html
Normal file
1345
master/godotapi/bit_map.html
Normal file
File diff suppressed because it is too large
Load diff
1453
master/godotapi/bitmap_font.html
Normal file
1453
master/godotapi/bitmap_font.html
Normal file
File diff suppressed because it is too large
Load diff
1328
master/godotapi/bone_2d.html
Normal file
1328
master/godotapi/bone_2d.html
Normal file
File diff suppressed because it is too large
Load diff
1293
master/godotapi/bone_attachment.html
Normal file
1293
master/godotapi/bone_attachment.html
Normal file
File diff suppressed because it is too large
Load diff
1332
master/godotapi/box_container.html
Normal file
1332
master/godotapi/box_container.html
Normal file
File diff suppressed because it is too large
Load diff
1293
master/godotapi/box_shape.html
Normal file
1293
master/godotapi/box_shape.html
Normal file
File diff suppressed because it is too large
Load diff
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue