Compare commits
88 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4175dbb3e5 | ||
| 7eadb07820 | |||
|
|
00d8ac2691 | ||
|
|
388bea9205 | ||
|
|
f25c3c7a5d | ||
|
|
d3e5f91b40 | ||
|
|
3f46e3c648 | ||
|
|
87707a86b4 | ||
|
|
031774f54f | ||
|
|
ed9ede5cb3 | ||
|
|
a49fcbdac7 | ||
|
|
157a90e4a0 |
||
|
|
d1b82d351c | ||
|
|
78d3626fa3 | ||
|
|
1b8e7ccd98 | ||
|
|
c2db807da4 | ||
|
|
7dd1b1ed5f | ||
|
|
2f3f4034cf | ||
|
|
19b0c23d62 | ||
|
|
0fecfdb3b8 | ||
|
|
34fda99def | ||
|
|
3a935b9308 | ||
|
|
f45281f5a0 | ||
|
|
db4bb91765 | ||
|
|
e9d73d8ec4 | ||
|
|
859f9f04fb | ||
|
|
ceaf66a34c | ||
|
|
fd5f77e7c2 | ||
|
|
8d68051f23 | ||
|
|
13f5aba3fe | ||
|
|
b3ad6134d9 | ||
|
|
1e8ccfea2b | ||
|
|
9e61030817 | ||
|
|
66c939b9e6 | ||
|
|
76de026b4f | ||
|
|
4eb771e9be | ||
|
|
2dd0130c78 | ||
|
|
651c2d823c | ||
|
|
8b1ac6d835 | ||
|
|
21ca9a088b | ||
|
|
96dfc7de90 | ||
|
|
a1d1481967 | ||
|
|
6e014bbc01 | ||
|
|
dc6ebaf575 | ||
|
|
be6f01e3b7 | ||
|
|
d11856377e | ||
|
|
0aab6e17ef | ||
|
|
5ccf351b5a | ||
|
|
f05eb090f7 | ||
|
|
e3216f09d0 | ||
|
|
ae3171cb98 | ||
|
|
d4ab8a5524 | ||
|
|
09326f5104 | ||
|
|
d89073bac8 | ||
|
|
e2feb06468 | ||
|
|
4d19140d7c | ||
|
|
72dd992e66 | ||
|
|
50835baca8 | ||
|
|
c06792df8d | ||
|
|
8d6972f729 | ||
|
|
0d21c361d0 | ||
|
|
3e1e8f1073 | ||
|
|
e2049ff1a7 | ||
|
|
4e24244c48 | ||
|
|
a1c378301a | ||
|
|
bf5bd54356 | ||
|
|
cc6bfa0045 | ||
|
|
a93dcd1d4d | ||
|
|
e494dc914a | ||
|
|
26570707aa | ||
|
|
d2b86a2b94 | ||
|
|
1b47dac4e9 | ||
|
|
7f73a89878 | ||
|
|
c5d7680e53 | ||
|
|
f5abff05e6 | ||
|
|
54d962afd4 | ||
|
|
b62db02d8f | ||
|
|
cf75723fa1 | ||
|
|
178192651f | ||
|
|
77a8cf7815 | ||
|
|
99934854d0 | ||
|
|
ee53768c13 | ||
|
|
b5fd4295e6 | ||
|
|
e3c014a359 | ||
|
|
2db2e413a9 | ||
|
|
7e23048048 | ||
|
|
2c226b90e2 | ||
|
|
fda800fd26 |
43 changed files with 6613 additions and 2194 deletions
|
|
@ -27,7 +27,7 @@ addons:
|
|||
- libxrandr-dev
|
||||
|
||||
before_install:
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install scons ; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then rvm --default use 2.3; brew update; brew install scons ; fi
|
||||
|
||||
install:
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export GODOT_PLATFORM=osx; else export GODOT_PLATFORM=x11; fi
|
||||
|
|
@ -49,6 +49,5 @@ script:
|
|||
- set -e
|
||||
- mkdir godotapi
|
||||
- nim c -d:release -r godot/godotapigen.nim "$GODOT_BIN" godotapi
|
||||
- nimble install -y
|
||||
- nim c -d:useRealtimeGc -c godotapi/godotall.nim
|
||||
- nim c -d:useRealtimeGc --path:godot -c godotapi/godotall.nim
|
||||
- nim c -d:release -r docs/docpublish.nim
|
||||
|
|
|
|||
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
|
|
@ -9,7 +9,7 @@
|
|||
"godot/godotapigen.nim"],
|
||||
"nim.buildOnSave": false,
|
||||
"nim.lintOnSave": true,
|
||||
"nim.licenseString": "# Copyright 2017 Xored Software, Inc.\n\n",
|
||||
"nim.licenseString": "# Copyright 2018 Xored Software, Inc.\n\n",
|
||||
"files.exclude": {
|
||||
"**/nimcache/**": true
|
||||
}
|
||||
|
|
|
|||
2
LICENSE
2
LICENSE
|
|
@ -2,7 +2,7 @@ godot-nim - Nim bindings for Godot Engine
|
|||
|
||||
The MIT License
|
||||
|
||||
Copyright (c) 2017 Xored Software Inc.
|
||||
Copyright (c) 2018 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,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Nim bindings for Godot Engine [](https://travis-ci.org/pragmagic/godot-nim)
|
||||
# Nim bindings for Godot Engine
|
||||
|
||||
Nim bindings for Godot 3.0 based on [GDNative](https://godotengine.org/article/dlscript-here).
|
||||
Nim bindings for Godot 3 based on [GDNative](https://godotengine.org/article/dlscript-here).
|
||||
|
||||
Documentation: https://pragmagic.github.io/godot-nim/
|
||||
|
||||
|
|
@ -13,4 +13,4 @@ Documentation: https://pragmagic.github.io/godot-nim/
|
|||
|
||||
This project is licensed under the MIT license. Read [LICENSE](LICENSE) file for details.
|
||||
|
||||
Copyright (c) 2017 Xored Software, Inc.
|
||||
Copyright (c) 2018 Xored Software, Inc.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright 2017 Xored Software, Inc.
|
||||
# Copyright 2018 Xored Software, Inc.
|
||||
|
||||
import threadpool, os, osproc, strutils, sequtils, pegs
|
||||
|
||||
|
|
@ -71,7 +71,7 @@ proc fixupHrefs(file: string) =
|
|||
|
||||
proc getGitHash(): string =
|
||||
result = execProcess("git rev-parse HEAD")
|
||||
if not result.isNil and result.len > 0:
|
||||
if result.len > 0:
|
||||
result = result.replace("\L", "").replace("\r", "")
|
||||
|
||||
proc buildDocs*(outDir, godotNimDir, godotBin: string) =
|
||||
|
|
@ -94,7 +94,8 @@ proc buildDocs*(outDir, godotNimDir, godotBin: string) =
|
|||
allNimFiles.add(file)
|
||||
for file in allNimFiles:
|
||||
spawn execOrFail(
|
||||
"nim doc -o:" & quoted(outName(outDirAbs, file)) &
|
||||
"nim doc -d:useRealtimeGc --path:godot -o:" &
|
||||
quoted(outName(outDirAbs, file)) &
|
||||
" --git.url:" & quoted(gitHubUrl) &
|
||||
" --git.commit:" & quoted(gitCommit) &
|
||||
' ' & quoted(file))
|
||||
|
|
@ -103,14 +104,15 @@ proc buildDocs*(outDir, godotNimDir, godotBin: string) =
|
|||
createDir(godotApiFolder)
|
||||
genApiFiles(godotApiFolder, godotBinAbs)
|
||||
for file in walkDirRec(godotApiFolder, {pcFile, pcDir}, [".nim"]):
|
||||
spawn execOrFail("nim doc " & quoted(file))
|
||||
spawn execOrFail("nim doc -d:useRealtimeGc --path:godot -o:" &
|
||||
quoted(outName(godotApiFolder, file)) & ' ' & quoted(file))
|
||||
|
||||
sync()
|
||||
|
||||
var gitHash: string
|
||||
withDir(godotBinAbs.parentDir()):
|
||||
gitHash = getGitHash()
|
||||
if gitHash.isNil or gitHash.len == 0:
|
||||
if gitHash.len == 0:
|
||||
raise newException(Exception,
|
||||
"Godot executable is not under Git repository")
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright 2017 Xored Software, Inc.
|
||||
# Copyright 2018 Xored Software, Inc.
|
||||
|
||||
import os, pegs, strutils
|
||||
import docbuild
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ Nim bindings for Godot Engine
|
|||
:Author: Ruslan Mustakov
|
||||
:Version: |godotnimversion|
|
||||
:GitHub: `$GODOTNIM_GITHUB_URL <$GODOTNIM_GITHUB_URL>`_
|
||||
:License: MIT
|
||||
|
||||
.. contents::
|
||||
|
||||
|
|
@ -32,41 +33,24 @@ which adds features for editing GDScript and Godot resource files.
|
|||
Getting Started
|
||||
===============
|
||||
|
||||
Building Godot
|
||||
Getting Godot
|
||||
--------------
|
||||
|
||||
The library requires a not yet released Godot version 3.0, which you can
|
||||
build yourself by running the commands below (requires
|
||||
`Git <https://git-scm.com/downloads>`_,
|
||||
`Python 2.7 <https://www.python.org/downloads/>`_,
|
||||
`SCons <http://www.scons.org/>`_):
|
||||
The library requires Godot version 3.0, which you can get here:
|
||||
https://godotengine.org/download
|
||||
|
||||
.. code-block:: bash
|
||||
git clone https://github.com/godotengine/godot.git
|
||||
cd godot
|
||||
scons platform=<your_platform>
|
||||
|
||||
where ``<your_platform>`` can be ``windows``, ``osx``, ``x11``. After build
|
||||
is finished, Godot binaries will be under the ``bin`` folder. More details
|
||||
about compiling Godot can be found in `Godot documentation
|
||||
<https://godot.readthedocs.io/en/stable/development/compiling/index.html>`_.
|
||||
|
||||
|
||||
Building Nim
|
||||
Installing Nim
|
||||
-------------
|
||||
|
||||
The library requires a not yet released Nim version 0.17.1, which you can
|
||||
build yourself by following instructions in the
|
||||
`Nim repository <https://github.com/nim-lang/Nim>`_. Make sure to also run
|
||||
``./koch tools -d:release`` after the steps described there to build ``nimble``
|
||||
(package manager) and ``nimsuggest`` (IDE helper tool,
|
||||
used by VSCode Nim plugin)
|
||||
The library requires Nim version 0.18.0 or newer, which you can get here:
|
||||
https://nim-lang.org/install.html
|
||||
|
||||
Make sure you also have ``nimble`` (Nim's package manager) installed.
|
||||
|
||||
Creating Project
|
||||
----------------
|
||||
|
||||
The fastest way to set up a Godot-Nim project is to use an existing stub:
|
||||
The fastest way to set up a Godot-Nim project is to use the existing stub:
|
||||
|
||||
.. code-block:: bash
|
||||
git clone --depth=1 https://github.com/pragmagic/godot-nim-stub.git myproject
|
||||
|
|
@ -91,7 +75,7 @@ If you would like to use Nim in an existing project:
|
|||
build scripts (``nakefile.nim``, ``src/stub.nimble``) according to your
|
||||
own project structure.
|
||||
|
||||
2. Copy ``project/nimlib.tres`` to your Godot project folder. It is a
|
||||
2. Copy ``nimlib.gdnlib`` to your Godot project folder. It is a
|
||||
GDNative library resource that contains paths to dynamic libraries
|
||||
compiled by Nim.
|
||||
|
||||
|
|
@ -155,7 +139,7 @@ exported and you don't have to import any of them directly.
|
|||
* `quats <quats.html>`_ Defines ``Quat`` (quaternion) describing object
|
||||
rotation in 3D space.
|
||||
* `rect2 <rect2.html>`_ Defines ``Rect2`` - a 2D rectangle.
|
||||
* `rect3 <rect3.html>`_ Defines ``Rect3`` - a 3D box.
|
||||
* `aabb <aabb.html>`_ Defines ``AABB`` - a 3D box.
|
||||
* `rids <rids.html>`_ Defines ``RID`` - a resource identifier.
|
||||
* `transform2d <transform2d.html>`_ Defines ``Transform2D``.
|
||||
* `transforms <transforms.html>`_ Defines ``Transform``.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
version = "0.5.4"
|
||||
version = "0.8.2"
|
||||
author = "Xored Software, Inc."
|
||||
description = "Godot Engine bindings"
|
||||
license = "MIT"
|
||||
srcDir = "godot"
|
||||
|
||||
requires "nim >= 0.17.0", "compiler >= 0.17.0"
|
||||
requires "nim >= 0.17.3", "compiler >= 0.17.3"
|
||||
79
godot/core/aabb.nim
Normal file
79
godot/core/aabb.nim
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
# Copyright (c) 2018 Xored Software, Inc.
|
||||
|
||||
import hashes
|
||||
|
||||
import vector3
|
||||
import internal/godotinternaltypes, internal/godotstrings
|
||||
import godotcoretypes, gdnativeapi
|
||||
|
||||
proc initAABB*(pos, size: Vector3): AABB {.inline.} =
|
||||
AABB(position: pos, size: size)
|
||||
|
||||
proc `$`*(self: AABB): string {.inline.} =
|
||||
$getGDNativeAPI().aabbAsString(self)
|
||||
|
||||
proc hash*(self: AABB): Hash {.inline.} =
|
||||
!$(self.position.hash() !& self.size.hash())
|
||||
|
||||
proc area*(self: AABB): float32 {.inline.} =
|
||||
getGDNativeAPI().aabbGetArea(self)
|
||||
|
||||
proc hasNoArea*(self: AABB): bool {.inline.} =
|
||||
getGDNativeAPI().aabbHasNoArea(self)
|
||||
|
||||
proc hasNoSurface*(self: AABB): bool {.inline.} =
|
||||
getGDNativeAPI().aabbHasNoSurface(self)
|
||||
|
||||
proc intersects*(self, other: AABB): bool {.inline.} =
|
||||
getGDNativeAPI().aabbIntersects(self, other)
|
||||
|
||||
proc encloses*(self, other: AABB): bool {.inline.} =
|
||||
getGDNativeAPI().aabbEncloses(self, other)
|
||||
|
||||
proc merge*(self, other: AABB): AABB {.inline.} =
|
||||
getGDNativeAPI().aabbMerge(self, other).toAABB()
|
||||
|
||||
proc intersection*(self, other: AABB): AABB {.inline.} =
|
||||
getGDNativeAPI().aabbIntersection(self, other).toAABB()
|
||||
|
||||
proc intersectsPlane*(self: AABB; plane: Plane): bool {.inline.} =
|
||||
getGDNativeAPI().aabbIntersectsPlane(self, plane)
|
||||
|
||||
proc intersectsSegment*(self: AABB; start, to: Vector3): bool {.inline.} =
|
||||
getGDNativeAPI().aabbIntersectsSegment(self, start, to)
|
||||
|
||||
proc contains*(self: AABB; point: Vector3): bool {.inline.} =
|
||||
getGDNativeAPI().aabbHasPoint(self, point)
|
||||
|
||||
proc getSupport*(self: AABB; dir: Vector3): Vector3 {.inline.} =
|
||||
getGDNativeAPI().aabbGetSupport(self, dir).toVector3()
|
||||
|
||||
proc getLongestAxis*(self: AABB): Vector3 {.inline.} =
|
||||
getGDNativeAPI().aabbGetLongestAxis(self).toVector3()
|
||||
|
||||
proc getLongestAxisIndex*(self: AABB): cint {.inline.} =
|
||||
getGDNativeAPI().aabbGetLongestAxisIndex(self)
|
||||
|
||||
proc getLongestAxisSize*(self: AABB): float32 {.inline.} =
|
||||
getGDNativeAPI().aabbGetLongestAxisSize(self)
|
||||
|
||||
proc getShortestAxis*(self: AABB): Vector3 {.inline.} =
|
||||
getGDNativeAPI().aabbGetShortestAxis(self).toVector3()
|
||||
|
||||
proc getShortestAxisIndex*(self: AABB): cint {.inline.} =
|
||||
getGDNativeAPI().aabbGetShortestAxisIndex(self)
|
||||
|
||||
proc getShortestAxisSize*(self: AABB): float32 {.inline.} =
|
||||
getGDNativeAPI().aabbGetShortestAxisSize(self)
|
||||
|
||||
proc expand*(self: AABB; toPoint: Vector3): AABB {.inline.} =
|
||||
getGDNativeAPI().aabbExpand(self, toPoint).toAABB()
|
||||
|
||||
proc grow*(self: AABB; by: float32): AABB {.inline.} =
|
||||
getGDNativeAPI().aabbGrow(self, by).toAABB()
|
||||
|
||||
proc getEndpoint*(self: AABB; idx: cint): Vector3 {.inline.} =
|
||||
getGDNativeAPI().aabbGetEndpoint(self, idx).toVector3()
|
||||
|
||||
proc `==`*(a, b: AABB): bool {.inline.} =
|
||||
getGDNativeAPI().aabbOperatorEqual(a, b)
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
# Copyright 2017 Xored Software, Inc.
|
||||
# Copyright 2018 Xored Software, Inc.
|
||||
|
||||
import hashes
|
||||
import internal.godotarrays
|
||||
import internal/godotinternaltypes, internal/godotarrays
|
||||
|
||||
type
|
||||
Array* = ref object
|
||||
|
|
@ -62,16 +62,16 @@ proc newArray*(pba: PoolByteArray): Array {.inline.} =
|
|||
new(result, arrayFinalizer)
|
||||
initGodotArray(result.godotArray, pba.godotPoolByteArray[])
|
||||
|
||||
proc `[]=`*(self: var Array; idx: int; value: Variant) {.inline.} =
|
||||
proc `[]=`*(self: Array; idx: int; value: Variant) {.inline.} =
|
||||
self.godotArray[idx.cint] = value.godotVariant[]
|
||||
|
||||
proc `[]`*(self: Array; idx: int): Variant {.inline.} =
|
||||
newVariant(self.godotArray[idx.cint])
|
||||
|
||||
proc add*(self: var Array; value: Variant) {.inline.} =
|
||||
proc add*(self: Array; value: Variant) {.inline.} =
|
||||
self.godotArray.add(value.godotVariant[])
|
||||
|
||||
proc clear*(self: var Array) {.inline.} =
|
||||
proc clear*(self: Array) {.inline.} =
|
||||
self.godotArray.clear()
|
||||
|
||||
proc count*(self: Array; value: Variant): int {.inline.} =
|
||||
|
|
@ -80,7 +80,7 @@ proc count*(self: Array; value: Variant): int {.inline.} =
|
|||
proc isEmpty*(self: Array): bool {.inline.} =
|
||||
self.godotArray.isEmpty()
|
||||
|
||||
proc erase*(self: var Array; value: Variant) {.inline.} =
|
||||
proc erase*(self: Array; value: Variant) {.inline.} =
|
||||
self.godotArray.erase(value.godotVariant[])
|
||||
|
||||
proc first*(self: Array): Variant {.inline.} =
|
||||
|
|
@ -101,37 +101,37 @@ proc contains*(self: Array; value: Variant): bool {.inline.} =
|
|||
proc hash*(self: Array): Hash {.inline.} =
|
||||
hash(self.godotArray.godotHash())
|
||||
|
||||
proc insert*(self: var Array; pos: int; value: Variant) {.inline.} =
|
||||
proc insert*(self: Array; pos: int; value: Variant) {.inline.} =
|
||||
self.godotArray.insert(pos.cint, value.godotVariant[])
|
||||
|
||||
proc reverse*(self: var Array) {.inline.} =
|
||||
proc reverse*(self: Array) {.inline.} =
|
||||
self.godotArray.reverse()
|
||||
|
||||
proc popLast*(self: var Array): Variant {.inline.} =
|
||||
proc popLast*(self: Array): Variant {.inline.} =
|
||||
newVariant(self.godotArray.popLast())
|
||||
|
||||
proc popFirst*(self: var Array): Variant {.inline.} =
|
||||
proc popFirst*(self: Array): Variant {.inline.} =
|
||||
newVariant(self.godotArray.popFirst())
|
||||
|
||||
proc addLast*(self: var Array; value: Variant) {.inline.} =
|
||||
proc addLast*(self: Array; value: Variant) {.inline.} =
|
||||
self.godotArray.addLast(value.godotVariant[])
|
||||
|
||||
proc addFirst*(self: var Array; value: Variant) {.inline.} =
|
||||
proc addFirst*(self: Array; value: Variant) {.inline.} =
|
||||
self.godotArray.addFirst(value.godotVariant[])
|
||||
|
||||
proc delete*(self: var Array; idx: int) {.inline.} =
|
||||
proc delete*(self: Array; idx: int) {.inline.} =
|
||||
self.godotArray.delete(idx.cint)
|
||||
|
||||
proc setLen*(self: var Array; size: int) {.inline.} =
|
||||
proc setLen*(self: Array; size: int) {.inline.} =
|
||||
self.godotArray.setLen(size.cint)
|
||||
|
||||
proc rfind*(self: Array; what: Variant; f: int): int {.inline.} =
|
||||
self.godotArray.rfind(what.godotVariant[], f.cint).int
|
||||
proc rfind*(self: Array; what: Variant; fromIdx: int): int {.inline.} =
|
||||
self.godotArray.rfind(what.godotVariant[], fromIdx.cint).int
|
||||
|
||||
proc len*(self: Array): int {.inline.} =
|
||||
self.godotArray.len.int
|
||||
|
||||
proc sort*(self: var Array) {.inline.} =
|
||||
proc sort*(self: Array) {.inline.} =
|
||||
self.godotArray.sort()
|
||||
|
||||
iterator items*(self: Array): Variant =
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
# Copyright (c) 2017 Xored Software, Inc.
|
||||
# Copyright (c) 2018 Xored Software, Inc.
|
||||
|
||||
import math, hashes
|
||||
|
||||
import math
|
||||
import godotbase, vector3, quats
|
||||
import godotcoretypes
|
||||
|
||||
type
|
||||
Basis* {.byref.} = object
|
||||
elements*: array[3, Vector3]
|
||||
{.push stackTrace: off.}
|
||||
|
||||
proc setCells*(basis: var Basis, xx, xy, xz, yx, yy, yz, zx, zy, zz: float32) =
|
||||
basis.elements[0].x = xx
|
||||
|
|
@ -202,6 +202,9 @@ proc `$`*(self: Basis): string {.inline.} =
|
|||
result.add(", ")
|
||||
result.add($self[i][j])
|
||||
|
||||
proc hash*(self: Basis): Hash {.inline.} =
|
||||
!$(self.elements[0].hash() !& self.elements[1].hash() !& self.elements[2].hash())
|
||||
|
||||
template cofac(row1, col1, row2, col2: int): float32 =
|
||||
self.elements[row1][col1] * self.elements[row2][col2] -
|
||||
self.elements[row1][col2] * self.elements[row2][col1]
|
||||
|
|
@ -452,3 +455,5 @@ proc rotate*(self: var Vector3; axis: Vector3; phi: float32) =
|
|||
proc rotated*(self: Vector3; axis: Vector3; phi: float32): Vector3 =
|
||||
result = self
|
||||
result.rotate(axis, phi)
|
||||
|
||||
{.pop.} # stackTrace: off
|
||||
|
|
@ -1,11 +1,8 @@
|
|||
# Copyright (c) 2017 Xored Software, Inc.
|
||||
# Copyright (c) 2018 Xored Software, Inc.
|
||||
|
||||
type
|
||||
Color* {.byref.} = object
|
||||
r*: float32
|
||||
g*: float32
|
||||
b*: float32
|
||||
a*: float32
|
||||
import hashes
|
||||
|
||||
import godotcoretypes, gdnativeapi
|
||||
|
||||
proc initColor*(r, g, b: float32; a: float32 = 1.0'f32): Color {.inline.} =
|
||||
Color(
|
||||
|
|
@ -19,12 +16,14 @@ proc initColor*(): Color {.inline.} =
|
|||
## Initializes black color with 1.0 alpha
|
||||
initColor(0, 0, 0)
|
||||
|
||||
proc h*(self: Color): float32 {.
|
||||
importc: "godot_color_get_h".}
|
||||
proc s*(self: Color): float32 {.
|
||||
importc: "godot_color_get_s".}
|
||||
proc v*(self: Color): float32 {.
|
||||
importc: "godot_color_get_v".}
|
||||
proc h*(self: Color): float32 {.inline.} =
|
||||
getGDNativeAPI().colorGetH(self)
|
||||
|
||||
proc s*(self: Color): float32 {.inline.} =
|
||||
getGDNativeAPI().colorGetS(self)
|
||||
|
||||
proc v*(self: Color): float32 {.inline.} =
|
||||
getGDNativeAPI().colorGetV(self)
|
||||
|
||||
proc `$`*(self: Color): string {.inline.} =
|
||||
result = newStringOfCap(50)
|
||||
|
|
@ -36,6 +35,9 @@ proc `$`*(self: Color): string {.inline.} =
|
|||
result.add(", ")
|
||||
result.add($self.a)
|
||||
|
||||
proc hash*(self: Color): Hash {.inline.} =
|
||||
!$(self.r.hash() !& self.g.hash() !& self.b.hash() !& self.a.hash())
|
||||
|
||||
proc toHex(val: float32, target: var string, targetIdx: int) =
|
||||
let val = clamp(int(val * 255), 0, 255)
|
||||
let nums = [(val and 0xF0) shr 4, val and 0xF]
|
||||
|
|
@ -58,16 +60,20 @@ proc toARGB32*(self: Color): uint32 {.inline.} =
|
|||
result = (result shl 8) or uint8(self.g * 255)
|
||||
result = (result shl 8) or uint8(self.b * 255)
|
||||
|
||||
proc gray*(self: Color): float32 {.
|
||||
importc: "godot_color_gray".}
|
||||
proc inverted*(self: Color): Color {.
|
||||
importc: "godot_color_inverted".}
|
||||
proc contrasted*(self: Color): Color {.
|
||||
importc: "godot_color_contrasted".}
|
||||
proc lerp*(self: Color; b: Color; t: float32): Color {.
|
||||
importc: "godot_color_linear_interpolate".}
|
||||
proc blend*(self: Color; over: Color): Color {.
|
||||
importc: "godot_color_blend".}
|
||||
proc gray*(self: Color): float32 {.inline.} =
|
||||
getGDNativeAPI().colorGray(self)
|
||||
|
||||
proc inverted*(self: Color): Color {.inline.} =
|
||||
getGDNativeAPI().colorInverted(self).toColor()
|
||||
|
||||
proc contrasted*(self: Color): Color {.inline.} =
|
||||
getGDNativeAPI().colorContrasted(self).toColor()
|
||||
|
||||
proc lerp*(self: Color; b: Color; t: float32): Color {.inline.} =
|
||||
getGDNativeAPI().colorLinearInterpolate(self, b, t).toColor()
|
||||
|
||||
proc blend*(self: Color; over: Color): Color {.inline.} =
|
||||
getGDNativeAPI().colorBlend(self, over).toColor()
|
||||
|
||||
proc `==`*(a, b: Color): bool {.inline.} =
|
||||
a.r == b.r and a.g == b.g and a.b == b.b and a.a == b.a
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
# Copyright 2017 Xored Software, Inc.
|
||||
# Copyright 2018 Xored Software, Inc.
|
||||
|
||||
import hashes
|
||||
import internal.godotstrings, internal.godotdictionaries,
|
||||
internal.godotvariants
|
||||
import internal/godotinternaltypes, internal/godotdictionaries,
|
||||
internal/godotvariants, internal/godotstrings
|
||||
|
||||
type
|
||||
Dictionary* = ref object
|
||||
|
|
@ -30,9 +30,12 @@ proc len*(self: Dictionary): int {.inline.} =
|
|||
proc isEmpty*(self: Dictionary): bool {.inline.} =
|
||||
self.godotDictionary.isEmpty()
|
||||
|
||||
proc clear*(self: var Dictionary) {.inline.} =
|
||||
proc clear*(self: Dictionary) {.inline.} =
|
||||
self.godotDictionary.clear()
|
||||
|
||||
proc hash*(self: Dictionary): Hash {.inline.} =
|
||||
hash(self.godotDictionary.godotHash())
|
||||
|
||||
import variants, arrays
|
||||
|
||||
proc newVariant*(dict: Dictionary): Variant {.inline.} =
|
||||
|
|
@ -40,7 +43,7 @@ proc newVariant*(dict: Dictionary): Variant {.inline.} =
|
|||
initGodotVariant(result.godotVariant[], dict.godotDictionary)
|
||||
|
||||
proc asDictionary*(self: Variant): Dictionary {.inline.} =
|
||||
newDictionary(self.godotVariant[].asGodotDictionary)
|
||||
newDictionary(self.godotVariant[].asGodotDictionary())
|
||||
|
||||
proc contains*(self: Dictionary; key: Variant): bool {.inline.}=
|
||||
self.godotDictionary.contains(key.godotVariant[])
|
||||
|
|
@ -48,12 +51,9 @@ proc contains*(self: Dictionary; key: Variant): bool {.inline.}=
|
|||
proc contains*(self: Dictionary; keys: Array): bool {.inline.} =
|
||||
self.godotDictionary.contains(keys.godotArray[])
|
||||
|
||||
proc del*(self: var Dictionary; key: Variant) {.inline.} =
|
||||
proc del*(self: Dictionary; key: Variant) {.inline.} =
|
||||
self.godotDictionary.del(key.godotVariant[])
|
||||
|
||||
proc hash*(self: Dictionary): Hash {.inline.} =
|
||||
hash(self.godotDictionary.godotHash())
|
||||
|
||||
proc keys*(self: Dictionary): Array {.inline.} =
|
||||
newArray(self.godotDictionary.keys())
|
||||
|
||||
|
|
@ -71,7 +71,7 @@ proc `[]`*(self: Dictionary; keyStr: string): Variant {.inline.} =
|
|||
godotStr.deinit()
|
||||
godotVariant.deinit()
|
||||
|
||||
proc `[]=`*(self: var Dictionary; key, value: Variant) {.inline.} =
|
||||
proc `[]=`*(self: Dictionary; key, value: Variant) {.inline.} =
|
||||
self.godotDictionary[key.godotVariant[]] = value.godotVariant[]
|
||||
|
||||
proc `==`*(self, other: Dictionary): bool {.inline.} =
|
||||
|
|
|
|||
|
|
@ -1,85 +1,64 @@
|
|||
# Copyright (c) 2017 Xored Software, Inc.
|
||||
# Copyright (c) 2018 Xored Software, Inc.
|
||||
|
||||
import math
|
||||
|
||||
type
|
||||
Error* {.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
|
||||
import math, godotinternal
|
||||
|
||||
# math helpers
|
||||
|
||||
{.push stackTrace: off.}
|
||||
const EPSILON = 0.00001'f32
|
||||
proc isEqualApprox*(a, b: float32): bool {.inline.} =
|
||||
proc isEqualApprox*(a, b: float32): bool {.inline, noinit.} =
|
||||
abs(a - b) < EPSILON
|
||||
|
||||
proc isEqualApprox*(a, b: float64): bool {.inline.} =
|
||||
proc isEqualApprox*(a, b: float64): bool {.inline, noinit.} =
|
||||
abs(a - b) < EPSILON
|
||||
|
||||
proc sign*(a: float32): float32 {.inline.} =
|
||||
proc sign*(a: float32): float32 {.inline, noinit.} =
|
||||
if a < 0: -1.0'f32 else: 1.0'f32
|
||||
|
||||
proc sign*(a: float64): float64 {.inline.} =
|
||||
proc sign*(a: float64): float64 {.inline, noinit.} =
|
||||
if a < 0: -1.0'f64 else: 1.0'f64
|
||||
|
||||
proc stepify*(value, step: float64): float64 =
|
||||
proc stepify*(value, step: float64): float64 {.inline, noinit.} =
|
||||
if step != 0'f64:
|
||||
floor(value / step + 0.5'f64) * step
|
||||
else:
|
||||
value
|
||||
|
||||
proc stepify*(value, step: float32): float32 =
|
||||
proc stepify*(value, step: float32): float32 {.inline, noinit.} =
|
||||
if step != 0'f32:
|
||||
floor(value / step + 0.5'f32) * step
|
||||
else:
|
||||
value
|
||||
|
||||
when (NimMajor, NimMinor, NimPatch) < (0, 20, 4):
|
||||
# Newer Nim has these procs in system module
|
||||
|
||||
proc min*(x, y: float32): float32 {.inline, noinit.} =
|
||||
if x <= y: x else: y
|
||||
|
||||
proc abs*(x: float32): float32 {.inline, noinit.} =
|
||||
if x < 0.0: -x else: x
|
||||
|
||||
proc max*(x, y: float32): float32 {.inline, noinit.} =
|
||||
if y <= x: x else: y
|
||||
|
||||
{.pop.} # stackTrace: off
|
||||
|
||||
template printWarning*(warning: typed) =
|
||||
## Prints ``warning`` to Godot log, adding filename and line information.
|
||||
let instInfo = instantiationInfo()
|
||||
godotPrintWarning(cstring($warning), cstring"", cstring(instInfo.filename), instInfo.line.cint)
|
||||
|
||||
template printError*(error: typed) =
|
||||
## Prints ``error`` to Godot log, adding filename and line information.
|
||||
let instInfo = instantiationInfo()
|
||||
godotPrintError(cstring($error), cstring"", cstring(instInfo.filename), instInfo.line.cint)
|
||||
|
||||
proc print*(parts: varargs[string, `$`]) =
|
||||
## Prints concatenated ``parts`` to Godot log.
|
||||
var combined = ""
|
||||
for v in parts:
|
||||
combined.add(v)
|
||||
var s = combined.toGodotString()
|
||||
godotPrint(s)
|
||||
s.deinit()
|
||||
|
|
|
|||
102
godot/core/godotcoretypes.nim
Normal file
102
godot/core/godotcoretypes.nim
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
# Copyright 2018 Xored Software, Inc.
|
||||
|
||||
type
|
||||
Color* {.byref.} = object
|
||||
r*: float32
|
||||
g*: float32
|
||||
b*: float32
|
||||
a*: float32
|
||||
|
||||
Vector3* {.byref.} = object
|
||||
x*: float32
|
||||
y*: float32
|
||||
z*: float32
|
||||
|
||||
Vector2* {.byref.} = object
|
||||
x*: float32
|
||||
y*: float32
|
||||
|
||||
Plane* {.byref.} = object
|
||||
normal*: Vector3
|
||||
d*: float32
|
||||
|
||||
Basis* {.byref.} = object
|
||||
elements*: array[3, Vector3]
|
||||
|
||||
Quat* {.byref.} = object
|
||||
x*: float32
|
||||
y*: float32
|
||||
z*: float32
|
||||
w*: float32
|
||||
|
||||
AABB* {.byref.} = object
|
||||
position*: Vector3
|
||||
size*: Vector3
|
||||
|
||||
Rect2* {.byref.} = object
|
||||
position*: Vector2
|
||||
size*: Vector2
|
||||
|
||||
Transform2D* {.byref.} = object
|
||||
elements*: array[3, Vector2]
|
||||
|
||||
Transform* {.byref.} = object
|
||||
basis*: Basis
|
||||
origin*: Vector3
|
||||
|
||||
RID* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
|
||||
Error* {.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
|
||||
|
|
@ -1,6 +1,9 @@
|
|||
# Copyright 2017 Xored Software, Inc.
|
||||
# Copyright 2018 Xored Software, Inc.
|
||||
|
||||
import internal.godotnodepaths, internal.godotstrings
|
||||
import hashes
|
||||
|
||||
import internal/godotinternaltypes, internal/godotnodepaths,
|
||||
internal/godotstrings
|
||||
|
||||
type
|
||||
NodePath* = ref object
|
||||
|
|
@ -31,6 +34,9 @@ proc `$`*(self: NodePath): string {.inline.} =
|
|||
result = $s
|
||||
s.deinit()
|
||||
|
||||
proc hash*(self: NodePath): Hash {.inline.} =
|
||||
($self).hash()
|
||||
|
||||
proc isAbsolute*(self: NodePath): bool {.inline.} =
|
||||
self.path.isAbsolute()
|
||||
|
||||
|
|
@ -50,8 +56,8 @@ proc getSubname*(self: NodePath; idx: int): string {.inline.} =
|
|||
result = $s
|
||||
s.deinit()
|
||||
|
||||
proc property*(self: NodePath): string {.inline.} =
|
||||
var s = self.path.property()
|
||||
proc getConcatenatedSubnames*(self: NodePath): string {.inline.} =
|
||||
var s = self.path.getConcatenatedSubnames()
|
||||
result = $s
|
||||
s.deinit()
|
||||
|
||||
|
|
|
|||
|
|
@ -1,73 +1,66 @@
|
|||
# Copyright (c) 2017 Xored Software, Inc.
|
||||
# Copyright (c) 2018 Xored Software, Inc.
|
||||
|
||||
import hashes
|
||||
|
||||
import vector3
|
||||
|
||||
import internal.godotstrings
|
||||
import internal/godotinternaltypes, internal/godotstrings
|
||||
import godotcoretypes, gdnativeapi
|
||||
|
||||
type
|
||||
Plane* {.byref.} = object
|
||||
normal*: Vector3
|
||||
d*: float32
|
||||
proc initPlane*(a, b, c, d: float32): Plane {.inline.} =
|
||||
getGDNativeAPI().planeNewWithReals(result, a, b, c, d)
|
||||
|
||||
proc initPlane(dest: var Plane; a, b, c, d: float32) {.
|
||||
importc: "godot_plane_new_with_reals".}
|
||||
proc initPlane(dest: var Plane; v1, v2, v3: Vector3) {.
|
||||
importc: "godot_plane_new_with_vectors".}
|
||||
proc initPlane(dest: var Plane; normal: Vector3; d: float32) {.
|
||||
importc: "godot_plane_new_with_normal".}
|
||||
proc initPlane*(v1, v2, v3: Vector3): Plane {.inline.} =
|
||||
getGDNativeAPI().planeNewWithVectors(result, v1, v2, v3)
|
||||
|
||||
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".}
|
||||
proc initPlane*(normal: Vector3; d: float32): Plane {.inline.} =
|
||||
result = Plane(
|
||||
normal: normal,
|
||||
d: d
|
||||
)
|
||||
|
||||
proc `$`*(self: Plane): string {.inline.} =
|
||||
$self.toGodotString()
|
||||
$getGDNativeAPI().planeAsString(self)
|
||||
|
||||
proc hash*(self: Plane): Hash {.inline, noinit.} =
|
||||
!$(self.normal.hash() !& self.d.hash())
|
||||
|
||||
proc normalized*(self: Plane): Plane {.inline.} =
|
||||
getGDNativeAPI().planeNormalized(self).toPlane()
|
||||
|
||||
proc center*(self: Plane): Vector3 {.inline.} =
|
||||
getGDNativeAPI().planeCenter(self).toVector3()
|
||||
|
||||
proc getAnyPoint*(self: Plane): Vector3 {.inline.} =
|
||||
getGDNativeAPI().planeGetAnyPoint(self).toVector3()
|
||||
|
||||
proc isPointOver*(self: Plane; point: Vector3): bool {.inline.} =
|
||||
getGDNativeAPI().planeIsPointOver(self, point)
|
||||
|
||||
proc distanceTo*(self: Plane; point: Vector3): float32 {.inline.} =
|
||||
getGDNativeAPI().planeDistanceTo(self, point)
|
||||
|
||||
proc normalized*(self: Plane): Plane {.
|
||||
noSideEffect,
|
||||
importc: "godot_plane_normalized".}
|
||||
proc center*(self: Plane): Vector3 {.
|
||||
noSideEffect,
|
||||
importc: "godot_plane_center".}
|
||||
proc getAnyPoint*(self: Plane): Vector3 {.
|
||||
noSideEffect,
|
||||
importc: "godot_plane_get_any_point".}
|
||||
proc isPointOver*(self: Plane; point: Vector3): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_plane_is_point_over".}
|
||||
proc distanceTo*(self: Plane; point: Vector3): float32 {.
|
||||
noSideEffect,
|
||||
importc: "godot_plane_distance_to".}
|
||||
proc contains*(self: Plane; point: Vector3;
|
||||
epsilon: float32): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_plane_has_point".}
|
||||
proc project*(self: Plane; point: Vector3): Vector3 {.
|
||||
noSideEffect,
|
||||
importc: "godot_plane_project".}
|
||||
epsilon: float32): bool {.inline.} =
|
||||
getGDNativeAPI().planeHasPoint(self, point, epsilon)
|
||||
|
||||
proc project*(self: Plane; point: Vector3): Vector3 {.inline.} =
|
||||
getGDNativeAPI().planeProject(self, point).toVector3()
|
||||
|
||||
proc intersect3*(self: Plane; dest: var Vector3;
|
||||
b, c: Plane): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_plane_intersect_3".}
|
||||
b, c: Plane): bool {.inline.} =
|
||||
getGDNativeAPI().planeIntersect3(self, dest, b, c)
|
||||
|
||||
proc intersectsRay*(self: Plane; dest: var Vector3;
|
||||
v, dir: Vector3): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_plane_intersects_ray".}
|
||||
v, dir: Vector3): bool {.inline.} =
|
||||
getGDNativeAPI().planeIntersectsRay(self, dest, v, dir)
|
||||
|
||||
proc intersectsSegment*(self: Plane; dest: var Vector3;
|
||||
segmentBegin, segmentEnd: Vector3): bool {.
|
||||
noSideEffect, importc: "godot_plane_intersects_segment".}
|
||||
proc `-`*(self: Plane): Plane {.
|
||||
noSideEffect,
|
||||
importc: "godot_plane_operator_neg".}
|
||||
proc `==`*(a, b: Plane): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_plane_operator_equal".}
|
||||
segmentBegin, segmentEnd: Vector3): bool {.inline.} =
|
||||
getGDNativeAPI().planeIntersectsSegment(self, dest, segmentBegin, segmentEnd)
|
||||
|
||||
proc `-`*(self: Plane): Plane {.inline.} =
|
||||
getGDNativeAPI().planeOperatorNeg(self).toPlane()
|
||||
|
||||
proc `==`*(a, b: Plane): bool {.inline.} =
|
||||
getGDNativeAPI().planeOperatorEqual(a, b)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,11 @@
|
|||
# Copyright 2017 Xored Software, Inc.
|
||||
# Copyright 2018 Xored Software, Inc.
|
||||
|
||||
import hashes
|
||||
|
||||
import godotcoretypes
|
||||
import internal/godotinternaltypes, internal/godotpoolarrays,
|
||||
internal/godotstrings
|
||||
import vector2, vector3, colors
|
||||
import internal.godotpoolarrays, internal.godotstrings
|
||||
|
||||
template definePoolArrayBase(T, GodotT, DataT, fieldName, newProcName,
|
||||
initProcName) =
|
||||
|
|
@ -25,51 +29,11 @@ template definePoolArrayBase(T, GodotT, DataT, fieldName, newProcName,
|
|||
new(result, poolArrayFinalizer)
|
||||
result.fieldName = arr
|
||||
|
||||
template definePoolArray(T, GodotT, DataT, fieldName, newProcName, initProcName;
|
||||
noData = false) =
|
||||
|
||||
proc newProcName*(arr: Array): T {.inline.} =
|
||||
new(result, poolArrayFinalizer)
|
||||
initProcName(result.fieldName, arr.godotArray[])
|
||||
|
||||
proc add*(self: var T; arr: T) {.inline.} =
|
||||
self.fieldName.add(arr.fieldName)
|
||||
|
||||
proc delete*(self: var T; idx: int) {.inline.} =
|
||||
self.fieldName.delete(idx.cint)
|
||||
|
||||
proc reverse*(self: var T) {.inline.} =
|
||||
self.fieldName.reverse()
|
||||
|
||||
proc setLen*(self: var T; size: int) {.inline.} =
|
||||
self.fieldName.setLen(size.cint)
|
||||
|
||||
proc len*(self: T): int {.inline.} =
|
||||
self.fieldName.len.int
|
||||
|
||||
when not noData:
|
||||
proc add*(self: var T; data: DataT) {.inline.} =
|
||||
self.fieldName.add(data)
|
||||
|
||||
proc addFirst*(self: var T, data: DataT) {.inline.} =
|
||||
self.fieldName.addFirst(data)
|
||||
|
||||
proc insert*(self: var T; idx: int; data: DataT): Error {.inline.} =
|
||||
self.fieldName.insert(idx.cint, data)
|
||||
|
||||
proc `[]=`*(self: var T; idx: int; data: DataT) {.inline.} =
|
||||
self.fieldName[idx.cint] = data
|
||||
|
||||
proc `[]`*(self: T; idx: int): DataT {.inline.} =
|
||||
self.fieldName[idx.cint]
|
||||
|
||||
iterator items*(arr: T): DataT =
|
||||
for i in 0..<arr.len:
|
||||
yield arr[i]
|
||||
|
||||
iterator pairs*(arr: T): tuple[key: int, val: DataT] =
|
||||
for i in 0..<arr.len:
|
||||
yield (i, arr[i])
|
||||
proc hash*(arr: T): Hash =
|
||||
for item in arr.fieldName.items():
|
||||
result = result !&
|
||||
(when type(item) is GodotString: ($item).hash() else: item.hash())
|
||||
result = !$result
|
||||
|
||||
definePoolArrayBase(PoolByteArray, GodotPoolByteArray, uint8,
|
||||
godotPoolByteArray, newPoolByteArray,
|
||||
|
|
@ -77,7 +41,7 @@ definePoolArrayBase(PoolByteArray, GodotPoolByteArray, uint8,
|
|||
definePoolArrayBase(PoolIntArray, GodotPoolIntArray, cint,
|
||||
godotPoolIntArray, newPoolIntArray,
|
||||
initGodotPoolIntArray)
|
||||
definePoolArrayBase(PoolRealArray, GodotPoolRealArray, float64,
|
||||
definePoolArrayBase(PoolRealArray, GodotPoolRealArray, float32,
|
||||
godotPoolRealArray, newPoolRealArray,
|
||||
initGodotPoolRealArray)
|
||||
definePoolArrayBase(PoolVector2Array, GodotPoolVector2Array, Vector2,
|
||||
|
|
@ -93,7 +57,64 @@ definePoolArrayBase(PoolStringArray, GodotPoolStringArray, string,
|
|||
godotPoolStringArray, newPoolStringArray,
|
||||
initGodotPoolStringArray)
|
||||
|
||||
import godotbase, arrays
|
||||
import arrays
|
||||
|
||||
template definePoolArray(T, GodotT, DataT, fieldName, newProcName, initProcName;
|
||||
noData = false) =
|
||||
|
||||
proc newProcName*(arr: Array): T {.inline.} =
|
||||
new(result, poolArrayFinalizer)
|
||||
initProcName(result.fieldName, arr.godotArray[])
|
||||
|
||||
proc add*(self: T; arr: T) {.inline.} =
|
||||
self.fieldName.add(arr.fieldName)
|
||||
|
||||
proc delete*(self: T; idx: int) {.inline.} =
|
||||
self.fieldName.delete(idx.cint)
|
||||
|
||||
proc reverse*(self: T) {.inline.} =
|
||||
self.fieldName.reverse()
|
||||
|
||||
proc setLen*(self: T; size: int) {.inline.} =
|
||||
self.fieldName.setLen(size.cint)
|
||||
|
||||
proc len*(self: T): int {.inline.} =
|
||||
self.fieldName.len.int
|
||||
|
||||
proc subarray*(self: T, idxFrom, idxTo: int): T {.inline.} =
|
||||
## Indexes are inclusive, negative values count from the end of the array.
|
||||
assert(idxFrom >= low(cint) and idxFrom <= high(cint) and
|
||||
idxTo >= low(cint) and idxTo <= high(cint))
|
||||
newProcName(self.fieldName.subarray(idxFrom.cint, idxTo.cint))
|
||||
|
||||
when not noData:
|
||||
proc add*(self: T; data: DataT) {.inline.} =
|
||||
self.fieldName.add(data)
|
||||
|
||||
proc insert*(self: T; idx: int; data: DataT): Error {.inline.} =
|
||||
self.fieldName.insert(idx.cint, data)
|
||||
|
||||
proc `[]=`*(self: T; idx: int; data: DataT) {.inline.} =
|
||||
self.fieldName[idx.cint] = data
|
||||
|
||||
proc `[]`*(self: T; idx: int): DataT {.inline.} =
|
||||
self.fieldName[idx.cint]
|
||||
|
||||
iterator items*(arr: T): DataT =
|
||||
for item in arr.fieldName.items:
|
||||
yield item
|
||||
|
||||
iterator pairs*(arr: T): tuple[key: int, val: DataT] =
|
||||
for pair in arr.fieldName.pairs:
|
||||
yield (pair[0].int, pair[1])
|
||||
|
||||
iterator mitems*(arr: T): var DataT =
|
||||
for item in arr.fieldName.mitems:
|
||||
yield item
|
||||
|
||||
iterator mpairs*(arr: T): tuple[key: int, val: var DataT] =
|
||||
for pair in arr.fieldName.mpairs:
|
||||
yield (pair[0].int, pair[1])
|
||||
|
||||
definePoolArray(PoolByteArray, GodotPoolByteArray, uint8,
|
||||
godotPoolByteArray, newPoolByteArray,
|
||||
|
|
@ -101,7 +122,7 @@ definePoolArray(PoolByteArray, GodotPoolByteArray, uint8,
|
|||
definePoolArray(PoolIntArray, GodotPoolIntArray, cint,
|
||||
godotPoolIntArray, newPoolIntArray,
|
||||
initGodotPoolIntArray)
|
||||
definePoolArray(PoolRealArray, GodotPoolRealArray, float64,
|
||||
definePoolArray(PoolRealArray, GodotPoolRealArray, float32,
|
||||
godotPoolRealArray, newPoolRealArray,
|
||||
initGodotPoolRealArray)
|
||||
definePoolArray(PoolVector2Array, GodotPoolVector2Array, Vector2,
|
||||
|
|
@ -117,22 +138,17 @@ definePoolArray(PoolStringArray, GodotPoolStringArray, string,
|
|||
godotPoolStringArray, newPoolStringArray,
|
||||
initGodotPoolStringArray, true)
|
||||
|
||||
proc add*(self: var PoolStringArray; data: string) =
|
||||
proc add*(self: PoolStringArray; data: string) =
|
||||
var s = data.toGodotString()
|
||||
self.godotPoolStringArray.add(s)
|
||||
s.deinit()
|
||||
|
||||
proc addFirst*(self: var PoolStringArray, data: string) =
|
||||
var s = data.toGodotString()
|
||||
self.godotPoolStringArray.addFirst(s)
|
||||
s.deinit()
|
||||
|
||||
proc insert*(self: var PoolStringArray; idx: int; data: string): Error =
|
||||
proc insert*(self: PoolStringArray; idx: int; data: string): Error =
|
||||
var s = data.toGodotString()
|
||||
result = self.godotPoolStringArray.insert(idx.cint, s)
|
||||
s.deinit()
|
||||
|
||||
proc `[]=`*(self: var PoolStringArray; idx: int; data: string) =
|
||||
proc `[]=`*(self: PoolStringArray; idx: int; data: string) =
|
||||
var s = data.toGodotString()
|
||||
self.godotPoolStringArray[idx.cint] = s
|
||||
s.deinit()
|
||||
|
|
|
|||
|
|
@ -1,91 +1,84 @@
|
|||
# Copyright (c) 2017 Xored Software, Inc.
|
||||
# Copyright (c) 2018 Xored Software, Inc.
|
||||
|
||||
import vector3
|
||||
import internal.godotstrings
|
||||
import hashes
|
||||
|
||||
type
|
||||
Quat* {.byref.} = object
|
||||
x*: float32
|
||||
y*: float32
|
||||
z*: float32
|
||||
w*: float32
|
||||
|
||||
proc initQuat(dest: var Quat; x, y, z, w: float32) {.
|
||||
importc: "godot_quat_new".}
|
||||
proc initQuat(dest: var Quat; axis: Vector3; angle: float32) {.
|
||||
importc: "godot_quat_new_with_axis_angle".}
|
||||
import internal/godotinternaltypes, internal/godotstrings
|
||||
import godotcoretypes, gdnativeapi
|
||||
|
||||
proc initQuat*(x, y, z, w: float32): Quat {.inline.} =
|
||||
initQuat(result, x, y, z, w)
|
||||
result = Quat(
|
||||
x: x,
|
||||
y: y,
|
||||
z: z,
|
||||
w: w
|
||||
)
|
||||
|
||||
proc initQuat*(axis: Vector3; angle: float32): Quat {.inline.} =
|
||||
initQuat(result, axis, angle)
|
||||
|
||||
proc toGodotString(self: Quat): GodotString {.
|
||||
noSideEffect,
|
||||
importc: "godot_quat_as_string".}
|
||||
getGDNativeAPI().quatNewWithAxisAngle(result, axis, angle)
|
||||
|
||||
proc `$`*(self: Quat): string {.inline.} =
|
||||
$self.toGodotString()
|
||||
$getGDNativeAPI().quatAsString(self)
|
||||
|
||||
proc hash*(self: Quat): Hash {.inline.} =
|
||||
!$(self.x.hash() !& self.y.hash() !& self.z.hash() !& self.w.hash())
|
||||
|
||||
proc length*(self: Quat): float32 {.inline.} =
|
||||
getGDNativeAPI().quatLength(self)
|
||||
|
||||
proc lengthSquared*(self: Quat): float32 {.inline.} =
|
||||
getGDNativeAPI().quatLengthSquared(self)
|
||||
|
||||
proc normalized*(self: Quat): Quat {.inline.} =
|
||||
getGDNativeAPI().quatNormalized(self).toQuat()
|
||||
|
||||
proc isNormalized*(self: Quat): bool {.inline.} =
|
||||
getGDNativeAPI().quatIsNormalized(self)
|
||||
|
||||
proc inverse*(self: Quat): Quat {.inline.} =
|
||||
getGDNativeAPI().quatInverse(self).toQuat()
|
||||
|
||||
proc dot*(a, b: Quat): float32 {.inline.} =
|
||||
getGDNativeAPI().quatDot(a, b)
|
||||
|
||||
proc xform*(self: Quat; v: Vector3): Vector3 {.inline.} =
|
||||
getGDNativeAPI().quatXform(self, v).toVector3()
|
||||
|
||||
proc slerp*(self: Quat; b: Quat; t: float32): Quat {.inline.} =
|
||||
getGDNativeAPI().quatSlerp(self, b, t).toQuat()
|
||||
|
||||
proc slerpni*(self: Quat; b: Quat; t: float32): Quat {.inline.} =
|
||||
getGDNativeAPI().quatSlerpni(self, b, t).toQuat()
|
||||
|
||||
proc cubicSlerp*(self, b, preA, postB: Quat;
|
||||
t: float32): Quat {.inline.} =
|
||||
getGDNativeAPI().quatCubicSlerp(self, b, preA, postB, t).toQuat()
|
||||
|
||||
proc `*`*(a: Quat, b: float32): Quat {.inline.} =
|
||||
getGDNativeAPI().quatOperatorMultiply(a, b).toQuat()
|
||||
|
||||
proc length*(self: Quat): float32 {.
|
||||
noSideEffect,
|
||||
importc: "godot_quat_length".}
|
||||
proc lengthSquared*(self: Quat): float32 {.
|
||||
noSideEffect,
|
||||
importc: "godot_quat_length_squared".}
|
||||
proc normalized*(self: Quat): Quat {.
|
||||
noSideEffect,
|
||||
importc: "godot_quat_normalized".}
|
||||
proc isNormalized*(self: Quat): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_quat_is_normalized".}
|
||||
proc inverse*(self: Quat): Quat {.
|
||||
noSideEffect,
|
||||
importc: "godot_quat_inverse".}
|
||||
proc dot*(a, b: Quat): float32 {.
|
||||
noSideEffect,
|
||||
importc: "godot_quat_dot".}
|
||||
proc xform*(self: Quat; v: Vector3): Vector3 {.
|
||||
noSideEffect,
|
||||
importc: "godot_quat_xform".}
|
||||
proc slerp*(self: Quat; b: Quat; t: float32): Quat {.
|
||||
noSideEffect,
|
||||
importc: "godot_quat_slerp".}
|
||||
proc slerpni*(self: Quat; b: Quat; t: float32): Quat {.
|
||||
noSideEffect,
|
||||
importc: "godot_quat_slerpni".}
|
||||
proc cubicSlerp*(self, b, pre_a, post_b: Quat;
|
||||
t: float32): Quat {.
|
||||
noSideEffect,
|
||||
importc: "godot_quat_cubic_slerp".}
|
||||
proc `*`*(a: Quat, b: float32): Quat {.
|
||||
noSideEffect,
|
||||
importc: "godot_quat_operator_multiply".}
|
||||
proc `*=`*(a: var Quat, b: float32) {.inline.} =
|
||||
a = a * b
|
||||
|
||||
proc `+`*(a, b: Quat): Quat {.
|
||||
noSideEffect,
|
||||
importc: "godot_quat_operator_add".}
|
||||
proc `+`*(a, b: Quat): Quat {.inline.} =
|
||||
getGDNativeAPI().quatOperatorAdd(a, b).toQuat()
|
||||
|
||||
proc `+=`*(a: var Quat, b: Quat) {.inline.} =
|
||||
a = a + b
|
||||
|
||||
proc `-`*(a, b: Quat): Quat {.
|
||||
noSideEffect,
|
||||
importc: "godot_quat_operator_substract".}
|
||||
proc `-`*(a, b: Quat): Quat {.inline.} =
|
||||
getGDNativeAPI().quatOperatorSubtract(a, b).toQuat()
|
||||
|
||||
proc `-=`* (a: var Quat, b: Quat) {.inline.} =
|
||||
a = a - b
|
||||
|
||||
proc `/`*(self: Quat; b: float32): Quat {.
|
||||
noSideEffect,
|
||||
importc: "godot_quat_operator_divide".}
|
||||
proc `/`*(self: Quat; b: float32): Quat {.inline.} =
|
||||
getGDNativeAPI().quatOperatorDivide(self, b).toQuat()
|
||||
|
||||
proc `/=`*(self: var Quat, b: float32) {.inline.} =
|
||||
self = self / b
|
||||
|
||||
proc `==`*(a, b: Quat): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_quat_operator_equal".}
|
||||
proc `-`*(self: Quat): Quat {.
|
||||
noSideEffect,
|
||||
importc: "godot_quat_operator_neg".}
|
||||
proc `==`*(a, b: Quat): bool {.inline.} =
|
||||
getGDNativeAPI().quatOperatorEqual(a, b)
|
||||
|
||||
proc `-`*(self: Quat): Quat {.inline.} =
|
||||
getGDNativeAPI().quatOperatorNeg(self).toQuat()
|
||||
|
|
|
|||
|
|
@ -1,54 +1,153 @@
|
|||
# Copyright (c) 2017 Xored Software, Inc.
|
||||
# Copyright (c) 2018 Xored Software, Inc.
|
||||
|
||||
import hashes
|
||||
|
||||
import vector2
|
||||
import internal/godotinternaltypes, internal/godotstrings
|
||||
import godotcoretypes, gdnativeapi
|
||||
|
||||
import internal.godotstrings
|
||||
{.push stackTrace: off.}
|
||||
|
||||
type
|
||||
Rect2* {.byref.} = object
|
||||
position*: Vector2
|
||||
size*: Vector2
|
||||
proc initRect2*(): Rect2 {.inline, noinit.} =
|
||||
Rect2()
|
||||
|
||||
proc initRect2*(pos, size: Vector2): Rect2 {.inline.} =
|
||||
proc initRect2*(pos, size: Vector2): Rect2 {.inline, noinit.} =
|
||||
Rect2(position: pos, size: size)
|
||||
|
||||
proc initRect2*(x, y, sizeX, sizeY: float32): Rect2 {.inline.} =
|
||||
proc initRect2*(x, y, sizeX, sizeY: float32): Rect2 {.inline, noinit.} =
|
||||
Rect2(position: vec2(x, y), size: vec2(sizeX, sizeY))
|
||||
|
||||
proc toGodotString(self: Rect2): GodotString {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect2_as_string".}
|
||||
proc `$`*(self: Rect2): string {.inline, noinit.} =
|
||||
$getGDNativeAPI().rect2AsString(self)
|
||||
|
||||
proc `$`*(self: Rect2): string {.inline.} =
|
||||
$self.toGodotString()
|
||||
proc hash*(self: Rect2): Hash {.inline, noinit.} =
|
||||
!$(self.position.hash() !& self.size.hash())
|
||||
|
||||
proc area*(self: Rect2): float32 {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect2_get_area".}
|
||||
proc intersects*(a, b: Rect2): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect2_intersects".}
|
||||
proc encloses*(a, b: Rect2): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect2_encloses".}
|
||||
proc hasNoArea*(self: Rect2): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect2_has_no_area".}
|
||||
proc clip*(a, b: Rect2): Rect2 {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect2_clip".}
|
||||
proc merge*(a, b: Rect2): Rect2 {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect2_merge".}
|
||||
proc contains*(self: Rect2; point: Vector2): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect2_has_point".}
|
||||
proc grow*(self: Rect2; by: float32): Rect2 {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect2_grow".}
|
||||
proc expand*(self: Rect2; to: Vector2): Rect2 {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect2_expand".}
|
||||
proc `==`*(a, b: Rect2): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect2_operator_equal".}
|
||||
proc area*(self: Rect2): float32 {.inline, noinit.} =
|
||||
self.size.x * self.size.y
|
||||
|
||||
proc intersects*(a, b: Rect2): bool {.inline, noinit.} =
|
||||
if a.position.x >= (b.position.x + b.size.x):
|
||||
return false
|
||||
if a.position.x + a.size.x <= b.position.x:
|
||||
return false
|
||||
if a.position.y >= (b.position.y + b.size.y):
|
||||
return false
|
||||
if a.position.y + a.size.y <= b.position.y:
|
||||
return false
|
||||
result = true
|
||||
|
||||
proc distanceTo*(self: Rect2, p: Vector2): float32 {.noinit.} =
|
||||
var inside = true
|
||||
if p.x < self.position.x:
|
||||
let d = self.position.x - p.x
|
||||
result = d
|
||||
inside = false
|
||||
if p.y < self.position.y:
|
||||
let d = self.position.y - p.y
|
||||
result = if inside: d else: min(result, d)
|
||||
inside = false
|
||||
if p.x >= (self.position.x + self.size.x):
|
||||
let d = p.x - (self.position.x + self.size.x)
|
||||
result = if inside: d else: min(result, d)
|
||||
inside = false
|
||||
if p.y >= (self.position.y + self.size.y):
|
||||
let d = p.y - (self.position.y + self.size.y)
|
||||
result = if inside: d else: min(result, d)
|
||||
inside = false
|
||||
|
||||
if inside:
|
||||
result = 0'f32
|
||||
|
||||
proc encloses*(a, b: Rect2): bool {.inline, noinit.} =
|
||||
b.position.x >= a.position.x and b.position.y >= a.position.y and
|
||||
(b.position.x + b.size.x) < (a.position.x + a.size.x) and
|
||||
(b.position.y + b.size.y) < (a.position.y + a.size.y)
|
||||
|
||||
proc hasNoArea*(self: Rect2): bool {.inline, noinit.} =
|
||||
self.size.x <= 0 or self.size.y <= 0
|
||||
|
||||
proc clip*(self, b: Rect2): Rect2 {.inline, noinit.} =
|
||||
if not self.intersects(b):
|
||||
return initRect2()
|
||||
|
||||
result = self
|
||||
|
||||
result.position.x = max(b.position.x, self.position.x)
|
||||
result.position.y = max(b.position.y, self.position.y)
|
||||
|
||||
let bEnd = b.position + b.size
|
||||
let selfEnd = self.position + self.size
|
||||
|
||||
result.size.x = min(bEnd.x, selfEnd.x) - result.position.x
|
||||
result.size.y = min(bEnd.y, selfEnd.y) - result.position.y
|
||||
|
||||
proc merge*(self, b: Rect2): Rect2 {.inline, noinit.} =
|
||||
result.position.x = min(b.position.x, self.position.x)
|
||||
result.position.y = min(b.position.y, self.position.y)
|
||||
|
||||
result.size.x = max(b.position.x + b.size.x, self.position.x + self.size.x)
|
||||
result.size.y = max(b.position.y + b.size.y, self.position.y + self.size.y)
|
||||
result.size -= result.position
|
||||
|
||||
proc contains*(self: Rect2; point: Vector2): bool {.inline, noinit.} =
|
||||
if point.x < self.position.x:
|
||||
return false
|
||||
if point.y < self.position.y:
|
||||
return false
|
||||
|
||||
if point.x >= self.position.x + self.size.x:
|
||||
return false
|
||||
if point.y >= self.position.y + self.size.y:
|
||||
return false
|
||||
|
||||
result = true
|
||||
|
||||
proc grow*(self: Rect2; by: float32): Rect2 {.inline, noinit.} =
|
||||
## Returns Rect2 enlarged by the specified size in every direction.
|
||||
result = self
|
||||
|
||||
result.position.x -= by
|
||||
result.position.y -= by
|
||||
|
||||
result.size.x += by * 2
|
||||
result.size.y += by * 2
|
||||
|
||||
proc growIndividual*(self: Rect2, left, top: float32,
|
||||
right, bottom: float32): Rect2 {.inline, noinit.} =
|
||||
result = self
|
||||
result.position.x -= left
|
||||
result.position.y -= top
|
||||
result.size.x += left + right
|
||||
result.size.y += top + bottom
|
||||
|
||||
proc expandTo*(self: var Rect2, to: Vector2) {.inline.} =
|
||||
var startPoint = self.position
|
||||
var endPoint = self.position + self.size
|
||||
|
||||
if to.x < startPoint.x:
|
||||
startPoint.x = to.x
|
||||
if to.y < startPoint.y:
|
||||
startPoint.y = to.y
|
||||
|
||||
if to.x > endPoint.x:
|
||||
endPoint.x = to.x
|
||||
if to.y > endPoint.y:
|
||||
endPoint.y = to.y
|
||||
|
||||
self.position = startPoint
|
||||
self.size = endPoint - startPoint
|
||||
|
||||
proc expand*(self: Rect2; to: Vector2): Rect2 {.inline, noinit.} =
|
||||
result = self
|
||||
result.expandTo(to)
|
||||
|
||||
proc abs*(self: Rect2): Rect2 {.inline, noinit.} =
|
||||
Rect2(position: vec2(self.position.x + min(self.size.x, 0'f32),
|
||||
self.position.y + min(self.size.y, 0'f32)),
|
||||
size: abs(self.size))
|
||||
|
||||
proc `==`*(a, b: Rect2): bool {.inline, noinit.} =
|
||||
a.position == b.position and a.size == b.size
|
||||
|
||||
{.pop.} # stackTrace: off
|
||||
|
|
@ -1,84 +0,0 @@
|
|||
# Copyright (c) 2017 Xored Software, Inc.
|
||||
|
||||
import planes, vector3
|
||||
|
||||
import internal.godotstrings
|
||||
|
||||
type
|
||||
Rect3* {.byref.} = object
|
||||
position*: Vector3
|
||||
size*: Vector3
|
||||
|
||||
proc initRect3*(pos, size: Vector3): Rect3 {.inline.} =
|
||||
Rect3(position: pos, size: size)
|
||||
|
||||
proc toGodotString(self: Rect3): GodotString {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_as_string".}
|
||||
|
||||
proc `$`*(self: Rect3): string {.inline.} =
|
||||
$self.toGodotString()
|
||||
|
||||
proc area*(self: Rect3): float32 {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_get_area".}
|
||||
proc hasNoArea*(self: Rect3): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_has_no_area".}
|
||||
proc hasNoSurface*(self: Rect3): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_has_no_surface".}
|
||||
proc intersects*(a, b: Rect3): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_intersects".}
|
||||
proc encloses*(self, other: Rect3): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_encloses".}
|
||||
proc merge*(self, other: Rect3): Rect3 {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_merge".}
|
||||
proc intersection*(self, other: Rect3): Rect3 {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_intersection".}
|
||||
proc intersectsPlane*(self: Rect3; plane: Plane): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_intersects_plane".}
|
||||
proc intersectsSegment*(self: Rect3; start, to: Vector3): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_intersects_segment".}
|
||||
proc contains*(self: Rect3; point: Vector3): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_has_point".}
|
||||
proc getSupport*(self: Rect3; dir: Vector3): Vector3 {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_get_support".}
|
||||
proc getLongestAxis*(self: Rect3): Vector3 {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_get_longest_axis".}
|
||||
proc getLongestAxisIndex*(self: Rect3): cint {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_get_longest_axis_index".}
|
||||
proc getLongestAxisSize*(self: Rect3): float32 {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_get_longest_axis_size".}
|
||||
proc getShortestAxis*(self: Rect3): Vector3 {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_get_shortest_axis".}
|
||||
proc getShortestAxisIndex*(self: Rect3): cint {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_get_shortest_axis_index".}
|
||||
proc getShortestAxisSize*(self: Rect3): float32 {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_get_shortest_axis_size".}
|
||||
proc expand*(self: Rect3; toPoint: Vector3): Rect3 {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_expand".}
|
||||
proc grow*(self: Rect3; by: float32): Rect3 {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_grow".}
|
||||
proc getEndpoint*(self: Rect3; idx: cint): Vector3 {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_get_endpoint".}
|
||||
proc `==`*(a, b: Rect3): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_rect3_operator_equal".}
|
||||
|
|
@ -1,31 +1,26 @@
|
|||
import internal.godotobjects
|
||||
# Copyright (c) 2018 Xored Software, Inc.
|
||||
|
||||
type
|
||||
RID* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
import hashes
|
||||
|
||||
proc initRID(dest: var RID) {.
|
||||
importc: "godot_rid_new".}
|
||||
proc initRID(dest: var RID; obj: ptr GodotObject) {.
|
||||
importc: "godot_rid_new_with_resource".}
|
||||
import godotcoretypes, internal/godotinternaltypes, gdnativeapi
|
||||
|
||||
proc initRID*(): RID {.inline.} =
|
||||
initRID(result)
|
||||
getGDNativeAPI().ridNew(result)
|
||||
|
||||
proc initRID*(obj: ptr GodotObject): RID {.inline.} =
|
||||
initRID(result, obj)
|
||||
|
||||
proc idCInt(self: RID): cint {.
|
||||
noSideEffect,
|
||||
importc: "godot_rid_get_id".}
|
||||
getGDNativeAPI().ridNewWithResource(result, obj)
|
||||
|
||||
proc id*(self: RID): uint32 {.inline.} =
|
||||
cast[uint32](self.idCInt())
|
||||
cast[uint32](getGDNativeAPI().ridGetId(self))
|
||||
|
||||
proc `$`*(self: RID): string =
|
||||
proc `$`*(self: RID): string {.inline.} =
|
||||
$self.id
|
||||
|
||||
proc `==`*(a, b: RID): bool {.
|
||||
importc: "godot_rid_operator_equal".}
|
||||
proc `<`*(a, b: RID): bool {.
|
||||
importc: "godot_rid_operator_less".}
|
||||
proc hash*(self: RID): Hash {.inline.} =
|
||||
self.id.hash()
|
||||
|
||||
proc `==`*(a, b: RID): bool {.inline.} =
|
||||
getGDNativeAPI().ridOperatorEqual(a, b)
|
||||
|
||||
proc `<`*(a, b: RID): bool {.inline.} =
|
||||
getGDNativeAPI().ridOperatorLess(a, b)
|
||||
|
|
|
|||
|
|
@ -1,76 +1,79 @@
|
|||
# Copyright (c) 2017 Xored Software, Inc.
|
||||
# Copyright (c) 2018 Xored Software, Inc.
|
||||
|
||||
import vector2, rect2
|
||||
import hashes, vector2
|
||||
|
||||
import internal.godotstrings
|
||||
|
||||
type
|
||||
Transform2D* {.byref.} = object
|
||||
elements*: array[3, Vector2]
|
||||
|
||||
proc initTransform2D(dest: var Transform2D) {.
|
||||
importc: "godot_transform2d_new_identity".}
|
||||
proc initTransform2D(dest: var Transform2D; rot: float32; pos: Vector2) {.
|
||||
importc: "godot_transform2d_new".}
|
||||
proc initTransform2D(dest: var Transform2D; xAxis, yAxis, origin: Vector2) {.
|
||||
importc: "godot_transform2d_new_axis_origin".}
|
||||
import internal/godotinternaltypes, internal/godotstrings
|
||||
import godotcoretypes, gdnativeapi
|
||||
|
||||
proc initTransform2D*(): Transform2D {.inline.} =
|
||||
initTransform2D(result)
|
||||
getGDNativeAPI().transform2DNewIdentity(result)
|
||||
|
||||
proc initTransform2D*(rot: float32; pos: Vector2): Transform2D {.inline.} =
|
||||
initTransform2D(result, rot, pos)
|
||||
getGDNativeAPI().transform2DNew(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".}
|
||||
getGDNativeAPI().transform2DNewAxisOrigin(result, xAxis, yAxis, origin)
|
||||
|
||||
proc `$`*(self: Transform2D): string {.inline.} =
|
||||
$self.toGodotString()
|
||||
$getGDNativeAPI().transform2DAsString(self)
|
||||
|
||||
proc inverse*(self: Transform2D): Transform2D {.
|
||||
importc: "godot_transform2d_inverse".}
|
||||
proc affineInverse*(self: Transform2D): Transform2D {.
|
||||
importc: "godot_transform2d_affine_inverse".}
|
||||
proc rotation*(self: Transform2D): float32 {.
|
||||
importc: "godot_transform2d_get_rotation".}
|
||||
proc origin*(self: Transform2D): Vector2 {.
|
||||
importc: "godot_transform2d_get_origin".}
|
||||
proc scale*(self: Transform2D): Vector2 {.
|
||||
importc: "godot_transform2d_get_scale".}
|
||||
proc orthonormalized*(self: Transform2D): Transform2D {.
|
||||
importc: "godot_transform2d_orthonormalized".}
|
||||
proc rotated*(self: Transform2D; phi: float32): Transform2D {.
|
||||
importc: "godot_transform2d_rotated".}
|
||||
proc scaled*(self: Transform2D; scale: Vector2): Transform2D {.
|
||||
importc: "godot_transform2d_scaled".}
|
||||
proc translated*(self: Transform2D;
|
||||
offset: Vector2): Transform2D {.
|
||||
importc: "godot_transform2d_translated".}
|
||||
proc xformVector2*(self: Transform2D; v: Vector2): Vector2 {.
|
||||
importc: "godot_transform2d_xform_vector2".}
|
||||
proc xformInvVector2*(self: Transform2D; v: Vector2): Vector2 {.
|
||||
importc: "godot_transform2d_xform_inv_vector2".}
|
||||
proc basisXformVector2*(self: Transform2D;
|
||||
v: Vector2): Vector2 {.
|
||||
importc: "godot_transform2d_basis_xform_vector2".}
|
||||
proc basisXformInvVector2*(self: Transform2D;
|
||||
v: Vector2): Vector2 {.
|
||||
importc: "godot_transform2d_basis_xform_inv_vector2".}
|
||||
proc xformRect2*(self: Transform2D; v: Rect2): Rect2 {.
|
||||
importc: "godot_transform2d_xform_rect2".}
|
||||
proc xformInvRect2*(self: Transform2D; v: Rect2): Rect2 {.
|
||||
importc: "godot_transform2d_xform_inv_rect2".}
|
||||
proc hash*(self: Transform2D): Hash {.inline, noinit.} =
|
||||
!$(self.elements[0].hash() !& self.elements[1].hash() !& self.elements[2].hash())
|
||||
|
||||
proc inverse*(self: Transform2D): Transform2D {.inline.} =
|
||||
getGDNativeAPI().transform2DInverse(self).toTransform2D()
|
||||
|
||||
proc affineInverse*(self: Transform2D): Transform2D {.inline.} =
|
||||
getGDNativeAPI().transform2DAffineInverse(self).toTransform2D()
|
||||
|
||||
proc rotation*(self: Transform2D): float32 {.inline.} =
|
||||
getGDNativeAPI().transform2DGetRotation(self)
|
||||
|
||||
proc origin*(self: Transform2D): Vector2 {.inline.} =
|
||||
getGDNativeAPI().transform2DGetOrigin(self).toVector2()
|
||||
|
||||
proc scale*(self: Transform2D): Vector2 {.inline.} =
|
||||
getGDNativeAPI().transform2DGetScale(self).toVector2()
|
||||
|
||||
proc orthonormalized*(self: Transform2D): Transform2D {.inline.} =
|
||||
getGDNativeAPI().transform2DOrthonormalized(self).toTransform2D()
|
||||
|
||||
proc rotated*(self: Transform2D; phi: float32): Transform2D {.inline.} =
|
||||
getGDNativeAPI().transform2DRotated(self, phi).toTransform2D()
|
||||
|
||||
proc scaled*(self: Transform2D; scale: Vector2): Transform2D {.inline.} =
|
||||
getGDNativeAPI().transform2DScaled(self, scale).toTransform2D()
|
||||
|
||||
proc translated*(self: Transform2D; offset: Vector2): Transform2D {.inline.} =
|
||||
getGDNativeAPI().transform2DTranslated(self, offset).toTransform2D()
|
||||
|
||||
proc xformVector2*(self: Transform2D; v: Vector2): Vector2 {.inline.} =
|
||||
getGDNativeAPI().transform2DXformVector2(self, v).toVector2()
|
||||
|
||||
proc xformInvVector2*(self: Transform2D; v: Vector2): Vector2 {.inline.} =
|
||||
getGDNativeAPI().transform2DXformInvVector2(self, v).toVector2()
|
||||
|
||||
proc basisXformVector2*(self: Transform2D; v: Vector2): Vector2 {.inline.} =
|
||||
getGDNativeAPI().transform2DBasisXformVector2(self, v).toVector2()
|
||||
|
||||
proc basisXformInvVector2*(self: Transform2D; v: Vector2): Vector2 {.inline.} =
|
||||
getGDNativeAPI().transform2DBasisXformInvVector2(self, v).toVector2()
|
||||
|
||||
proc xformRect2*(self: Transform2D; rect: Rect2): Rect2 {.inline.} =
|
||||
getGDNativeAPI().transform2DXformRect2(self, rect).toRect2()
|
||||
|
||||
proc xformInvRect2*(self: Transform2D; rect: Rect2): Rect2 {.inline.} =
|
||||
getGDNativeAPI().transform2DXformInvRect2(self, rect).toRect2()
|
||||
|
||||
proc interpolateWith*(self, m: Transform2D;
|
||||
c: float32): Transform2D {.
|
||||
importc: "godot_transform2d_interpolate_with".}
|
||||
proc `==`*(a, b: Transform2D): bool {.
|
||||
importc: "godot_transform2d_operator_equal".}
|
||||
proc `*`*(a, b: Transform2D): Transform2D {.
|
||||
importc: "godot_transform2d_operator_multiply".}
|
||||
c: float32): Transform2D {.inline.} =
|
||||
getGDNativeAPI().transform2DInterpolateWith(self, m, c).toTransform2D()
|
||||
|
||||
proc `==`*(a, b: Transform2D): bool {.inline.} =
|
||||
getGDNativeAPI().transform2DOperatorEqual(a, b)
|
||||
|
||||
proc `*`*(a, b: Transform2D): Transform2D {.inline.} =
|
||||
getGDNativeAPI().transform2DOperatorMultiply(a, b).toTransform2D()
|
||||
|
||||
proc `*=`*(a: var Transform2D, b: Transform2D) {.inline.} =
|
||||
a = a * b
|
||||
|
|
|
|||
|
|
@ -1,13 +1,10 @@
|
|||
# Copyright (c) 2017 Xored Software, Inc.
|
||||
# Copyright (c) 2018 Xored Software, Inc.
|
||||
|
||||
import basis, vector3, planes, rect3
|
||||
import hashes
|
||||
|
||||
import internal.godotstrings
|
||||
|
||||
type
|
||||
Transform* {.byref.} = object
|
||||
basis*: Basis
|
||||
origin*: Vector3
|
||||
import internal/godotinternaltypes, internal/godotstrings
|
||||
import godotcoretypes, gdnativeapi
|
||||
import basis, vector3
|
||||
|
||||
proc initTransform*(): Transform {.inline.} =
|
||||
result.basis = initBasis()
|
||||
|
|
@ -23,45 +20,57 @@ proc initTransform*(xAxis, yAxis, zAxis,
|
|||
proc initTransform*(basis: Basis, origin: Vector3): Transform {.inline.} =
|
||||
Transform(basis: basis, origin: origin)
|
||||
|
||||
proc toGodotString(self: Transform): GodotString {.
|
||||
importc: "godot_transform_as_string".}
|
||||
|
||||
proc `$`*(self: Transform): string {.inline.} =
|
||||
$self.toGodotString()
|
||||
$getGDNativeAPI().transformAsString(self)
|
||||
|
||||
proc hash*(self: Transform): Hash {.inline.} =
|
||||
!$(self.basis.hash() !& self.origin.hash())
|
||||
|
||||
proc inverse*(self: Transform): Transform {.inline.} =
|
||||
getGDNativeAPI().transformInverse(self).toTransform()
|
||||
|
||||
proc affineInverse*(self: Transform): Transform {.inline.} =
|
||||
getGDNativeAPI().transformAffineInverse(self).toTransform()
|
||||
|
||||
proc orthonormalized*(self: Transform): Transform {.inline.} =
|
||||
getGDNativeAPI().transformOrthonormalized(self).toTransform()
|
||||
|
||||
proc inverse*(self: Transform): Transform {.
|
||||
importc: "godot_transform_inverse".}
|
||||
proc affineInverse*(self: Transform): Transform {.
|
||||
importc: "godot_transform_affine_inverse".}
|
||||
proc orthonormalized*(self: Transform): Transform {.
|
||||
importc: "godot_transform_orthonormalized".}
|
||||
proc rotated*(self: Transform; axis: Vector3;
|
||||
phi: float32): Transform {.
|
||||
importc: "godot_transform_rotated".}
|
||||
proc scaled*(self: Transform; scale: Vector3): Transform {.
|
||||
importc: "godot_transform_scaled".}
|
||||
proc translated*(self: Transform; offset: Vector3): Transform {.
|
||||
importc: "godot_transform_translated".}
|
||||
proc lookingAt*(self: Transform;
|
||||
target, up: Vector3): Transform {.
|
||||
importc: "godot_transform_looking_at".}
|
||||
phi: float32): Transform {.inline.} =
|
||||
getGDNativeAPI().transformRotated(self, axis, phi).toTransform()
|
||||
|
||||
proc xformPlane*(self: Transform; v: Plane): Plane {.
|
||||
importc: "godot_transform_xform_plane".}
|
||||
proc xformInvPlane*(self: Transform; v: Plane): Plane {.
|
||||
importc: "godot_transform_xform_inv_plane".}
|
||||
proc xformVector3*(self: Transform; v: Vector3): Vector3 {.
|
||||
importc: "godot_transform_xform_vector3".}
|
||||
proc xformInvVector3*(self: Transform; v: Vector3): Vector3 {.
|
||||
importc: "godot_transform_xform_inv_vector3".}
|
||||
proc xformRect3*(self: Transform; v: Vector3): Rect3 {.
|
||||
importc: "godot_transform_xform_rect3".}
|
||||
proc xformInvRect3*(self: Transform; v: Vector3): Vector3 {.
|
||||
importc: "godot_transform_xform_inv_rect3".}
|
||||
proc scaled*(self: Transform; scale: Vector3): Transform {.inline.} =
|
||||
getGDNativeAPI().transformScaled(self, scale).toTransform()
|
||||
|
||||
proc `==`*(self: Transform; b: Transform): bool {.
|
||||
importc: "godot_transform_operator_equal".}
|
||||
proc `*`*(a, b: Transform): Transform {.
|
||||
importc: "godot_transform_operator_multiply".}
|
||||
proc `*=`*(a: var Transform, b: Transform) {.inline.} =
|
||||
a = a * b
|
||||
proc translated*(self: Transform; offset: Vector3): Transform {.inline.} =
|
||||
getGDNativeAPI().transformTranslated(self, offset).toTransform()
|
||||
|
||||
proc lookingAt*(self: Transform; target, up: Vector3): Transform {.inline.} =
|
||||
getGDNativeAPI().transformLookingAt(self, target, up).toTransform()
|
||||
|
||||
proc xformPlane*(self: Transform; plane: Plane): Plane {.inline.} =
|
||||
getGDNativeAPI().transformXformPlane(self, plane).toPlane()
|
||||
|
||||
proc xformInvPlane*(self: Transform; plane: Plane): Plane {.inline.} =
|
||||
getGDNativeAPI().transformXformInvPlane(self, plane).toPlane()
|
||||
|
||||
proc xformVector3*(self: Transform; v: Vector3): Vector3 {.inline.} =
|
||||
getGDNativeAPI().transformXformVector3(self, v).toVector3()
|
||||
|
||||
proc xformInvVector3*(self: Transform; v: Vector3): Vector3 {.inline.} =
|
||||
getGDNativeAPI().transformXformInvVector3(self, v).toVector3()
|
||||
|
||||
proc xformAABB*(self: Transform; rect: AABB): AABB {.inline.} =
|
||||
getGDNativeAPI().transformXformAABB(self, rect).toAABB()
|
||||
|
||||
proc xformInvAABB*(self: Transform; rect: AABB): AABB {.inline.} =
|
||||
getGDNativeAPI().transformXformInvAABB(self, rect).toAABB()
|
||||
|
||||
proc `==`*(self: Transform; b: Transform): bool {.inline.} =
|
||||
getGDNativeAPI().transformOperatorEqual(self, b)
|
||||
|
||||
proc `*`*(self, other: Transform): Transform {.inline.} =
|
||||
getGDNativeAPI().transformOperatorMultiply(self, other).toTransform()
|
||||
|
||||
proc `*=`*(self: var Transform, other: Transform) {.inline.} =
|
||||
self = self * other
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import tables
|
||||
import tables, hashes
|
||||
|
||||
import internal.godotobjects, internal.godotvariants, internal.godotpoolarrays,
|
||||
internal.godotstrings, internal.godotnodepaths
|
||||
import godotcoretypes
|
||||
import internal/godotinternaltypes, internal/godotvariants,
|
||||
internal/godotstrings, internal/godotdictionaries,
|
||||
internal/godotarrays
|
||||
|
||||
type
|
||||
Variant* = ref object
|
||||
|
|
@ -71,15 +73,16 @@ proc newVariant*(r: cdouble): Variant {.inline.} =
|
|||
|
||||
proc newVariant*(s: string): Variant {.inline.} =
|
||||
new(result, variantFinalizer)
|
||||
if s.isNil:
|
||||
initGodotVariant(result.godotVariant)
|
||||
else:
|
||||
var godotStr = s.toGodotString()
|
||||
initGodotVariant(result.godotVariant, godotStr)
|
||||
godotStr.deinit()
|
||||
when (NimMajor, NimMinor, NimPatch) < (0, 19, 0):
|
||||
if s.isNil:
|
||||
initGodotVariant(result.godotVariant)
|
||||
return
|
||||
var godotStr = s.toGodotString()
|
||||
initGodotVariant(result.godotVariant, godotStr)
|
||||
godotStr.deinit()
|
||||
|
||||
import basis, nodepaths
|
||||
import planes, quats, rect2, rect3, rids
|
||||
import planes, quats, rect2, aabb, rids
|
||||
import transforms, transform2d, vector2
|
||||
import vector3, colors
|
||||
|
||||
|
|
@ -107,9 +110,9 @@ proc newVariant*(quat: Quat): Variant {.inline.} =
|
|||
new(result, variantFinalizer)
|
||||
initGodotVariant(result.godotVariant, quat)
|
||||
|
||||
proc newVariant*(rect3: Rect3): Variant {.inline.} =
|
||||
proc newVariant*(aabb: AABB): Variant {.inline.} =
|
||||
new(result, variantFinalizer)
|
||||
initGodotVariant(result.godotVariant, rect3)
|
||||
initGodotVariant(result.godotVariant, aabb)
|
||||
|
||||
proc newVariant*(basis: Basis): Variant {.inline.} =
|
||||
new(result, variantFinalizer)
|
||||
|
|
@ -139,11 +142,7 @@ proc newVariant*(obj: ptr GodotObject): Variant {.inline.} =
|
|||
new(result, variantFinalizer)
|
||||
initGodotVariant(result.godotVariant, obj)
|
||||
|
||||
import arrays, poolarrays
|
||||
|
||||
proc newVariant*(arr: Array): Variant {.inline.} =
|
||||
new(result, variantFinalizer)
|
||||
initGodotVariant(result.godotVariant, arr.godotArray[])
|
||||
import poolarrays
|
||||
|
||||
proc newVariant*(pba: PoolByteArray): Variant {.inline.} =
|
||||
new(result, variantFinalizer)
|
||||
|
|
@ -176,81 +175,119 @@ proc newVariant*(pca: PoolColorArray): Variant {.inline.} =
|
|||
proc asBool*(self: Variant): bool {.inline.} =
|
||||
self.godotVariant.asBool()
|
||||
|
||||
proc asUInt*(self: Variant): uint64 =
|
||||
proc asUInt*(self: Variant): uint64 {.inline.} =
|
||||
self.godotVariant.asUInt()
|
||||
|
||||
proc asInt*(self: Variant): int64 =
|
||||
proc asInt*(self: Variant): int64 {.inline.} =
|
||||
self.godotVariant.asInt()
|
||||
|
||||
proc asReal*(self: Variant): cdouble =
|
||||
proc asReal*(self: Variant): cdouble {.inline.} =
|
||||
self.godotVariant.asReal()
|
||||
|
||||
proc asString*(self: Variant): string =
|
||||
proc asString*(self: Variant): string {.inline.} =
|
||||
$self
|
||||
|
||||
proc asVector2*(self: Variant): Vector2 =
|
||||
proc asVector2*(self: Variant): Vector2 {.inline.} =
|
||||
self.godotVariant.asVector2()
|
||||
|
||||
proc asRect2*(self: Variant): Rect2 =
|
||||
proc asRect2*(self: Variant): Rect2 {.inline.} =
|
||||
self.godotVariant.asRect2()
|
||||
|
||||
proc asVector3*(self: Variant): Vector3 =
|
||||
proc asVector3*(self: Variant): Vector3 {.inline.} =
|
||||
self.godotVariant.asVector3()
|
||||
|
||||
proc asTransform2D*(self: Variant): Transform2D =
|
||||
proc asTransform2D*(self: Variant): Transform2D {.inline.} =
|
||||
self.godotVariant.asTransform2D()
|
||||
|
||||
proc asPlane*(self: Variant): Plane =
|
||||
proc asPlane*(self: Variant): Plane {.inline.} =
|
||||
self.godotVariant.asPlane()
|
||||
|
||||
proc asQuat*(self: Variant): Quat =
|
||||
proc asQuat*(self: Variant): Quat {.inline.} =
|
||||
self.godotVariant.asQuat()
|
||||
|
||||
proc asRect3*(self: Variant): Rect3 =
|
||||
self.godotVariant.asRect3()
|
||||
proc asAABB*(self: Variant): AABB {.inline.} =
|
||||
self.godotVariant.asAABB()
|
||||
|
||||
proc asBasis*(self: Variant): Basis =
|
||||
proc asBasis*(self: Variant): Basis {.inline.} =
|
||||
self.godotVariant.asBasis()
|
||||
|
||||
proc asTransform*(self: Variant): Transform =
|
||||
proc asTransform*(self: Variant): Transform {.inline.} =
|
||||
self.godotVariant.asTransform()
|
||||
|
||||
proc asColor*(self: Variant): Color =
|
||||
proc asColor*(self: Variant): Color {.inline.} =
|
||||
self.godotVariant.asColor()
|
||||
|
||||
proc asNodePath*(self: Variant): NodePath =
|
||||
proc asNodePath*(self: Variant): NodePath {.inline.} =
|
||||
result = newNodePath(self.godotVariant.asNodePath())
|
||||
|
||||
proc asRID*(self: Variant): RID =
|
||||
proc asRID*(self: Variant): RID {.inline.} =
|
||||
self.godotVariant.asRID()
|
||||
|
||||
proc asGodotObject*(self: Variant): ptr GodotObject =
|
||||
proc asGodotObject*(self: Variant): ptr GodotObject {.inline.} =
|
||||
self.godotVariant.asGodotObject()
|
||||
|
||||
proc asArray*(self: Variant): Array =
|
||||
newArray(self.godotVariant.asGodotArray())
|
||||
|
||||
proc asPoolByteArray*(self: Variant): PoolByteArray =
|
||||
proc asPoolByteArray*(self: Variant): PoolByteArray {.inline.} =
|
||||
newPoolByteArray(self.godotVariant.asGodotPoolByteArray())
|
||||
|
||||
proc asPoolIntArray*(self: Variant): PoolIntArray =
|
||||
proc asPoolIntArray*(self: Variant): PoolIntArray {.inline.} =
|
||||
newPoolIntArray(self.godotVariant.asGodotPoolIntArray())
|
||||
|
||||
proc asPoolRealArray*(self: Variant): PoolRealArray =
|
||||
proc asPoolRealArray*(self: Variant): PoolRealArray {.inline.} =
|
||||
newPoolRealArray(self.godotVariant.asGodotPoolRealArray())
|
||||
|
||||
proc asPoolStringArray*(self: Variant): PoolStringArray =
|
||||
proc asPoolStringArray*(self: Variant): PoolStringArray {.inline.} =
|
||||
newPoolStringArray(self.godotVariant.asGodotPoolStringArray())
|
||||
|
||||
proc asPoolVector2Array*(self: Variant): PoolVector2Array =
|
||||
proc asPoolVector2Array*(self: Variant): PoolVector2Array {.inline.} =
|
||||
newPoolVector2Array(self.godotVariant.asGodotPoolVector2Array())
|
||||
|
||||
proc asPoolVector3Array*(self: Variant): PoolVector3Array =
|
||||
proc asPoolVector3Array*(self: Variant): PoolVector3Array {.inline.} =
|
||||
newPoolVector3Array(self.godotVariant.asGodotPoolVector3Array())
|
||||
|
||||
proc asPoolColorArray*(self: Variant): PoolColorArray =
|
||||
proc asPoolColorArray*(self: Variant): PoolColorArray {.inline.} =
|
||||
newPoolColorArray(self.godotVariant.asGodotPoolColorArray())
|
||||
|
||||
proc hash*(self: Variant): Hash =
|
||||
proc objectHash(obj: ptr GodotObject): Hash =
|
||||
if not obj.isNil: cast[int](obj).hash() else: 0.hash()
|
||||
result = case self.getType():
|
||||
of VariantType.Nil: Hash(0)
|
||||
of VariantType.Bool: self.asBool().hash()
|
||||
of VariantType.Int: self.asInt().hash()
|
||||
of VariantType.Real: self.asReal().hash()
|
||||
of VariantType.String: self.asString().hash()
|
||||
of VariantType.Vector2: self.asVector2().hash()
|
||||
of VariantType.Rect2: self.asRect2().hash()
|
||||
of VariantType.Vector3: self.asVector3().hash()
|
||||
of VariantType.Transform2D: self.asTransform2D().hash()
|
||||
of VariantType.Plane: self.asPlane().hash()
|
||||
of VariantType.Quat: self.asQuat().hash()
|
||||
of VariantType.AABB: self.asAABB().hash()
|
||||
of VariantType.Basis: self.asBasis().hash()
|
||||
of VariantType.Transform: self.asTransform().hash()
|
||||
of VariantType.Color: self.asColor().hash()
|
||||
of VariantType.NodePath: self.asNodePath().hash()
|
||||
of VariantType.RID: self.asRID().hash()
|
||||
of VariantType.Object: self.asGodotObject().objectHash()
|
||||
of VariantType.Dictionary: hash(self.godotVariant.asGodotDictionary().godotHash())
|
||||
of VariantType.Array: hash(self.godotVariant.asGodotArray().godotHash())
|
||||
of VariantType.PoolByteArray: self.asPoolByteArray().hash()
|
||||
of VariantType.PoolIntArray: self.asPoolIntArray().hash()
|
||||
of VariantType.PoolRealArray: self.asPoolRealArray().hash()
|
||||
of VariantType.PoolStringArray: self.asPoolStringArray().hash()
|
||||
of VariantType.PoolVector2Array: self.asPoolVector2Array().hash()
|
||||
of VariantType.PoolVector3Array: self.asPoolVector3Array().hash()
|
||||
of VariantType.PoolColorArray: self.asPoolColorArray().hash()
|
||||
|
||||
import arrays
|
||||
|
||||
proc newVariant*(arr: Array): Variant {.inline.} =
|
||||
new(result, variantFinalizer)
|
||||
initGodotVariant(result.godotVariant, arr.godotArray[])
|
||||
|
||||
proc asArray*(self: Variant): Array {.inline.} =
|
||||
newArray(self.godotVariant.asGodotArray())
|
||||
|
||||
proc hasMethod*(self: Variant; meth: string): bool =
|
||||
var s = meth.toGodotString()
|
||||
result = self.godotVariant.hasMethod(s)
|
||||
|
|
@ -267,5 +304,5 @@ proc `<`*(self, other: Variant): bool =
|
|||
proc hashCompare*(self, other: Variant): bool =
|
||||
self.godotVariant.hashCompare(other.godotVariant)
|
||||
|
||||
proc booleanize*(self: Variant; isValid: var bool): bool =
|
||||
self.godotVariant.booleanize(isValid)
|
||||
proc booleanize*(self: Variant): bool =
|
||||
self.godotVariant.booleanize()
|
||||
|
|
|
|||
|
|
@ -1,109 +1,214 @@
|
|||
# Copyright (c) 2017 Xored Software, Inc.
|
||||
# Copyright (c) 2018 Xored Software, Inc.
|
||||
|
||||
import internal.godotstrings
|
||||
import math, godotbase, hashes
|
||||
|
||||
type
|
||||
Vector2* {.byref.} = object
|
||||
x*: float32
|
||||
y*: float32
|
||||
import internal/godotinternaltypes, internal/godotstrings
|
||||
import godotcoretypes, gdnativeapi
|
||||
|
||||
proc vec2*(x, y: float32): Vector2 {.inline.} =
|
||||
const EPSILON = 0.00001'f32
|
||||
|
||||
{.push stackTrace: off.}
|
||||
|
||||
proc vec2*(): Vector2 {.inline, noinit.} =
|
||||
Vector2()
|
||||
|
||||
proc vec2*(x, y: float32): Vector2 {.inline, noinit.} =
|
||||
Vector2(x: x, y: y)
|
||||
|
||||
proc toGodotString(self: Vector2): GodotString {.
|
||||
importc: "godot_vector2_as_string".}
|
||||
proc `$`*(self: Vector2): string {.inline, noinit.} =
|
||||
$getGDNativeAPI().vector2AsString(self)
|
||||
|
||||
proc `$`*(self: Vector2): string {.inline.} =
|
||||
$self.toGodotString()
|
||||
proc hash*(self: Vector2): Hash {.inline, noinit.} =
|
||||
!$(self.x.hash() !& self.y.hash())
|
||||
|
||||
proc normalized*(self: Vector2): Vector2 {.
|
||||
importc: "godot_vector2_normalized".}
|
||||
proc length*(self: Vector2): float32 {.
|
||||
importc: "godot_vector2_length".}
|
||||
proc angle*(self: Vector2): float32 {.
|
||||
importc: "godot_vector2_angle".}
|
||||
proc lengthSquared*(self: Vector2): float32 {.
|
||||
importc: "godot_vector2_length_squared".}
|
||||
proc isNormalized*(self: Vector2): bool {.
|
||||
importc: "godot_vector2_is_normalized".}
|
||||
proc distanceTo*(self, to: Vector2): float32 {.
|
||||
importc: "godot_vector2_distance_to".}
|
||||
proc distanceSquaredTo*(self, to: Vector2): float32 {.
|
||||
importc: "godot_vector2_distance_squared_to".}
|
||||
proc angleTo*(self, to: Vector2): float32 {.
|
||||
importc: "godot_vector2_angle_to".}
|
||||
proc angleToPoint*(self, to: Vector2): float32 {.
|
||||
importc: "godot_vector2_angle_to_point".}
|
||||
proc lerp*(self, b: Vector2; t: float32): Vector2 {.
|
||||
importc: "godot_vector2_linear_interpolate".}
|
||||
proc cubicInterpolate*(self, b, pre_a, post_b: Vector2; t: float32): Vector2 {.
|
||||
importc: "godot_vector2_cubic_interpolate".}
|
||||
proc rotated*(self: Vector2; phi: float32): Vector2 {.
|
||||
importc: "godot_vector2_rotated".}
|
||||
proc tangent*(self: Vector2): Vector2 {.
|
||||
importc: "godot_vector2_tangent".}
|
||||
proc floor*(self: Vector2): Vector2 {.
|
||||
importc: "godot_vector2_floor".}
|
||||
proc snapped*(self: Vector2; by: Vector2): Vector2 {.
|
||||
importc: "godot_vector2_snapped".}
|
||||
proc aspect*(self: Vector2): float32 {.
|
||||
importc: "godot_vector2_aspect".}
|
||||
proc dot*(a, b: Vector2): float32 {.
|
||||
importc: "godot_vector2_dot".}
|
||||
proc slide*(self, n: Vector2): Vector2 {.
|
||||
importc: "godot_vector2_slide".}
|
||||
proc bounce*(self, n: Vector2): Vector2 {.
|
||||
importc: "godot_vector2_bounce".}
|
||||
proc reflect*(self, n: Vector2): Vector2 {.
|
||||
importc: "godot_vector2_reflect".}
|
||||
proc abs*(self: Vector2): Vector2 {.
|
||||
importc: "godot_vector2_abs".}
|
||||
proc clamped*(self: Vector2; length: float32): Vector2 {.
|
||||
importc: "godot_vector2_clamped".}
|
||||
proc `+`*(self, other: Vector2): Vector2 {.inline, noinit.} =
|
||||
Vector2(x: self.x + other.x, y: self.y + other.y)
|
||||
|
||||
proc `+`*(a, b: Vector2): Vector2 {.
|
||||
importc: "godot_vector2_operator_add".}
|
||||
proc `+=`*(a: var Vector2, b: Vector2) {.inline.} =
|
||||
a += b
|
||||
proc `+=`*(self: var Vector2, other: Vector2) {.inline, noinit.} =
|
||||
self.x += other.x
|
||||
self.y += other.y
|
||||
|
||||
proc `-`*(a, b: Vector2): Vector2 {.
|
||||
importc: "godot_vector2_operator_substract".}
|
||||
proc `-=`*(a: var Vector2, b: Vector2) {.inline.} =
|
||||
a = a - b
|
||||
proc `-`*(self, other: Vector2): Vector2 {.inline, noinit.} =
|
||||
Vector2(x: self.x - other.x, y: self.y - other.y)
|
||||
|
||||
proc `*`*(a, b: Vector2): Vector2 {.
|
||||
importc: "godot_vector2_operator_multiply_vector".}
|
||||
proc `-=`*(self: var Vector2, other: Vector2) {.inline, noinit.} =
|
||||
self.x -= other.x
|
||||
self.y -= other.y
|
||||
|
||||
proc `*=`*(a: var Vector2, b: Vector2) {.inline.} =
|
||||
a = a * b
|
||||
proc `*`*(self, other: Vector2): Vector2 {.inline, noinit.} =
|
||||
Vector2(x: self.x * other.x, y: self.y * other.y)
|
||||
|
||||
proc `*`*(self: Vector2, scalar: float32): Vector2 {.
|
||||
importc: "godot_vector2_operator_multiply_scalar".}
|
||||
proc `*=`*(self: var Vector2, scalar: float32) {.inline.} =
|
||||
self = self * scalar
|
||||
proc `*=`*(self: var Vector2, other: Vector2) {.inline, noinit.} =
|
||||
self.x *= other.x
|
||||
self.y *= other.y
|
||||
|
||||
proc `/`*(a, b: Vector2): Vector2 {.
|
||||
importc: "godot_vector2_operator_divide_vector".}
|
||||
proc `/=`*(a: var Vector2, b: Vector2) {.inline.} =
|
||||
a = a / b
|
||||
proc `*`*(self: Vector2, scalar: float32): Vector2 {.inline, noinit.} =
|
||||
Vector2(x: self.x * scalar, y: self.y * scalar)
|
||||
|
||||
proc `/`*(self: Vector2; scalar: float32): Vector2 {.
|
||||
importc: "godot_vector2_operator_divide_scalar".}
|
||||
proc `/=`*(self: var Vector2; scalar: float32) {.inline.} =
|
||||
proc `*`*(scalar: float32, v: Vector2): Vector2 {.inline, noinit.} =
|
||||
v * scalar
|
||||
|
||||
proc `*=`*(self: var Vector2, scalar: float32) {.inline, noinit.} =
|
||||
self.x *= scalar
|
||||
self.y *= scalar
|
||||
|
||||
proc `/`*(self, other: Vector2): Vector2 {.inline, noinit.} =
|
||||
Vector2(x: self.x / other.x, y: self.y / other.y)
|
||||
|
||||
proc `/=`*(self: var Vector2, other: Vector2) {.inline, noinit.} =
|
||||
self.x /= other.x
|
||||
self.y /= other.y
|
||||
|
||||
proc `/`*(self: Vector2; scalar: float32): Vector2 {.inline, noinit.} =
|
||||
Vector2(x: self.x / scalar, y: self.y / scalar)
|
||||
|
||||
proc `/=`*(self: var Vector2; scalar: float32) {.inline, noinit.} =
|
||||
self = self / scalar
|
||||
|
||||
proc `==`*(a, b: Vector2): bool {.
|
||||
importc: "godot_vector2_operator_equal".}
|
||||
proc `<`*(a, b: Vector2): bool {.
|
||||
importc: "godot_vector2_operator_less".}
|
||||
proc `-`*(self: Vector2): Vector2 {.
|
||||
importc: "godot_vector2_operator_neg".}
|
||||
proc `==`*(self, other: Vector2): bool {.inline, noinit.} =
|
||||
self.x == other.x and self.y == other.y
|
||||
|
||||
proc `x=`*(self: var Vector2; x: float32) {.
|
||||
importc: "godot_vector2_set_x".}
|
||||
proc `y=`*(self: var Vector2; y: float32) {.
|
||||
importc: "godot_vector2_set_y".}
|
||||
proc x*(self: Vector2): float32 {.
|
||||
importc: "godot_vector2_get_x".}
|
||||
proc y*(self: Vector2): float32 {.
|
||||
importc: "godot_vector2_get_y".}
|
||||
proc `<`*(self, other: Vector2): bool {.inline, noinit.} =
|
||||
if self.x == other.x:
|
||||
self.y < other.y
|
||||
else:
|
||||
self.x < other.x
|
||||
|
||||
proc `>`*(self, other: Vector2): bool {.inline, noinit.} =
|
||||
if self.x == other.x:
|
||||
self.y > other.y
|
||||
else:
|
||||
self.x > other.x
|
||||
|
||||
proc `-`*(self: Vector2): Vector2 {.inline, noinit.} =
|
||||
Vector2(x: -self.x, y: -self.y)
|
||||
|
||||
proc length*(self: Vector2): float32 {.inline, noinit.} =
|
||||
sqrt(self.x * self.x + self.y * self.y)
|
||||
|
||||
proc lengthSquared*(self: Vector2): float32 {.inline, noinit.} =
|
||||
self.x * self.x + self.y * self.y
|
||||
|
||||
proc normalize*(self: var Vector2) {.inline.} =
|
||||
var len = self.x * self.x + self.y * self.y
|
||||
if len != 0:
|
||||
len = sqrt(len)
|
||||
self.x /= len
|
||||
self.y /= len
|
||||
|
||||
proc normalized*(self: Vector2): Vector2 {.inline, noinit.} =
|
||||
result = self
|
||||
result.normalize()
|
||||
|
||||
proc angle*(self: Vector2): float32 {.inline, noinit.} =
|
||||
arctan2(self.y, self.x)
|
||||
|
||||
proc isNormalized*(self: Vector2): bool {.inline, noinit.} =
|
||||
isEqualApprox(self.lengthSquared(), 1.0)
|
||||
|
||||
proc distanceTo*(self, to: Vector2): float32 {.inline, noinit.} =
|
||||
sqrt((self.x - to.x) * (self.x - to.x) + (self.y - to.y) * (self.y - to.y))
|
||||
|
||||
proc distanceSquaredTo*(self, to: Vector2): float32 {.inline, noinit.} =
|
||||
(self.x - to.x) * (self.x - to.x) + (self.y - to.y) * (self.y - to.y)
|
||||
|
||||
proc dot*(a, b: Vector2): float32 {.inline, noinit.} =
|
||||
a.x * b.x + a.y * b.y
|
||||
|
||||
proc cross*(a, b: Vector2): float32 {.inline, noinit.} =
|
||||
a.x * b.y - a.y * b.x
|
||||
|
||||
proc cross*(self: Vector2, scalar: float32): Vector2 {.inline, noinit.} =
|
||||
Vector2(x: scalar * self.y, y: -scalar * self.x)
|
||||
|
||||
proc angleTo*(self, to: Vector2): float32 {.noinit.} =
|
||||
arctan2(cross(self, to), dot(self, to))
|
||||
|
||||
proc angleToPoint*(self, to: Vector2): float32 {.inline, noinit.} =
|
||||
arctan2(self.y - to.y, self.x - to.x)
|
||||
|
||||
proc floor*(self: Vector2): Vector2 {.inline, noinit.} =
|
||||
Vector2(x: floor(self.x), y: floor(self.y))
|
||||
|
||||
proc planeProject*(self: Vector2, d: float32,
|
||||
vec: Vector2): Vector2 {.noinit.} =
|
||||
vec - self * (self.dot(vec) - d)
|
||||
|
||||
proc project*(self, other: Vector2): Vector2 {.noinit.} =
|
||||
self * (other.dot(self) / self.dot(self))
|
||||
|
||||
proc lerp*(self, b: Vector2; t: float32): Vector2 {.inline, noinit.} =
|
||||
result = self
|
||||
result.x += t * (b.x - self.x)
|
||||
result.y += t * (b.y - self.y)
|
||||
|
||||
proc cubicInterpolate*(self, b, preA, postB: Vector2;
|
||||
t: float32): Vector2 {.noinit.} =
|
||||
let p0 = preA
|
||||
let p1 = self
|
||||
let p2 = b
|
||||
let p3 = postB
|
||||
|
||||
let t2 = t * t
|
||||
let t3 = t2 * t
|
||||
|
||||
result = 0.5'f32 * ((p1 * 2.0'f32)) +
|
||||
(-p0 + p2) * t +
|
||||
(2.0 * p0 - 5.0 * p1 + 4 * p2 - p3) * t2 +
|
||||
(-p0 + 3.0 * p1 - 3.0 * p2 + p3) * t3
|
||||
|
||||
proc setRotation*(self: var Vector2, radians: float32) {.inline, noinit.} =
|
||||
self.x = cos(radians)
|
||||
self.y = sin(radians)
|
||||
|
||||
proc rotated*(self: Vector2; phi: float32): Vector2 {.inline, noinit.} =
|
||||
result.setRotation(phi)
|
||||
result *= self.length()
|
||||
|
||||
proc tangent*(self: Vector2): Vector2 {.inline, noinit.} =
|
||||
Vector2(x: self.y, y: -self.x)
|
||||
|
||||
proc snapped*(self: Vector2; by: Vector2): Vector2 {.inline, noinit.} =
|
||||
Vector2(x: stepify(self.x, by.x), y: stepify(self.y, by.y))
|
||||
|
||||
proc aspect*(self: Vector2): float32 {.inline, noinit.} =
|
||||
self.x / self.y
|
||||
|
||||
proc slide*(self, n: Vector2): Vector2 {.noinit.} =
|
||||
when not defined(release):
|
||||
if not n.isNormalized():
|
||||
printError("Normal not normalized in slide. " & getStackTrace())
|
||||
return vec2()
|
||||
result = self - n * self.dot(n)
|
||||
|
||||
proc reflect*(self, n: Vector2): Vector2 {.noinit.} =
|
||||
when not defined(release):
|
||||
if not n.isNormalized():
|
||||
printError("Normal not normalized in bounce. " & getStackTrace())
|
||||
return vec2()
|
||||
result = 2.0 * n * self.dot(n) - self
|
||||
|
||||
proc bounce*(self, n: Vector2): Vector2 {.inline, noinit.} =
|
||||
-self.reflect(n)
|
||||
|
||||
proc abs*(self: Vector2): Vector2 {.inline, noinit.} =
|
||||
Vector2(x: abs(self.x), y: abs(self.y))
|
||||
|
||||
proc clamped*(self: Vector2; length: float32): Vector2 {.noinit.} =
|
||||
let len = self.length()
|
||||
result = self
|
||||
if len > 0 and length < len:
|
||||
result /= len
|
||||
result *= length
|
||||
|
||||
proc moveToward*(vFrom, to: Vector2, delta: float32): Vector2 =
|
||||
let
|
||||
vd = to - vFrom
|
||||
vLen = vd.length
|
||||
|
||||
if vLen <= delta or vLen < EPSILON:
|
||||
result = to
|
||||
else:
|
||||
result = vFrom + (vd / vLen) * delta
|
||||
|
||||
{.pop.} # stackTrace: off
|
||||
|
|
|
|||
|
|
@ -1,13 +1,11 @@
|
|||
# Copyright (c) 2017 Xored Software, Inc.
|
||||
# Copyright (c) 2018 Xored Software, Inc.
|
||||
|
||||
import math
|
||||
import godotbase
|
||||
import math, hashes
|
||||
import godotbase, godotcoretypes
|
||||
|
||||
type
|
||||
Vector3* {.byref.} = object
|
||||
x*: float32
|
||||
y*: float32
|
||||
z*: float32
|
||||
const EPSILON = 0.00001'f32
|
||||
|
||||
{.push stackTrace: off.}
|
||||
|
||||
proc vec3*(): Vector3 {.inline.} =
|
||||
Vector3()
|
||||
|
|
@ -25,6 +23,9 @@ proc `$`*(self: Vector3): string {.inline.} =
|
|||
result.add($self.z)
|
||||
result.add(')')
|
||||
|
||||
proc hash*(self: Vector3): Hash {.inline, noinit.} =
|
||||
!$(self.x.hash() !& self.y.hash() !& self.z.hash())
|
||||
|
||||
proc `+`*(a, b: Vector3): Vector3 {.inline.} =
|
||||
result.x = a.x + b.x
|
||||
result.y = a.y + b.y
|
||||
|
|
@ -239,3 +240,15 @@ proc cubicInterpolate*(self, b, preA, postB: Vector3;
|
|||
(-p0 + p2) * t +
|
||||
(2.0 * p0 - 5.0 * p1 + 4 * p2 - p3) * t2 +
|
||||
(-p0 + 3.0 * p1 - 3.0 * p2 + p3) * t3)
|
||||
|
||||
proc moveToward*(vFrom, to: Vector3, delta: float32): Vector3 =
|
||||
let
|
||||
vd = to - vFrom
|
||||
vLen = vd.length
|
||||
|
||||
if vLen <= delta or vLen < EPSILON:
|
||||
result = to
|
||||
else:
|
||||
result = vFrom + (vd / vLen) * delta
|
||||
|
||||
{.pop.} # stackTrace: off
|
||||
3617
godot/gdnativeapi.nim
Normal file
3617
godot/gdnativeapi.nim
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -1,17 +1,18 @@
|
|||
# Copyright 2017 Xored Software, Inc.
|
||||
# Copyright 2018 Xored Software, Inc.
|
||||
|
||||
import core.godotbase, godotinternal
|
||||
import core.vector2, core.rect2, core.vector3, core.transform2d, core.planes,
|
||||
core.quats
|
||||
import core.rect3, core.basis, core.transforms, core.colors, core.nodepaths,
|
||||
core.rids
|
||||
import core.dictionaries, core.arrays, core.poolarrays, core.variants
|
||||
import core/godotbase, godotinternal
|
||||
import core/godotcoretypes
|
||||
import core/vector2, core/rect2, core/vector3, core/transform2d, core/planes,
|
||||
core/quats
|
||||
import core/aabb, core/basis, core/transforms, core/colors, core/nodepaths,
|
||||
core/rids
|
||||
import core/dictionaries, core/arrays, core/poolarrays, core/variants
|
||||
|
||||
import nim.godotmacros, nim.godotnim
|
||||
import nim/godotmacros, nim/godotnim
|
||||
|
||||
export godotbase, vector2, rect2, vector3, transform2d, planes, quats,
|
||||
rect3, basis, transforms, colors, nodepaths, rids, dictionaries, arrays,
|
||||
poolarrays, variants
|
||||
export godotbase, godotcoretypes, vector2, rect2, vector3, transform2d, planes,
|
||||
quats, aabb, basis, transforms, colors, nodepaths, rids, dictionaries,
|
||||
arrays, poolarrays, variants
|
||||
export godotmacros, godotnim
|
||||
|
||||
export GodotPropertyHint, GodotPropertyUsage
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,262 +1,85 @@
|
|||
# Copyright 2017 Xored Software, Inc.
|
||||
# Copyright 2018 Xored Software, Inc.
|
||||
|
||||
import internal.godotobjects, internal.godotarrays, internal.godotnodepaths,
|
||||
internal.godotpoolarrays, internal.godotstrings, internal.godotvariants,
|
||||
internal.godotdictionaries
|
||||
import internal/godotinternaltypes, internal/godotarrays,
|
||||
internal/godotnodepaths, internal/godotpoolarrays, internal/godotstrings,
|
||||
internal/godotvariants, internal/godotdictionaries
|
||||
|
||||
export godotobjects, godotarrays, godotnodepaths, godotpoolarrays,
|
||||
import gdnativeapi
|
||||
export godotinternaltypes, godotarrays, godotnodepaths, godotpoolarrays,
|
||||
godotstrings, godotvariants, godotdictionaries
|
||||
|
||||
const MAX_ARG_COUNT* = 128
|
||||
proc getMethod*(className: cstring;
|
||||
methodName: cstring): ptr GodotMethodBind {.inline.} =
|
||||
getGDNativeAPI().methodBindGetMethod(className, methodName)
|
||||
|
||||
# MethodBind API
|
||||
|
||||
type GodotMethodBind* = object
|
||||
|
||||
proc getMethod*(className: cstring; methodName: cstring): ptr GodotMethodBind {.
|
||||
importc: "godot_method_bind_get_method".}
|
||||
proc ptrCall*(methodBind: ptr GodotMethodBind;
|
||||
instance: ptr GodotObject;
|
||||
args: ptr array[MAX_ARG_COUNT, pointer];
|
||||
ret: pointer) {.
|
||||
importc: "godot_method_bind_ptrcall".}
|
||||
ret: pointer) {.inline.} =
|
||||
getGDNativeAPI().methodBindPtrCall(methodBind, instance, args, ret)
|
||||
|
||||
proc call*(methodBind: ptr GodotMethodBind;
|
||||
instance: ptr GodotObject;
|
||||
args: ptr array[MAX_ARG_COUNT, ptr GodotVariant]; argCount: cint;
|
||||
callError: var VariantCallError): GodotVariant {.
|
||||
importc: "godot_method_bind_call".}
|
||||
callError: var VariantCallError): GodotVariant {.inline.} =
|
||||
getGDNativeAPI().methodBindCall(
|
||||
methodBind, instance, args, argCount, callError)
|
||||
|
||||
# Script API
|
||||
proc nativeScriptRegisterClass*(libHandle: pointer; name, base: cstring;
|
||||
createFunc: GodotInstanceCreateFunc;
|
||||
destroyFunc: GodotInstanceDestroyFunc)
|
||||
{.inline.} =
|
||||
getGDNativeAPI().nativeScriptRegisterClass(
|
||||
libHandle, name, base, createFunc, destroyFunc)
|
||||
|
||||
type
|
||||
GodotNativeInitOptions* = object
|
||||
inEditor*: bool
|
||||
coreApiHash*: uint64
|
||||
editorApiHash*: uint64
|
||||
noApiHash*: uint64
|
||||
gdNativeLibrary*: ptr GodotObject
|
||||
proc nativeScriptRegisterToolClass*(libHandle: pointer; name, base: cstring;
|
||||
createFunc: GodotInstanceCreateFunc;
|
||||
destroyFunc: GodotInstanceDestroyFunc)
|
||||
{.inline.} =
|
||||
getGDNativeAPI().nativeScriptRegisterToolClass(
|
||||
libHandle, name, base, createFunc, destroyFunc)
|
||||
|
||||
GodotNativeTerminateOptions* = object
|
||||
inEditor*: bool
|
||||
proc nativeScriptRegisterMethod*(libHandle: pointer;
|
||||
name: cstring; function_name: cstring;
|
||||
attr: GodotMethodAttributes;
|
||||
meth: GodotInstanceMethod) {.inline.} =
|
||||
getGDNativeAPI().nativeScriptRegisterMethod(
|
||||
libHandle, name, functionName, attr, meth)
|
||||
|
||||
GodotMethodRPCMode* {.size: sizeof(cint), pure.} = enum
|
||||
Disabled,
|
||||
Remote,
|
||||
Sync,
|
||||
Master,
|
||||
Slave
|
||||
proc nativeScriptRegisterProperty*(libHandle: pointer;
|
||||
name, path: cstring;
|
||||
attr: ptr GodotPropertyAttributes;
|
||||
setFunc: GodotPropertySetFunc;
|
||||
getFunc: GodotPropertyGetFunc) {.inline.} =
|
||||
getGDNativeAPI().nativeScriptRegisterProperty(
|
||||
libHandle, name, path, attr, setFunc, getFunc)
|
||||
|
||||
GodotMethodAttributes* = object
|
||||
rpcMode*: GodotMethodRPCMode
|
||||
proc nativeScriptRegisterSignal*(libHandle: pointer; name: cstring;
|
||||
signal: GodotSignal) {.inline.} =
|
||||
getGDNativeAPI().nativeScriptRegisterSignal(libHandle, name, signal)
|
||||
|
||||
GodotPropertyHint* {.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
|
||||
proc getUserdata*(instance: ptr GodotObject): pointer {.inline.} =
|
||||
getGDNativeAPI().nativeScriptGetUserdata(instance)
|
||||
|
||||
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
|
||||
proc getClassConstructor*(className: cstring): GodotClassConstructor
|
||||
{.inline.} =
|
||||
getGDNativeAPI().getClassConstructor(className)
|
||||
|
||||
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
|
||||
GodotPropertyUsage* {.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* {.bycopy.} = object
|
||||
rsetType*: GodotMethodRPCMode
|
||||
typ*: cint
|
||||
hint*: GodotPropertyHint
|
||||
hintString*: GodotString
|
||||
usage*: cint
|
||||
defaultValue*: GodotVariant
|
||||
|
||||
GodotInstanceCreateFunc* {.bycopy.} = object
|
||||
createFunc*:
|
||||
proc (obj: ptr GodotObject; methodData: pointer): pointer {.noconv.}
|
||||
## returns user data
|
||||
methodData*: pointer
|
||||
freeFunc*: proc (a2: pointer) {.noconv.}
|
||||
|
||||
GodotInstanceDestroyFunc* {.bycopy.} = object
|
||||
destroyFunc*:
|
||||
proc (obj: ptr GodotObject; methodData: pointer;
|
||||
userData: pointer) {.noconv.}
|
||||
methodData*: pointer
|
||||
freeFunc*: proc (a2: pointer) {.noconv.}
|
||||
|
||||
proc godotScriptRegisterClass*(libHandle: pointer; name, base: cstring;
|
||||
create_func: GodotInstanceCreateFunc;
|
||||
destroy_func: GodotInstanceDestroyFunc) {.
|
||||
importc: "godot_nativescript_register_class".}
|
||||
proc godotScriptRegisterToolClass*(libHandle: pointer; name, base: cstring;
|
||||
createFunc: GodotInstanceCreateFunc;
|
||||
destroyFunc: GodotInstanceDestroyFunc) {.
|
||||
importc: "godot_nativescript_register_tool_class".}
|
||||
type
|
||||
GodotInstanceMethod* {.bycopy.} = object
|
||||
meth*:
|
||||
proc (obj: ptr GodotObject; methodData: pointer;
|
||||
userData: pointer; numArgs: cint;
|
||||
args: var array[MAX_ARG_COUNT, ptr GodotVariant]):
|
||||
GodotVariant {.noconv.}
|
||||
methodData*: pointer
|
||||
freeFunc*: proc (a2: pointer) {.noconv.}
|
||||
|
||||
proc godotScriptRegisterMethod*(libHandle: pointer;
|
||||
name: cstring; function_name: cstring;
|
||||
attr: GodotMethodAttributes;
|
||||
meth: GodotInstanceMethod) {.
|
||||
importc: "godot_nativescript_register_method".}
|
||||
type
|
||||
GodotPropertySetFunc* {.bycopy.} = object
|
||||
setFunc*: proc (obj: ptr GodotObject; methodData: pointer;
|
||||
userData: pointer; value: GodotVariant) {.noconv.}
|
||||
methodData*: pointer
|
||||
freeFunc*: proc (a2: pointer) {.noconv.}
|
||||
|
||||
GodotPropertyGetFunc* {.bycopy.} = object
|
||||
getFunc*: proc (obj: ptr GodotObject; methodData: pointer;
|
||||
userData: pointer): GodotVariant {.noconv.}
|
||||
methodData*: pointer
|
||||
freeFunc*: proc (a2: pointer) {.noconv.}
|
||||
|
||||
proc godotScriptRegisterProperty*(libHandle: pointer;
|
||||
name: cstring; path: cstring;
|
||||
attr: ptr GodotPropertyAttributes;
|
||||
setFunc: GodotPropertySetFunc;
|
||||
getFunc: GodotPropertyGetFunc) {.
|
||||
importc: "godot_nativescript_register_property".}
|
||||
|
||||
type
|
||||
GodotSignalArgument* {.bycopy.} = object
|
||||
name*: GodotString
|
||||
typ*: cint
|
||||
hint*: GodotPropertyHint
|
||||
hintString*: GodotString
|
||||
usage*: cint
|
||||
defaultValue*: GodotVariant
|
||||
|
||||
GodotSignal* = object
|
||||
name*: GodotString
|
||||
numArgs*: cint
|
||||
args*: ptr GodotSignalArgument
|
||||
numDefaultArgs*: cint
|
||||
defaultArgs*: ptr GodotVariant
|
||||
|
||||
|
||||
proc godotScriptRegisterSignal*(libHandle: pointer; name: cstring;
|
||||
signal: GodotSignal) {.
|
||||
importc: "godot_nativescript_register_signal".}
|
||||
|
||||
proc getUserdata*(instance: ptr GodotObject): pointer {.
|
||||
importc: "godot_nativescript_get_userdata".}
|
||||
|
||||
type ClassConstructor = proc (): ptr GodotObject {.noconv.}
|
||||
proc getClassConstructor*(className: cstring): ClassConstructor {.
|
||||
importc: "godot_get_class_constructor".}
|
||||
|
||||
proc godotStackBottom*(): pointer {.
|
||||
importc: "godot_get_stack_bottom".}
|
||||
|
||||
proc deinit*(o: ptr GodotObject) {.
|
||||
importc: "godot_object_destroy".}
|
||||
proc deinit*(o: ptr GodotObject) {.inline.} =
|
||||
getGDNativeAPI().objectDestroy(o)
|
||||
|
||||
# print using Godot's error handler list
|
||||
|
||||
proc godotPrintError*(description: cstring; function: cstring; file: cstring;
|
||||
line: cint) {.
|
||||
importc: "godot_print_error".}
|
||||
proc godotPrintError*(description, function, file: cstring;
|
||||
line: cint) {.inline.} =
|
||||
getGDNativeAPI().printError(description, function, file, line)
|
||||
|
||||
proc godotPrintWarning*(description: cstring; function: cstring;
|
||||
file: cstring; line: cint) {.
|
||||
importc: "godot_print_warning".}
|
||||
proc godotPrintWarning*(description, function, file: cstring;
|
||||
line: cint) {.inline.} =
|
||||
getGDNativeAPI().printWarning(description, function, file, line)
|
||||
|
||||
proc godotPrint*(message: GodotString) {.
|
||||
importc: "godot_print".}
|
||||
proc godotPrint*(message: GodotString) {.inline.} =
|
||||
getGDNativeAPI().print(message)
|
||||
|
||||
var getClassMethodBind: ptr GodotMethodBind
|
||||
proc getClassName*(o: ptr GodotObject): string =
|
||||
|
|
@ -270,22 +93,30 @@ proc getClassName*(o: ptr GodotObject): string =
|
|||
# There are physics type not known by ClassDB
|
||||
result = result[0..result.len-3]
|
||||
|
||||
proc getGodotSingleton*(name: cstring): ptr GodotObject {.
|
||||
importc: "godot_global_get_singleton".}
|
||||
proc getClassNameRaw*(o: ptr GodotObject): GodotString =
|
||||
if getClassMethodBind.isNil:
|
||||
getClassMethodBind = getMethod(cstring"Object", cstring"get_class")
|
||||
getClassMethodBind.ptrCall(o, nil, addr result)
|
||||
|
||||
proc getGodotSingleton*(name: cstring): ptr GodotObject {.inline.} =
|
||||
getGDNativeAPI().globalGetSingleton(name)
|
||||
|
||||
# System Functions
|
||||
|
||||
proc godotAlloc*(bytes: cint): pointer {.
|
||||
importc: "godot_alloc".}
|
||||
proc godotAlloc*(bytes: cint): pointer {.inline.} =
|
||||
## 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".}
|
||||
getGDNativeAPI().alloc(bytes)
|
||||
|
||||
proc godotRealloc*(p: pointer; bytes: cint): pointer {.inline.} =
|
||||
## 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".}
|
||||
getGDNativeAPI().realloc(p, bytes)
|
||||
|
||||
proc godotFree*(p: pointer) {.inline.} =
|
||||
## 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.
|
||||
getGDNativeAPI().free(p)
|
||||
|
|
|
|||
19
godot/internal/backwardcompat.inc.nim
Normal file
19
godot/internal/backwardcompat.inc.nim
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
# Copyright 2019 Xored Software, Inc.
|
||||
|
||||
when (NimMajor, NimMinor, NimPatch) < (0, 19, 0):
|
||||
import macros, sets
|
||||
|
||||
proc strVal(n: NimNode): string {.used.} =
|
||||
case n.kind
|
||||
of nnkIdent:
|
||||
$n.ident
|
||||
of nnkSym:
|
||||
$n.symbol
|
||||
else:
|
||||
macros.strVal(n)
|
||||
|
||||
proc toHashSet[A](keys: openArray[A]): HashSet[A] {.inline, used.} =
|
||||
toSet(keys)
|
||||
|
||||
proc initHashSet[A](): HashSet[A] {.inline, used.} =
|
||||
initSet[A]()
|
||||
|
|
@ -1,123 +1,155 @@
|
|||
# Copyright (c) 2017 Xored Software, Inc.
|
||||
# Copyright (c) 2018 Xored Software, Inc.
|
||||
|
||||
type
|
||||
GodotArray* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
import godotinternaltypes, gdnativeapi, core/godotcoretypes
|
||||
|
||||
proc len*(self: GodotArray): cint {.
|
||||
noSideEffect,
|
||||
importc: "godot_array_size".}
|
||||
proc len*(self: GodotArray): cint {.inline.} =
|
||||
getGDNativeAPI().arraySize(self)
|
||||
|
||||
import hashes
|
||||
import godotobjects, godotpoolarrays, godotvariants, godotstrings
|
||||
|
||||
proc initGodotArray*(dest: var GodotArray) {.
|
||||
importc: "godot_array_new".}
|
||||
proc initGodotArray*(dest: var GodotArray; pca: GodotPoolColorArray) {.
|
||||
importc: "godot_array_new_pool_coloarray".}
|
||||
proc initGodotArray*(dest: var GodotArray; pv3a: GodotPoolVector3Array) {.
|
||||
importc: "godot_array_new_pool_vector3_array".}
|
||||
proc initGodotArray*(dest: var GodotArray; pv2a: GodotPoolVector2Array) {.
|
||||
importc: "godot_array_new_pool_vector2_array".}
|
||||
proc initGodotArray*(dest: var GodotArray; psa: GodotPoolStringArray) {.
|
||||
importc: "godot_array_new_pool_string_array".}
|
||||
proc initGodotArray*(dest: var GodotArray; pra: GodotPoolRealArray) {.
|
||||
importc: "godot_array_new_pool_real_array".}
|
||||
proc initGodotArray*(dest: var GodotArray; pia: GodotPoolIntArray) {.
|
||||
importc: "godot_array_new_pool_int_array".}
|
||||
proc initGodotArray*(dest: var GodotArray; pba: GodotPoolByteArray) {.
|
||||
importc: "godot_array_new_pool_byte_array".}
|
||||
proc iniGodotArray*(dest: var GodotArray; src: GodotArray) {.
|
||||
importc: "godot_array_new_copy".}
|
||||
proc initGodotArray*(dest: var GodotArray) {.inline.} =
|
||||
getGDNativeAPI().arrayNew(dest)
|
||||
|
||||
proc deinit*(self: var GodotArray) {.importc: "godot_array_destroy".}
|
||||
proc initGodotArray*(dest: var GodotArray;
|
||||
pca: GodotPoolColorArray) {.inline.} =
|
||||
getGDNativeAPI().arrayNewPoolColorArray(dest, pca)
|
||||
|
||||
proc `[]=`*(self: var GodotArray; idx: cint;
|
||||
value: GodotVariant) {.
|
||||
noSideEffect,
|
||||
importc: "godot_array_set".}
|
||||
proc `[]`*(self: GodotArray; idx: cint): GodotVariant {.
|
||||
noSideEffect,
|
||||
importc: "godot_array_get".}
|
||||
proc mget*(self: var GodotArray; idx: cint): ptr GodotVariant {.
|
||||
importc: "godot_array_operator_index".}
|
||||
proc initGodotArray*(dest: var GodotArray;
|
||||
pv3a: GodotPoolVector3Array) {.inline.} =
|
||||
getGDNativeAPI().arrayNewPoolVector3Array(dest, pv3a)
|
||||
|
||||
proc initGodotArray*(dest: var GodotArray;
|
||||
pv2a: GodotPoolVector2Array) {.inline.} =
|
||||
getGDNativeAPI().arrayNewPoolVector2Array(dest, pv2a)
|
||||
|
||||
proc initGodotArray*(dest: var GodotArray;
|
||||
psa: GodotPoolStringArray) {.inline.} =
|
||||
getGDNativeAPI().arrayNewPoolStringArray(dest, psa)
|
||||
|
||||
proc initGodotArray*(dest: var GodotArray;
|
||||
pra: GodotPoolRealArray) {.inline.} =
|
||||
getGDNativeAPI().arrayNewPoolRealArray(dest, pra)
|
||||
|
||||
proc initGodotArray*(dest: var GodotArray;
|
||||
pia: GodotPoolIntArray) {.inline.} =
|
||||
getGDNativeAPI().arrayNewPoolIntArray(dest, pia)
|
||||
|
||||
proc initGodotArray*(dest: var GodotArray;
|
||||
pba: GodotPoolByteArray) {.inline.} =
|
||||
getGDNativeAPI().arrayNewPoolByteArray(dest, pba)
|
||||
|
||||
proc initGodotArray*(dest: var GodotArray; src: GodotArray) {.inline.} =
|
||||
getGDNativeAPI().arrayNewCopy(dest, src)
|
||||
|
||||
proc deinit*(self: var GodotArray) {.inline.} =
|
||||
getGDNativeAPI().arrayDestroy(self)
|
||||
|
||||
proc `[]=`*(self: var GodotArray; idx: cint; value: GodotVariant) {.inline.} =
|
||||
getGDNativeAPI().arraySet(self, idx, value)
|
||||
|
||||
proc `[]`*(self: GodotArray; idx: cint): GodotVariant {.inline.} =
|
||||
getGDNativeAPI().arrayGet(self, idx)
|
||||
|
||||
proc mget*(self: var GodotArray; idx: cint): ptr GodotVariant {.inline.} =
|
||||
getGDNativeAPI().arrayOperatorIndex(self, idx)
|
||||
|
||||
proc add*(self: var GodotArray; value: GodotVariant) {.inline.} =
|
||||
getGDNativeAPI().arrayPushBack(self, value)
|
||||
|
||||
proc clear*(self: var GodotArray) {.inline.} =
|
||||
getGDNativeAPI().arrayClear(self)
|
||||
|
||||
proc count*(self: GodotArray; value: GodotVariant): cint {.inline.} =
|
||||
getGDNativeAPI().arrayCount(self, value)
|
||||
|
||||
proc isEmpty*(self: GodotArray): bool {.inline.} =
|
||||
getGDNativeAPI().arrayEmpty(self)
|
||||
|
||||
proc erase*(self: var GodotArray; value: GodotVariant) {.inline.} =
|
||||
getGDNativeAPI().arrayErase(self, value)
|
||||
|
||||
proc first*(self: GodotArray): GodotVariant {.inline.} =
|
||||
getGDNativeAPI().arrayFront(self)
|
||||
|
||||
proc last*(self: GodotArray): GodotVariant {.inline.} =
|
||||
getGDNativeAPI().arrayBack(self)
|
||||
|
||||
proc add*(self: var GodotArray; value: GodotVariant) {.
|
||||
noSideEffect,
|
||||
importc: "godot_array_append".}
|
||||
proc clear*(self: var GodotArray) {.importc: "godot_array_clear".}
|
||||
proc count*(self: GodotArray; value: GodotVariant): cint {.
|
||||
noSideEffect,
|
||||
importc: "godot_array_count".}
|
||||
proc isEmpty*(self: GodotArray): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_array_empty".}
|
||||
proc erase*(self: var GodotArray; value: GodotVariant) {.
|
||||
importc: "godot_array_erase".}
|
||||
proc first*(self: GodotArray): GodotVariant {.
|
||||
noSideEffect,
|
||||
importc: "godot_array_front".}
|
||||
proc last*(self: GodotArray): GodotVariant {.
|
||||
noSideEffect,
|
||||
importc: "godot_array_back".}
|
||||
proc find*(self: GodotArray; what: GodotVariant;
|
||||
f: cint): cint {.
|
||||
noSideEffect,
|
||||
importc: "godot_array_find".}
|
||||
proc findLast*(self: GodotArray; what: GodotVariant): cint {.
|
||||
noSideEffect,
|
||||
importc: "godot_array_find_last".}
|
||||
proc contains*(self: GodotArray; value: GodotVariant): bool {.
|
||||
noSideEffect,
|
||||
importc: "godot_array_has".}
|
||||
fromIdx: cint): cint {.inline.} =
|
||||
getGDNativeAPI().arrayFind(self, what, fromIdx)
|
||||
|
||||
proc findLast*(self: GodotArray; what: GodotVariant): cint {.inline.} =
|
||||
getGDNativeAPI().arrayFindLast(self, what)
|
||||
|
||||
proc contains*(self: GodotArray; value: GodotVariant): bool {.inline.} =
|
||||
getGDNativeAPI().arrayHas(self, value)
|
||||
|
||||
proc godotHash*(self: GodotArray): cint {.inline.} =
|
||||
getGDNativeAPI().arrayHash(self)
|
||||
|
||||
proc godotHash*(self: GodotArray): cint {.
|
||||
noSideEffect,
|
||||
importc: "godot_array_hash".}
|
||||
proc hash*(self: GodotArray): Hash {.inline.} =
|
||||
hash(godotHash(self))
|
||||
|
||||
proc insert*(self: var GodotArray; pos: cint;
|
||||
value: GodotVariant) {.
|
||||
importc: "godot_array_insert".}
|
||||
proc reverse*(self: var GodotArray) {.importc: "godot_array_invert".}
|
||||
proc popLast*(self: var GodotArray): GodotVariant {.
|
||||
importc: "godot_array_pop_back".}
|
||||
proc popFirst*(self: var GodotArray): GodotVariant {.
|
||||
importc: "godot_array_pop_front".}
|
||||
proc addLast*(self: var GodotArray; value: GodotVariant) {.
|
||||
importc: "godot_array_push_back".}
|
||||
proc addFirst*(self: var GodotArray; value: GodotVariant) {.
|
||||
importc: "godot_array_push_front".}
|
||||
value: GodotVariant): Error {.discardable, inline.} =
|
||||
getGDNativeAPI().arrayInsert(self, pos, value)
|
||||
|
||||
proc reverse*(self: var GodotArray) {.inline.} =
|
||||
getGDNativeAPI().arrayInvert(self)
|
||||
|
||||
proc popLast*(self: var GodotArray): GodotVariant {.inline.} =
|
||||
getGDNativeAPI().arrayPopBack(self)
|
||||
|
||||
proc popFirst*(self: var GodotArray): GodotVariant {.inline.} =
|
||||
getGDNativeAPI().arrayPopFront(self)
|
||||
|
||||
proc addLast*(self: var GodotArray; value: GodotVariant) {.inline.} =
|
||||
getGDNativeAPI().arrayPushBack(self, value)
|
||||
|
||||
proc addFirst*(self: var GodotArray; value: GodotVariant) {.inline.} =
|
||||
getGDNativeAPI().arrayPushFront(self, value)
|
||||
|
||||
proc delete*(self: var GodotArray; idx: cint) {.inline.} =
|
||||
getGDNativeAPI().arrayRemove(self, idx)
|
||||
|
||||
proc setLen*(self: var GodotArray; size: cint) {.inline.} =
|
||||
getGDNativeAPI().arrayResize(self, size)
|
||||
|
||||
proc delete*(self: var GodotArray; idx: cint) {.
|
||||
importc: "godot_array_remove".}
|
||||
proc setLen*(self: var GodotArray; size: cint) {.
|
||||
importc: "godot_array_resize".}
|
||||
proc rfind*(self: GodotArray; what: GodotVariant;
|
||||
f: cint): cint {.
|
||||
noSideEffect,
|
||||
importc: "godot_array_rfind".}
|
||||
proc sort*(self: var GodotArray) {.importc: "godot_array_sort".}
|
||||
proc sortCustom*(self: var GodotArray; obj: var GodotObject;
|
||||
funcName: GodotString) {.
|
||||
importc: "godot_array_sort_custom".}
|
||||
fromIdx: cint): cint {.inline.} =
|
||||
getGDNativeAPI().arrayRFind(self, what, fromIdx)
|
||||
|
||||
proc sort*(self: var GodotArray) {.inline.} =
|
||||
getGDNativeAPI().arraySort(self)
|
||||
|
||||
proc sortCustom*(self: var GodotArray; obj: ptr GodotObject;
|
||||
funcName: GodotString) {.inline.} =
|
||||
getGDNativeAPI().arraySortCustom(self, obj, funcName)
|
||||
|
||||
proc binarySearch*(self: var GodotArray, val: ptr GodotVariant,
|
||||
before: bool) {.inline.} =
|
||||
getGDNativeAPI().arrayBSearch(self, val, before)
|
||||
|
||||
proc binarySearchCustom*(self: var GodotArray, val: ptr GodotVariant,
|
||||
obj: ptr GodotObject, funcName: GodotString,
|
||||
before: bool) {.inline.} =
|
||||
getGDNativeAPI().arrayBSearchCustom(self, val, obj, funcName, before)
|
||||
|
||||
iterator items*(self: GodotArray): GodotVariant =
|
||||
for i in 0..<self.len:
|
||||
for i in 0.cint..<self.len:
|
||||
yield self[i]
|
||||
|
||||
iterator mitems*(self: var GodotArray): var GodotVariant =
|
||||
for i in 0..<self.len:
|
||||
for i in 0.cint..<self.len:
|
||||
yield self.mget(i)[]
|
||||
|
||||
iterator pairs*(self: GodotArray): tuple[key: cint, val: GodotVariant] =
|
||||
for i in 0..<self.len:
|
||||
for i in 0.cint..<self.len:
|
||||
yield (i, self[i])
|
||||
|
||||
iterator mpairs*(self: var GodotArray): tuple[key: cint,
|
||||
val: var GodotVariant] =
|
||||
for i in 0..<self.len:
|
||||
for i in 0.cint..<self.len:
|
||||
yield (i, self.mget(i)[])
|
||||
|
||||
proc `$`*(self: GodotArray): string =
|
||||
|
|
|
|||
|
|
@ -1,48 +1,56 @@
|
|||
# Copyright (c) 2017 Xored Software, Inc.
|
||||
# Copyright (c) 2018 Xored Software, Inc.
|
||||
|
||||
type
|
||||
GodotDictionary* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
import godotinternaltypes, gdnativeapi
|
||||
|
||||
import godotarrays, godotvariants, godotstrings
|
||||
proc initGodotDictionary*(dest: var GodotDictionary) {.inline.} =
|
||||
getGDNativeAPI().dictionaryNew(dest)
|
||||
|
||||
proc initGodotDictionary*(dest: var GodotDictionary; src: GodotDictionary) {.
|
||||
importc: "godot_dictionary_new_copy".}
|
||||
proc initGodotDictionary*(dest: var GodotDictionary;
|
||||
src: GodotDictionary) {.inline.} =
|
||||
getGDNativeAPI().dictionaryNewCopy(dest, src)
|
||||
|
||||
proc deinit*(self: var GodotDictionary) {.
|
||||
importc: "godot_dictionary_destroy".}
|
||||
proc deinit*(self: var GodotDictionary) {.inline.} =
|
||||
getGDNativeAPI().dictionaryDestroy(self)
|
||||
|
||||
proc initGodotDictionary*(dest: var GodotDictionary) {.
|
||||
importc: "godot_dictionary_new".}
|
||||
proc len*(self: GodotDictionary): cint {.inline.} =
|
||||
getGDNativeAPI().dictionarySize(self)
|
||||
|
||||
proc len*(self: GodotDictionary): cint {.
|
||||
importc: "godot_dictionary_size".}
|
||||
proc isEmpty*(self: GodotDictionary): bool {.
|
||||
importc: "godot_dictionary_empty".}
|
||||
proc clear*(self: var GodotDictionary) {.
|
||||
importc: "godot_dictionary_clear".}
|
||||
proc contains*(self: GodotDictionary; key: GodotVariant): bool {.
|
||||
importc: "godot_dictionary_has".}
|
||||
proc contains*(self: GodotDictionary; keys: GodotArray): bool {.
|
||||
importc: "godot_dictionary_has_all".}
|
||||
proc del*(self: var GodotDictionary; key: GodotVariant) {.
|
||||
importc: "godot_dictionary_erase".}
|
||||
proc isEmpty*(self: GodotDictionary): bool {.inline.} =
|
||||
getGDNativeAPI().dictionaryEmpty(self)
|
||||
|
||||
proc godotHash*(self: GodotDictionary): cint {.
|
||||
importc: "godot_dictionary_hash".}
|
||||
proc keys*(self: GodotDictionary): GodotArray {.
|
||||
importc: "godot_dictionary_keys".}
|
||||
proc values*(self: GodotDictionary): GodotArray {.
|
||||
importc: "godot_dictionary_values".}
|
||||
proc `[]`*(self: GodotDictionary; key: GodotVariant): GodotVariant {.
|
||||
importc: "godot_dictionary_get".}
|
||||
proc `[]=`*(self: var GodotDictionary; key, value: GodotVariant) {.
|
||||
importc: "godot_dictionary_set".}
|
||||
proc mget*(self: var GodotDictionary; key: GodotVariant): ptr GodotVariant {.
|
||||
importc: "godot_dictionary_operator_index".}
|
||||
proc clear*(self: var GodotDictionary) {.inline.} =
|
||||
getGDNativeAPI().dictionaryClear(self)
|
||||
|
||||
proc `==`*(self, other: GodotDictionary): bool {.
|
||||
importc: "godot_dictionary_operator_equal".}
|
||||
proc contains*(self: GodotDictionary; key: GodotVariant): bool {.inline.} =
|
||||
getGDNativeAPI().dictionaryHas(self, key)
|
||||
|
||||
proc toJson*(self: GodotDictionary): GodotString {.
|
||||
importc: "godot_dictionary_to_json".}
|
||||
proc contains*(self: GodotDictionary; keys: GodotArray): bool {.inline.} =
|
||||
getGDNativeAPI().dictionaryHasAll(self, keys)
|
||||
|
||||
proc del*(self: var GodotDictionary; key: GodotVariant) {.inline.} =
|
||||
getGDNativeAPI().dictionaryErase(self, key)
|
||||
|
||||
proc godotHash*(self: GodotDictionary): cint {.inline.} =
|
||||
getGDNativeAPI().dictionaryHash(self, )
|
||||
|
||||
proc keys*(self: GodotDictionary): GodotArray {.inline.} =
|
||||
getGDNativeAPI().dictionaryKeys(self)
|
||||
|
||||
proc values*(self: GodotDictionary): GodotArray {.inline.} =
|
||||
getGDNativeAPI().dictionaryValues(self)
|
||||
|
||||
proc `[]`*(self: GodotDictionary; key: GodotVariant): GodotVariant {.inline.} =
|
||||
getGDNativeAPI().dictionaryGet(self, key)
|
||||
|
||||
proc `[]=`*(self: var GodotDictionary; key, value: GodotVariant) {.inline.} =
|
||||
getGDNativeAPI().dictionarySet(self, key, value)
|
||||
|
||||
proc mget*(self: var GodotDictionary;
|
||||
key: GodotVariant): ptr GodotVariant {.inline.} =
|
||||
getGDNativeAPI().dictionaryOperatorIndex(self, key)
|
||||
|
||||
proc `==`*(self, other: GodotDictionary): bool {.inline.} =
|
||||
getGDNativeAPI().dictionaryOperatorEqual(self, other)
|
||||
|
||||
proc toJson*(self: GodotDictionary): GodotString {.inline.} =
|
||||
getGDNativeAPI().dictionaryToJson(self)
|
||||
|
|
|
|||
313
godot/internal/godotinternaltypes.nim
Normal file
313
godot/internal/godotinternaltypes.nim
Normal file
|
|
@ -0,0 +1,313 @@
|
|||
# Copyright 2018 Xored Software, Inc.
|
||||
|
||||
const MAX_ARG_COUNT* = 256
|
||||
|
||||
type
|
||||
GodotArray* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
|
||||
GodotDictionary* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
|
||||
GodotNodePath* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
|
||||
GodotObject* = object
|
||||
|
||||
GodotPoolByteArray* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
GodotPoolByteArrayReadAccess* {.byref.} = object
|
||||
data: array[1, byte]
|
||||
GodotPoolByteArrayWriteAccess* {.byref.} = object
|
||||
data: array[1, byte]
|
||||
|
||||
GodotPoolIntArray* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
GodotPoolIntArrayReadAccess* {.byref.} = object
|
||||
data: array[1, byte]
|
||||
GodotPoolIntArrayWriteAccess* {.byref.} = object
|
||||
data: array[1, byte]
|
||||
|
||||
GodotPoolRealArray* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
GodotPoolRealArrayReadAccess* {.byref.} = object
|
||||
data: array[1, byte]
|
||||
GodotPoolRealArrayWriteAccess* {.byref.} = object
|
||||
data: array[1, byte]
|
||||
|
||||
GodotPoolStringArray* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
GodotPoolStringArrayReadAccess* {.byref.} = object
|
||||
data: array[1, byte]
|
||||
GodotPoolStringArrayWriteAccess* {.byref.} = object
|
||||
data: array[1, byte]
|
||||
|
||||
GodotPoolVector2Array* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
GodotPoolVector2ArrayReadAccess* {.byref.} = object
|
||||
data: array[1, byte]
|
||||
GodotPoolVector2ArrayWriteAccess* {.byref.} = object
|
||||
data: array[1, byte]
|
||||
|
||||
GodotPoolVector3Array* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
GodotPoolVector3ArrayReadAccess* {.byref.} = object
|
||||
data: array[1, byte]
|
||||
GodotPoolVector3ArrayWriteAccess* {.byref.} = object
|
||||
data: array[1, byte]
|
||||
|
||||
GodotPoolColorArray* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
GodotPoolColorArrayReadAccess* {.byref.} = object
|
||||
data: array[1, byte]
|
||||
GodotPoolColorArrayWriteAccess* {.byref.} = object
|
||||
data: array[1, byte]
|
||||
|
||||
GodotString* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
|
||||
cwchar_t* {.importc: "wchar_t", nodecl.} = object
|
||||
|
||||
GodotCharString* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
|
||||
VariantType* {.size: sizeof(cint), pure.} = enum
|
||||
Nil, ## atomic types
|
||||
Bool,
|
||||
Int,
|
||||
Real,
|
||||
String,
|
||||
# math types
|
||||
Vector2, ## 5
|
||||
Rect2,
|
||||
Vector3,
|
||||
Transform2D,
|
||||
Plane,
|
||||
Quat, ## 10
|
||||
AABB,
|
||||
Basis,
|
||||
Transform, ## misc types
|
||||
Color,
|
||||
NodePath, ## 15
|
||||
RID,
|
||||
Object,
|
||||
Dictionary,
|
||||
Array, ## 20
|
||||
# arrays
|
||||
PoolByteArray,
|
||||
PoolIntArray,
|
||||
PoolRealArray,
|
||||
PoolStringArray,
|
||||
PoolVector2Array, ## 25
|
||||
PoolVector3Array,
|
||||
PoolColorArray
|
||||
|
||||
VariantCallErrorType* {.size: sizeof(cint), pure.} = enum
|
||||
OK,
|
||||
InvalidMethod,
|
||||
InvalidArgument,
|
||||
TooManyArguments,
|
||||
TooFewArguments,
|
||||
InstanceIsNull
|
||||
|
||||
VariantCallError* = object
|
||||
error*: VariantCallErrorType
|
||||
argument*: cint
|
||||
expected*: VariantType
|
||||
|
||||
GodotVariant* {.byref.} = object
|
||||
data: array[2, int64]
|
||||
data2: int
|
||||
|
||||
type GodotMethodBind* = object
|
||||
|
||||
type
|
||||
GDNativeAPIVersion* = object
|
||||
major*: cuint
|
||||
minor*: cuint
|
||||
|
||||
GDNativeInitOptions* = object
|
||||
inEditor*: bool
|
||||
coreApiHash*: uint64
|
||||
editorApiHash*: uint64
|
||||
noApiHash*: uint64
|
||||
reportVersionMismatch*: proc (library: ptr GodotObject, extension: cstring,
|
||||
want: GDNativeAPIVersion, have: GDNativeAPIVersion) {.noconv.}
|
||||
reportLoadingError*: proc (library: ptr GodotObject, what: cstring) {.noconv.}
|
||||
gdNativeLibrary*: ptr GodotObject
|
||||
gdNativeAPIStruct*: pointer
|
||||
activeLibraryPath*: ptr GodotString
|
||||
|
||||
GDNativeTerminateOptions* = object
|
||||
inEditor*: bool
|
||||
|
||||
GodotMethodRPCMode* {.size: sizeof(cint), pure.} = enum
|
||||
Disabled,
|
||||
Remote,
|
||||
Sync,
|
||||
Master,
|
||||
Slave
|
||||
|
||||
GodotMethodAttributes* = object
|
||||
rpcMode*: GodotMethodRPCMode
|
||||
|
||||
GodotPropertyHint* {.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
|
||||
GodotPropertyUsage* {.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* {.bycopy.} = object
|
||||
rsetType*: GodotMethodRPCMode
|
||||
typ*: cint
|
||||
hint*: GodotPropertyHint
|
||||
hintString*: GodotString
|
||||
usage*: cint
|
||||
defaultValue*: GodotVariant
|
||||
|
||||
GodotInstanceCreateFunc* {.bycopy.} = object
|
||||
createFunc*:
|
||||
proc (obj: ptr GodotObject; methodData: pointer): pointer {.noconv.}
|
||||
## returns user data
|
||||
methodData*: pointer
|
||||
freeFunc*: proc (a2: pointer) {.noconv.}
|
||||
|
||||
GodotInstanceDestroyFunc* {.bycopy.} = object
|
||||
destroyFunc*:
|
||||
proc (obj: ptr GodotObject; methodData: pointer;
|
||||
userData: pointer) {.noconv.}
|
||||
methodData*: pointer
|
||||
freeFunc*: proc (a2: pointer) {.noconv.}
|
||||
|
||||
GodotInstanceMethod* {.bycopy.} = object
|
||||
meth*:
|
||||
proc (obj: ptr GodotObject; methodData: pointer;
|
||||
userData: pointer; numArgs: cint;
|
||||
args: var array[MAX_ARG_COUNT, ptr GodotVariant]):
|
||||
GodotVariant {.noconv.}
|
||||
methodData*: pointer
|
||||
freeFunc*: proc (a2: pointer) {.noconv.}
|
||||
|
||||
GodotPropertySetFunc* {.bycopy.} = object
|
||||
setFunc*: proc (obj: ptr GodotObject; methodData: pointer;
|
||||
userData: pointer; value: GodotVariant) {.noconv.}
|
||||
methodData*: pointer
|
||||
freeFunc*: proc (a2: pointer) {.noconv.}
|
||||
|
||||
GodotPropertyGetFunc* {.bycopy.} = object
|
||||
getFunc*: proc (obj: ptr GodotObject; methodData: pointer;
|
||||
userData: pointer): GodotVariant {.noconv.}
|
||||
methodData*: pointer
|
||||
freeFunc*: proc (a2: pointer) {.noconv.}
|
||||
|
||||
GodotSignalArgument* {.bycopy.} = object
|
||||
name*: GodotString
|
||||
typ*: cint
|
||||
hint*: GodotPropertyHint
|
||||
hintString*: GodotString
|
||||
usage*: cint
|
||||
defaultValue*: GodotVariant
|
||||
|
||||
GodotSignal* = object
|
||||
name*: GodotString
|
||||
numArgs*: cint
|
||||
args*: ptr GodotSignalArgument
|
||||
numDefaultArgs*: cint
|
||||
defaultArgs*: ptr GodotVariant
|
||||
|
||||
GodotClassConstructor* = proc (): ptr GodotObject {.
|
||||
noconv, gcsafe, locks: 0, raises: [], tags: [].}
|
||||
|
||||
template offset*[T](p: ptr T, offset: int): ptr T =
|
||||
cast[ptr T](cast[ByteAddress](p) +% (offset * sizeof(T)))
|
||||
|
|
@ -1,32 +1,40 @@
|
|||
# Copyright 2017 Xored Software, Inc.
|
||||
# Copyright 2018 Xored Software, Inc.
|
||||
|
||||
import godotstrings
|
||||
import godotinternaltypes, gdnativeapi
|
||||
|
||||
type
|
||||
GodotNodePath* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
proc initGodotNodePath*(dest: var GodotNodePath; s: GodotString) {.inline.} =
|
||||
getGDNativeAPI().nodePathNew(dest, s)
|
||||
|
||||
proc initGodotNodePath*(dest: var GodotNodePath; s: GodotString) {.
|
||||
importc: "godot_node_path_new".}
|
||||
proc deinit*(self: var GodotNodePath) {.
|
||||
importc: "godot_node_path_destroy".}
|
||||
proc toGodotString*(self: GodotNodePath): GodotString {.
|
||||
importc: "godot_node_path_as_string".}
|
||||
proc initGodotNodePath*(dest: var GodotNodePath;
|
||||
src: GodotNodePath) {.inline.} =
|
||||
getGDNativeAPI().nodePathNewCopy(dest, src)
|
||||
|
||||
proc isAbsolute*(self: GodotNodePath): bool {.
|
||||
noSideEffect, importc: "godot_node_path_is_absolute".}
|
||||
proc nameCount*(self: GodotNodePath): cint {.
|
||||
noSideEffect, importc: "godot_node_path_get_name_count".}
|
||||
proc getName*(self: GodotNodePath; idx: cint): GodotString {.
|
||||
noSideEffect, importc: "godot_node_path_get_name".}
|
||||
proc subnameCount*(self: GodotNodePath): cint {.
|
||||
noSideEffect, importc: "godot_node_path_get_subname_count".}
|
||||
proc getSubname*(self: GodotNodePath; idx: cint): GodotString {.
|
||||
noSideEffect, importc: "godot_node_path_get_subname".}
|
||||
proc property*(self: GodotNodePath): GodotString {.
|
||||
noSideEffect, importc: "godot_node_path_get_property".}
|
||||
proc isEmpty*(self: GodotNodePath): bool {.
|
||||
noSideEffect, importc: "godot_node_path_is_empty".}
|
||||
proc deinit*(self: var GodotNodePath) {.inline.} =
|
||||
getGDNativeAPI().nodePathDestroy(self)
|
||||
|
||||
proc `==`*(a, b: GodotNodePath): bool {.
|
||||
noSideEffect, importc: "godot_node_path_operator_equal".}
|
||||
proc toGodotString*(self: GodotNodePath): GodotString {.inline.} =
|
||||
getGDNativeAPI().nodePathAsString(self)
|
||||
|
||||
proc isAbsolute*(self: GodotNodePath): bool {.inline.} =
|
||||
getGDNativeAPI().nodePathIsAbsolute(self)
|
||||
|
||||
proc nameCount*(self: GodotNodePath): cint {.inline.} =
|
||||
getGDNativeAPI().nodePathGetNameCount(self)
|
||||
|
||||
proc getName*(self: GodotNodePath; idx: cint): GodotString {.inline.} =
|
||||
getGDNativeAPI().nodePathGetName(self, idx)
|
||||
|
||||
proc subnameCount*(self: GodotNodePath): cint {.inline.} =
|
||||
getGDNativeAPI().nodePathGetSubnameCount(self)
|
||||
|
||||
proc getSubname*(self: GodotNodePath; idx: cint): GodotString {.inline.} =
|
||||
getGDNativeAPI().nodePathGetSubname(self, idx)
|
||||
|
||||
proc getConcatenatedSubnames*(self: GodotNodePath): GodotString {.inline.} =
|
||||
getGDNativeAPI().nodePathGetConcatenatedSubnames(self)
|
||||
|
||||
proc isEmpty*(self: GodotNodePath): bool {.inline.} =
|
||||
getGDNativeAPI().nodePathIsEmpty(self)
|
||||
|
||||
proc `==`*(a, b: GodotNodePath): bool {.inline.} =
|
||||
getGDNativeAPI().nodePathOperatorEqual(a, b)
|
||||
|
|
|
|||
|
|
@ -1,4 +0,0 @@
|
|||
# Copyright 2017 Xored Software, Inc.
|
||||
|
||||
type
|
||||
GodotObject* = object
|
||||
|
|
@ -1,374 +1,269 @@
|
|||
# Copyright (c) 2017 Xored Software, Inc.
|
||||
# Copyright (c) 2018 Xored Software, Inc.
|
||||
|
||||
type
|
||||
GodotPoolByteArray* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
GodotPoolIntArray* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
GodotPoolRealArray* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
GodotPoolStringArray* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
GodotPoolVector2Array* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
GodotPoolVector3Array* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
GodotPoolColorArray* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
import godotinternaltypes, gdnativeapi
|
||||
import core/godotcoretypes
|
||||
|
||||
import godotstrings, godotarrays
|
||||
import core.godotbase, core.colors, core.vector2, core.vector3
|
||||
template genPoolArrayAPI(ArrayT, initIdent, DataT,
|
||||
newProc, newCopyProc, newWithArrayProc, appendProc,
|
||||
appendArrayProc, insertProc, invertProc, pushBackProc,
|
||||
removeProc, resizeProc, setProc, getProc, sizeProc,
|
||||
destroyProc, readProc, writeProc,
|
||||
readAccessPtrProc, writeAccessPtrProc,
|
||||
readAccessDestroyProc, writeAccessDestroyProc) =
|
||||
proc initIdent*(dest: var ArrayT) {.inline.} =
|
||||
getGDNativeAPI().newProc(dest)
|
||||
|
||||
# byte
|
||||
proc initIdent*(dest: var ArrayT; src: ArrayT) {.inline.} =
|
||||
getGDNativeAPI().newCopyProc(dest, src)
|
||||
|
||||
proc initGodotPoolByteArray*(dest: var GodotPoolByteArray) {.
|
||||
importc: "godot_pool_byte_array_new".}
|
||||
proc initGodotPoolByteArray*(dest: var GodotPoolByteArray;
|
||||
src: GodotPoolByteArray) {.
|
||||
importc: "godot_pool_byte_array_new_copy".}
|
||||
proc initGodotPoolByteArray*(dest: var GodotPoolByteArray; arr: GodotArray) {.
|
||||
importc: "godot_pool_byte_array_new_with_array".}
|
||||
proc initIdent*(dest: var ArrayT; arr: GodotArray) {.inline.} =
|
||||
getGDNativeAPI().newWithArrayProc(dest, arr)
|
||||
|
||||
proc deinit*(self: var GodotPoolByteArray) {.
|
||||
importc: "godot_pool_byte_array_destroy".}
|
||||
proc deinit*(self: var ArrayT) {.inline.} =
|
||||
getGDNativeAPI().destroyProc(self)
|
||||
|
||||
proc add*(self: var GodotPoolByteArray;
|
||||
data: uint8) {.
|
||||
importc: "godot_pool_byte_array_append".}
|
||||
proc addFirst*(self: var GodotPoolByteArray, data: uint8) {.
|
||||
importc: "godot_pool_byte_array_push_back".}
|
||||
proc add*(self: var GodotPoolByteArray;
|
||||
arr: GodotPoolByteArray) {.
|
||||
importc: "godot_pool_byte_array_append_array".}
|
||||
proc insert*(self: var GodotPoolByteArray; idx: cint;
|
||||
data: uint8): Error {.
|
||||
importc: "godot_pool_byte_array_insert".}
|
||||
proc delete*(self: var GodotPoolByteArray; idx: cint) {.
|
||||
importc: "godot_pool_byte_array_remove".}
|
||||
proc add*(self: var ArrayT; data: DataT) {.inline.} =
|
||||
getGDNativeAPI().pushBackProc(self, data)
|
||||
|
||||
proc reverse*(self: var GodotPoolByteArray) {.
|
||||
importc: "godot_pool_byte_array_invert".}
|
||||
proc setLen*(self: var GodotPoolByteArray; size: cint) {.
|
||||
importc: "godot_pool_byte_array_resize".}
|
||||
proc add*(self: var ArrayT; arr: ArrayT) {.inline.} =
|
||||
getGDNativeAPI().appendArrayProc(self, arr)
|
||||
|
||||
proc `[]=`*(self: var GodotPoolByteArray; idx: cint; data: uint8) {.
|
||||
importc: "godot_pool_byte_array_set".}
|
||||
proc `[]`*(self: GodotPoolByteArray; idx: cint): uint8 {.
|
||||
noSideEffect,
|
||||
importc: "godot_pool_byte_array_get".}
|
||||
proc len*(self: GodotPoolByteArray): cint {.
|
||||
noSideEffect,
|
||||
importc: "godot_pool_byte_array_size".}
|
||||
proc insert*(self: var ArrayT; idx: cint;
|
||||
data: DataT): Error {.inline.} =
|
||||
getGDNativeAPI().insertProc(self, idx, data)
|
||||
|
||||
iterator items*(arr: GodotPoolByteArray): byte =
|
||||
for i in 0..<arr.len:
|
||||
yield arr[i]
|
||||
proc delete*(self: var ArrayT; idx: cint) {.inline.} =
|
||||
getGDNativeAPI().removeProc(self, idx)
|
||||
|
||||
iterator pairs*(arr: GodotPoolByteArray): tuple[key: cint, val: byte] =
|
||||
for i in 0..<arr.len:
|
||||
yield (i, arr[i])
|
||||
proc reverse*(self: var ArrayT) {.inline.} =
|
||||
getGDNativeAPI().invertProc(self)
|
||||
|
||||
proc initGodotPoolIntArray*(dest: var GodotPoolIntArray) {.
|
||||
importc: "godot_pool_int_array_new".}
|
||||
proc initGodotPoolIntArray*(dest: var GodotPoolIntArray;
|
||||
src: GodotPoolIntArray) {.
|
||||
importc: "godot_pool_int_array_new_copy".}
|
||||
proc initGodotPoolIntArray*(dest: var GodotPoolIntArray;
|
||||
arr: GodotArray) {.
|
||||
importc: "godot_pool_int_array_new_with_array".}
|
||||
proc deinit*(self: var GodotPoolIntArray) {.
|
||||
importc: "godot_pool_int_array_destroy".}
|
||||
proc setLen*(self: var ArrayT; size: cint) {.inline.} =
|
||||
getGDNativeAPI().resizeProc(self, size)
|
||||
|
||||
proc add*(self: var GodotPoolIntArray; data: cint) {.
|
||||
importc: "godot_pool_int_array_append".}
|
||||
proc addFirst*(self: var GodotPoolIntArray; data: cint) {.
|
||||
importc: "godot_pool_int_array_push_back".}
|
||||
proc add*(self: var GodotPoolIntArray; arr: GodotPoolIntArray) {.
|
||||
importc: "godot_pool_int_array_append_array".}
|
||||
proc insert*(self: var GodotPoolIntArray; idx: cint;
|
||||
data: cint): Error {.
|
||||
importc: "godot_pool_int_array_insert".}
|
||||
proc delete*(self: var GodotPoolIntArray; idx: cint) {.
|
||||
importc: "godot_pool_int_array_remove".}
|
||||
proc reverse*(self: var GodotPoolIntArray) {.
|
||||
importc: "godot_pool_int_array_invert".}
|
||||
proc `[]=`*(self: var ArrayT; idx: cint; data: DataT) {.inline.} =
|
||||
getGDNativeAPI().setProc(self, idx, data)
|
||||
|
||||
proc setLen*(self: var GodotPoolIntArray; size: cint) {.
|
||||
importc: "godot_pool_int_array_resize".}
|
||||
proc `[]=`*(self: var GodotPoolIntArray; idx: cint; data: cint) {.
|
||||
importc: "godot_pool_int_array_set".}
|
||||
proc `[]`*(self: GodotPoolIntArray; idx: cint): cint {.
|
||||
noSideEffect,
|
||||
importc: "godot_pool_int_array_get".}
|
||||
proc len*(self: GodotPoolIntArray): cint {.
|
||||
noSideEffect,
|
||||
importc: "godot_pool_int_array_size".}
|
||||
proc `[]`*(self: ArrayT; idx: cint): DataT {.inline.} =
|
||||
let data = getGDNativeAPI().getProc(self, idx)
|
||||
when DataT is Color:
|
||||
data.toColor()
|
||||
elif DataT is Vector2:
|
||||
data.toVector2()
|
||||
elif DataT is Vector3:
|
||||
data.toVector3()
|
||||
else:
|
||||
data
|
||||
|
||||
iterator items*(arr: GodotPoolIntArray): cint =
|
||||
for i in 0..<arr.len:
|
||||
yield arr[i]
|
||||
proc len*(self: ArrayT): cint {.inline.} =
|
||||
getGDNativeAPI().sizeProc(self)
|
||||
|
||||
iterator pairs*(arr: GodotPoolIntArray): tuple[key: cint, val: cint] =
|
||||
for i in 0..<arr.len:
|
||||
yield (i, arr[i])
|
||||
iterator items*(self: ArrayT): DataT =
|
||||
let readAccess = getGDNativeAPI().readProc(self)
|
||||
let readPtr = getGDNativeAPI().readAccessPtrProc(readAccess)
|
||||
for i in 0.cint..<self.len:
|
||||
yield readPtr.offset(i)[]
|
||||
getGDNativeAPI().readAccessDestroyProc(readAccess)
|
||||
|
||||
# Real
|
||||
iterator mitems*(self: var ArrayT): var DataT =
|
||||
let writeAccess = getGDNativeAPI().writeProc(self)
|
||||
let writePtr = getGDNativeAPI().writeAccessPtrProc(writeAccess)
|
||||
for i in 0.cint..<self.len:
|
||||
yield writePtr.offset(i)[]
|
||||
getGDNativeAPI().writeAccessDestroyProc(writeAccess)
|
||||
|
||||
proc initGodotPoolRealArray*(dest: var GodotPoolRealArray) {.
|
||||
importc: "godot_pool_real_array_new".}
|
||||
proc initGodotPoolRealArray*(dest: var GodotPoolRealArray;
|
||||
src: GodotPoolRealArray) {.
|
||||
importc: "godot_pool_real_array_new_copy".}
|
||||
proc initGodotPoolRealArray*(dest: var GodotPoolRealArray; arr: GodotArray) {.
|
||||
importc: "godot_pool_real_array_new_with_array".}
|
||||
iterator pairs*(self: ArrayT): tuple[key: cint, val: DataT] =
|
||||
let readAccess = getGDNativeAPI().readProc(self)
|
||||
let readPtr = getGDNativeAPI().readAccessPtrProc(readAccess)
|
||||
for i in 0.cint..<self.len:
|
||||
yield (i, readPtr.offset(i)[])
|
||||
getGDNativeAPI().readAccessDestroyProc(readAccess)
|
||||
|
||||
proc deinit*(self: var GodotPoolRealArray) {.
|
||||
importc: "godot_pool_real_array_destroy".}
|
||||
iterator mpairs*(self: var ArrayT): tuple[key: cint, val: var DataT] =
|
||||
let writeAccess = getGDNativeAPI().writeProc(self)
|
||||
let writePtr = getGDNativeAPI().writeAccessPtrProc(writeAccess)
|
||||
for i in 0.cint..<self.len:
|
||||
yield (i, writePtr.offset(i)[])
|
||||
getGDNativeAPI().writeAccessDestroyProc(writeAccess)
|
||||
|
||||
proc add*(self: var GodotPoolRealArray; data: float32) {.
|
||||
importc: "godot_pool_real_array_append".}
|
||||
proc addFirst*(self: var GodotPoolRealArray; data: float32) {.
|
||||
importc: "godot_pool_real_array_push_back".}
|
||||
proc add*(self: var GodotPoolRealArray; arr: GodotPoolRealArray) {.
|
||||
importc: "godot_pool_real_array_append_array".}
|
||||
proc insert*(self: var GodotPoolRealArray;
|
||||
idx: cint; data: float32): Error {.
|
||||
importc: "godot_pool_real_array_insert".}
|
||||
proc delete*(self: var GodotPoolRealArray; idx: cint) {.
|
||||
importc: "godot_pool_real_array_remove".}
|
||||
proc reverse*(self: var GodotPoolRealArray) {.
|
||||
importc: "godot_pool_real_array_invert".}
|
||||
proc setLen*(self: var GodotPoolRealArray; size: cint) {.
|
||||
importc: "godot_pool_real_array_resize".}
|
||||
proc `[]=`*(self: var GodotPoolRealArray; idx: cint; data: float32) {.
|
||||
importc: "godot_pool_real_array_set".}
|
||||
proc `[]`*(self: GodotPoolRealArray; idx: cint): float32 {.
|
||||
noSideEffect,
|
||||
importc: "godot_pool_real_array_get".}
|
||||
proc len*(self: GodotPoolRealArray): cint {.
|
||||
noSideEffect,
|
||||
importc: "godot_pool_real_array_size".}
|
||||
proc subarray*(self: ArrayT, idxFrom, idxTo: cint): ArrayT =
|
||||
## Indexes are inclusive, negative values count from the end of the array.
|
||||
let ownLen = self.len
|
||||
var actualIdxFrom = if idxFrom < 0: idxFrom + ownLen
|
||||
else: idxFrom
|
||||
var actualIdxTo = if idxTo < 0: idxTo + ownLen
|
||||
else: idxTo
|
||||
|
||||
iterator items*(arr: GodotPoolRealArray): float32 =
|
||||
for i in 0..<arr.len:
|
||||
yield arr[i]
|
||||
initIdent(result)
|
||||
if actualIdxFrom < 0 or actualIdxFrom >= ownLen:
|
||||
let instInfo = instantiationInfo()
|
||||
getGDNativeAPI().printError(
|
||||
cstring"Invalid subarray begin index", cstring"subarray", instInfo.filename, instInfo.line.cint)
|
||||
return
|
||||
if actualIdxTo < 0 or actualIdxTo >= ownLen:
|
||||
let instInfo = instantiationInfo()
|
||||
getGDNativeAPI().printError(
|
||||
cstring"Invalid subarray end index", cstring"subarray", instInfo.filename, instInfo.line.cint)
|
||||
return
|
||||
let span = actualIdxTo - actualIdxFrom + 1
|
||||
result.setLen(span)
|
||||
let readAccess = getGDNativeAPI().readProc(self)
|
||||
let writeAccess = getGDNativeAPI().writeProc(result)
|
||||
let readPtr = getGDNativeAPI().readAccessPtrProc(readAccess).offset(actualIdxFrom)
|
||||
copyMem(getGDNativeAPI().writeAccessPtrProc(writeAccess), readPtr, span)
|
||||
getGDNativeAPI().readAccessDestroyProc(readAccess)
|
||||
getGDNativeAPI().writeAccessDestroyProc(writeAccess)
|
||||
|
||||
iterator pairs*(arr: GodotPoolRealArray): tuple[key: cint, val: float32] =
|
||||
for i in 0..<arr.len:
|
||||
yield (i, arr[i])
|
||||
genPoolArrayAPI(GodotPoolByteArray, initGodotPoolByteArray, byte,
|
||||
poolByteArrayNew,
|
||||
poolByteArrayNewCopy,
|
||||
poolByteArrayNewWithArray,
|
||||
poolByteArrayAppend,
|
||||
poolByteArrayAppendArray,
|
||||
poolByteArrayInsert,
|
||||
poolByteArrayInvert,
|
||||
poolByteArrayPushBack,
|
||||
poolByteArrayRemove,
|
||||
poolByteArrayResize,
|
||||
poolByteArraySet,
|
||||
poolByteArrayGet,
|
||||
poolByteArraySize,
|
||||
poolByteArrayDestroy,
|
||||
poolByteArrayRead,
|
||||
poolByteArrayWrite,
|
||||
poolByteArrayReadAccessPtr,
|
||||
poolByteArrayWriteAccessPtr,
|
||||
poolByteArrayReadAccessDestroy,
|
||||
poolByteArrayWriteAccessDestroy)
|
||||
|
||||
# String
|
||||
genPoolArrayAPI(GodotPoolIntArray, initGodotPoolIntArray, cint,
|
||||
poolIntArrayNew,
|
||||
poolIntArrayNewCopy,
|
||||
poolIntArrayNewWithArray,
|
||||
poolIntArrayAppend,
|
||||
poolIntArrayAppendArray,
|
||||
poolIntArrayInsert,
|
||||
poolIntArrayInvert,
|
||||
poolIntArrayPushBack,
|
||||
poolIntArrayRemove,
|
||||
poolIntArrayResize,
|
||||
poolIntArraySet,
|
||||
poolIntArrayGet,
|
||||
poolIntArraySize,
|
||||
poolIntArrayDestroy,
|
||||
poolIntArrayRead,
|
||||
poolIntArrayWrite,
|
||||
poolIntArrayReadAccessPtr,
|
||||
poolIntArrayWriteAccessPtr,
|
||||
poolIntArrayReadAccessDestroy,
|
||||
poolIntArrayWriteAccessDestroy)
|
||||
|
||||
proc initGodotPoolStringArray*(dest: var GodotPoolStringArray) {.
|
||||
importc: "godot_pool_string_array_new".}
|
||||
proc initGodotPoolStringArray*(dest: var GodotPoolStringArray;
|
||||
src: GodotPoolStringArray) {.
|
||||
importc: "godot_pool_string_array_new_copy".}
|
||||
proc initGodotPoolStringArray*(dest: var GodotPoolStringArray; arr: GodotArray) {.
|
||||
importc: "godot_pool_string_array_new_with_array".}
|
||||
genPoolArrayAPI(GodotPoolRealArray, initGodotPoolRealArray, float32,
|
||||
poolRealArrayNew,
|
||||
poolRealArrayNewCopy,
|
||||
poolRealArrayNewWithArray,
|
||||
poolRealArrayAppend,
|
||||
poolRealArrayAppendArray,
|
||||
poolRealArrayInsert,
|
||||
poolRealArrayInvert,
|
||||
poolRealArrayPushBack,
|
||||
poolRealArrayRemove,
|
||||
poolRealArrayResize,
|
||||
poolRealArraySet,
|
||||
poolRealArrayGet,
|
||||
poolRealArraySize,
|
||||
poolRealArrayDestroy,
|
||||
poolRealArrayRead,
|
||||
poolRealArrayWrite,
|
||||
poolRealArrayReadAccessPtr,
|
||||
poolRealArrayWriteAccessPtr,
|
||||
poolRealArrayReadAccessDestroy,
|
||||
poolRealArrayWriteAccessDestroy)
|
||||
|
||||
proc deinit*(self: var GodotPoolStringArray) {.
|
||||
importc: "godot_pool_string_array_destroy".}
|
||||
genPoolArrayAPI(GodotPoolStringArray, initGodotPoolStringArray, GodotString,
|
||||
poolStringArrayNew,
|
||||
poolStringArrayNewCopy,
|
||||
poolStringArrayNewWithArray,
|
||||
poolStringArrayAppend,
|
||||
poolStringArrayAppendArray,
|
||||
poolStringArrayInsert,
|
||||
poolStringArrayInvert,
|
||||
poolStringArrayPushBack,
|
||||
poolStringArrayRemove,
|
||||
poolStringArrayResize,
|
||||
poolStringArraySet,
|
||||
poolStringArrayGet,
|
||||
poolStringArraySize,
|
||||
poolStringArrayDestroy,
|
||||
poolStringArrayRead,
|
||||
poolStringArrayWrite,
|
||||
poolStringArrayReadAccessPtr,
|
||||
poolStringArrayWriteAccessPtr,
|
||||
poolStringArrayReadAccessDestroy,
|
||||
poolStringArrayWriteAccessDestroy)
|
||||
|
||||
proc initGodotPoolStringArray*(): GodotPoolStringArray {.inline.} =
|
||||
initGodotPoolStringArray(result)
|
||||
genPoolArrayAPI(GodotPoolVector2Array, initGodotPoolVector2Array, Vector2,
|
||||
poolVector2ArrayNew,
|
||||
poolVector2ArrayNewCopy,
|
||||
poolVector2ArrayNewWithArray,
|
||||
poolVector2ArrayAppend,
|
||||
poolVector2ArrayAppendArray,
|
||||
poolVector2ArrayInsert,
|
||||
poolVector2ArrayInvert,
|
||||
poolVector2ArrayPushBack,
|
||||
poolVector2ArrayRemove,
|
||||
poolVector2ArrayResize,
|
||||
poolVector2ArraySet,
|
||||
poolVector2ArrayGet,
|
||||
poolVector2ArraySize,
|
||||
poolVector2ArrayDestroy,
|
||||
poolVector2ArrayRead,
|
||||
poolVector2ArrayWrite,
|
||||
poolVector2ArrayReadAccessPtr,
|
||||
poolVector2ArrayWriteAccessPtr,
|
||||
poolVector2ArrayReadAccessDestroy,
|
||||
poolVector2ArrayWriteAccessDestroy)
|
||||
|
||||
proc initGodotPoolStringArray*(arr: GodotArray): GodotPoolStringArray {.inline.} =
|
||||
initGodotPoolStringArray(result, arr)
|
||||
genPoolArrayAPI(GodotPoolVector3Array, initGodotPoolVector3Array, Vector3,
|
||||
poolVector3ArrayNew,
|
||||
poolVector3ArrayNewCopy,
|
||||
poolVector3ArrayNewWithArray,
|
||||
poolVector3ArrayAppend,
|
||||
poolVector3ArrayAppendArray,
|
||||
poolVector3ArrayInsert,
|
||||
poolVector3ArrayInvert,
|
||||
poolVector3ArrayPushBack,
|
||||
poolVector3ArrayRemove,
|
||||
poolVector3ArrayResize,
|
||||
poolVector3ArraySet,
|
||||
poolVector3ArrayGet,
|
||||
poolVector3ArraySize,
|
||||
poolVector3ArrayDestroy,
|
||||
poolVector3ArrayRead,
|
||||
poolVector3ArrayWrite,
|
||||
poolVector3ArrayReadAccessPtr,
|
||||
poolVector3ArrayWriteAccessPtr,
|
||||
poolVector3ArrayReadAccessDestroy,
|
||||
poolVector3ArrayWriteAccessDestroy)
|
||||
|
||||
proc add*(self: var GodotPoolStringArray; data: GodotString) {.
|
||||
importc: "godot_pool_string_array_append".}
|
||||
proc addFirst*(self: var GodotPoolStringArray; data: GodotString) {.
|
||||
importc: "godot_pool_string_array_push_back".}
|
||||
proc add*(self: var GodotPoolStringArray; arr: GodotPoolStringArray) {.
|
||||
importc: "godot_pool_string_array_append_array".}
|
||||
proc insert*(self: var GodotPoolStringArray;
|
||||
idx: cint; data: GodotString): Error {.
|
||||
importc: "godot_pool_string_array_insert".}
|
||||
proc delete*(self: var GodotPoolStringArray; idx: cint) {.
|
||||
importc: "godot_pool_string_array_remove".}
|
||||
proc reverse*(self: var GodotPoolStringArray) {.
|
||||
importc: "godot_pool_string_array_invert".}
|
||||
proc setLen*(self: var GodotPoolStringArray; size: cint) {.
|
||||
importc: "godot_pool_string_array_resize".}
|
||||
proc `[]=`*(self: var GodotPoolStringArray; idx: cint;
|
||||
data: GodotString) {.
|
||||
importc: "godot_pool_string_array_set".}
|
||||
proc `[]`*(self: GodotPoolStringArray; idx: cint): GodotString {.
|
||||
noSideEffect,
|
||||
importc: "godot_pool_string_array_get".}
|
||||
proc len*(self: GodotPoolStringArray): cint {.
|
||||
noSideEffect,
|
||||
importc: "godot_pool_string_array_size".}
|
||||
|
||||
iterator items*(arr: GodotPoolStringArray): GodotString =
|
||||
for i in 0..<arr.len:
|
||||
yield arr[i]
|
||||
|
||||
iterator pairs*(arr: GodotPoolStringArray): tuple[key: cint, val: GodotString] =
|
||||
for i in 0..<arr.len:
|
||||
yield (i, arr[i])
|
||||
|
||||
# Vector2
|
||||
|
||||
proc initGodotPoolVector2Array*(dest: var GodotPoolVector2Array) {.
|
||||
importc: "godot_pool_vector2_array_new".}
|
||||
proc initGodotPoolVector2Array*(dest: var GodotPoolVector2Array;
|
||||
src: GodotPoolVector2Array) {.
|
||||
importc: "godot_pool_vector2_array_new_copy".}
|
||||
proc initGodotPoolVector2Array*(dest: var GodotPoolVector2Array;
|
||||
arr: GodotArray) {.
|
||||
importc: "godot_pool_vector2_array_new_with_array".}
|
||||
|
||||
proc deinit*(self: var GodotPoolVector2Array) {.
|
||||
importc: "godot_pool_vector2_array_destroy".}
|
||||
|
||||
proc initGodotPoolVector2Array*(): GodotPoolVector2Array {.inline.} =
|
||||
initGodotPoolVector2Array(result)
|
||||
|
||||
proc initGodotPoolVector2Array*(arr: GodotArray): GodotPoolVector2Array {.inline.} =
|
||||
initGodotPoolVector2Array(result, arr)
|
||||
|
||||
proc add*(self: var GodotPoolVector2Array; data: Vector2) {.
|
||||
importc: "godot_pool_vector2_array_append".}
|
||||
proc addFirst*(self: var GodotPoolVector2Array; data: Vector2) {.
|
||||
importc: "godot_pool_vector2_array_push_back".}
|
||||
proc add*(self: var GodotPoolVector2Array;
|
||||
arr: GodotPoolVector2Array) {.
|
||||
importc: "godot_pool_vector2_array_append_array".}
|
||||
proc insert*(self: var GodotPoolVector2Array;
|
||||
idx: cint; data: Vector2): Error {.
|
||||
importc: "godot_pool_vector2_array_insert".}
|
||||
proc delete*(self: var GodotPoolVector2Array; idx: cint) {.
|
||||
importc: "godot_pool_vector2_array_remove".}
|
||||
proc reverse*(self: var GodotPoolVector2Array) {.
|
||||
importc: "godot_pool_vector2_array_invert".}
|
||||
proc setLen*(self: var GodotPoolVector2Array; size: cint) {.
|
||||
importc: "godot_pool_vector2_array_resize".}
|
||||
proc `[]=`*(self: var GodotPoolVector2Array; idx: cint;
|
||||
data: Vector2) {.
|
||||
importc: "godot_pool_vector2_array_set".}
|
||||
proc `[]`*(self: GodotPoolVector2Array; idx: cint): Vector2 {.
|
||||
noSideEffect,
|
||||
importc: "godot_pool_vector2_array_get".}
|
||||
proc len*(self: GodotPoolVector2Array): cint {.
|
||||
noSideEffect,
|
||||
importc: "godot_pool_vector2_array_size".}
|
||||
|
||||
iterator items*(arr: GodotPoolVector2Array): Vector2 =
|
||||
for i in 0..<arr.len:
|
||||
yield arr[i]
|
||||
|
||||
iterator pairs*(arr: GodotPoolVector2Array): tuple[key: cint, val: Vector2] =
|
||||
for i in 0..<arr.len:
|
||||
yield (i, arr[i])
|
||||
|
||||
# Vector3
|
||||
|
||||
proc initGodotPoolVector3Array*(dest: var GodotPoolVector3Array) {.
|
||||
importc: "godot_pool_vector3_array_new".}
|
||||
proc initGodotPoolVector3Array*(dest: var GodotPoolVector3Array;
|
||||
src: GodotPoolVector3Array) {.
|
||||
importc: "godot_pool_vector3_array_new_copy".}
|
||||
proc initGodotPoolVector3Array*(dest: var GodotPoolVector3Array;
|
||||
arr: GodotArray) {.
|
||||
importc: "godot_pool_vector3_array_new_with_array".}
|
||||
|
||||
proc deinit*(self: var GodotPoolVector3Array) {.
|
||||
importc: "godot_pool_vector3_array_destroy".}
|
||||
|
||||
proc initGodotPoolVector3Array*(): GodotPoolVector3Array {.inline.} =
|
||||
initGodotPoolVector3Array(result)
|
||||
|
||||
proc initGodotPoolVector3Array*(arr: GodotArray):
|
||||
GodotPoolVector3Array {.inline.} =
|
||||
initGodotPoolVector3Array(result, arr)
|
||||
|
||||
proc add*(self: var GodotPoolVector3Array;
|
||||
data: Vector3) {.
|
||||
importc: "godot_pool_vector3_array_append".}
|
||||
proc addFirst*(self: var GodotPoolVector3Array;
|
||||
data: Vector3) {.
|
||||
importc: "godot_pool_vector3_array_push_back".}
|
||||
proc add*(self: var GodotPoolVector3Array;
|
||||
arr: GodotPoolVector3Array) {.
|
||||
importc: "godot_pool_vector3_array_append_array".}
|
||||
proc insert*(self: var GodotPoolVector3Array;
|
||||
idx: cint; data: Vector3): Error {.
|
||||
importc: "godot_pool_vector3_array_insert".}
|
||||
proc delete*(self: var GodotPoolVector3Array; idx: cint) {.
|
||||
importc: "godot_pool_vector3_array_remove".}
|
||||
proc reverse*(self: var GodotPoolVector3Array) {.
|
||||
importc: "godot_pool_vector3_array_invert".}
|
||||
proc setLen*(self: var GodotPoolVector3Array; size: cint) {.
|
||||
importc: "godot_pool_vector3_array_resize".}
|
||||
proc `[]=`*(self: var GodotPoolVector3Array;
|
||||
idx: cint; data: Vector3) {.
|
||||
importc: "godot_pool_vector3_array_set".}
|
||||
proc `[]`*(self: GodotPoolVector3Array;
|
||||
idx: cint): Vector3 {.
|
||||
noSideEffect,
|
||||
importc: "godot_pool_vector3_array_get".}
|
||||
proc len*(self: GodotPoolVector3Array): cint {.
|
||||
noSideEffect,
|
||||
importc: "godot_pool_vector3_array_size".}
|
||||
|
||||
iterator items*(arr: GodotPoolVector3Array): Vector3 =
|
||||
for i in 0..<arr.len:
|
||||
yield arr[i]
|
||||
|
||||
iterator pairs*(arr: GodotPoolVector3Array): tuple[key: cint, val: Vector3] =
|
||||
for i in 0..<arr.len:
|
||||
yield (i, arr[i])
|
||||
|
||||
# Color
|
||||
|
||||
proc initGodotPoolColorArray*(dest: var GodotPoolColorArray) {.
|
||||
importc: "godot_pool_color_array_new".}
|
||||
proc initGodotPoolColorArray*(dest: var GodotPoolColorArray;
|
||||
src: GodotPoolColorArray) {.
|
||||
importc: "godot_pool_color_array_new_copy".}
|
||||
proc initGodotPoolColorArray*(dest: var GodotPoolColorArray; arr: GodotArray) {.
|
||||
importc: "godot_pool_color_array_new_with_array".}
|
||||
|
||||
proc deinit*(self: var GodotPoolColorArray) {.
|
||||
importc: "godot_pool_color_array_destroy".}
|
||||
|
||||
proc initGodotPoolColorArray*(): GodotPoolColorArray {.inline.} =
|
||||
initGodotPoolColorArray(result)
|
||||
|
||||
proc initGodotPoolColorArray*(arr: GodotArray): GodotPoolColorArray {.inline.} =
|
||||
initGodotPoolColorArray(result, arr)
|
||||
|
||||
proc add*(self: var GodotPoolColorArray; data: Color) {.
|
||||
importc: "godot_pool_color_array_append".}
|
||||
proc addFirst*(self: var GodotPoolColorArray; data: Color) {.
|
||||
importc: "godot_pool_color_array_push_back".}
|
||||
proc add*(self: var GodotPoolColorArray; arr: GodotPoolColorArray) {.
|
||||
importc: "godot_pool_color_array_append_array".}
|
||||
proc insert*(self: var GodotPoolColorArray;
|
||||
idx: cint; data: Color): Error {.
|
||||
importc: "godot_pool_color_array_insert".}
|
||||
proc delete*(self: var GodotPoolColorArray; idx: cint) {.
|
||||
importc: "godot_pool_color_array_remove".}
|
||||
proc reverse*(self: var GodotPoolColorArray) {.
|
||||
importc: "godot_pool_color_array_invert".}
|
||||
proc setLen*(self: var GodotPoolColorArray; size: cint) {.
|
||||
importc: "godot_pool_color_array_resize".}
|
||||
proc `[]=`*(self: var GodotPoolColorArray; idx: cint;
|
||||
data: Color) {.
|
||||
importc: "godot_pool_color_array_set".}
|
||||
proc `[]`*(self: GodotPoolColorArray; idx: cint): Color {.
|
||||
noSideEffect,
|
||||
importc: "godot_pool_color_array_get".}
|
||||
proc len*(self: GodotPoolColorArray): cint {.
|
||||
noSideEffect,
|
||||
importc: "godot_pool_color_array_size".}
|
||||
|
||||
iterator items*(arr: GodotPoolColorArray): Color =
|
||||
for i in 0..<arr.len:
|
||||
yield arr[i]
|
||||
|
||||
iterator pairs*(arr: GodotPoolColorArray): tuple[key: cint, val: Color] =
|
||||
for i in 0..<arr.len:
|
||||
yield (i, arr[i])
|
||||
genPoolArrayAPI(GodotPoolColorArray, initGodotPoolColorArray, Color,
|
||||
poolColorArrayNew,
|
||||
poolColorArrayNewCopy,
|
||||
poolColorArrayNewWithArray,
|
||||
poolColorArrayAppend,
|
||||
poolColorArrayAppendArray,
|
||||
poolColorArrayInsert,
|
||||
poolColorArrayInvert,
|
||||
poolColorArrayPushBack,
|
||||
poolColorArrayRemove,
|
||||
poolColorArrayResize,
|
||||
poolColorArraySet,
|
||||
poolColorArrayGet,
|
||||
poolColorArraySize,
|
||||
poolColorArrayDestroy,
|
||||
poolColorArrayRead,
|
||||
poolColorArrayWrite,
|
||||
poolColorArrayReadAccessPtr,
|
||||
poolColorArrayWriteAccessPtr,
|
||||
poolColorArrayReadAccessDestroy,
|
||||
poolColorArrayWriteAccessDestroy)
|
||||
|
|
|
|||
|
|
@ -1,50 +1,50 @@
|
|||
# Copyright (c) 2017 Xored Software, Inc.
|
||||
# Copyright (c) 2018 Xored Software, Inc.
|
||||
|
||||
type
|
||||
GodotString* {.byref.} = object
|
||||
data: array[sizeof(int), byte]
|
||||
import godotinternaltypes, gdnativeapi
|
||||
|
||||
proc initGodotString(dest: var GodotString) {.inline, raises: [].} =
|
||||
getGDNativeAPI().stringNew(dest)
|
||||
|
||||
proc initGodotString(dest: var GodotString) {.
|
||||
importc: "godot_string_new".}
|
||||
proc initGodotString(dest: var GodotString; contents: cstring;
|
||||
size: cint) {.
|
||||
importc: "godot_string_new_data".}
|
||||
size: cint) {.inline.} =
|
||||
## Initializes ``dest`` from UTF-8 ``contents``
|
||||
proc getData(self: GodotString; dest: cstring;
|
||||
size: var cint) {.
|
||||
noSideEffect
|
||||
importc: "godot_string_get_data".}
|
||||
## Converts ``self`` into UTF-8 encoding, putting the result into ``dest``.
|
||||
dest = getGDNativeAPI().stringCharsToUtf8WithLen(contents, size)
|
||||
|
||||
proc `==`*(self, b: GodotString): bool {.inline.} =
|
||||
getGDNativeAPI().stringOperatorEqual(self, b)
|
||||
|
||||
proc `<`*(self, b: GodotString): bool {.inline.} =
|
||||
getGDNativeAPI().stringOperatorLess(self, b)
|
||||
|
||||
proc `&`*(self, b: GodotString): GodotString {.inline.} =
|
||||
getGDNativeAPI().stringOperatorPlus(self, b)
|
||||
|
||||
proc deinit*(self: var GodotString) {.inline.} =
|
||||
getGDNativeAPI().stringDestroy(self)
|
||||
|
||||
proc len*(self: GodotString): cint {.inline.} =
|
||||
## Returns the length of string in bytes if it is represented as UTF-8.
|
||||
getData(self, nil, result)
|
||||
getGDNativeAPI().stringLength(self)
|
||||
|
||||
proc cstring*(self: GodotString): cstring {.
|
||||
importc: "godot_string_c_str".}
|
||||
proc `==`*(self, b: GodotString): bool {.
|
||||
importc: "godot_string_operator_equal".}
|
||||
proc `<`*(self, b: GodotString): bool {.
|
||||
importc: "godot_string_operator_less".}
|
||||
proc `&`*(self, b: GodotString): GodotString {.
|
||||
importc: "godot_string_operator_plus".}
|
||||
|
||||
proc deinit*(self: var GodotString) {.importc: "godot_string_destroy".}
|
||||
proc dataPtr*(self: GodotString): ptr cwchar_t {.inline.} =
|
||||
getGDNativeAPI().stringWideStr(self)
|
||||
|
||||
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')
|
||||
var charStr = getGDNativeAPI().stringUtf8(self)
|
||||
let length = getGDNativeAPI().charStringLength(charStr)
|
||||
result = newString(length)
|
||||
copyMem(addr result[0], getGDNativeAPI().charStringGetData(charStr), length)
|
||||
getGDNativeAPI().charStringDestroy(charStr)
|
||||
|
||||
proc toGodotString*(s: string): GodotString {.inline.} =
|
||||
## Converts the Nim string into ``GodotString``
|
||||
if s.isNil:
|
||||
initGodotString(result)
|
||||
when (NimMajor, NimMinor, NimPatch) < (0, 19, 0):
|
||||
if s.isNil:
|
||||
initGodotString(result)
|
||||
else:
|
||||
initGodotString(result, cstring(s), cint(s.len + 1))
|
||||
else:
|
||||
initGodotString(result, unsafeAddr s[0], cint(s.len + 1))
|
||||
initGodotString(result, cstring(s), cint(s.len + 1))
|
||||
|
||||
proc toGodotString*(s: cstring): GodotString {.inline.} =
|
||||
## Converts the cstring into ``GodotString``
|
||||
|
|
|
|||
|
|
@ -1,197 +1,216 @@
|
|||
# Copyright 2017 Xored Software, Inc.
|
||||
# Copyright 2018 Xored Software, Inc.
|
||||
|
||||
type
|
||||
VariantType* {.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
|
||||
import core/godotcoretypes, godotinternaltypes, gdnativeapi
|
||||
|
||||
VariantCallErrorType* {.size: sizeof(cint), pure.} = enum
|
||||
OK,
|
||||
InvalidMethod,
|
||||
InvalidArgument,
|
||||
TooManyArguments,
|
||||
TooFewArguments,
|
||||
InstanceIsNull
|
||||
proc getType*(p: GodotVariant): VariantType {.inline.} =
|
||||
getGDNativeAPI().variantGetType(p)
|
||||
|
||||
VariantCallError* = object
|
||||
error*: VariantCallErrorType
|
||||
argument*: cint
|
||||
expected*: VariantType
|
||||
proc initGodotVariant*(dest: var GodotVariant) {.inline.} =
|
||||
getGDNativeAPI().variantNewNil(dest)
|
||||
|
||||
GodotVariant* {.byref.} = object
|
||||
data: array[4 + sizeof(int) div 4, float32]
|
||||
proc initGodotVariant*(dest: var GodotVariant, src: GodotVariant) {.inline.} =
|
||||
getGDNativeAPI().variantNewCopy(dest, src)
|
||||
|
||||
import godotobjects, godotarrays, godotpoolarrays,
|
||||
godotstrings, godotnodepaths, godotdictionaries
|
||||
proc initGodotVariant*(dest: var GodotVariant; b: bool) {.inline.} =
|
||||
getGDNativeAPI().variantNewBool(dest, b)
|
||||
|
||||
import core.vector2, core.rect2,
|
||||
core.vector3, core.transform2d, core.planes,
|
||||
core.quats, core.rect3, core.basis,
|
||||
core.transforms, core.colors, core.rids,
|
||||
core.rect2
|
||||
proc initGodotVariant*(dest: var GodotVariant; i: uint64) {.inline.} =
|
||||
getGDNativeAPI().variantNewUInt(dest, i)
|
||||
|
||||
proc getType*(p: GodotVariant): VariantType {.
|
||||
importc: "godot_variant_get_type".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; i: int64) {.inline.} =
|
||||
getGDNativeAPI().variantNewInt(dest, i)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant) {.
|
||||
importc: "godot_variant_new_nil".}
|
||||
proc initGodotVariant*(dest: var GodotVariant, src: GodotVariant) {.
|
||||
importc: "godot_variant_new_copy".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; b: bool) {.
|
||||
importc: "godot_variant_new_bool".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; i: uint64) {.
|
||||
importc: "godot_variant_new_uint".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; i: int64) {.
|
||||
importc: "godot_variant_new_int".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; r: cdouble) {.
|
||||
importc: "godot_variant_new_real".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; s: GodotString) {.
|
||||
importc: "godot_variant_new_string".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; v2: Vector2) {.
|
||||
importc: "godot_variant_new_vector2".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; rect2: Rect2) {.
|
||||
importc: "godot_variant_new_rect2".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; v3: Vector3) {.
|
||||
importc: "godot_variant_new_vector3".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; t2d: Transform2D) {.
|
||||
importc: "godot_variant_new_transform2d".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; plane: Plane) {.
|
||||
importc: "godot_variant_new_plane".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; quat: Quat) {.
|
||||
importc: "godot_variant_new_quat".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; rect3: Rect3) {.
|
||||
importc: "godot_variant_new_rect3".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; basis: Basis) {.
|
||||
importc: "godot_variant_new_basis".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; trans: Transform) {.
|
||||
importc: "godot_variant_new_transform".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; color: Color) {.
|
||||
importc: "godot_variant_new_color".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; nodePath: GodotNodePath) {.
|
||||
importc: "godot_variant_new_node_path".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; rid: RID) {.
|
||||
importc: "godot_variant_new_rid".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; obj: ptr GodotObject) {.
|
||||
importc: "godot_variant_new_object".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; arr: GodotArray) {.
|
||||
importc: "godot_variant_new_array".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; pba: GodotPoolByteArray) {.
|
||||
importc: "godot_variant_new_pool_byte_array".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; pia: GodotPoolIntArray) {.
|
||||
importc: "godot_variant_new_pool_int_array".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; pra: GodotPoolRealArray) {.
|
||||
importc: "godot_variant_new_pool_real_array".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; psa: GodotPoolStringArray) {.
|
||||
importc: "godot_variant_new_pool_string_array".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; pv2a: GodotPoolVector2Array) {.
|
||||
importc: "godot_variant_new_pool_vector2_array".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; pv3a: GodotPoolVector3Array) {.
|
||||
importc: "godot_variant_new_pool_vector3_array".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; pca: GodotPoolColorArray) {.
|
||||
importc: "godot_variant_new_pool_color_array".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; dict: GodotDictionary) {.
|
||||
importc: "godot_variant_new_dictionary".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; r: cdouble) {.inline.} =
|
||||
getGDNativeAPI().variantNewReal(dest, r)
|
||||
|
||||
proc deinit*(v: var GodotVariant) {.importc: "godot_variant_destroy".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; s: GodotString) {.inline.} =
|
||||
getGDNativeAPI().variantNewString(dest, s)
|
||||
|
||||
proc asBool*(self: GodotVariant): bool {.
|
||||
importc: "godot_variant_as_bool".}
|
||||
proc asUInt*(self: GodotVariant): uint64 {.
|
||||
importc: "godot_variant_as_uint".}
|
||||
proc asInt*(self: GodotVariant): int64 {.
|
||||
importc: "godot_variant_as_int".}
|
||||
proc asReal*(self: GodotVariant): cdouble {.
|
||||
importc: "godot_variant_as_real".}
|
||||
proc asGodotString*(self: GodotVariant): GodotString {.
|
||||
importc: "godot_variant_as_string".}
|
||||
proc asVector2*(self: GodotVariant): Vector2 {.
|
||||
importc: "godot_variant_as_vector2".}
|
||||
proc asRect2*(self: GodotVariant): Rect2 {.
|
||||
importc: "godot_variant_as_rect2".}
|
||||
proc asVector3*(self: GodotVariant): Vector3 {.
|
||||
importc: "godot_variant_as_vector3".}
|
||||
proc asTransform2D*(self: GodotVariant): Transform2D {.
|
||||
importc: "godot_variant_as_transform2d".}
|
||||
proc asPlane*(self: GodotVariant): Plane {.
|
||||
importc: "godot_variant_as_plane".}
|
||||
proc asQuat*(self: GodotVariant): Quat {.
|
||||
importc: "godot_variant_as_quat".}
|
||||
proc asRect3*(self: GodotVariant): Rect3 {.
|
||||
importc: "godot_variant_as_rect3".}
|
||||
proc asBasis*(self: GodotVariant): Basis {.
|
||||
importc: "godot_variant_as_basis".}
|
||||
proc asTransform*(self: GodotVariant): Transform {.
|
||||
importc: "godot_variant_as_transform".}
|
||||
proc asColor*(self: GodotVariant): Color {.
|
||||
importc: "godot_variant_as_color".}
|
||||
proc asNodePath*(self: GodotVariant): GodotNodePath {.
|
||||
importc: "godot_variant_as_node_path".}
|
||||
proc asRID*(self: GodotVariant): RID {.
|
||||
importc: "godot_variant_as_rid".}
|
||||
proc asGodotObject*(self: GodotVariant): ptr GodotObject {.
|
||||
importc: "godot_variant_as_object".}
|
||||
proc asGodotArray*(self: GodotVariant): GodotArray {.
|
||||
importc: "godot_variant_as_array".}
|
||||
proc asGodotPoolByteArray*(self: GodotVariant): GodotPoolByteArray {.
|
||||
importc: "godot_variant_as_pool_byte_array".}
|
||||
proc asGodotPoolIntArray*(self: GodotVariant): GodotPoolIntArray {.
|
||||
importc: "godot_variant_as_pool_int_array".}
|
||||
proc asGodotPoolRealArray*(self: GodotVariant): GodotPoolRealArray {.
|
||||
importc: "godot_variant_as_pool_real_array".}
|
||||
proc asGodotPoolStringArray*(self: GodotVariant): GodotPoolStringArray {.
|
||||
importc: "godot_variant_as_pool_string_array".}
|
||||
proc asGodotPoolVector2Array*(self: GodotVariant): GodotPoolVector2Array {.
|
||||
importc: "godot_variant_as_pool_vector2_array".}
|
||||
proc asGodotPoolVector3Array*(self: GodotVariant): GodotPoolVector3Array {.
|
||||
importc: "godot_variant_as_pool_vector3_array".}
|
||||
proc asGodotPoolColorArray*(self: GodotVariant): GodotPoolColorArray {.
|
||||
importc: "godot_variant_as_pool_color_array".}
|
||||
proc asGodotDictionary*(self: GodotVariant): GodotDictionary {.
|
||||
importc: "godot_variant_as_dictionary".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; v2: Vector2) {.inline.} =
|
||||
getGDNativeAPI().variantNewVector2(dest, v2)
|
||||
|
||||
proc call*(self: GodotVariant; meth: GodotString;
|
||||
args: var array[128, GodotVariant]; argCount: cint;
|
||||
error: var VariantCallError): GodotVariant {.
|
||||
importc: "godot_variant_call".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; rect2: Rect2) {.inline.} =
|
||||
getGDNativeAPI().variantNewRect2(dest, rect2)
|
||||
|
||||
proc hasMethod*(self: GodotVariant; meth: GodotString): bool {.
|
||||
importc: "godot_variant_has_method".}
|
||||
proc `==`*(self, other: GodotVariant): bool {.
|
||||
importc: "godot_variant_operator_equal".}
|
||||
proc `<`*(self, other: GodotVariant): bool {.
|
||||
importc: "godot_variant_operator_less".}
|
||||
proc hashCompare*(self, other: GodotVariant): bool {.
|
||||
importc: "godot_variant_hash_compare".}
|
||||
proc booleanize*(self: GodotVariant; isValid: var bool): bool {.
|
||||
importc: "godot_variant_booleanize".}
|
||||
proc initGodotVariant*(dest: var GodotVariant; v3: Vector3) {.inline.} =
|
||||
getGDNativeAPI().variantNewVector3(dest, v3)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant; t2d: Transform2D) {.inline.} =
|
||||
getGDNativeAPI().variantNewTransform2D(dest, t2d)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant; plane: Plane) {.inline.} =
|
||||
getGDNativeAPI().variantNewPlane(dest, plane)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant; quat: Quat) {.inline.} =
|
||||
getGDNativeAPI().variantNewQuat(dest, quat)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant; aabb: AABB) {.inline.} =
|
||||
getGDNativeAPI().variantNewAABB(dest, aabb)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant; basis: Basis) {.inline.} =
|
||||
getGDNativeAPI().variantNewBasis(dest, basis)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant; trans: Transform) {.inline.} =
|
||||
getGDNativeAPI().variantNewTransform(dest, trans)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant; color: Color) {.inline.} =
|
||||
getGDNativeAPI().variantNewColor(dest, color)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant;
|
||||
nodePath: GodotNodePath) {.inline.} =
|
||||
getGDNativeAPI().variantNewNodePath(dest, nodePath)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant; rid: RID) {.inline.} =
|
||||
getGDNativeAPI().variantNewRID(dest, rid)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant;
|
||||
obj: ptr GodotObject) {.inline.} =
|
||||
getGDNativeAPI().variantNewObject(dest, obj)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant; arr: GodotArray) {.inline.} =
|
||||
getGDNativeAPI().variantNewArray(dest, arr)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant;
|
||||
pba: GodotPoolByteArray) {.inline.} =
|
||||
getGDNativeAPI().variantNewPoolByteArray(dest, pba)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant;
|
||||
pia: GodotPoolIntArray) {.inline.} =
|
||||
getGDNativeAPI().variantNewPoolIntArray(dest, pia)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant;
|
||||
pra: GodotPoolRealArray) {.inline.} =
|
||||
getGDNativeAPI().variantNewPoolRealArray(dest, pra)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant;
|
||||
psa: GodotPoolStringArray) {.inline.} =
|
||||
getGDNativeAPI().variantNewPoolStringArray(dest, psa)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant;
|
||||
pv2a: GodotPoolVector2Array) {.inline.} =
|
||||
getGDNativeAPI().variantNewPoolVector2Array(dest, pv2a)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant;
|
||||
pv3a: GodotPoolVector3Array) {.inline.} =
|
||||
getGDNativeAPI().variantNewPoolVector3Array(dest, pv3a)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant;
|
||||
pca: GodotPoolColorArray) {.inline.} =
|
||||
getGDNativeAPI().variantNewPoolColorArray(dest, pca)
|
||||
|
||||
proc initGodotVariant*(dest: var GodotVariant;
|
||||
dict: GodotDictionary) {.inline.} =
|
||||
getGDNativeAPI().variantNewDictionary(dest, dict)
|
||||
|
||||
proc deinit*(v: var GodotVariant) {.inline.} =
|
||||
getGDNativeAPI().variantDestroy(v)
|
||||
|
||||
proc asBool*(self: GodotVariant): bool {.inline.} =
|
||||
getGDNativeAPI().variantAsBool(self)
|
||||
|
||||
proc asUInt*(self: GodotVariant): uint64 {.inline.} =
|
||||
getGDNativeAPI().variantAsUInt(self)
|
||||
|
||||
proc asInt*(self: GodotVariant): int64 {.inline.} =
|
||||
getGDNativeAPI().variantAsInt(self)
|
||||
|
||||
proc asReal*(self: GodotVariant): cdouble {.inline.} =
|
||||
getGDNativeAPI().variantAsReal(self)
|
||||
|
||||
proc asGodotString*(self: GodotVariant): GodotString {.inline.} =
|
||||
getGDNativeAPI().variantAsString(self)
|
||||
|
||||
proc asVector2*(self: GodotVariant): Vector2 {.inline.} =
|
||||
getGDNativeAPI().variantAsVector2(self).toVector2()
|
||||
|
||||
proc asRect2*(self: GodotVariant): Rect2 {.inline.} =
|
||||
getGDNativeAPI().variantAsRect2(self).toRect2()
|
||||
|
||||
proc asVector3*(self: GodotVariant): Vector3 {.inline.} =
|
||||
getGDNativeAPI().variantAsVector3(self).toVector3()
|
||||
|
||||
proc asTransform2D*(self: GodotVariant): Transform2D {.inline.} =
|
||||
getGDNativeAPI().variantAsTransform2D(self).toTransform2D()
|
||||
|
||||
proc asPlane*(self: GodotVariant): Plane {.inline.} =
|
||||
getGDNativeAPI().variantAsPlane(self).toPlane()
|
||||
|
||||
proc asQuat*(self: GodotVariant): Quat {.inline.} =
|
||||
getGDNativeAPI().variantAsQuat(self).toQuat()
|
||||
|
||||
proc asAABB*(self: GodotVariant): AABB {.inline.} =
|
||||
getGDNativeAPI().variantAsAABB(self).toAABB()
|
||||
|
||||
proc asBasis*(self: GodotVariant): Basis {.inline.} =
|
||||
getGDNativeAPI().variantAsBasis(self).toBasis()
|
||||
|
||||
proc asTransform*(self: GodotVariant): Transform {.inline.} =
|
||||
getGDNativeAPI().variantAsTransform(self).toTransform()
|
||||
|
||||
proc asColor*(self: GodotVariant): Color {.inline.} =
|
||||
getGDNativeAPI().variantAsColor(self).toColor()
|
||||
|
||||
proc asNodePath*(self: GodotVariant): GodotNodePath {.inline.} =
|
||||
getGDNativeAPI().variantAsNodePath(self)
|
||||
|
||||
proc asRID*(self: GodotVariant): RID {.inline.} =
|
||||
getGDNativeAPI().variantAsRID(self)
|
||||
|
||||
proc asGodotObject*(self: GodotVariant): ptr GodotObject {.inline.} =
|
||||
getGDNativeAPI().variantAsObject(self)
|
||||
|
||||
proc asGodotArray*(self: GodotVariant): GodotArray {.inline.} =
|
||||
getGDNativeAPI().variantAsArray(self)
|
||||
|
||||
proc asGodotPoolByteArray*(self: GodotVariant): GodotPoolByteArray {.inline.} =
|
||||
getGDNativeAPI().variantAsPoolByteArray(self)
|
||||
|
||||
proc asGodotPoolIntArray*(self: GodotVariant): GodotPoolIntArray {.inline.} =
|
||||
getGDNativeAPI().variantAsPoolIntArray(self)
|
||||
|
||||
proc asGodotPoolRealArray*(self: GodotVariant): GodotPoolRealArray {.inline.} =
|
||||
getGDNativeAPI().variantAsPoolRealArray(self)
|
||||
|
||||
proc asGodotPoolStringArray*(self: GodotVariant): GodotPoolStringArray
|
||||
{.inline.} =
|
||||
getGDNativeAPI().variantAsPoolStringArray(self)
|
||||
|
||||
proc asGodotPoolVector2Array*(self: GodotVariant): GodotPoolVector2Array
|
||||
{.inline.} =
|
||||
getGDNativeAPI().variantAsPoolVector2Array(self)
|
||||
|
||||
proc asGodotPoolVector3Array*(self: GodotVariant): GodotPoolVector3Array
|
||||
{.inline.} =
|
||||
getGDNativeAPI().variantAsPoolVector3Array(self)
|
||||
|
||||
proc asGodotPoolColorArray*(self: GodotVariant): GodotPoolColorArray
|
||||
{.inline.} =
|
||||
getGDNativeAPI().variantAsPoolColorArray(self)
|
||||
|
||||
proc asGodotDictionary*(self: GodotVariant): GodotDictionary {.inline.} =
|
||||
getGDNativeAPI().variantAsDictionary(self)
|
||||
|
||||
proc call*(self: var GodotVariant; meth: GodotString;
|
||||
args: ptr array[256, ptr GodotVariant]; argCount: cint;
|
||||
error: var VariantCallError): GodotVariant {.inline.} =
|
||||
getGDNativeAPI().variantCall(self, meth, args, argCount, error)
|
||||
|
||||
proc hasMethod*(self: GodotVariant; meth: GodotString): bool {.inline.} =
|
||||
getGDNativeAPI().variantHasMethod(self, meth)
|
||||
|
||||
proc `==`*(self, other: GodotVariant): bool {.inline.} =
|
||||
getGDNativeAPI().variantOperatorEqual(self, other)
|
||||
|
||||
proc `<`*(self, other: GodotVariant): bool {.inline.} =
|
||||
getGDNativeAPI().variantOperatorLess(self, other)
|
||||
|
||||
proc hashCompare*(self, other: GodotVariant): bool {.inline.} =
|
||||
getGDNativeAPI().variantHashCompare(self, other)
|
||||
|
||||
proc booleanize*(self: GodotVariant): bool {.inline.} =
|
||||
getGDNativeAPI().variantBooleanize(self)
|
||||
|
||||
import godotstrings
|
||||
proc `$`*(self: GodotVariant): string =
|
||||
var s = self.asGodotString()
|
||||
result = $s
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
# Copyright 2017 Xored Software, Inc.
|
||||
# Copyright 2018 Xored Software, Inc.
|
||||
|
||||
import macros, tables, typetraits
|
||||
import godotinternal, internal.godotvariants
|
||||
import godotnim, core.variants
|
||||
import macros, tables, typetraits, strutils, sets, sequtils, options, algorithm
|
||||
import godotinternal, internal/godotvariants
|
||||
import godotnim, core/variants
|
||||
|
||||
type
|
||||
VarDecl = ref object
|
||||
|
|
@ -10,8 +10,8 @@ type
|
|||
typ: NimNode
|
||||
defaultValue: NimNode
|
||||
isNoGodot: bool
|
||||
hint: string
|
||||
hintStr: string
|
||||
hint: Option[string]
|
||||
hintStr: Option[string]
|
||||
usage: NimNode
|
||||
isExported: bool
|
||||
|
||||
|
|
@ -32,6 +32,8 @@ type
|
|||
|
||||
ParseError = object of Exception
|
||||
|
||||
include "internal/backwardcompat.inc.nim"
|
||||
|
||||
proc godotToNim[T](val: Variant): (T, ConversionResult) =
|
||||
mixin fromVariant
|
||||
result[1] = fromVariant(result[0], val)
|
||||
|
|
@ -51,14 +53,15 @@ template parseError(node: NimNode, msg: string) =
|
|||
proc extractNames(definition: NimNode):
|
||||
tuple[name, parentName: string] =
|
||||
if definition.kind == nnkIdent:
|
||||
result.name = $(definition.ident)
|
||||
result.name = definition.strVal
|
||||
else:
|
||||
if not (definition.kind == nnkInfix and definition[0].ident == !"of"):
|
||||
if not (definition.kind == nnkInfix and
|
||||
definition[0].strVal == "of"):
|
||||
parseError(definition, "invalid type definition")
|
||||
result.name = $(definition[1].ident)
|
||||
result.name = definition[1].strVal
|
||||
case definition[2].kind:
|
||||
of nnkIdent:
|
||||
result.parentName = $definition[2].ident
|
||||
result.parentName = definition[2].strVal
|
||||
else:
|
||||
parseError(definition[2], "parent type expected")
|
||||
|
||||
|
|
@ -71,13 +74,13 @@ proc newCStringLit(s: string): NimNode {.compileTime.} =
|
|||
newNimNode(nnkCallStrLit).add(ident("cstring"), newRStrLit(s))
|
||||
|
||||
iterator pragmas(node: NimNode):
|
||||
tuple[key: NimIdent, value: NimNode, index: int] =
|
||||
tuple[key: string, value: NimNode, index: int] =
|
||||
assert node.kind in {nnkPragma, nnkEmpty}
|
||||
for index in countdown(node.len - 1, 0):
|
||||
if node[index].kind == nnkExprColonExpr:
|
||||
yield (node[index][0].ident, node[index][1], index)
|
||||
yield (node[index][0].strVal, node[index][1], index)
|
||||
elif node[index].kind == nnkIdent:
|
||||
yield (node[index].ident, nil, index)
|
||||
yield (node[index].strVal, nil, index)
|
||||
|
||||
proc removePragmaNode(statement: NimNode,
|
||||
pname: string): NimNode {.compileTime.} =
|
||||
|
|
@ -90,9 +93,8 @@ proc removePragmaNode(statement: NimNode,
|
|||
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:
|
||||
if ident.eqIdent(pname):
|
||||
pragmas.del(i)
|
||||
return val
|
||||
|
||||
|
|
@ -103,19 +105,18 @@ proc removePragma(statement: NimNode, pname: string): bool =
|
|||
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:
|
||||
if ident.eqIdent(pname):
|
||||
pragmas.del(i)
|
||||
return true
|
||||
|
||||
proc removeStrPragma(statement: NimNode,
|
||||
pname: string): string {.compileTime.} =
|
||||
pname: string): Option[string] {.compileTime.} =
|
||||
## Removes the pragma from the node and returns value of the pragma
|
||||
## Works for routine nodes or nnkPragmaExpr
|
||||
let node = removePragmaNode(statement, pname)
|
||||
result = if node.isNil: nil
|
||||
else: $node
|
||||
result = if node.isNil: none(string)
|
||||
else: some($node)
|
||||
|
||||
proc isExported(node: NimNode): bool {.compileTime.} =
|
||||
if node.kind == nnkPragmaExpr:
|
||||
|
|
@ -171,10 +172,15 @@ proc parseMethod(meth: NimNode): MethodDecl =
|
|||
|
||||
proc parseVarSection(decl: NimNode): seq[VarDecl] =
|
||||
assert(decl.kind == nnkVarSection)
|
||||
result = identDefsToVarDecls(decl[0])
|
||||
for i in 0..<decl.len:
|
||||
if i == 0:
|
||||
result = identDefsToVarDecls(decl[i])
|
||||
else:
|
||||
result.add(identDefsToVarDecls(decl[i]))
|
||||
|
||||
proc parseType(definition, callSite: NimNode): ObjectDecl =
|
||||
let body = callSite[^1]
|
||||
proc parseType(ast: NimNode): ObjectDecl =
|
||||
let definition = ast[0]
|
||||
let body = ast[^1]
|
||||
result = ObjectDecl(
|
||||
fields: newSeq[VarDecl](),
|
||||
methods: newSeq[MethodDecl]()
|
||||
|
|
@ -182,17 +188,17 @@ proc parseType(definition, callSite: NimNode): ObjectDecl =
|
|||
(result.name, result.parentName) = extractNames(definition)
|
||||
|
||||
var isTool = false
|
||||
for i in 2..(callSite.len - 2):
|
||||
let option = callSite[i]
|
||||
for i in 1..(ast.len - 2):
|
||||
let option = ast[i]
|
||||
if option.kind != nnkIdent:
|
||||
parseError(option, "type specifier expected")
|
||||
if option.ident == !"tool":
|
||||
if option.strVal == "tool":
|
||||
isTool = true
|
||||
else:
|
||||
parseError(option, "valid type specifier expected")
|
||||
result.isTool = isTool
|
||||
|
||||
if result.parentName.isNil: result.parentName = "Object"
|
||||
if result.parentName.len == 0: result.parentName = "Object"
|
||||
for statement in body:
|
||||
case statement.kind:
|
||||
of nnkVarSection:
|
||||
|
|
@ -209,7 +215,7 @@ proc parseType(definition, callSite: NimNode): ObjectDecl =
|
|||
macro invokeVarArgs(procIdent, objIdent;
|
||||
minArgs, maxArgs: static[int], numArgsIdent,
|
||||
argSeqIdent; argTypes: seq[NimNode],
|
||||
hasReturnValue, isStaticCall: static[bool]): typed =
|
||||
hasReturnValue, isStaticCall: static[bool]): untyped =
|
||||
## Produces statement in form:
|
||||
##
|
||||
## .. code-block:: nim
|
||||
|
|
@ -266,8 +272,12 @@ macro invokeVarArgs(procIdent, objIdent;
|
|||
invocation = newNimNode(nnkCall).add(ident("procCall"), invocation)
|
||||
|
||||
if hasReturnValue:
|
||||
let resultVariant = genSym(nskLet, "ret")
|
||||
branchBody.add(
|
||||
newNimNode(nnkLetSection).add(
|
||||
newIdentDefs(resultVariant, ident("Variant"), newCall("toVariant", invocation))))
|
||||
let theCall = newNimNode(nnkBracketExpr).add(newNimNode(nnkDotExpr).add(
|
||||
newCall("toVariant", invocation), ident("godotVariant")))
|
||||
resultVariant, ident("godotVariant")))
|
||||
branchBody.add(getAst(initGodotVariantCall(ident("result"), theCall)))
|
||||
else:
|
||||
branchBody.add(invocation)
|
||||
|
|
@ -282,7 +292,7 @@ macro invokeVarArgs(procIdent, objIdent;
|
|||
" arguments, but got " & $numArgs)
|
||||
|
||||
result.add(newNimNode(nnkElse).add(getAst(
|
||||
printInvokeErr($procIdent.ident, minArgs, maxArgs, numArgsIdent))))
|
||||
printInvokeErr(procIdent.strVal, minArgs, maxArgs, numArgsIdent))))
|
||||
|
||||
proc typeError(nimType: string, value: string, godotType: VariantType,
|
||||
className: cstring, propertyName: cstring): string =
|
||||
|
|
@ -313,23 +323,29 @@ proc refcountIncremented(obj: ptr GodotObject, methodData: pointer,
|
|||
userData: pointer, numArgs: cint,
|
||||
args: var array[MAX_ARG_COUNT, ptr GodotVariant]):
|
||||
GodotVariant {.noconv.} =
|
||||
GC_ref(cast[NimGodotObject](userData))
|
||||
let nimObj = cast[NimGodotObject](userData)
|
||||
if not nimObj.isFinalized:
|
||||
GC_ref(nimObj)
|
||||
|
||||
proc refcountDecremented(obj: ptr GodotObject, methodData: pointer,
|
||||
userData: pointer, numArgs: cint,
|
||||
args: var array[MAX_ARG_COUNT, ptr GodotVariant]):
|
||||
GodotVariant {.noconv.} =
|
||||
GC_unref(cast[NimGodotObject](userData))
|
||||
initGodotVariant(result, false) # destroy when Nim decides
|
||||
let nimObj = cast[NimGodotObject](userData)
|
||||
if not nimObj.isFinalized:
|
||||
GC_unref(nimObj)
|
||||
initGodotVariant(result, nimObj.isFinalized)
|
||||
|
||||
template registerGodotClass(classNameIdent, classNameLit, isRef,
|
||||
template registerGodotClass(classNameIdent, classNameLit; isRefClass: bool;
|
||||
baseNameLit, createFuncIdent; isTool: bool) =
|
||||
proc createFuncIdent(obj: ptr GodotObject,
|
||||
methData: pointer): pointer {.noconv.} =
|
||||
var nimObj: classNameIdent
|
||||
new(nimObj, nimGodotObjectFinalizer[classNameIdent])
|
||||
nimObj.setGodotObject(obj)
|
||||
nimObj.setNativeObject(asNimGodotObject[NimGodotObject](obj, noRef = true))
|
||||
nimObj.isRef = when isRefClass: true else: false
|
||||
nimObj.setNativeObject(asNimGodotObject[NimGodotObject](
|
||||
obj, forceNativeObject = true))
|
||||
GC_ref(nimObj)
|
||||
result = cast[pointer](nimObj)
|
||||
when compiles(nimObj.init()):
|
||||
|
|
@ -339,15 +355,15 @@ template registerGodotClass(classNameIdent, classNameLit, isRef,
|
|||
createFunc: createFuncIdent
|
||||
)
|
||||
let destroyFuncObj = GodotInstanceDestroyFunc(
|
||||
destroyFunc: when isRef: nimDestroyRefFunc else: nimDestroyFunc
|
||||
destroyFunc: when isRefClass: nimDestroyRefFunc else: nimDestroyFunc
|
||||
)
|
||||
registerClass(classNameIdent, classNameLit, false)
|
||||
when isTool:
|
||||
godotScriptRegisterToolClass(getNativeLibHandle(), classNameLit, baseNameLit,
|
||||
createFuncObj, destroyFuncObj)
|
||||
nativeScriptRegisterToolClass(getNativeLibHandle(), classNameLit,
|
||||
baseNameLit, createFuncObj, destroyFuncObj)
|
||||
else:
|
||||
godotScriptRegisterClass(getNativeLibHandle(), classNameLit, baseNameLit,
|
||||
createFuncObj, destroyFuncObj)
|
||||
nativeScriptRegisterClass(getNativeLibHandle(), classNameLit,
|
||||
baseNameLit, createFuncObj, destroyFuncObj)
|
||||
|
||||
template registerGodotField(classNameLit, classNameIdent, propNameLit,
|
||||
propNameIdent, propTypeLit, propTypeIdent,
|
||||
|
|
@ -384,10 +400,9 @@ template registerGodotField(classNameLit, classNameIdent, propNameLit,
|
|||
getFunc: getFuncIdent
|
||||
)
|
||||
mixin godotTypeInfo
|
||||
static:
|
||||
var typeInfo: GodotTypeInfo
|
||||
when compiles(godotTypeInfo(propTypeIdent)):
|
||||
typeInfo = godotTypeInfo(propTypeIdent)
|
||||
const typeInfo = when compiles(godotTypeInfo(propTypeIdent)):
|
||||
godotTypeInfo(propTypeIdent)
|
||||
else: GodotTypeInfo()
|
||||
const hintStr = when hintStrLit != "NIM":
|
||||
hintStrLit
|
||||
else:
|
||||
|
|
@ -409,13 +424,10 @@ template registerGodotField(classNameLit, classNameIdent, propNameLit,
|
|||
{.push warning[ProveInit]: on.}
|
||||
when hasDefaultValue:
|
||||
attr.defaultValue = (defaultValueNode).toVariant().godotVariant[]
|
||||
godotScriptRegisterProperty(getNativeLibHandle(), classNameLit, propNameLit,
|
||||
unsafeAddr attr, setFunc, getFunc)
|
||||
nativeScriptRegisterProperty(getNativeLibHandle(), classNameLit, propNameLit,
|
||||
unsafeAddr attr, setFunc, getFunc)
|
||||
hintStrGodot.deinit()
|
||||
|
||||
static:
|
||||
import strutils, sets, sequtils
|
||||
|
||||
proc toGodotStyle(s: string): string {.compileTime.} =
|
||||
result = newStringOfCap(s.len + 10)
|
||||
for c in s:
|
||||
|
|
@ -436,7 +448,7 @@ proc genType(obj: ObjectDecl): NimNode {.compileTime.} =
|
|||
let objTy = newNimNode(nnkObjectTy)
|
||||
typeDef.add(newNimNode(nnkRefTy).add(objTy))
|
||||
objTy.add(newEmptyNode())
|
||||
if obj.parentName.isNil:
|
||||
if obj.parentName.len == 0:
|
||||
objTy.add(newEmptyNode())
|
||||
else:
|
||||
objTy.add(newNimNode(nnkOfInherit).add(ident(obj.parentName)))
|
||||
|
|
@ -446,35 +458,38 @@ proc genType(obj: ObjectDecl): NimNode {.compileTime.} =
|
|||
let initBody = newStmtList()
|
||||
for decl in obj.fields:
|
||||
if not decl.defaultValue.isNil and decl.defaultValue.kind != nnkEmpty:
|
||||
initBody.add(newNimNode(nnkAsgn).add(decl.name, decl.defaultValue))
|
||||
initBody.add(newNimNode(nnkAsgn).add(newDotExpr(ident("self"), decl.name),
|
||||
decl.defaultValue))
|
||||
let name = if not decl.isExported: decl.name
|
||||
else: postfix(decl.name, "*")
|
||||
recList.add(newIdentDefs(name, decl.typ))
|
||||
|
||||
# Add default values to init method
|
||||
if initBody.len > 0:
|
||||
var initMethod: NimNode
|
||||
for meth in obj.methods:
|
||||
if meth.name == "init" and meth.nimNode[3].len == 1:
|
||||
initMethod = meth.nimNode
|
||||
break
|
||||
if initMethod.isNil:
|
||||
obj.methods.add(MethodDecl(
|
||||
name: "init",
|
||||
args: newSeq[VarDecl](),
|
||||
returnType: newEmptyNode(),
|
||||
isVirtual: true,
|
||||
isNoGodot: false,
|
||||
nimNode: newProc(ident("init"), body = initBody,
|
||||
procType = nnkMethodDef)
|
||||
))
|
||||
else:
|
||||
initMethod.body.insert(0, initBody)
|
||||
# Add default values and/or super call to init method
|
||||
initBody.insert(0, newNimNode(nnkCommand).add(ident("procCall"),
|
||||
newCall("init", newCall(obj.parentName, ident("self")))))
|
||||
var initMethod: NimNode
|
||||
for meth in obj.methods:
|
||||
if meth.name == "init" and meth.nimNode[3].len == 1:
|
||||
initMethod = meth.nimNode
|
||||
break
|
||||
if initMethod.isNil:
|
||||
obj.methods.add(MethodDecl(
|
||||
name: "init",
|
||||
args: newSeq[VarDecl](),
|
||||
returnType: newEmptyNode(),
|
||||
isVirtual: true,
|
||||
isNoGodot: false,
|
||||
nimNode: newProc(postfix(ident("init"), "*"), body = initBody,
|
||||
procType = nnkMethodDef)
|
||||
))
|
||||
else:
|
||||
initMethod.body.insert(0, initBody)
|
||||
|
||||
# {.this: self.} for convenience
|
||||
result.add(newNimNode(nnkPragma).add(newNimNode(nnkExprColonExpr).add(
|
||||
ident("this"), ident("self")
|
||||
)))
|
||||
when (NimMajor, NimMinor, NimPatch) < (0, 19, 0):
|
||||
# {.this: self.} for convenience
|
||||
result.add(newNimNode(nnkPragma).add(newNimNode(nnkExprColonExpr).add(
|
||||
ident("this"), ident("self")
|
||||
)))
|
||||
|
||||
# Nim proc defintions
|
||||
var decls = newSeqOfCap[NimNode](obj.methods.len)
|
||||
|
|
@ -494,23 +509,25 @@ proc genType(obj: ObjectDecl): NimNode {.compileTime.} =
|
|||
result.add(meth.nimNode)
|
||||
|
||||
# Register Godot object
|
||||
let parentName = if obj.parentName.isNil: newStrLitNode("Object")
|
||||
let parentName = if obj.parentName.len == 0: newStrLitNode("Object")
|
||||
else: newStrLitNode(obj.parentName)
|
||||
let classNameLit = newCStringLit(obj.name)
|
||||
let classNameLit = newStrLitNode(obj.name)
|
||||
let classNameIdent = ident(obj.name)
|
||||
let isRef: bool = if obj.parentName.isNil: false
|
||||
let isRef: bool = if obj.parentName.len == 0: false
|
||||
else: obj.parentName in refClasses
|
||||
# Wrapping bools with a newLit is required as a temporary workaround for
|
||||
# https://github.com/nim-lang/Nim/issues/7375
|
||||
result.add(getAst(
|
||||
registerGodotClass(classNameIdent, classNameLit, isRef, parentName,
|
||||
genSym(nskProc, "createFunc"), obj.isTool)))
|
||||
registerGodotClass(classNameIdent, classNameLit, newLit(isRef), parentName,
|
||||
genSym(nskProc, "createFunc"), newLit(obj.isTool))))
|
||||
|
||||
# Register fields (properties)
|
||||
for field in obj.fields:
|
||||
if field.isNoGodot: continue
|
||||
let hintStr = if field.hintStr.isNil: "NIM"
|
||||
else: field.hintStr
|
||||
let hint = if field.hint.isNil: "NIM"
|
||||
else: field.hint
|
||||
let hintStr = if field.hintStr.isNone: "NIM"
|
||||
else: field.hintStr.get
|
||||
let hint = if field.hint.isNone: "NIM"
|
||||
else: field.hint.get
|
||||
let usage =
|
||||
if field.usage.isNil:
|
||||
newLit(ord(GodotPropertyUsage.Default) or
|
||||
|
|
@ -533,10 +550,23 @@ proc genType(obj: ObjectDecl): NimNode {.compileTime.} =
|
|||
template registerGodotMethod(classNameLit, classNameIdent, methodNameIdent,
|
||||
methodNameLit, minArgs, maxArgs,
|
||||
argTypes, methFuncIdent, hasReturnValue) =
|
||||
when (NimMajor, NimMinor, NimPatch) < (0, 19, 0):
|
||||
{.emit: """/*TYPESECTION*/
|
||||
N_NOINLINE(void, setStackBottom)(void* thestackbottom);
|
||||
""".}
|
||||
|
||||
proc methFuncIdent(obj: ptr GodotObject, methodData: pointer,
|
||||
userData: pointer, numArgs: cint,
|
||||
args: var array[MAX_ARG_COUNT, ptr GodotVariant]):
|
||||
GodotVariant {.noconv.} =
|
||||
var stackBottom {.volatile.}: pointer
|
||||
stackBottom = addr(stackBottom)
|
||||
when (NimMajor, NimMinor, NimPatch) < (0, 19, 0):
|
||||
{.emit: """
|
||||
setStackBottom((void*)(&`stackBottom`));
|
||||
""".}
|
||||
else:
|
||||
nimGC_setStackBottom(stackBottom)
|
||||
let self = cast[classNameIdent](userData)
|
||||
const isStaticCall = methodNameLit == cstring"_ready" or
|
||||
methodNameLit == cstring"_process" or
|
||||
|
|
@ -561,8 +591,8 @@ proc genType(obj: ObjectDecl): NimNode {.compileTime.} =
|
|||
let meth = GodotInstanceMethod(
|
||||
meth: methFuncIdent
|
||||
)
|
||||
godotScriptRegisterMethod(getNativeLibHandle(), classNameLit, methodNameLit,
|
||||
GodotMethodAttributes(), meth)
|
||||
nativeScriptRegisterMethod(getNativeLibHandle(), classNameLit,
|
||||
methodNameLit, GodotMethodAttributes(), meth)
|
||||
|
||||
for meth in obj.methods:
|
||||
if meth.isNoGodot: continue
|
||||
|
|
@ -579,8 +609,8 @@ proc genType(obj: ObjectDecl): NimNode {.compileTime.} =
|
|||
else: toGodotStyle(meth.name)
|
||||
let hasReturnValueBool = not (meth.returnType.isNil or
|
||||
meth.returnType.kind == nnkEmpty or
|
||||
(meth.returnType.kind == nnkIdent and
|
||||
meth.returnType.ident == !"void"))
|
||||
(meth.returnType.kind == nnkIdent and
|
||||
meth.returnType.strVal == "void"))
|
||||
let hasReturnValue = if hasReturnValueBool: ident("true")
|
||||
else: ident("false")
|
||||
result.add(getAst(
|
||||
|
|
@ -598,19 +628,15 @@ proc genType(obj: ObjectDecl): NimNode {.compileTime.} =
|
|||
let refDec = GodotInstanceMethod(
|
||||
meth: refcountDecremented
|
||||
)
|
||||
godotScriptRegisterMethod(getNativeLibHandle(), classNameLit,
|
||||
cstring"_refcount_incremented",
|
||||
GodotMethodAttributes(), refInc)
|
||||
godotScriptRegisterMethod(getNativeLibHandle(), classNameLit,
|
||||
cstring"_refcount_decremented",
|
||||
GodotMethodAttributes(), refDec)
|
||||
nativeScriptRegisterMethod(getNativeLibHandle(), classNameLit,
|
||||
cstring"_refcount_incremented",
|
||||
GodotMethodAttributes(), refInc)
|
||||
nativeScriptRegisterMethod(getNativeLibHandle(), classNameLit,
|
||||
cstring"_refcount_decremented",
|
||||
GodotMethodAttributes(), refDec)
|
||||
result.add(getAst(registerRefIncDec(classNameLit)))
|
||||
|
||||
{.push warning[Deprecated]: off.}
|
||||
# immediate macros are deprecated, but `untyped` doesn't make it immediate,
|
||||
# as the warning and the documentation claim.
|
||||
|
||||
macro gdobj*(definition: untyped, body: typed): typed {.immediate.} =
|
||||
macro gdobj*(ast: varargs[untyped]): untyped =
|
||||
## Generates Godot type. Self-documenting example:
|
||||
##
|
||||
## .. code-block:: nim
|
||||
|
|
@ -618,7 +644,7 @@ macro gdobj*(definition: untyped, body: typed): typed {.immediate.} =
|
|||
##
|
||||
## gdobj MyObj of Node:
|
||||
## var myField: int
|
||||
## ## Not exported to Godot (i.e. editor will not see this field).
|
||||
## ## Not exported to Godot (i.e. editor and scripts will not see this field).
|
||||
##
|
||||
## var myString* {.gdExport, hint: Length, hintStr: "20".}: string
|
||||
## ## Exported to Godot as ``my_string``.
|
||||
|
|
@ -631,12 +657,12 @@ macro gdobj*(definition: untyped, body: typed): typed {.immediate.} =
|
|||
## ## Exported methods are exported to Godot by default,
|
||||
## ## and their Godot names are prefixed with ``_``
|
||||
## ## (in this case ``_ready``)
|
||||
## print("I am ready! myString is: " & myString)
|
||||
## print("I am ready! myString is: " & self.myString)
|
||||
##
|
||||
## proc myProc*() {.gdExport.} =
|
||||
## ## Exported to Godot as ``my_proc``
|
||||
## print("myProc is called! Incrementing myField.")
|
||||
## inc myField
|
||||
## inc self.myField
|
||||
##
|
||||
## If parent type is omitted, the type is inherited from ``Object``.
|
||||
##
|
||||
|
|
@ -654,7 +680,5 @@ macro gdobj*(definition: untyped, body: typed): typed {.immediate.} =
|
|||
## `gdnew <godotnim.html#gdnew>`_ or by using
|
||||
## `load <godotapi/resource_loader.html#load,string,string,bool>`_ or any other way
|
||||
## that you can find in `Godot API <index.html#modules-godot-api>`_.
|
||||
let typeDef = parseType(definition, callsite())
|
||||
let typeDef = parseType(ast)
|
||||
result = genType(typeDef)
|
||||
|
||||
{.push warning[Deprecated]: on.}
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
# Copyright 2017 Xored Software, Inc.
|
||||
# Copyright 2018 Xored Software, Inc.
|
||||
|
||||
import tables, typetraits, macros, asyncdispatch
|
||||
import core.godotbase
|
||||
import core.vector2, core.rect2,
|
||||
core.vector3, core.transform2d,
|
||||
core.planes, core.quats, core.rect3,
|
||||
core.basis, core.transforms, core.colors,
|
||||
core.nodepaths, core.rids, core.dictionaries,
|
||||
core.arrays, core.poolarrays, core.variants
|
||||
import tables, typetraits, macros, unicode, strutils, sets, options
|
||||
import gdnativeapi
|
||||
import core/godotcoretypes, core/godotbase
|
||||
import core/vector2, core/rect2,
|
||||
core/vector3, core/transform2d,
|
||||
core/planes, core/quats, core/aabb,
|
||||
core/basis, core/transforms, core/colors,
|
||||
core/nodepaths, core/rids, core/dictionaries,
|
||||
core/arrays, core/poolarrays, core/variants
|
||||
import godotinternal
|
||||
|
||||
## This module defines ``NimGodotObject`` and ``toVariant``/``fromVariant``
|
||||
|
|
@ -30,7 +31,7 @@ type
|
|||
## The base type all Godot types inherit from.
|
||||
## Manages lifecycle of the wrapped ``GodotObject``.
|
||||
godotObject: ptr GodotObject
|
||||
linkedObject: NimGodotObject
|
||||
linkedObjectPtr: pointer
|
||||
## Wrapper around native object that is the container of the Nim "script"
|
||||
## This is needed for `of` checks and `as` conversions to work as
|
||||
## expected. For example, Nim type may inherit from ``Spatial``, but the
|
||||
|
|
@ -38,7 +39,11 @@ type
|
|||
## ``Particles`` is valid, but Nim type system is not aware of that.
|
||||
## This works in both directions - for linked native object this
|
||||
## reference points to Nim object.
|
||||
isExternalRef: bool
|
||||
## This is stored as a raw pointer to avoid reference cycles and therefore
|
||||
## improve GC performance.
|
||||
isRef*: bool
|
||||
isFinalized: bool
|
||||
isNative: bool
|
||||
|
||||
ConversionResult* {.pure.} = enum
|
||||
## Conversion result to return from ``fromVariant`` procedure.
|
||||
|
|
@ -54,7 +59,7 @@ type
|
|||
SomeFloat = float32 or float64 or cfloat
|
||||
|
||||
SomeGodot = bool or Vector2 or Rect2 or Vector3 or
|
||||
Transform2D or Plane or Quat or Rect3 or
|
||||
Transform2D or Plane or Quat or AABB or
|
||||
Basis or Transform or Color or NodePath or
|
||||
RID or GodotObject or Dictionary or Array or
|
||||
PoolByteArray or PoolIntArray or PoolRealArray or
|
||||
|
|
@ -86,37 +91,71 @@ type
|
|||
## values.
|
||||
## See documentation of ``GodotPropertyHint`` for description of formats.
|
||||
|
||||
template printWarning*(warning: typed) =
|
||||
## Prints ``warning`` to Godot log, adding filename and line information.
|
||||
let (filename, line) = instantiationInfo()
|
||||
godotPrintWarning(cstring($warning), nil, cstring(filename), line.cint)
|
||||
FNV1Hash = uint32
|
||||
|
||||
template printError*(error: typed) =
|
||||
## Prints ``error`` to Godot log, adding filename and line information.
|
||||
let (filename, line) = instantiationInfo()
|
||||
godotPrintError(cstring($error), nil, cstring(filename), line.cint)
|
||||
include "internal/backwardcompat.inc.nim"
|
||||
|
||||
proc print*(parts: varargs[string, `$`]) =
|
||||
## Prints concatenated ``parts`` to Godot log.
|
||||
var combined = ""
|
||||
for v in parts:
|
||||
combined.add(v)
|
||||
var s = combined.toGodotString()
|
||||
godotPrint(s)
|
||||
s.deinit()
|
||||
proc isFinalized*(obj: NimGodotObject): bool {.inline.} =
|
||||
obj.isFinalized
|
||||
|
||||
var classRegistry {.threadvar.}: TableRef[cstring, ObjectInfo]
|
||||
var classRegistryStatic* {.compileTime.}: TableRef[cstring, ObjectInfo]
|
||||
var classRegistry {.threadvar.}: TableRef[FNV1Hash, ObjectInfo]
|
||||
var classRegistryStatic* {.compileTime.}: TableRef[FNV1Hash, ObjectInfo]
|
||||
## Compile-time variable used for implementation of several procedures
|
||||
## and macros
|
||||
static:
|
||||
classRegistryStatic = newTable[cstring, ObjectInfo]()
|
||||
classRegistryStatic = newTable[FNV1Hash, ObjectInfo]()
|
||||
|
||||
static:
|
||||
import sets, strutils
|
||||
var nativeClasses {.compileTime.} = newSeq[string]()
|
||||
var refClasses* {.compileTime.} = newSeq[string]()
|
||||
|
||||
template initFNV1Hash(hash: var FNV1Hash) =
|
||||
hash = 0x811c9dc5'u32
|
||||
|
||||
template appendFNV1Hash(hash: var FNV1Hash, val: uint8) =
|
||||
block:
|
||||
let u64hash = hash.uint64
|
||||
hash = ((
|
||||
u64hash +
|
||||
(u64hash shl 1'u64) +
|
||||
(u64hash shl 4'u64) +
|
||||
(u64hash shl 7'u64) +
|
||||
(u64hash shl 8'u64) +
|
||||
(u64hash shl 24'u64)) and 0xFFFFFFFF'u32).uint32 xor val
|
||||
|
||||
{.push stackTrace:off.}
|
||||
proc lsb(c: ptr cwchar_t): char {.noinit, inline.} =
|
||||
{.emit: [result, " = (char)(", c[]," & 0xFF);"]}
|
||||
{.pop.}
|
||||
|
||||
proc fnv1Hash(godotClassName: GodotString): FNV1Hash =
|
||||
var charsCount = godotClassName.len
|
||||
let charsPtr = godotClassName.dataPtr
|
||||
if charsCount > 2 and
|
||||
charsPtr.offset(charsCount - 2).lsb == 'S' and
|
||||
charsPtr.offset(charsCount - 1).lsb == 'W':
|
||||
charsCount -= 2
|
||||
|
||||
initFNV1Hash(result)
|
||||
for i in 0..<charsCount:
|
||||
let c = charsPtr.offset(i).lsb
|
||||
appendFNV1Hash(result, c.uint8)
|
||||
|
||||
proc fnv1Hash(godotClassName: string): FNV1Hash {.compileTime.} =
|
||||
var charsCount = godotClassName.len
|
||||
if godotClassName.endsWith("SW"):
|
||||
charsCount -= 2
|
||||
|
||||
initFNV1Hash(result)
|
||||
var i = 0
|
||||
for rune in runes(godotClassName):
|
||||
if i >= charsCount:
|
||||
break
|
||||
let firstByte = uint8(rune.uint64 and 0xFF'u64)
|
||||
appendFNV1Hash(result, firstByte)
|
||||
# We don't really need to calculate hash of other bytes,
|
||||
# since we only use hashes of ASCII strings
|
||||
inc i
|
||||
|
||||
proc getClassName*(o: NimGodotObject): string =
|
||||
o.godotObject.getClassName()
|
||||
|
||||
|
|
@ -128,11 +167,18 @@ proc unreference(o: ptr GodotObject): bool =
|
|||
unreferenceMethodBind.ptrCall(o, nil, addr(result))
|
||||
|
||||
var referenceMethodBind {.threadvar.}: ptr GodotMethodBind
|
||||
proc reference(o: ptr GodotObject) =
|
||||
proc reference(o: ptr GodotObject): bool {.discardable.} =
|
||||
if isNil(referenceMethodBind):
|
||||
referenceMethodBind = getMethod(cstring"Reference",
|
||||
cstring"reference")
|
||||
referenceMethodBind.ptrCall(o, nil, nil)
|
||||
referenceMethodBind.ptrCall(o, nil, addr result)
|
||||
|
||||
var initRefMethodBind {.threadvar.}: ptr GodotMethodBind
|
||||
proc initRef(o: ptr GodotObject): bool {.discardable.} =
|
||||
if isNil(initRefMethodBind):
|
||||
initRefMethodBind = getMethod(cstring"Reference",
|
||||
cstring"init_ref")
|
||||
initRefMethodBind.ptrCall(o, nil, addr result)
|
||||
|
||||
proc deinit*(obj: NimGodotObject) =
|
||||
## Destroy the object. You only need to call this for objects not inherited
|
||||
|
|
@ -141,11 +187,15 @@ proc deinit*(obj: NimGodotObject) =
|
|||
obj.godotObject.deinit()
|
||||
obj.godotObject = nil
|
||||
|
||||
proc linkedObject(obj: NimGodotObject): NimGodotObject {.inline.} =
|
||||
cast[NimGodotObject](obj.linkedObjectPtr)
|
||||
|
||||
proc nimGodotObjectFinalizer*[T: NimGodotObject](obj: T) =
|
||||
if obj.godotObject.isNil: return
|
||||
if obj.isExternalRef and obj.godotObject.unreference():
|
||||
obj.deinit()
|
||||
elif not obj.linkedObject.isNil:
|
||||
if obj.godotObject.isNil or obj.isNative: return
|
||||
# important to set it before so that ``unreference`` is aware
|
||||
obj.isFinalized = true
|
||||
if (obj.isRef or not obj.linkedObject.isNil and obj.linkedObject.isRef) and
|
||||
obj.godotObject.unreference():
|
||||
obj.deinit()
|
||||
|
||||
macro baseNativeType(T: typedesc): cstring =
|
||||
|
|
@ -159,7 +209,7 @@ macro baseNativeType(T: typedesc): cstring =
|
|||
if typeName == "NimGodotObject":
|
||||
break
|
||||
t = getType(t[1][1])
|
||||
if baseT.isNil:
|
||||
if baseT.len == 0:
|
||||
result = newNilLit()
|
||||
else:
|
||||
let rStr = newNimNode(nnkRStrLit)
|
||||
|
|
@ -184,12 +234,12 @@ macro isResource(T: typedesc): bool =
|
|||
result = if inherits(getType(T), "Resource"): ident("true")
|
||||
else: ident("false")
|
||||
|
||||
template registerClass*(T: typedesc; godotClassName: cstring,
|
||||
template registerClass*(T: typedesc; godotClassName: string or cstring,
|
||||
native: bool) =
|
||||
## Registers the specified Godot type.
|
||||
## Used by ``gdobj`` macro and `godotapigen <godotapigen.html>`_.
|
||||
if classRegistry.isNil:
|
||||
classRegistry = newTable[cstring, ObjectInfo]()
|
||||
classRegistry = newTable[FNV1Hash, ObjectInfo]()
|
||||
let constructor = proc(): NimGodotObject =
|
||||
var t: T
|
||||
new(t, nimGodotObjectFinalizer[T])
|
||||
|
|
@ -203,14 +253,22 @@ template registerClass*(T: typedesc; godotClassName: cstring,
|
|||
isNative: native,
|
||||
isRef: isRef
|
||||
)
|
||||
classRegistry[godotClassName] = objInfo
|
||||
classRegistry[fnv1Hash($godotClassName)] = objInfo
|
||||
static:
|
||||
let objInfoStatic = ObjectInfo(
|
||||
baseNativeClass: base,
|
||||
isNative: native,
|
||||
isRef: isRef,
|
||||
)
|
||||
classRegistryStatic[godotClassName] = objInfoStatic
|
||||
let nameHash = fnv1Hash($godotClassName)
|
||||
if not classRegistryStatic.contains(nameHash):
|
||||
classRegistryStatic[nameHash] = objInfoStatic
|
||||
elif not endsWith($godotClassName, "SW"):
|
||||
# For simplicity we assume that all class names must have
|
||||
# different hashes
|
||||
# If this exception is ever raised, I guess, we should
|
||||
# implement a proper collision resolving
|
||||
raise newException(Exception, "Hash collision " & $godotClassName)
|
||||
when isRef:
|
||||
static:
|
||||
refClasses.add(T.name)
|
||||
|
|
@ -219,34 +277,37 @@ template registerClass*(T: typedesc; godotClassName: cstring,
|
|||
nativeClasses.add(T.name)
|
||||
|
||||
proc newNimGodotObject[T: NimGodotObject](
|
||||
godotObject: ptr GodotObject, godotClassName: cstring, noRef: bool): T =
|
||||
godotObject: ptr GodotObject, godotClassName: GodotString, noRef: bool): T =
|
||||
assert(not classRegistry.isNil)
|
||||
assert(not godotObject.isNil)
|
||||
let objInfo = classRegistry.getOrDefault(godotClassName)
|
||||
let objInfo = classRegistry.getOrDefault(fnv1Hash(godotClassName))
|
||||
if objInfo.constructor.isNil:
|
||||
printError("Nim constructor not found for class " & $godotClassName)
|
||||
else:
|
||||
result = T(objInfo.constructor())
|
||||
result.godotObject = godotObject
|
||||
result.isRef = objInfo.isRef
|
||||
if not noRef and objInfo.isRef:
|
||||
result.isExternalRef = true
|
||||
result.godotObject.reference()
|
||||
|
||||
proc asNimGodotObject*[T: NimGodotObject](
|
||||
godotObject: ptr GodotObject, noRef: bool = false): T =
|
||||
godotObject: ptr GodotObject, forceNativeObject, noRef: bool = false): T =
|
||||
## Wraps ``godotObject`` into Nim type ``T``.
|
||||
## This is used by `godotapigen <godotapigen.html>`_ and should rarely be
|
||||
## used by anything else.
|
||||
if godotObject.isNil: return nil
|
||||
let userDataPtr = godotObject.getUserData()
|
||||
if not userDataPtr.isNil:
|
||||
if not userDataPtr.isNil and not forceNativeObject:
|
||||
result = cast[T](userDataPtr)
|
||||
if result.godotObject != godotObject:
|
||||
# Could be data from other bindings
|
||||
result = nil
|
||||
if result.isNil:
|
||||
var classNameStr = godotObject.getClassNameRaw()
|
||||
result = newNimGodotObject[T](
|
||||
godotObject, cstring(godotObject.getClassName()), noRef)
|
||||
godotObject, classNameStr,
|
||||
forceNativeObject or noRef)
|
||||
deinit(classNameStr)
|
||||
|
||||
proc newVariant*(obj: NimGodotObject): Variant {.inline.} =
|
||||
newVariant(obj.godotObject)
|
||||
|
|
@ -271,52 +332,35 @@ proc `as`*[T: NimGodotObject](obj: NimGodotObject, t: typedesc[T]): T =
|
|||
## This can be used either in dot notation (``node.as(Button)``) or
|
||||
## infix notation (``node as Button``).
|
||||
if obj.isNil: return nil
|
||||
if obj of T:
|
||||
if system.`of`(obj, T):
|
||||
result = T(obj)
|
||||
elif not obj.linkedObject.isNil and obj.linkedObject of T:
|
||||
elif not obj.linkedObject.isNil and system.`of`(obj.linkedObject, T):
|
||||
result = T(obj.linkedObject)
|
||||
else:
|
||||
when not defined(release):
|
||||
printError("Failed to cast object to " &
|
||||
T.name & "\n" & getStackTrace())
|
||||
result = nil
|
||||
|
||||
proc `~`*[T: NimGodotObject](obj: NimGodotObject,
|
||||
t: typedesc[T]): bool {.inline.} =
|
||||
## Godot-specific inheritance check. You must use this over Nim's standard
|
||||
## ``of`` operator, because Nim does not know which object your script is
|
||||
## attached to in runtime. For example, if you create a
|
||||
## ``gdobj Bullet of Spatial`` and the ``Bullet`` is attached to a
|
||||
## ``MeshInstance``, ``myBullet of MeshInstance`` will return ``false``, but
|
||||
## ``myBullet ~ MeshInstance`` will return ``true``.
|
||||
## This is going to be changed to ``of`` in later versions, when Nim starts
|
||||
## supporting overloading ``of`` operator.
|
||||
not obj.isNil and (obj of T or obj.linkedObject of T)
|
||||
proc `of`*[T1, T2: NimGodotObject](obj: T1, t: typedesc[T2]): bool {.inline.} =
|
||||
## Godot-specific inheritance check.
|
||||
not obj.isNil and (system.`of`(obj, T2) or system.`of`(obj.linkedObject, T2))
|
||||
|
||||
proc newRStrLit(s: string): NimNode {.compileTime.} =
|
||||
result = newNimNode(nnkRStrLit)
|
||||
result.strVal = s
|
||||
|
||||
static:
|
||||
import strutils
|
||||
|
||||
macro toGodotName(T: typedesc): string =
|
||||
var godotName: string
|
||||
macro toGodotName(T: typedesc): untyped =
|
||||
if T is GodotString or T is string:
|
||||
godotName = "String"
|
||||
newStrLitNode"String"
|
||||
elif T is SomeFloat:
|
||||
godotName = "float"
|
||||
newStrLitNode"float"
|
||||
elif T is SomeUnsignedInt or T is SomeSignedInt:
|
||||
godotName = "int"
|
||||
if godotName.isNil:
|
||||
let nameStr: string = (($T.getType()[1][1].symbol).split(':')[0])
|
||||
godotName = case nameStr:
|
||||
of "File", "Directory", "Thread", "Mutex", "Semaphore":
|
||||
"_" & nameStr
|
||||
else:
|
||||
nameStr
|
||||
|
||||
result = newLit(godotName)
|
||||
newStrLitNode"int"
|
||||
else:
|
||||
let nameStr = ((T.getType()[1][1].strVal).split(':')[0])
|
||||
case nameStr:
|
||||
of "File", "Directory", "Thread", "Mutex", "Semaphore":
|
||||
newStrLitNode("_" & nameStr)
|
||||
else:
|
||||
newStrLitNode(nameStr)
|
||||
|
||||
macro asCString(s: static[string]): cstring =
|
||||
result = newNimNode(nnkCallStrLit).add(
|
||||
|
|
@ -367,15 +411,26 @@ proc newOwnObj[T: NimGodotObject](name: cstring): T =
|
|||
"but it returned: " & $ret.getType())
|
||||
else:
|
||||
result = asNimGodotObject[T](ret.asGodotObject())
|
||||
if result.isRef:
|
||||
result.isFinalized = true
|
||||
result.godotObject.reference()
|
||||
result.isFinalized = false
|
||||
ret.deinit()
|
||||
|
||||
proc gdnew*[T: NimGodotObject](): T =
|
||||
## Instantiates new object of type ``T``.
|
||||
const godotName = asCString(toGodotName(T))
|
||||
const objInfo = classRegistryStatic[godotName]
|
||||
result = when objInfo.isNative:
|
||||
asNimGodotObject[T](getClassConstructor(godotName)())
|
||||
else: newOwnObj[T](godotName)
|
||||
const godotName = toGodotName(T)
|
||||
const cGodotName = asCString(godotName)
|
||||
const objInfo = classRegistryStatic[fnv1Hash(godotName)]
|
||||
when objInfo.isNative:
|
||||
let godotObject = getClassConstructor(cGodotName)()
|
||||
new(result, nimGodotObjectFinalizer[T])
|
||||
result.godotObject = godotObject
|
||||
when objInfo.isRef:
|
||||
godotObject.initRef()
|
||||
result.isRef = true
|
||||
else:
|
||||
result = newOwnObj[T](cGodotName)
|
||||
|
||||
proc newCallError*(err: VariantCallError): ref CallError =
|
||||
## Instantiates ``CallError`` from Godot ``err``.
|
||||
|
|
@ -415,13 +470,17 @@ proc setGodotObject*(nimObj: NimGodotObject, obj: ptr GodotObject) {.inline.} =
|
|||
proc setNativeObject*(nimObj: NimGodotObject,
|
||||
nativeObj: NimGodotObject) {.inline.} =
|
||||
## Used from Godot constructor produced by ``gdobj`` macro. Do not call.
|
||||
nimObj.linkedObject = nativeObj
|
||||
nativeObj.linkedObject = nimObj
|
||||
GC_ref(nativeObj)
|
||||
nimObj.linkedObjectPtr = cast[pointer](nativeObj)
|
||||
nativeObj.linkedObjectPtr = cast[pointer](nimObj)
|
||||
nativeObj.isNative = true
|
||||
|
||||
proc removeGodotObject*(nimObj: NimGodotObject) {.inline.} =
|
||||
## Used from Godot destructor produced by ``gdobj`` macro. Do not call.
|
||||
GC_unref(nimObj.linkedObject)
|
||||
nimObj.godotObject = nil
|
||||
nimObj.linkedObject.godotObject = nil
|
||||
nimObj.linkedObjectPtr = nil
|
||||
|
||||
proc `==`*(self, other: NimGodotObject): bool {.inline.} =
|
||||
## Compares objects by referential equality.
|
||||
|
|
@ -464,7 +523,7 @@ proc toVariant*(self: Variant): Variant {.inline.} =
|
|||
if self.isNil:
|
||||
newVariant()
|
||||
else:
|
||||
self
|
||||
newVariant(self)
|
||||
|
||||
proc fromVariant*(self: var Variant,
|
||||
val: Variant): ConversionResult {.inline.} =
|
||||
|
|
@ -492,8 +551,8 @@ proc godotTypeInfo*(T: typedesc[SomeGodotOrNum]): GodotTypeInfo {.inline.} =
|
|||
VariantType.Plane
|
||||
elif T is Quat:
|
||||
VariantType.Quat
|
||||
elif T is Rect3:
|
||||
VariantType.Rect3
|
||||
elif T is AABB:
|
||||
VariantType.AABB
|
||||
elif T is Basis:
|
||||
VariantType.Basis
|
||||
elif T is Transform:
|
||||
|
|
@ -553,7 +612,11 @@ proc fromVariant*[T: SomeSignedInt or SomeUnsignedInt](
|
|||
else: uint64)
|
||||
intVal = when T is SomeSignedInt: val.asInt()
|
||||
else: val.asUint()
|
||||
if intVal > high(T) or intVal < low(T):
|
||||
const highT = when T is SomeSignedInt: high(T).int64
|
||||
else: high(T).uint64
|
||||
const lowT = when T is SomeSignedInt: low(T).int64
|
||||
else: low(T).uint64
|
||||
if intVal > highT or intVal < lowT:
|
||||
result = ConversionResult.RangeError
|
||||
else:
|
||||
self = T(intVal)
|
||||
|
|
@ -609,8 +672,8 @@ proc fromVariant*[T: SomeGodot](self: var T, val: Variant): ConversionResult =
|
|||
self = val.asPlane()
|
||||
elif self is Quat:
|
||||
self = val.asQuat()
|
||||
elif self is Rect3:
|
||||
self = val.asRect3()
|
||||
elif self is AABB:
|
||||
self = val.asAABB()
|
||||
elif self is Basis:
|
||||
self = val.asBasis()
|
||||
elif self is Transform:
|
||||
|
|
@ -657,7 +720,10 @@ proc fromVariant*(s: var string, val: Variant): ConversionResult =
|
|||
if val.getType() == VariantType.String:
|
||||
s = val.asString()
|
||||
elif val.getType() == VariantType.Nil:
|
||||
s = nil
|
||||
when (NimMajor, NimMinor, NimPatch) < (0, 19, 0):
|
||||
s = nil
|
||||
else:
|
||||
s = ""
|
||||
else:
|
||||
result = ConversionResult.TypeError
|
||||
|
||||
|
|
@ -683,12 +749,20 @@ proc godotTypeInfo*(T: typedesc[seq]): GodotTypeInfo =
|
|||
proc godotTypeInfo*(T: typedesc[array]): GodotTypeInfo =
|
||||
arrTypeInfo(T)
|
||||
|
||||
proc toVariant*[T](s: openarray[T]): Variant =
|
||||
template arrayToVariant(s: untyped): Variant =
|
||||
var arr = newArray()
|
||||
mixin toVariant
|
||||
for item in s:
|
||||
arr.add(toVariant(item))
|
||||
result = newVariant(arr)
|
||||
newVariant(arr)
|
||||
|
||||
proc toVariant*[T](s: seq[T]): Variant =
|
||||
if s.isNil:
|
||||
return newVariant()
|
||||
result = arrayToVariant(s)
|
||||
|
||||
proc toVariant*[I, T](s: array[I, T]): Variant =
|
||||
result = arrayToVariant(s)
|
||||
|
||||
proc fromVariant*[T](s: var seq[T], val: Variant): ConversionResult =
|
||||
if val.getType() == VariantType.Nil:
|
||||
|
|
@ -723,10 +797,31 @@ proc fromVariant*[T: array](s: var T, val: Variant): ConversionResult =
|
|||
else:
|
||||
result = ConversionResult.TypeError
|
||||
|
||||
proc godotTypeInfo*(T: typedesc[Table|TableRef]): GodotTypeInfo {.inline.} =
|
||||
proc godotTypeInfo*[T](OptT: typedesc[Option[T]]): GodotTypeInfo =
|
||||
when compiles(godotTypeInfo(T)):
|
||||
result.variantType = godotTypeInfo(T)
|
||||
else:
|
||||
result.variantType = VariantType.Nil
|
||||
|
||||
proc toVariant*[T](option: Option[T]): Variant =
|
||||
if option.isSome():
|
||||
result = toVariant(option.unsafeGet())
|
||||
else:
|
||||
result = newVariant()
|
||||
|
||||
proc fromVariant*[T](option: var Option[T], val: Variant): ConversionResult =
|
||||
if val.getType() == VariantType.Nil:
|
||||
option = none(T)
|
||||
else:
|
||||
var v: T
|
||||
result = fromVariant(v, val)
|
||||
if result == ConversionResult.OK:
|
||||
option = some(result)
|
||||
|
||||
proc godotTypeInfo*(T: typedesc[Table|TableRef|OrderedTable|OrderedTableRef]): GodotTypeInfo {.inline.} =
|
||||
result.variantType = VariantType.Dictionary
|
||||
|
||||
proc toVariant*[T: Table or TableRef](t: T): Variant =
|
||||
proc toVariant*[T: Table or TableRef or OrderedTable or OrderedTableRef](t: T): Variant =
|
||||
when t is ref:
|
||||
if t.isNil:
|
||||
return newVariant()
|
||||
|
|
@ -736,7 +831,7 @@ proc toVariant*[T: Table or TableRef](t: T): Variant =
|
|||
dict[toVariant(k)] = toVariant(v)
|
||||
result = newVariant(dict)
|
||||
|
||||
proc fromVariant*[T: Table or TableRef](t: var T,
|
||||
proc fromVariant*[T: Table or TableRef or OrderedTable or OrderedTableRef](t: var T,
|
||||
val: Variant): ConversionResult =
|
||||
if val.getType() == VariantType.Nil:
|
||||
when t is ref:
|
||||
|
|
@ -746,8 +841,12 @@ proc fromVariant*[T: Table or TableRef](t: var T,
|
|||
mixin fromVariant
|
||||
when t is Table:
|
||||
t = initTable[type(t.keys()), type(t.values())]()
|
||||
else:
|
||||
elif t is TableRef:
|
||||
t = newTable[type(t.keys()), type(t.values())]()
|
||||
elif t is OrderedTable:
|
||||
t = initOrderedTable[type(t.keys()), type(t.values())]()
|
||||
else:
|
||||
t = newOrderedTable[type(t.keys()), type(t.values())]()
|
||||
for k, v in dict:
|
||||
var nimKey: type(t.keys())
|
||||
var nimVal: type(t.values())
|
||||
|
|
@ -765,10 +864,11 @@ proc fromVariant*[T: Table or TableRef](t: var T,
|
|||
else:
|
||||
result = ConversionResult.TypeError
|
||||
|
||||
{.emit: """/*TYPESECTION*/
|
||||
void NimMain(void);
|
||||
N_NOINLINE(void, setStackBottom)(void* thestackbottom);
|
||||
""".}
|
||||
when (NimMajor, NimMinor, NimPatch) < (0, 19, 0):
|
||||
{.emit: """/*TYPESECTION*/
|
||||
N_LIB_EXPORT N_CDECL(void, NimMain)(void);
|
||||
N_NOINLINE(void, setStackBottom)(void* thestackbottom);
|
||||
""".}
|
||||
|
||||
var nativeLibHandle: pointer
|
||||
proc getNativeLibHandle*(): pointer =
|
||||
|
|
@ -780,26 +880,61 @@ proc godot_nativescript_init(handle: pointer) {.
|
|||
cdecl, exportc, dynlib.} =
|
||||
nativeLibHandle = handle
|
||||
|
||||
let stackBottom = godotStackBottom()
|
||||
var stackBottom {.volatile.}: pointer
|
||||
stackBottom = addr(stackBottom)
|
||||
{.emit: """
|
||||
NimMain();
|
||||
setStackBottom(`stackBottom`);
|
||||
""".}
|
||||
when (NimMajor, NimMinor, NimPatch) < (0, 19, 0):
|
||||
{.emit: """
|
||||
setStackBottom((void*)(&`stackBottom`));
|
||||
""".}
|
||||
else:
|
||||
nimGC_setStackBottom(stackBottom)
|
||||
GC_fullCollect()
|
||||
GC_disable()
|
||||
|
||||
proc godot_gdnative_init(options: ptr GodotNativeInitOptions) {.
|
||||
proc godot_gdnative_init(options: ptr GDNativeInitOptions) {.
|
||||
cdecl, exportc, dynlib.} =
|
||||
gdNativeLibraryObj = options.gdNativeLibrary
|
||||
setGDNativeAPI(options.gdNativeAPIStruct, options)
|
||||
|
||||
proc godot_gdnative_terminate(options: ptr GodotNativeTerminateOptions) {.
|
||||
proc godot_gdnative_terminate(options: ptr GDNativeTerminateOptions) {.
|
||||
cdecl, exportc, dynlib.} =
|
||||
deallocHeap(runFinalizers = not options[].inEditor, allowGcAfterwards = false)
|
||||
if not options[].inEditor or not compileOption("threads"):
|
||||
deallocHeap(runFinalizers = not options[].inEditor, allowGcAfterwards = false)
|
||||
|
||||
const nimGcStepLengthUs {.intdefine.} = 2000
|
||||
|
||||
var idleCallbacks {.threadvar.}: seq[proc () {.closure.}]
|
||||
idleCallbacks = newSeq[proc () {.closure.}]()
|
||||
|
||||
var isMainThread {.threadvar.}: bool
|
||||
isMainThread = true
|
||||
|
||||
proc registerFrameCallback*(cb: proc () {.closure.}) =
|
||||
# Registers a callback to be called on the main thread at the end
|
||||
# of each frame.
|
||||
if not isMainThread:
|
||||
const err = cstring"registerFrameIdleCallback is called from non-main thread. Ignoring."
|
||||
godotPrintError(err, cstring"registerFrameCallback",
|
||||
cstring"godotnim.nim", 0)
|
||||
else:
|
||||
idleCallbacks.add(cb)
|
||||
|
||||
{.push stackTrace: off.}
|
||||
|
||||
proc godot_nativescript_frame() {.cdecl, exportc, dynlib.} =
|
||||
if asyncdispatch.hasPendingOperations():
|
||||
poll(0)
|
||||
var stackBottom {.volatile.}: pointer
|
||||
stackBottom = addr(stackBottom)
|
||||
when (NimMajor, NimMinor, NimPatch) < (0, 19, 0):
|
||||
{.emit: """
|
||||
setStackBottom((void*)(&`stackBottom`));
|
||||
""".}
|
||||
else:
|
||||
nimGC_setStackBottom(stackBottom)
|
||||
for cb in idleCallbacks:
|
||||
cb()
|
||||
GC_step(nimGcStepLengthUs, true, 0)
|
||||
|
||||
when not defined(release):
|
||||
|
|
@ -810,8 +945,13 @@ proc godot_nativescript_thread_enter() {.cdecl, exportc, dynlib.} =
|
|||
when compileOption("threads"):
|
||||
setupForeignThreadGc()
|
||||
else:
|
||||
print(cstring"A foreign thread is created, but app is compiled without --threads:on. Bad things will happen if Nim code is invoked from this thread.")
|
||||
const err = cstring"A foreign thread is created, but app is compiled without --threads:on. Bad things will happen if Nim code is invoked from this thread. If you see this warning when running the editor and you don't actually use threads, ignore it."
|
||||
var s = err.toGodotString()
|
||||
godotPrint(s)
|
||||
s.deinit()
|
||||
|
||||
proc godot_nativescript_thread_exit() {.cdecl, exportc, dynlib.} =
|
||||
when compileOption("threads"):
|
||||
teardownForeignThreadGc()
|
||||
|
||||
{.pop.} # stackTrace: off
|
||||
|
|
|
|||
|
|
@ -1 +1,2 @@
|
|||
--path:"$projectdir/../"
|
||||
-d:useRealtimeGc
|
||||
Loading…
Add table
Add a link
Reference in a new issue