Compare commits

...

118 commits

Author SHA1 Message Date
Ruslan Mustakov
4175dbb3e5 Bump version to 0.8.2 2021-05-03 23:18:50 +07:00
7eadb07820 Move template below arrays import
Fixes #81 

Alternate workaround for https://github.com/nim-lang/Nim/issues/16462 without changing VariantType.
2021-05-03 23:17:18 +07:00
Jason
00d8ac2691 Support nim case insensitivy in pragmas 2021-03-12 11:09:55 +07:00
Arun Dilipan
388bea9205 Added moveToward for vectors. 2020-12-13 12:13:41 +07:00
ShalokShalom
f25c3c7a5d Clarify version compability
One guy in the chat just asked me, if this binding is for 3.0 only, or also for 3.2.3
2020-10-17 13:22:31 +07:00
Ruslan Mustakov
d3e5f91b40 Fix wrapping methods with Array return types 2020-08-14 01:44:48 +07:00
Ruslan Mustakov
3f46e3c648 Break reference cycle in NimGodotObject 2020-06-05 16:53:34 +07:00
Ruslan Mustakov
87707a86b4 Remove Travis badge from README
Need to fix the CI script.
2020-06-03 18:06:18 +07:00
Ruslan Mustakov
031774f54f More efficient and GC-safe conversions in API generator 2020-06-03 17:58:47 +07:00
Ruslan Mustakov
ed9ede5cb3 Up version to 0.7.27 2020-02-05 12:34:44 +07:00
Konstantin Zaitsev
a49fcbdac7 Fix variant size for 32bit platform with memory alignment 2020-02-05 11:36:42 +07:00
zetashift
157a90e4a0
add gensym in hygienic template fix thanks to demotohiro (#55)
Add gensym in hygienic template fix thanks to demotohiro
2020-02-05 11:35:50 +07:00
Ruslan Mustakov
d1b82d351c Fix unsigned int conversion to/from Variant 2019-12-23 20:53:13 +07:00
Ruslan Mustakov
78d3626fa3 Do not log error when casting fails
This allows not to perform unnecessary 'of' check before
casting, if cast failure is expected.
2019-12-04 23:58:13 +07:00
Ruslan Mustakov
1b8e7ccd98 Add variant conversion for Option[T] 2019-10-02 15:26:41 +07:00
Ruslan Mustakov
c2db807da4 Up version to 0.7.23 2019-09-20 09:20:50 +07:00
Dwana Games
7dd1b1ed5f Add self to field initialization 2019-09-20 09:20:27 +07:00
Ruslan Mustakov
2f3f4034cf Fix newVariant for nil strings and older Nim 2019-09-18 13:27:31 +07:00
Ruslan Mustakov
19b0c23d62 Finalize support for Nim 0.20
Closes #32, closes #41.
2019-09-15 20:11:15 +07:00
Dwana Games
0fecfdb3b8 Updated to work with nim 0.20
- Attempt to fix deprecated this:self pragma by injecting self to methods and properties (needs more testing)
- Changed import headers to use / (slash) instead of . (period)
- Fixed object branch in godotapigen.nim
- Fixed deprecated nimNode.ident with nimNode.strVal

Fix toGodotName function

Consider procCall calls as special cases, otherwise it gives problems in _init function

Fix infinite recursive call in Godot 3.2
2019-09-15 15:34:09 +07:00
zetashift
34fda99def Small changes to add 0.18.0 compatibility
Change toGodotName back to macro because that got fixed in devel

change isSome to isNone in godotapigen
2019-09-15 15:33:59 +07:00
Fabian Keller
3a935b9308 attempt to make 0.19 compatible
workaround for nim/macro/typedesc issue

work-around for nim-lang/Nim#7375

fixed more isNil usages

fixed new name of setStackBottom
2019-09-15 15:33:44 +07:00
Konstantin Zaitsev
f45281f5a0 Fix possible double free memory on exit 2019-09-12 18:59:11 +07:00
Ruslan Mustakov
db4bb91765 Fix editor crash in multithreaded mode 2019-07-09 13:48:54 +07:00
Ruslan Mustakov
e9d73d8ec4 Fix GDNative API procedure declarations
Earlier signature mismatch caused problems on macOS with Godot 3.1.
2018-10-11 19:06:05 +07:00
Ruslan Mustakov
859f9f04fb OrderedTable to Variant conversion support 2018-09-21 16:34:09 +07:00
Evgeny Zuev
ceaf66a34c Make classRegistry use hashes instead of strings as keys for faster lookup
Up version to 0.7.16
2018-08-29 13:44:37 +07:00
Ruslan Mustakov
fd5f77e7c2 Fix gdobj to properly handle var block 2018-08-14 17:59:24 +07:00
Evgeny Zuev
8d68051f23 Fix system.of being preferred over godot.of in some cases
Fix `as` fails when argument `obj` is not convertible to `T`
Up version to 0.7.14
2018-06-21 17:53:01 +07:00
Ruslan Mustakov
13f5aba3fe Up version to 0.7.13 2018-06-04 17:26:26 +07:00
Ruslan Mustakov
b3ad6134d9 Fix doc generation 2018-06-04 16:24:52 +07:00
Ruslan Mustakov
1e8ccfea2b Fix handling of Error as an argument in Godot API 2018-06-04 14:28:14 +07:00
Ruslan Mustakov
9e61030817 Up version to 0.7.12 2018-06-04 11:50:37 +07:00
Ruslan Mustakov
66c939b9e6 Fix for latest Nim
Closes #23.
2018-06-04 11:50:37 +07:00
Ruslan Mustakov
76de026b4f Implement hash proc for Godot types 2018-06-04 11:50:37 +07:00
Ruslan Mustakov
4eb771e9be Support all the default values 2018-06-04 11:50:37 +07:00
Ruslan Mustakov
2dd0130c78 Avoid name clashes between properties and methods
Fixes #19.
2018-06-04 11:50:37 +07:00
Ruslan Mustakov
651c2d823c Handle nil object references properly
Fixes #26.
2018-06-04 11:50:37 +07:00
Ruslan Mustakov
8b1ac6d835 Fix compilation with C++ backend. Fixes #25. 2018-06-04 11:50:37 +07:00
Jon Renner
21ca9a088b export Vector2 normalize proc 2018-05-19 14:30:02 +07:00
Ruslan Mustakov
96dfc7de90 Fix for latest Nim 2018-05-16 15:06:57 +07:00
Ruslan Mustakov
a1d1481967 Add a remark to thread enter warning 2018-05-14 21:15:11 +07:00
Ruslan Mustakov
6e014bbc01 Make godotapigen use getter return type for property types
Fixes #20.
2018-04-24 11:12:49 +07:00
Ruslan Mustakov
dc6ebaf575 Fix GDNative API version check
Fixes #18.
2018-03-31 17:45:50 +07:00
Ruslan Mustakov
be6f01e3b7 More pool array features: subarray, mitems, mpairs 2018-02-22 18:55:52 +07:00
Ruslan Mustakov
d11856377e Implement Vector2 and Rect2 procs
This allows compiler to inline/optimize them, which cannot be done if
these procs are invoked via GDNative API.
2018-02-17 23:44:07 +07:00
Ruslan Mustakov
0aab6e17ef Update license year and fix doc to have Godot 3.0 download URL 2018-01-31 20:52:15 +07:00
Ruslan Mustakov
5ccf351b5a Fix Variant export 2018-01-31 20:30:13 +07:00
Ruslan Mustakov
f05eb090f7 Update after GDNative API changes 2018-01-25 17:52:58 +07:00
Ruslan Mustakov
e3216f09d0 Update ref types not to be var in parameters 2018-01-25 17:39:01 +07:00
Ruslan Mustakov
ae3171cb98 Fix Vector2 += 2018-01-15 11:01:48 +07:00
Ruslan Mustakov
d4ab8a5524 Update after recent GDNative API changes 2018-01-12 23:22:50 +07:00
Ruslan Mustakov
09326f5104 Fix Reference leak and improve gdnew performance 2018-01-11 16:52:41 +07:00
Ruslan Mustakov
d89073bac8 Do not depend on asyncdispatch
Instead, allow to register frame callbacks.
2017-12-29 11:52:00 +07:00
Ruslan Mustakov
e2feb06468 Add indexed property support 2017-12-18 17:22:12 +07:00
Ruslan Mustakov
4d19140d7c Update for latest GDNative API changes 2017-12-18 13:48:01 +07:00
Ruslan Mustakov
72dd992e66 Fix docbuild 2017-12-08 21:23:32 +07:00
Ruslan Mustakov
50835baca8 Fix travis 2017-12-08 16:50:08 +07:00
Ruslan Mustakov
c06792df8d Add vec2(). Closes #12 2017-12-08 16:07:23 +07:00
Ruslan Mustakov
8d6972f729 Fix doc generation 2017-12-08 13:21:01 +07:00
Ruslan Mustakov
0d21c361d0 Use setStackBottom for methods called from outside 2017-11-28 12:04:07 +07:00
Ruslan Mustakov
3e1e8f1073 Repair Travis build 2017-11-22 17:35:56 +07:00
Ruslan Mustakov
e2049ff1a7 Update for latest Nim 2017-11-22 16:38:28 +07:00
Ruslan Mustakov
4e24244c48 Update for latest Godot 2017-11-22 12:28:54 +07:00
Ruslan Mustakov
a1c378301a Update for latest Godot 2017-11-21 02:44:32 +07:00
Ruslan Mustakov
bf5bd54356 Rename Rect3 to AABB to sync with Godot 2017-11-20 06:52:37 +07:00
Ruslan Mustakov
cc6bfa0045 Update for latest GDNative API changes 2017-11-13 10:18:25 +07:00
Ruslan Mustakov
a93dcd1d4d Update for latest Nim 2017-11-08 11:39:07 +07:00
Ruslan Mustakov
e494dc914a Update GDNative API struct 2017-11-08 11:14:48 +07:00
Ruslan Mustakov
26570707aa Fix poll loop 2017-10-18 11:47:20 +07:00
Ruslan Mustakov
d2b86a2b94 Perform poll(0) in a loop
Temporary workaround for https://github.com/nim-lang/Nim/issues/6523
2017-10-17 16:32:07 +07:00
Ruslan Mustakov
1b47dac4e9 Fix thread_enter not to use GC 2017-10-16 20:10:16 +07:00
Ruslan Mustakov
7f73a89878 Fix $ for core types 2017-10-12 21:26:36 +07:00
Ruslan Mustakov
c5d7680e53 Change GodotClassConstructor to a safe signature 2017-10-12 20:55:45 +07:00
Ruslan Mustakov
f5abff05e6 Extend GDNative API according to the latest update 2017-10-09 14:47:28 +07:00
Ruslan Mustakov
54d962afd4 Fix void return type in godotapigen 2017-10-05 18:55:51 +07:00
Ruslan Mustakov
b62db02d8f Use GDNative API struct 2017-10-05 18:28:12 +07:00
Evgeny Zuev
cf75723fa1 Fix crash when passing nil seq to godot
Up version to 0.5.10
2017-09-19 18:26:55 +07:00
Ruslan Mustakov
178192651f Update docs regarding Nim version 2017-09-14 11:11:03 +07:00
Ruslan Mustakov
77a8cf7815 Replace ~ with of 2017-09-14 11:04:34 +07:00
Ruslan Mustakov
99934854d0 Fix Reference handling 2017-09-14 10:49:43 +07:00
Ruslan Mustakov
ee53768c13 Export generated init 2017-09-04 20:28:34 +07:00
Ruslan Mustakov
b5fd4295e6 Always generate init with super call 2017-09-04 19:29:59 +07:00
Ruslan Mustakov
e3c014a359 Up version to 0.5.6 2017-09-04 15:21:25 +07:00
Konstantin Zaitsev
2db2e413a9 Fix transform xform methods for rect3 2017-09-04 12:22:35 +07:00
Ruslan Mustakov
7e23048048 Up version to 0.5.5 2017-08-23 13:30:24 +07:00
Ruslan Mustakov
2c226b90e2 Support of enums in API generator 2017-08-23 13:30:08 +07:00
Ruslan Mustakov
fda800fd26 Avoid using godot_get_stack_bottom
It's not reliable on Android.
2017-08-23 13:29:35 +07:00
Ruslan Mustakov
3349fe2321 Up version to v0.5.4 2017-08-17 18:41:24 +07:00
Ruslan Mustakov
7a96e33f74 Treat process and fixed process as multilevel calls 2017-08-17 17:47:27 +07:00
Ruslan Mustakov
f54de5cd46 Remove wrong assertion (false for references) 2017-08-17 16:52:11 +07:00
Ruslan Mustakov
3d9839ceed Fix genSingletonWithDerived 2017-08-16 18:00:07 +07:00
Ruslan Mustakov
8d49c0b910 Register singleton-derived types. Fixes #8 2017-08-15 10:45:57 +07:00
Ruslan Mustakov
c5f6d47f3e Mark emitSignal as discardable 2017-08-14 20:22:08 +07:00
Ruslan Mustakov
6da07cada0 Up version to 0.5.1 2017-08-11 12:32:58 +07:00
Ruslan Mustakov
72e6e774a7 Remove debug code from gdobj 2017-08-11 12:30:12 +07:00
Konstantin Zaitsev
d43b10bc76 Fix nil pointer exception for variant from arrays 2017-08-11 12:22:16 +07:00
Ruslan Mustakov
53f0f230da Up version to 0.5.0 2017-08-09 17:05:29 +07:00
Ruslan Mustakov
e8ea5fbe27 Rename noExport -> noGdExport 2017-08-09 17:03:48 +07:00
Ruslan Mustakov
34753b7a27 Fix string returns in godotapigen 2017-08-09 16:34:28 +07:00
Ruslan Mustakov
fcc10071fb Fix toVariant for nil values 2017-08-08 21:58:17 +07:00
Ruslan Mustakov
a7d9aaef95 Fix initTransform 2017-08-08 21:58:03 +07:00
Ruslan Mustakov
4b6c76e776 Dont add base pragma for PhysicsBody methods 2017-08-08 19:13:51 +07:00
Ruslan Mustakov
daa56270e5 Fix object property export 2017-08-08 17:23:45 +07:00
Ruslan Mustakov
4cc9711d2f Handle nil in == 2017-08-07 22:13:42 +07:00
Ruslan Mustakov
8ef554501f Add nil check to tilde 2017-08-07 20:59:32 +07:00
Ruslan Mustakov
327cd0e18f Proper inheritance checks and conversion 2017-08-06 19:22:38 +07:00
Ruslan Mustakov
643c445f87 Allow conversion from Real to int types 2017-08-06 14:21:48 +07:00
Ruslan Mustakov
6549d90c3b Remove commented code from poolarrays 2017-08-06 13:59:33 +07:00
Ruslan Mustakov
6aaeed4dca Add missing $ to standard types 2017-08-06 13:58:54 +07:00
Ruslan Mustakov
72b706d7fe Allow to omit type when default value is present 2017-08-06 13:43:11 +07:00
Ruslan Mustakov
f91a0d0364 Allow gdExport without Nim export 2017-08-05 23:02:48 +07:00
Ruslan Mustakov
fd40716b58 print can be used similar to echo 2017-08-05 22:55:27 +07:00
Ruslan Mustakov
64a8aefeb8 Delete nimruntime 2017-08-05 22:33:51 +07:00
Ruslan Mustakov
3b89eeb9a7 Support default values 2017-08-05 22:33:21 +07:00
Ruslan Mustakov
c1c1852203 Provide type hints for standard types 2017-08-05 21:08:28 +07:00
Ruslan Mustakov
afa48455f6 Add -d:useRealtimeGc in Travis build 2017-08-04 13:23:20 +07:00
Ruslan Mustakov
fedd04229a Add varargs and openarray constructors for Array 2017-08-04 12:21:22 +07:00
44 changed files with 7105 additions and 2490 deletions

View file

@ -27,7 +27,7 @@ addons:
- libxrandr-dev - libxrandr-dev
before_install: 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: install:
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export GODOT_PLATFORM=osx; else export GODOT_PLATFORM=x11; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export GODOT_PLATFORM=osx; else export GODOT_PLATFORM=x11; fi
@ -49,6 +49,5 @@ script:
- set -e - set -e
- mkdir godotapi - mkdir godotapi
- nim c -d:release -r godot/godotapigen.nim "$GODOT_BIN" godotapi - nim c -d:release -r godot/godotapigen.nim "$GODOT_BIN" godotapi
- nimble install -y - nim c -d:useRealtimeGc --path:godot -c godotapi/godotall.nim
- nim c -c godotapi/godotall.nim
- nim c -d:release -r docs/docpublish.nim - nim c -d:release -r docs/docpublish.nim

View file

@ -9,7 +9,7 @@
"godot/godotapigen.nim"], "godot/godotapigen.nim"],
"nim.buildOnSave": false, "nim.buildOnSave": false,
"nim.lintOnSave": true, "nim.lintOnSave": true,
"nim.licenseString": "# Copyright 2017 Xored Software, Inc.\n\n", "nim.licenseString": "# Copyright 2018 Xored Software, Inc.\n\n",
"files.exclude": { "files.exclude": {
"**/nimcache/**": true "**/nimcache/**": true
} }

View file

@ -2,7 +2,7 @@ godot-nim - Nim bindings for Godot Engine
The MIT License 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 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, associated documentation files (the "Software"), to deal in the Software without restriction,

View file

@ -1,6 +1,6 @@
# Nim bindings for Godot Engine [![Build Status](https://travis-ci.org/pragmagic/godot-nim.svg?branch=master)](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/ 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. 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.

View file

@ -1,4 +1,4 @@
# Copyright 2017 Xored Software, Inc. # Copyright 2018 Xored Software, Inc.
import threadpool, os, osproc, strutils, sequtils, pegs import threadpool, os, osproc, strutils, sequtils, pegs
@ -71,7 +71,7 @@ proc fixupHrefs(file: string) =
proc getGitHash(): string = proc getGitHash(): string =
result = execProcess("git rev-parse HEAD") result = execProcess("git rev-parse HEAD")
if not result.isNil and result.len > 0: if result.len > 0:
result = result.replace("\L", "").replace("\r", "") result = result.replace("\L", "").replace("\r", "")
proc buildDocs*(outDir, godotNimDir, godotBin: string) = proc buildDocs*(outDir, godotNimDir, godotBin: string) =
@ -94,7 +94,8 @@ proc buildDocs*(outDir, godotNimDir, godotBin: string) =
allNimFiles.add(file) allNimFiles.add(file)
for file in allNimFiles: for file in allNimFiles:
spawn execOrFail( 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.url:" & quoted(gitHubUrl) &
" --git.commit:" & quoted(gitCommit) & " --git.commit:" & quoted(gitCommit) &
' ' & quoted(file)) ' ' & quoted(file))
@ -103,14 +104,15 @@ proc buildDocs*(outDir, godotNimDir, godotBin: string) =
createDir(godotApiFolder) createDir(godotApiFolder)
genApiFiles(godotApiFolder, godotBinAbs) genApiFiles(godotApiFolder, godotBinAbs)
for file in walkDirRec(godotApiFolder, {pcFile, pcDir}, [".nim"]): 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() sync()
var gitHash: string var gitHash: string
withDir(godotBinAbs.parentDir()): withDir(godotBinAbs.parentDir()):
gitHash = getGitHash() gitHash = getGitHash()
if gitHash.isNil or gitHash.len == 0: if gitHash.len == 0:
raise newException(Exception, raise newException(Exception,
"Godot executable is not under Git repository") "Godot executable is not under Git repository")

View file

@ -1,4 +1,4 @@
# Copyright 2017 Xored Software, Inc. # Copyright 2018 Xored Software, Inc.
import os, pegs, strutils import os, pegs, strutils
import docbuild import docbuild

View file

@ -5,6 +5,7 @@ Nim bindings for Godot Engine
:Author: Ruslan Mustakov :Author: Ruslan Mustakov
:Version: |godotnimversion| :Version: |godotnimversion|
:GitHub: `$GODOTNIM_GITHUB_URL <$GODOTNIM_GITHUB_URL>`_ :GitHub: `$GODOTNIM_GITHUB_URL <$GODOTNIM_GITHUB_URL>`_
:License: MIT
.. contents:: .. contents::
@ -32,41 +33,24 @@ which adds features for editing GDScript and Godot resource files.
Getting Started Getting Started
=============== ===============
Building Godot Getting Godot
-------------- --------------
The library requires a not yet released Godot version 3.0, which you can The library requires Godot version 3.0, which you can get here:
build yourself by running the commands below (requires https://godotengine.org/download
`Git <https://git-scm.com/downloads>`_,
`Python 2.7 <https://www.python.org/downloads/>`_,
`SCons <http://www.scons.org/>`_):
.. code-block:: bash Installing Nim
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
------------- -------------
The library requires a not yet released Nim version 0.17.1, which you can The library requires Nim version 0.18.0 or newer, which you can get here:
build yourself by following instructions in the https://nim-lang.org/install.html
`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)
Make sure you also have ``nimble`` (Nim's package manager) installed.
Creating Project 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 .. code-block:: bash
git clone --depth=1 https://github.com/pragmagic/godot-nim-stub.git myproject 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 build scripts (``nakefile.nim``, ``src/stub.nimble``) according to your
own project structure. 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 GDNative library resource that contains paths to dynamic libraries
compiled by Nim. 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 * `quats <quats.html>`_ Defines ``Quat`` (quaternion) describing object
rotation in 3D space. rotation in 3D space.
* `rect2 <rect2.html>`_ Defines ``Rect2`` - a 2D rectangle. * `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. * `rids <rids.html>`_ Defines ``RID`` - a resource identifier.
* `transform2d <transform2d.html>`_ Defines ``Transform2D``. * `transform2d <transform2d.html>`_ Defines ``Transform2D``.
* `transforms <transforms.html>`_ Defines ``Transform``. * `transforms <transforms.html>`_ Defines ``Transform``.

View file

@ -1,7 +1,7 @@
version = "0.4.1" version = "0.8.2"
author = "Xored Software, Inc." author = "Xored Software, Inc."
description = "Godot Engine bindings" description = "Godot Engine bindings"
license = "MIT" license = "MIT"
srcDir = "godot" 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
View 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)

View file

@ -1,7 +1,7 @@
# Copyright 2017 Xored Software, Inc. # Copyright 2018 Xored Software, Inc.
import hashes import hashes
import internal.godotarrays import internal/godotinternaltypes, internal/godotarrays
type type
Array* = ref object Array* = ref object
@ -15,14 +15,23 @@ proc godotArray*(arr: Array): ptr GodotArray {.inline.} =
proc arrayFinalizer(arr: Array) = proc arrayFinalizer(arr: Array) =
arr.godotArray.deinit() arr.godotArray.deinit()
proc newArray*(): Array {.inline.} =
new(result, arrayFinalizer)
initGodotArray(result.godotArray)
proc newArray*(arr: GodotArray): Array {.inline.} = proc newArray*(arr: GodotArray): Array {.inline.} =
new(result, arrayFinalizer) new(result, arrayFinalizer)
result.godotArray = arr result.godotArray = arr
import variants
proc newArray*(s: varargs[Variant]): Array =
new(result, arrayFinalizer)
initGodotArray(result.godotArray)
for v in s:
result.godotArray.add(v.godotVariant[])
proc newArray*(s: openarray[Variant]): Array =
result = newArray()
for v in s:
result.godotArray.add(v.godotVariant[])
import poolarrays import poolarrays
proc newArray*(pca: PoolColorArray): Array {.inline.} = proc newArray*(pca: PoolColorArray): Array {.inline.} =
@ -53,18 +62,16 @@ proc newArray*(pba: PoolByteArray): Array {.inline.} =
new(result, arrayFinalizer) new(result, arrayFinalizer)
initGodotArray(result.godotArray, pba.godotPoolByteArray[]) initGodotArray(result.godotArray, pba.godotPoolByteArray[])
import variants proc `[]=`*(self: Array; idx: int; value: Variant) {.inline.} =
proc `[]=`*(self: var Array; idx: int; value: Variant) {.inline.} =
self.godotArray[idx.cint] = value.godotVariant[] self.godotArray[idx.cint] = value.godotVariant[]
proc `[]`*(self: Array; idx: int): Variant {.inline.} = proc `[]`*(self: Array; idx: int): Variant {.inline.} =
newVariant(self.godotArray[idx.cint]) 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[]) self.godotArray.add(value.godotVariant[])
proc clear*(self: var Array) {.inline.} = proc clear*(self: Array) {.inline.} =
self.godotArray.clear() self.godotArray.clear()
proc count*(self: Array; value: Variant): int {.inline.} = proc count*(self: Array; value: Variant): int {.inline.} =
@ -73,7 +80,7 @@ proc count*(self: Array; value: Variant): int {.inline.} =
proc isEmpty*(self: Array): bool {.inline.} = proc isEmpty*(self: Array): bool {.inline.} =
self.godotArray.isEmpty() self.godotArray.isEmpty()
proc erase*(self: var Array; value: Variant) {.inline.} = proc erase*(self: Array; value: Variant) {.inline.} =
self.godotArray.erase(value.godotVariant[]) self.godotArray.erase(value.godotVariant[])
proc first*(self: Array): Variant {.inline.} = proc first*(self: Array): Variant {.inline.} =
@ -94,43 +101,46 @@ proc contains*(self: Array; value: Variant): bool {.inline.} =
proc hash*(self: Array): Hash {.inline.} = proc hash*(self: Array): Hash {.inline.} =
hash(self.godotArray.godotHash()) 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[]) self.godotArray.insert(pos.cint, value.godotVariant[])
proc reverse*(self: var Array) {.inline.} = proc reverse*(self: Array) {.inline.} =
self.godotArray.reverse() self.godotArray.reverse()
proc popLast*(self: var Array): Variant {.inline.} = proc popLast*(self: Array): Variant {.inline.} =
newVariant(self.godotArray.popLast()) newVariant(self.godotArray.popLast())
proc popFirst*(self: var Array): Variant {.inline.} = proc popFirst*(self: Array): Variant {.inline.} =
newVariant(self.godotArray.popFirst()) newVariant(self.godotArray.popFirst())
proc addLast*(self: var Array; value: Variant) {.inline.} = proc addLast*(self: Array; value: Variant) {.inline.} =
self.godotArray.addLast(value.godotVariant[]) 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[]) 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) 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) self.godotArray.setLen(size.cint)
proc rfind*(self: Array; what: Variant; f: int): int {.inline.} = proc rfind*(self: Array; what: Variant; fromIdx: int): int {.inline.} =
self.godotArray.rfind(what.godotVariant[], f.cint).int self.godotArray.rfind(what.godotVariant[], fromIdx.cint).int
proc len*(self: Array): int {.inline.} = proc len*(self: Array): int {.inline.} =
self.godotArray.len.int self.godotArray.len.int
proc sort*(self: var Array) {.inline.} = proc sort*(self: Array) {.inline.} =
self.godotArray.sort() self.godotArray.sort()
iterator items*(arr: Array): Variant = iterator items*(self: Array): Variant =
for i in 0..<arr.len: for i in 0..<self.len:
yield arr[i] yield self[i]
iterator pairs*(arr: Array): tuple[key: int, val: Variant] = iterator pairs*(self: Array): tuple[key: int, val: Variant] =
for i in 0..<arr.len: for i in 0..<self.len:
yield (i, arr[i]) yield (i, self[i])
proc `$`*(self: Array): string =
$self.godotArray

View file

@ -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 godotbase, vector3, quats
import godotcoretypes
type {.push stackTrace: off.}
Basis* {.byref.} = object
elements*: array[3, Vector3]
proc setCells*(basis: var Basis, xx, xy, xz, yx, yy, yz, zx, zy, zz: float32) = proc setCells*(basis: var Basis, xx, xy, xz, yx, yy, yz, zx, zy, zz: float32) =
basis.elements[0].x = xx basis.elements[0].x = xx
@ -202,6 +202,9 @@ proc `$`*(self: Basis): string {.inline.} =
result.add(", ") result.add(", ")
result.add($self[i][j]) 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 = template cofac(row1, col1, row2, col2: int): float32 =
self.elements[row1][col1] * self.elements[row2][col2] - self.elements[row1][col1] * self.elements[row2][col2] -
self.elements[row1][col2] * self.elements[row2][col1] 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 = proc rotated*(self: Vector3; axis: Vector3; phi: float32): Vector3 =
result = self result = self
result.rotate(axis, phi) result.rotate(axis, phi)
{.pop.} # stackTrace: off

View file

@ -1,11 +1,8 @@
# Copyright (c) 2017 Xored Software, Inc. # Copyright (c) 2018 Xored Software, Inc.
type import hashes
Color* {.byref.} = object
r*: float32 import godotcoretypes, gdnativeapi
g*: float32
b*: float32
a*: float32
proc initColor*(r, g, b: float32; a: float32 = 1.0'f32): Color {.inline.} = proc initColor*(r, g, b: float32; a: float32 = 1.0'f32): Color {.inline.} =
Color( Color(
@ -19,12 +16,14 @@ proc initColor*(): Color {.inline.} =
## Initializes black color with 1.0 alpha ## Initializes black color with 1.0 alpha
initColor(0, 0, 0) initColor(0, 0, 0)
proc h*(self: Color): float32 {. proc h*(self: Color): float32 {.inline.} =
importc: "godot_color_get_h".} getGDNativeAPI().colorGetH(self)
proc s*(self: Color): float32 {.
importc: "godot_color_get_s".} proc s*(self: Color): float32 {.inline.} =
proc v*(self: Color): float32 {. getGDNativeAPI().colorGetS(self)
importc: "godot_color_get_v".}
proc v*(self: Color): float32 {.inline.} =
getGDNativeAPI().colorGetV(self)
proc `$`*(self: Color): string {.inline.} = proc `$`*(self: Color): string {.inline.} =
result = newStringOfCap(50) result = newStringOfCap(50)
@ -36,6 +35,9 @@ proc `$`*(self: Color): string {.inline.} =
result.add(", ") result.add(", ")
result.add($self.a) 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) = proc toHex(val: float32, target: var string, targetIdx: int) =
let val = clamp(int(val * 255), 0, 255) let val = clamp(int(val * 255), 0, 255)
let nums = [(val and 0xF0) shr 4, val and 0xF] 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.g * 255)
result = (result shl 8) or uint8(self.b * 255) result = (result shl 8) or uint8(self.b * 255)
proc gray*(self: Color): float32 {. proc gray*(self: Color): float32 {.inline.} =
importc: "godot_color_gray".} getGDNativeAPI().colorGray(self)
proc inverted*(self: Color): Color {.
importc: "godot_color_inverted".} proc inverted*(self: Color): Color {.inline.} =
proc contrasted*(self: Color): Color {. getGDNativeAPI().colorInverted(self).toColor()
importc: "godot_color_contrasted".}
proc lerp*(self: Color; b: Color; t: float32): Color {. proc contrasted*(self: Color): Color {.inline.} =
importc: "godot_color_linear_interpolate".} getGDNativeAPI().colorContrasted(self).toColor()
proc blend*(self: Color; over: Color): Color {.
importc: "godot_color_blend".} 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.} = 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 a.r == b.r and a.g == b.g and a.b == b.b and a.a == b.a

View file

@ -1,8 +1,8 @@
# Copyright 2017 Xored Software, Inc. # Copyright 2018 Xored Software, Inc.
import hashes import hashes
import internal.godotstrings, internal.godotdictionaries, import internal/godotinternaltypes, internal/godotdictionaries,
internal.godotvariants internal/godotvariants, internal/godotstrings
type type
Dictionary* = ref object Dictionary* = ref object
@ -30,9 +30,12 @@ proc len*(self: Dictionary): int {.inline.} =
proc isEmpty*(self: Dictionary): bool {.inline.} = proc isEmpty*(self: Dictionary): bool {.inline.} =
self.godotDictionary.isEmpty() self.godotDictionary.isEmpty()
proc clear*(self: var Dictionary) {.inline.} = proc clear*(self: Dictionary) {.inline.} =
self.godotDictionary.clear() self.godotDictionary.clear()
proc hash*(self: Dictionary): Hash {.inline.} =
hash(self.godotDictionary.godotHash())
import variants, arrays import variants, arrays
proc newVariant*(dict: Dictionary): Variant {.inline.} = proc newVariant*(dict: Dictionary): Variant {.inline.} =
@ -40,7 +43,7 @@ proc newVariant*(dict: Dictionary): Variant {.inline.} =
initGodotVariant(result.godotVariant[], dict.godotDictionary) initGodotVariant(result.godotVariant[], dict.godotDictionary)
proc asDictionary*(self: Variant): Dictionary {.inline.} = proc asDictionary*(self: Variant): Dictionary {.inline.} =
newDictionary(self.godotVariant[].asGodotDictionary) newDictionary(self.godotVariant[].asGodotDictionary())
proc contains*(self: Dictionary; key: Variant): bool {.inline.}= proc contains*(self: Dictionary; key: Variant): bool {.inline.}=
self.godotDictionary.contains(key.godotVariant[]) 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.} = proc contains*(self: Dictionary; keys: Array): bool {.inline.} =
self.godotDictionary.contains(keys.godotArray[]) 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[]) self.godotDictionary.del(key.godotVariant[])
proc hash*(self: Dictionary): Hash {.inline.} =
hash(self.godotDictionary.godotHash())
proc keys*(self: Dictionary): Array {.inline.} = proc keys*(self: Dictionary): Array {.inline.} =
newArray(self.godotDictionary.keys()) newArray(self.godotDictionary.keys())
@ -71,7 +71,7 @@ proc `[]`*(self: Dictionary; keyStr: string): Variant {.inline.} =
godotStr.deinit() godotStr.deinit()
godotVariant.deinit() godotVariant.deinit()
proc `[]=`*(self: var Dictionary; key, value: Variant) {.inline.} = proc `[]=`*(self: Dictionary; key, value: Variant) {.inline.} =
self.godotDictionary[key.godotVariant[]] = value.godotVariant[] self.godotDictionary[key.godotVariant[]] = value.godotVariant[]
proc `==`*(self, other: Dictionary): bool {.inline.} = proc `==`*(self, other: Dictionary): bool {.inline.} =
@ -97,3 +97,14 @@ iterator values*(dict: Dictionary): Variant =
iterator pairs*(dict: Dictionary): tuple[key, val: Variant] = iterator pairs*(dict: Dictionary): tuple[key, val: Variant] =
for key in keys(dict): for key in keys(dict):
yield (key, dict[key]) yield (key, dict[key])
proc `$`*(self: Dictionary): string =
result = newStringOfCap(32)
result.add('{')
for k, v in self:
if result.len > 1:
result.add(", ")
result.add($k)
result.add(": ")
result.add($v)
result.add('}')

View file

@ -1,85 +1,64 @@
# Copyright (c) 2017 Xored Software, Inc. # Copyright (c) 2018 Xored Software, Inc.
import math import math, godotinternal
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
# math helpers # math helpers
{.push stackTrace: off.}
const EPSILON = 0.00001'f32 const EPSILON = 0.00001'f32
proc isEqualApprox*(a, b: float32): bool {.inline.} = proc isEqualApprox*(a, b: float32): bool {.inline, noinit.} =
abs(a - b) < EPSILON abs(a - b) < EPSILON
proc isEqualApprox*(a, b: float64): bool {.inline.} = proc isEqualApprox*(a, b: float64): bool {.inline, noinit.} =
abs(a - b) < EPSILON 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 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 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: if step != 0'f64:
floor(value / step + 0.5'f64) * step floor(value / step + 0.5'f64) * step
else: else:
value value
proc stepify*(value, step: float32): float32 = proc stepify*(value, step: float32): float32 {.inline, noinit.} =
if step != 0'f32: if step != 0'f32:
floor(value / step + 0.5'f32) * step floor(value / step + 0.5'f32) * step
else: else:
value 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()

View 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

View file

@ -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 type
NodePath* = ref object NodePath* = ref object
@ -31,6 +34,9 @@ proc `$`*(self: NodePath): string {.inline.} =
result = $s result = $s
s.deinit() s.deinit()
proc hash*(self: NodePath): Hash {.inline.} =
($self).hash()
proc isAbsolute*(self: NodePath): bool {.inline.} = proc isAbsolute*(self: NodePath): bool {.inline.} =
self.path.isAbsolute() self.path.isAbsolute()
@ -50,8 +56,8 @@ proc getSubname*(self: NodePath; idx: int): string {.inline.} =
result = $s result = $s
s.deinit() s.deinit()
proc property*(self: NodePath): string {.inline.} = proc getConcatenatedSubnames*(self: NodePath): string {.inline.} =
var s = self.path.property() var s = self.path.getConcatenatedSubnames()
result = $s result = $s
s.deinit() s.deinit()

View file

@ -1,73 +1,66 @@
# Copyright (c) 2017 Xored Software, Inc. # Copyright (c) 2018 Xored Software, Inc.
import hashes
import vector3 import vector3
import internal.godotstrings import internal/godotinternaltypes, internal/godotstrings
import godotcoretypes, gdnativeapi
type proc initPlane*(a, b, c, d: float32): Plane {.inline.} =
Plane* {.byref.} = object getGDNativeAPI().planeNewWithReals(result, a, b, c, d)
normal*: Vector3
d*: float32
proc initPlane(dest: var Plane; a, b, c, d: float32) {. proc initPlane*(v1, v2, v3: Vector3): Plane {.inline.} =
importc: "godot_plane_new_with_reals".} getGDNativeAPI().planeNewWithVectors(result, v1, v2, v3)
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*(a, b, c, d: float32): Plane = proc initPlane*(normal: Vector3; d: float32): Plane {.inline.} =
initPlane(result, a, b, c, d) result = Plane(
normal: normal,
proc initPlane*(v1, v2, v3: Vector3): Plane = d: d
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 `$`*(self: Plane): string {.inline.} = 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; proc contains*(self: Plane; point: Vector3;
epsilon: float32): bool {. epsilon: float32): bool {.inline.} =
noSideEffect, getGDNativeAPI().planeHasPoint(self, point, epsilon)
importc: "godot_plane_has_point".}
proc project*(self: Plane; point: Vector3): Vector3 {. proc project*(self: Plane; point: Vector3): Vector3 {.inline.} =
noSideEffect, getGDNativeAPI().planeProject(self, point).toVector3()
importc: "godot_plane_project".}
proc intersect3*(self: Plane; dest: var Vector3; proc intersect3*(self: Plane; dest: var Vector3;
b, c: Plane): bool {. b, c: Plane): bool {.inline.} =
noSideEffect, getGDNativeAPI().planeIntersect3(self, dest, b, c)
importc: "godot_plane_intersect_3".}
proc intersectsRay*(self: Plane; dest: var Vector3; proc intersectsRay*(self: Plane; dest: var Vector3;
v, dir: Vector3): bool {. v, dir: Vector3): bool {.inline.} =
noSideEffect, getGDNativeAPI().planeIntersectsRay(self, dest, v, dir)
importc: "godot_plane_intersects_ray".}
proc intersectsSegment*(self: Plane; dest: var Vector3; proc intersectsSegment*(self: Plane; dest: var Vector3;
segmentBegin, segmentEnd: Vector3): bool {. segmentBegin, segmentEnd: Vector3): bool {.inline.} =
noSideEffect, importc: "godot_plane_intersects_segment".} getGDNativeAPI().planeIntersectsSegment(self, dest, segmentBegin, segmentEnd)
proc `-`*(self: Plane): Plane {.
noSideEffect, proc `-`*(self: Plane): Plane {.inline.} =
importc: "godot_plane_operator_neg".} getGDNativeAPI().planeOperatorNeg(self).toPlane()
proc `==`*(a, b: Plane): bool {.
noSideEffect, proc `==`*(a, b: Plane): bool {.inline.} =
importc: "godot_plane_operator_equal".} getGDNativeAPI().planeOperatorEqual(a, b)

View file

@ -1,65 +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 vector2, vector3, colors
import internal.godotpoolarrays, internal.godotstrings
# type
# PoolByteArray* = ref object
# godotPoolByteArray: GodotPoolByteArray
# PoolIntArray* = ref object
# godotPoolIntArray: GodotPoolIntArray
# PoolRealArray* = ref object
# godotPoolRealArray: GodotPoolRealArray
# PoolVector2Array* = ref object
# godotPoolVector2Array: GodotPoolVector2Array
# PoolVector3Array* = ref object
# godotPoolVector3Array: GodotPoolVector3Array
# PoolColorArray* = ref object
# godotPoolColorArray: GodotPoolColorArray
# PoolStringArray* = ref object
# godotPoolStringArray: GodotPoolStringArray
# proc godotPoolByteArray*(self: PoolByteArray):
# ptr GodotPoolByteArray {.inline.} =
# ## WARNING: do not keep the returned value for longer than the lifetime of
# ## the array.
# addr self.godotPoolByteArray
# proc godotPoolIntArray*(self: PoolIntArray):
# ptr GodotPoolIntArray {.inline.} =
# ## WARNING: do not keep the returned value for longer than the lifetime of
# ## the array.
# addr self.godotPoolIntArray
# proc godotPoolRealArray*(self: PoolRealArray):
# ptr GodotPoolRealArray {.inline.} =
# ## WARNING: do not keep the returned value for longer than the lifetime of
# ## the array.
# addr self.godotPoolRealArray
# proc godotPoolVector2Array*(self: PoolVector2Array):
# ptr GodotPoolVector2Array {.inline.} =
# ## WARNING: do not keep the returned value for longer than the lifetime of
# ## the array.
# addr self.godotPoolVector2Array
# proc godotPoolVector3Array*(self: PoolVector3Array):
# ptr GodotPoolVector3Array {.inline.} =
# ## WARNING: do not keep the returned value for longer than the lifetime of
# ## the array.
# addr self.godotPoolVector3Array
# proc godotPoolColorArray*(self: PoolColorArray):
# ptr GodotPoolColorArray {.inline.} =
# ## WARNING: do not keep the returned value for longer than the lifetime of
# ## the array.
# addr self.godotPoolColorArray
# proc godotPoolStringArray*(self: PoolStringArray):
# ptr GodotPoolStringArray {.inline.} =
# ## WARNING: do not keep the returned value for longer than the lifetime of
# ## the array.
# addr self.godotPoolStringArray
template definePoolArrayBase(T, GodotT, DataT, fieldName, newProcName, template definePoolArrayBase(T, GodotT, DataT, fieldName, newProcName,
initProcName) = initProcName) =
@ -83,51 +29,11 @@ template definePoolArrayBase(T, GodotT, DataT, fieldName, newProcName,
new(result, poolArrayFinalizer) new(result, poolArrayFinalizer)
result.fieldName = arr result.fieldName = arr
template definePoolArray(T, GodotT, DataT, fieldName, newProcName, initProcName; proc hash*(arr: T): Hash =
noData = false) = for item in arr.fieldName.items():
result = result !&
proc newProcName*(arr: Array): T {.inline.} = (when type(item) is GodotString: ($item).hash() else: item.hash())
new(result, poolArrayFinalizer) result = !$result
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])
definePoolArrayBase(PoolByteArray, GodotPoolByteArray, uint8, definePoolArrayBase(PoolByteArray, GodotPoolByteArray, uint8,
godotPoolByteArray, newPoolByteArray, godotPoolByteArray, newPoolByteArray,
@ -135,7 +41,7 @@ definePoolArrayBase(PoolByteArray, GodotPoolByteArray, uint8,
definePoolArrayBase(PoolIntArray, GodotPoolIntArray, cint, definePoolArrayBase(PoolIntArray, GodotPoolIntArray, cint,
godotPoolIntArray, newPoolIntArray, godotPoolIntArray, newPoolIntArray,
initGodotPoolIntArray) initGodotPoolIntArray)
definePoolArrayBase(PoolRealArray, GodotPoolRealArray, float64, definePoolArrayBase(PoolRealArray, GodotPoolRealArray, float32,
godotPoolRealArray, newPoolRealArray, godotPoolRealArray, newPoolRealArray,
initGodotPoolRealArray) initGodotPoolRealArray)
definePoolArrayBase(PoolVector2Array, GodotPoolVector2Array, Vector2, definePoolArrayBase(PoolVector2Array, GodotPoolVector2Array, Vector2,
@ -151,7 +57,64 @@ definePoolArrayBase(PoolStringArray, GodotPoolStringArray, string,
godotPoolStringArray, newPoolStringArray, godotPoolStringArray, newPoolStringArray,
initGodotPoolStringArray) 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, definePoolArray(PoolByteArray, GodotPoolByteArray, uint8,
godotPoolByteArray, newPoolByteArray, godotPoolByteArray, newPoolByteArray,
@ -159,7 +122,7 @@ definePoolArray(PoolByteArray, GodotPoolByteArray, uint8,
definePoolArray(PoolIntArray, GodotPoolIntArray, cint, definePoolArray(PoolIntArray, GodotPoolIntArray, cint,
godotPoolIntArray, newPoolIntArray, godotPoolIntArray, newPoolIntArray,
initGodotPoolIntArray) initGodotPoolIntArray)
definePoolArray(PoolRealArray, GodotPoolRealArray, float64, definePoolArray(PoolRealArray, GodotPoolRealArray, float32,
godotPoolRealArray, newPoolRealArray, godotPoolRealArray, newPoolRealArray,
initGodotPoolRealArray) initGodotPoolRealArray)
definePoolArray(PoolVector2Array, GodotPoolVector2Array, Vector2, definePoolArray(PoolVector2Array, GodotPoolVector2Array, Vector2,
@ -175,22 +138,17 @@ definePoolArray(PoolStringArray, GodotPoolStringArray, string,
godotPoolStringArray, newPoolStringArray, godotPoolStringArray, newPoolStringArray,
initGodotPoolStringArray, true) initGodotPoolStringArray, true)
proc add*(self: var PoolStringArray; data: string) = proc add*(self: PoolStringArray; data: string) =
var s = data.toGodotString() var s = data.toGodotString()
self.godotPoolStringArray.add(s) self.godotPoolStringArray.add(s)
s.deinit() s.deinit()
proc addFirst*(self: var PoolStringArray, data: string) = proc insert*(self: PoolStringArray; idx: int; data: string): Error =
var s = data.toGodotString()
self.godotPoolStringArray.addFirst(s)
s.deinit()
proc insert*(self: var PoolStringArray; idx: int; data: string): Error =
var s = data.toGodotString() var s = data.toGodotString()
result = self.godotPoolStringArray.insert(idx.cint, s) result = self.godotPoolStringArray.insert(idx.cint, s)
s.deinit() s.deinit()
proc `[]=`*(self: var PoolStringArray; idx: int; data: string) = proc `[]=`*(self: PoolStringArray; idx: int; data: string) =
var s = data.toGodotString() var s = data.toGodotString()
self.godotPoolStringArray[idx.cint] = s self.godotPoolStringArray[idx.cint] = s
s.deinit() s.deinit()

View file

@ -1,91 +1,84 @@
# Copyright (c) 2017 Xored Software, Inc. # Copyright (c) 2018 Xored Software, Inc.
import vector3 import hashes
import internal.godotstrings
type import internal/godotinternaltypes, internal/godotstrings
Quat* {.byref.} = object import godotcoretypes, gdnativeapi
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".}
proc initQuat*(x, y, z, w: float32): Quat {.inline.} = 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.} = proc initQuat*(axis: Vector3; angle: float32): Quat {.inline.} =
initQuat(result, axis, angle) getGDNativeAPI().quatNewWithAxisAngle(result, axis, angle)
proc toGodotString(self: Quat): GodotString {.
noSideEffect,
importc: "godot_quat_as_string".}
proc `$`*(self: Quat): string {.inline.} = 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.} = proc `*=`*(a: var Quat, b: float32) {.inline.} =
a = a * b a = a * b
proc `+`*(a, b: Quat): Quat {. proc `+`*(a, b: Quat): Quat {.inline.} =
noSideEffect, getGDNativeAPI().quatOperatorAdd(a, b).toQuat()
importc: "godot_quat_operator_add".}
proc `+=`*(a: var Quat, b: Quat) {.inline.} = proc `+=`*(a: var Quat, b: Quat) {.inline.} =
a = a + b a = a + b
proc `-`*(a, b: Quat): Quat {. proc `-`*(a, b: Quat): Quat {.inline.} =
noSideEffect, getGDNativeAPI().quatOperatorSubtract(a, b).toQuat()
importc: "godot_quat_operator_substract".}
proc `-=`* (a: var Quat, b: Quat) {.inline.} = proc `-=`* (a: var Quat, b: Quat) {.inline.} =
a = a - b a = a - b
proc `/`*(self: Quat; b: float32): Quat {. proc `/`*(self: Quat; b: float32): Quat {.inline.} =
noSideEffect, getGDNativeAPI().quatOperatorDivide(self, b).toQuat()
importc: "godot_quat_operator_divide".}
proc `/=`*(self: var Quat, b: float32) {.inline.} = proc `/=`*(self: var Quat, b: float32) {.inline.} =
self = self / b self = self / b
proc `==`*(a, b: Quat): bool {. proc `==`*(a, b: Quat): bool {.inline.} =
noSideEffect, getGDNativeAPI().quatOperatorEqual(a, b)
importc: "godot_quat_operator_equal".}
proc `-`*(self: Quat): Quat {. proc `-`*(self: Quat): Quat {.inline.} =
noSideEffect, getGDNativeAPI().quatOperatorNeg(self).toQuat()
importc: "godot_quat_operator_neg".}

View file

@ -1,54 +1,153 @@
# Copyright (c) 2017 Xored Software, Inc. # Copyright (c) 2018 Xored Software, Inc.
import hashes
import vector2 import vector2
import internal/godotinternaltypes, internal/godotstrings
import godotcoretypes, gdnativeapi
import internal.godotstrings {.push stackTrace: off.}
type proc initRect2*(): Rect2 {.inline, noinit.} =
Rect2* {.byref.} = object Rect2()
position*: Vector2
size*: Vector2
proc initRect2*(pos, size: Vector2): Rect2 {.inline.} = proc initRect2*(pos, size: Vector2): Rect2 {.inline, noinit.} =
Rect2(position: pos, size: size) 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)) Rect2(position: vec2(x, y), size: vec2(sizeX, sizeY))
proc toGodotString(self: Rect2): GodotString {. proc `$`*(self: Rect2): string {.inline, noinit.} =
noSideEffect, $getGDNativeAPI().rect2AsString(self)
importc: "godot_rect2_as_string".}
proc `$`*(self: Rect2): string {.inline.} = proc hash*(self: Rect2): Hash {.inline, noinit.} =
$self.toGodotString() !$(self.position.hash() !& self.size.hash())
proc area*(self: Rect2): float32 {. proc area*(self: Rect2): float32 {.inline, noinit.} =
noSideEffect, self.size.x * self.size.y
importc: "godot_rect2_get_area".}
proc intersects*(a, b: Rect2): bool {. proc intersects*(a, b: Rect2): bool {.inline, noinit.} =
noSideEffect, if a.position.x >= (b.position.x + b.size.x):
importc: "godot_rect2_intersects".} return false
proc encloses*(a, b: Rect2): bool {. if a.position.x + a.size.x <= b.position.x:
noSideEffect, return false
importc: "godot_rect2_encloses".} if a.position.y >= (b.position.y + b.size.y):
proc hasNoArea*(self: Rect2): bool {. return false
noSideEffect, if a.position.y + a.size.y <= b.position.y:
importc: "godot_rect2_has_no_area".} return false
proc clip*(a, b: Rect2): Rect2 {. result = true
noSideEffect,
importc: "godot_rect2_clip".} proc distanceTo*(self: Rect2, p: Vector2): float32 {.noinit.} =
proc merge*(a, b: Rect2): Rect2 {. var inside = true
noSideEffect, if p.x < self.position.x:
importc: "godot_rect2_merge".} let d = self.position.x - p.x
proc contains*(self: Rect2; point: Vector2): bool {. result = d
noSideEffect, inside = false
importc: "godot_rect2_has_point".} if p.y < self.position.y:
proc grow*(self: Rect2; by: float32): Rect2 {. let d = self.position.y - p.y
noSideEffect, result = if inside: d else: min(result, d)
importc: "godot_rect2_grow".} inside = false
proc expand*(self: Rect2; to: Vector2): Rect2 {. if p.x >= (self.position.x + self.size.x):
noSideEffect, let d = p.x - (self.position.x + self.size.x)
importc: "godot_rect2_expand".} result = if inside: d else: min(result, d)
proc `==`*(a, b: Rect2): bool {. inside = false
noSideEffect, if p.y >= (self.position.y + self.size.y):
importc: "godot_rect2_operator_equal".} 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

View file

@ -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".}

View file

@ -1,28 +1,26 @@
import internal.godotobjects # Copyright (c) 2018 Xored Software, Inc.
type import hashes
RID* {.byref.} = object
data: array[sizeof(int), byte]
proc initRID(dest: var RID) {. import godotcoretypes, internal/godotinternaltypes, gdnativeapi
importc: "godot_rid_new".}
proc initRID(dest: var RID; obj: ptr GodotObject) {.
importc: "godot_rid_new_with_resource".}
proc initRID*(): RID {.inline.} = proc initRID*(): RID {.inline.} =
initRID(result) getGDNativeAPI().ridNew(result)
proc initRID*(obj: ptr GodotObject): RID {.inline.} = proc initRID*(obj: ptr GodotObject): RID {.inline.} =
initRID(result, obj) getGDNativeAPI().ridNewWithResource(result, obj)
proc idCInt(self: RID): cint {.
noSideEffect,
importc: "godot_rid_get_id".}
proc id*(self: RID): uint32 {.inline.} = proc id*(self: RID): uint32 {.inline.} =
cast[uint32](self.idCInt()) cast[uint32](getGDNativeAPI().ridGetId(self))
proc `==`*(a, b: RID): bool {. proc `$`*(self: RID): string {.inline.} =
importc: "godot_rid_operator_equal".} $self.id
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)

View file

@ -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 import internal/godotinternaltypes, internal/godotstrings
import godotcoretypes, gdnativeapi
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".}
proc initTransform2D*(): Transform2D {.inline.} = proc initTransform2D*(): Transform2D {.inline.} =
initTransform2D(result) getGDNativeAPI().transform2DNewIdentity(result)
proc initTransform2D*(rot: float32; pos: Vector2): Transform2D {.inline.} = 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.} = proc initTransform2D*(xAxis, yAxis, origin: Vector2): Transform2D {.inline.} =
initTransform2D(result, xAxis, yAxis, origin) getGDNativeAPI().transform2DNewAxisOrigin(result, xAxis, yAxis, origin)
proc toGodotString(self: Transform2D): GodotString {.
importc: "godot_transform2d_as_string".}
proc `$`*(self: Transform2D): string {.inline.} = proc `$`*(self: Transform2D): string {.inline.} =
$self.toGodotString() $getGDNativeAPI().transform2DAsString(self)
proc inverse*(self: Transform2D): Transform2D {. proc hash*(self: Transform2D): Hash {.inline, noinit.} =
importc: "godot_transform2d_inverse".} !$(self.elements[0].hash() !& self.elements[1].hash() !& self.elements[2].hash())
proc affineInverse*(self: Transform2D): Transform2D {.
importc: "godot_transform2d_affine_inverse".} proc inverse*(self: Transform2D): Transform2D {.inline.} =
proc rotation*(self: Transform2D): float32 {. getGDNativeAPI().transform2DInverse(self).toTransform2D()
importc: "godot_transform2d_get_rotation".}
proc origin*(self: Transform2D): Vector2 {. proc affineInverse*(self: Transform2D): Transform2D {.inline.} =
importc: "godot_transform2d_get_origin".} getGDNativeAPI().transform2DAffineInverse(self).toTransform2D()
proc scale*(self: Transform2D): Vector2 {.
importc: "godot_transform2d_get_scale".} proc rotation*(self: Transform2D): float32 {.inline.} =
proc orthonormalized*(self: Transform2D): Transform2D {. getGDNativeAPI().transform2DGetRotation(self)
importc: "godot_transform2d_orthonormalized".}
proc rotated*(self: Transform2D; phi: float32): Transform2D {. proc origin*(self: Transform2D): Vector2 {.inline.} =
importc: "godot_transform2d_rotated".} getGDNativeAPI().transform2DGetOrigin(self).toVector2()
proc scaled*(self: Transform2D; scale: Vector2): Transform2D {.
importc: "godot_transform2d_scaled".} proc scale*(self: Transform2D): Vector2 {.inline.} =
proc translated*(self: Transform2D; getGDNativeAPI().transform2DGetScale(self).toVector2()
offset: Vector2): Transform2D {.
importc: "godot_transform2d_translated".} proc orthonormalized*(self: Transform2D): Transform2D {.inline.} =
proc xformVector2*(self: Transform2D; v: Vector2): Vector2 {. getGDNativeAPI().transform2DOrthonormalized(self).toTransform2D()
importc: "godot_transform2d_xform_vector2".}
proc xformInvVector2*(self: Transform2D; v: Vector2): Vector2 {. proc rotated*(self: Transform2D; phi: float32): Transform2D {.inline.} =
importc: "godot_transform2d_xform_inv_vector2".} getGDNativeAPI().transform2DRotated(self, phi).toTransform2D()
proc basisXformVector2*(self: Transform2D;
v: Vector2): Vector2 {. proc scaled*(self: Transform2D; scale: Vector2): Transform2D {.inline.} =
importc: "godot_transform2d_basis_xform_vector2".} getGDNativeAPI().transform2DScaled(self, scale).toTransform2D()
proc basisXformInvVector2*(self: Transform2D;
v: Vector2): Vector2 {. proc translated*(self: Transform2D; offset: Vector2): Transform2D {.inline.} =
importc: "godot_transform2d_basis_xform_inv_vector2".} getGDNativeAPI().transform2DTranslated(self, offset).toTransform2D()
proc xformRect2*(self: Transform2D; v: Rect2): Rect2 {.
importc: "godot_transform2d_xform_rect2".} proc xformVector2*(self: Transform2D; v: Vector2): Vector2 {.inline.} =
proc xformInvRect2*(self: Transform2D; v: Rect2): Rect2 {. getGDNativeAPI().transform2DXformVector2(self, v).toVector2()
importc: "godot_transform2d_xform_inv_rect2".}
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; proc interpolateWith*(self, m: Transform2D;
c: float32): Transform2D {. c: float32): Transform2D {.inline.} =
importc: "godot_transform2d_interpolate_with".} getGDNativeAPI().transform2DInterpolateWith(self, m, c).toTransform2D()
proc `==`*(a, b: Transform2D): bool {.
importc: "godot_transform2d_operator_equal".} proc `==`*(a, b: Transform2D): bool {.inline.} =
proc `*`*(a, b: Transform2D): Transform2D {. getGDNativeAPI().transform2DOperatorEqual(a, b)
importc: "godot_transform2d_operator_multiply".}
proc `*`*(a, b: Transform2D): Transform2D {.inline.} =
getGDNativeAPI().transform2DOperatorMultiply(a, b).toTransform2D()
proc `*=`*(a: var Transform2D, b: Transform2D) {.inline.} = proc `*=`*(a: var Transform2D, b: Transform2D) {.inline.} =
a = a * b a = a * b

View file

@ -1,16 +1,13 @@
# Copyright (c) 2017 Xored Software, Inc. # Copyright (c) 2018 Xored Software, Inc.
import basis, vector3, planes, rect3 import hashes
import internal.godotstrings import internal/godotinternaltypes, internal/godotstrings
import godotcoretypes, gdnativeapi
type import basis, vector3
Transform* {.byref.} = object
basis*: Basis
origin*: Vector3
proc initTransform*(): Transform {.inline.} = proc initTransform*(): Transform {.inline.} =
discard result.basis = initBasis()
proc initTransform*(xAxis, yAxis, zAxis, proc initTransform*(xAxis, yAxis, zAxis,
origin: Vector3): Transform {.inline.} = origin: Vector3): Transform {.inline.} =
@ -23,45 +20,57 @@ proc initTransform*(xAxis, yAxis, zAxis,
proc initTransform*(basis: Basis, origin: Vector3): Transform {.inline.} = proc initTransform*(basis: Basis, origin: Vector3): Transform {.inline.} =
Transform(basis: basis, origin: origin) Transform(basis: basis, origin: origin)
proc toGodotString(self: Transform): GodotString {.
importc: "godot_transform_as_string".}
proc `$`*(self: Transform): string {.inline.} = 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; proc rotated*(self: Transform; axis: Vector3;
phi: float32): Transform {. phi: float32): Transform {.inline.} =
importc: "godot_transform_rotated".} getGDNativeAPI().transformRotated(self, axis, phi).toTransform()
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".}
proc xformPlane*(self: Transform; v: Plane): Plane {. proc scaled*(self: Transform; scale: Vector3): Transform {.inline.} =
importc: "godot_transform_xform_plane".} getGDNativeAPI().transformScaled(self, scale).toTransform()
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 `==`*(self: Transform; b: Transform): bool {. proc translated*(self: Transform; offset: Vector3): Transform {.inline.} =
importc: "godot_transform_operator_equal".} getGDNativeAPI().transformTranslated(self, offset).toTransform()
proc `*`*(a, b: Transform): Transform {.
importc: "godot_transform_operator_multiply".} proc lookingAt*(self: Transform; target, up: Vector3): Transform {.inline.} =
proc `*=`*(a: var Transform, b: Transform) {.inline.} = getGDNativeAPI().transformLookingAt(self, target, up).toTransform()
a = a * b
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

View file

@ -1,7 +1,9 @@
import tables import tables, hashes
import internal.godotobjects, internal.godotvariants, internal.godotpoolarrays, import godotcoretypes
internal.godotstrings, internal.godotnodepaths import internal/godotinternaltypes, internal/godotvariants,
internal/godotstrings, internal/godotdictionaries,
internal/godotarrays
type type
Variant* = ref object Variant* = ref object
@ -27,6 +29,9 @@ proc variantFinalizer*(v: Variant) =
if not v.noDeinit: if not v.noDeinit:
v.godotVariant.deinit() v.godotVariant.deinit()
proc `$`*(self: Variant): string {.inline.} =
$self.godotVariant
proc newVariant*(): Variant {.inline.} = proc newVariant*(): Variant {.inline.} =
new(result, variantFinalizer) new(result, variantFinalizer)
initGodotVariant(result.godotVariant) initGodotVariant(result.godotVariant)
@ -68,12 +73,16 @@ proc newVariant*(r: cdouble): Variant {.inline.} =
proc newVariant*(s: string): Variant {.inline.} = proc newVariant*(s: string): Variant {.inline.} =
new(result, variantFinalizer) new(result, variantFinalizer)
when (NimMajor, NimMinor, NimPatch) < (0, 19, 0):
if s.isNil:
initGodotVariant(result.godotVariant)
return
var godotStr = s.toGodotString() var godotStr = s.toGodotString()
initGodotVariant(result.godotVariant, godotStr) initGodotVariant(result.godotVariant, godotStr)
godotStr.deinit() godotStr.deinit()
import basis, nodepaths import basis, nodepaths
import planes, quats, rect2, rect3, rids import planes, quats, rect2, aabb, rids
import transforms, transform2d, vector2 import transforms, transform2d, vector2
import vector3, colors import vector3, colors
@ -101,9 +110,9 @@ proc newVariant*(quat: Quat): Variant {.inline.} =
new(result, variantFinalizer) new(result, variantFinalizer)
initGodotVariant(result.godotVariant, quat) initGodotVariant(result.godotVariant, quat)
proc newVariant*(rect3: Rect3): Variant {.inline.} = proc newVariant*(aabb: AABB): Variant {.inline.} =
new(result, variantFinalizer) new(result, variantFinalizer)
initGodotVariant(result.godotVariant, rect3) initGodotVariant(result.godotVariant, aabb)
proc newVariant*(basis: Basis): Variant {.inline.} = proc newVariant*(basis: Basis): Variant {.inline.} =
new(result, variantFinalizer) new(result, variantFinalizer)
@ -133,114 +142,152 @@ proc newVariant*(obj: ptr GodotObject): Variant {.inline.} =
new(result, variantFinalizer) new(result, variantFinalizer)
initGodotVariant(result.godotVariant, obj) initGodotVariant(result.godotVariant, obj)
import arrays, poolarrays import poolarrays
proc newVariant*(arr: Array): Variant {.inline.} =
new(result, variantFinalizer)
initGodotVariant(result.godotVariant, arr.godotArray[])
proc newVariant*(pba: PoolByteArray): Variant {.inline.} = proc newVariant*(pba: PoolByteArray): Variant {.inline.} =
new(result, variantFinalizer) new(result, variantFinalizer)
initGodotVariant(result.godotVariant, pba.godotPoolByteArray[]) initGodotVariant(result.godotVariant, pba.godotPoolByteArray[])
proc newVariant*(pia: PoolIntArray): Variant {.inline.} = proc newVariant*(pia: PoolIntArray): Variant {.inline.} =
new(result, variantFinalizer)
initGodotVariant(result.godotVariant, pia.godotPoolIntArray[]) initGodotVariant(result.godotVariant, pia.godotPoolIntArray[])
proc newVariant*(pra: PoolRealArray): Variant {.inline.} = proc newVariant*(pra: PoolRealArray): Variant {.inline.} =
new(result, variantFinalizer)
initGodotVariant(result.godotVariant, pra.godotPoolRealArray[]) initGodotVariant(result.godotVariant, pra.godotPoolRealArray[])
proc newVariant*(psa: PoolStringArray): Variant {.inline.} = proc newVariant*(psa: PoolStringArray): Variant {.inline.} =
new(result, variantFinalizer)
initGodotVariant(result.godotVariant, psa.godotPoolStringArray[]) initGodotVariant(result.godotVariant, psa.godotPoolStringArray[])
proc newVariant*(pv2a: PoolVector2Array): Variant {.inline.} = proc newVariant*(pv2a: PoolVector2Array): Variant {.inline.} =
new(result, variantFinalizer)
initGodotVariant(result.godotVariant, pv2a.godotPoolVector2Array[]) initGodotVariant(result.godotVariant, pv2a.godotPoolVector2Array[])
proc newVariant*(pv3a: PoolVector3Array): Variant {.inline.} = proc newVariant*(pv3a: PoolVector3Array): Variant {.inline.} =
new(result, variantFinalizer)
initGodotVariant(result.godotVariant, pv3a.godotPoolVector3Array[]) initGodotVariant(result.godotVariant, pv3a.godotPoolVector3Array[])
proc newVariant*(pca: PoolColorArray): Variant {.inline.} = proc newVariant*(pca: PoolColorArray): Variant {.inline.} =
new(result, variantFinalizer)
initGodotVariant(result.godotVariant, pca.godotPoolColorArray[]) initGodotVariant(result.godotVariant, pca.godotPoolColorArray[])
proc asBool*(self: Variant): bool {.inline.} = proc asBool*(self: Variant): bool {.inline.} =
self.godotVariant.asBool() self.godotVariant.asBool()
proc asUInt*(self: Variant): uint64 = proc asUInt*(self: Variant): uint64 {.inline.} =
self.godotVariant.asUInt() self.godotVariant.asUInt()
proc asInt*(self: Variant): int64 = proc asInt*(self: Variant): int64 {.inline.} =
self.godotVariant.asInt() self.godotVariant.asInt()
proc asReal*(self: Variant): cdouble = proc asReal*(self: Variant): cdouble {.inline.} =
self.godotVariant.asReal() self.godotVariant.asReal()
proc asString*(self: Variant): string = proc asString*(self: Variant): string {.inline.} =
var s = self.godotVariant.asGodotString() $self
result = $s
s.deinit()
proc asVector2*(self: Variant): Vector2 = proc asVector2*(self: Variant): Vector2 {.inline.} =
self.godotVariant.asVector2() self.godotVariant.asVector2()
proc asRect2*(self: Variant): Rect2 = proc asRect2*(self: Variant): Rect2 {.inline.} =
self.godotVariant.asRect2() self.godotVariant.asRect2()
proc asVector3*(self: Variant): Vector3 = proc asVector3*(self: Variant): Vector3 {.inline.} =
self.godotVariant.asVector3() self.godotVariant.asVector3()
proc asTransform2D*(self: Variant): Transform2D = proc asTransform2D*(self: Variant): Transform2D {.inline.} =
self.godotVariant.asTransform2D() self.godotVariant.asTransform2D()
proc asPlane*(self: Variant): Plane = proc asPlane*(self: Variant): Plane {.inline.} =
self.godotVariant.asPlane() self.godotVariant.asPlane()
proc asQuat*(self: Variant): Quat = proc asQuat*(self: Variant): Quat {.inline.} =
self.godotVariant.asQuat() self.godotVariant.asQuat()
proc asRect3*(self: Variant): Rect3 = proc asAABB*(self: Variant): AABB {.inline.} =
self.godotVariant.asRect3() self.godotVariant.asAABB()
proc asBasis*(self: Variant): Basis = proc asBasis*(self: Variant): Basis {.inline.} =
self.godotVariant.asBasis() self.godotVariant.asBasis()
proc asTransform*(self: Variant): Transform = proc asTransform*(self: Variant): Transform {.inline.} =
self.godotVariant.asTransform() self.godotVariant.asTransform()
proc asColor*(self: Variant): Color = proc asColor*(self: Variant): Color {.inline.} =
self.godotVariant.asColor() self.godotVariant.asColor()
proc asNodePath*(self: Variant): NodePath = proc asNodePath*(self: Variant): NodePath {.inline.} =
result = newNodePath(self.godotVariant.asNodePath()) result = newNodePath(self.godotVariant.asNodePath())
proc asRID*(self: Variant): RID = proc asRID*(self: Variant): RID {.inline.} =
self.godotVariant.asRID() self.godotVariant.asRID()
proc asGodotObject*(self: Variant): ptr GodotObject = proc asGodotObject*(self: Variant): ptr GodotObject {.inline.} =
self.godotVariant.asGodotObject() self.godotVariant.asGodotObject()
proc asArray*(self: Variant): Array = proc asPoolByteArray*(self: Variant): PoolByteArray {.inline.} =
newArray(self.godotVariant.asGodotArray())
proc asPoolByteArray*(self: Variant): PoolByteArray =
newPoolByteArray(self.godotVariant.asGodotPoolByteArray()) newPoolByteArray(self.godotVariant.asGodotPoolByteArray())
proc asPoolIntArray*(self: Variant): PoolIntArray = proc asPoolIntArray*(self: Variant): PoolIntArray {.inline.} =
newPoolIntArray(self.godotVariant.asGodotPoolIntArray()) newPoolIntArray(self.godotVariant.asGodotPoolIntArray())
proc asPoolRealArray*(self: Variant): PoolRealArray = proc asPoolRealArray*(self: Variant): PoolRealArray {.inline.} =
newPoolRealArray(self.godotVariant.asGodotPoolRealArray()) newPoolRealArray(self.godotVariant.asGodotPoolRealArray())
proc asPoolStringArray*(self: Variant): PoolStringArray = proc asPoolStringArray*(self: Variant): PoolStringArray {.inline.} =
newPoolStringArray(self.godotVariant.asGodotPoolStringArray()) newPoolStringArray(self.godotVariant.asGodotPoolStringArray())
proc asPoolVector2Array*(self: Variant): PoolVector2Array = proc asPoolVector2Array*(self: Variant): PoolVector2Array {.inline.} =
newPoolVector2Array(self.godotVariant.asGodotPoolVector2Array()) newPoolVector2Array(self.godotVariant.asGodotPoolVector2Array())
proc asPoolVector3Array*(self: Variant): PoolVector3Array = proc asPoolVector3Array*(self: Variant): PoolVector3Array {.inline.} =
newPoolVector3Array(self.godotVariant.asGodotPoolVector3Array()) newPoolVector3Array(self.godotVariant.asGodotPoolVector3Array())
proc asPoolColorArray*(self: Variant): PoolColorArray = proc asPoolColorArray*(self: Variant): PoolColorArray {.inline.} =
newPoolColorArray(self.godotVariant.asGodotPoolColorArray()) 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 = proc hasMethod*(self: Variant; meth: string): bool =
var s = meth.toGodotString() var s = meth.toGodotString()
result = self.godotVariant.hasMethod(s) result = self.godotVariant.hasMethod(s)
@ -257,5 +304,5 @@ proc `<`*(self, other: Variant): bool =
proc hashCompare*(self, other: Variant): bool = proc hashCompare*(self, other: Variant): bool =
self.godotVariant.hashCompare(other.godotVariant) self.godotVariant.hashCompare(other.godotVariant)
proc booleanize*(self: Variant; isValid: var bool): bool = proc booleanize*(self: Variant): bool =
self.godotVariant.booleanize(isValid) self.godotVariant.booleanize()

View file

@ -1,109 +1,214 @@
# Copyright (c) 2017 Xored Software, Inc. # Copyright (c) 2018 Xored Software, Inc.
import internal.godotstrings import math, godotbase, hashes
type import internal/godotinternaltypes, internal/godotstrings
Vector2* {.byref.} = object import godotcoretypes, gdnativeapi
x*: float32
y*: float32
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) Vector2(x: x, y: y)
proc toGodotString(self: Vector2): GodotString {. proc `$`*(self: Vector2): string {.inline, noinit.} =
importc: "godot_vector2_as_string".} $getGDNativeAPI().vector2AsString(self)
proc `$`*(self: Vector2): string {.inline.} = proc hash*(self: Vector2): Hash {.inline, noinit.} =
$self.toGodotString() !$(self.x.hash() !& self.y.hash())
proc normalized*(self: Vector2): Vector2 {. proc `+`*(self, other: Vector2): Vector2 {.inline, noinit.} =
importc: "godot_vector2_normalized".} Vector2(x: self.x + other.x, y: self.y + other.y)
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 `+`*(a, b: Vector2): Vector2 {. proc `+=`*(self: var Vector2, other: Vector2) {.inline, noinit.} =
importc: "godot_vector2_operator_add".} self.x += other.x
proc `+=`*(a: var Vector2, b: Vector2) {.inline.} = self.y += other.y
a += b
proc `-`*(a, b: Vector2): Vector2 {. proc `-`*(self, other: Vector2): Vector2 {.inline, noinit.} =
importc: "godot_vector2_operator_substract".} Vector2(x: self.x - other.x, y: self.y - other.y)
proc `-=`*(a: var Vector2, b: Vector2) {.inline.} =
a = a - b
proc `*`*(a, b: Vector2): Vector2 {. proc `-=`*(self: var Vector2, other: Vector2) {.inline, noinit.} =
importc: "godot_vector2_operator_multiply_vector".} self.x -= other.x
self.y -= other.y
proc `*=`*(a: var Vector2, b: Vector2) {.inline.} = proc `*`*(self, other: Vector2): Vector2 {.inline, noinit.} =
a = a * b Vector2(x: self.x * other.x, y: self.y * other.y)
proc `*`*(self: Vector2, scalar: float32): Vector2 {. proc `*=`*(self: var Vector2, other: Vector2) {.inline, noinit.} =
importc: "godot_vector2_operator_multiply_scalar".} self.x *= other.x
proc `*=`*(self: var Vector2, scalar: float32) {.inline.} = self.y *= other.y
self = self * scalar
proc `/`*(a, b: Vector2): Vector2 {. proc `*`*(self: Vector2, scalar: float32): Vector2 {.inline, noinit.} =
importc: "godot_vector2_operator_divide_vector".} Vector2(x: self.x * scalar, y: self.y * scalar)
proc `/=`*(a: var Vector2, b: Vector2) {.inline.} =
a = a / b
proc `/`*(self: Vector2; scalar: float32): Vector2 {. proc `*`*(scalar: float32, v: Vector2): Vector2 {.inline, noinit.} =
importc: "godot_vector2_operator_divide_scalar".} v * scalar
proc `/=`*(self: var Vector2; scalar: float32) {.inline.} =
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 self = self / scalar
proc `==`*(a, b: Vector2): bool {. proc `==`*(self, other: Vector2): bool {.inline, noinit.} =
importc: "godot_vector2_operator_equal".} self.x == other.x and self.y == other.y
proc `<`*(a, b: Vector2): bool {.
importc: "godot_vector2_operator_less".}
proc `-`*(self: Vector2): Vector2 {.
importc: "godot_vector2_operator_neg".}
proc `x=`*(self: var Vector2; x: float32) {. proc `<`*(self, other: Vector2): bool {.inline, noinit.} =
importc: "godot_vector2_set_x".} if self.x == other.x:
proc `y=`*(self: var Vector2; y: float32) {. self.y < other.y
importc: "godot_vector2_set_y".} else:
proc x*(self: Vector2): float32 {. self.x < other.x
importc: "godot_vector2_get_x".}
proc y*(self: Vector2): float32 {. proc `>`*(self, other: Vector2): bool {.inline, noinit.} =
importc: "godot_vector2_get_y".} 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

View file

@ -1,13 +1,11 @@
# Copyright (c) 2017 Xored Software, Inc. # Copyright (c) 2018 Xored Software, Inc.
import math import math, hashes
import godotbase import godotbase, godotcoretypes
type const EPSILON = 0.00001'f32
Vector3* {.byref.} = object
x*: float32 {.push stackTrace: off.}
y*: float32
z*: float32
proc vec3*(): Vector3 {.inline.} = proc vec3*(): Vector3 {.inline.} =
Vector3() Vector3()
@ -25,6 +23,9 @@ proc `$`*(self: Vector3): string {.inline.} =
result.add($self.z) result.add($self.z)
result.add(')') result.add(')')
proc hash*(self: Vector3): Hash {.inline, noinit.} =
!$(self.x.hash() !& self.y.hash() !& self.z.hash())
proc `+`*(a, b: Vector3): Vector3 {.inline.} = proc `+`*(a, b: Vector3): Vector3 {.inline.} =
result.x = a.x + b.x result.x = a.x + b.x
result.y = a.y + b.y result.y = a.y + b.y
@ -239,3 +240,15 @@ proc cubicInterpolate*(self, b, preA, postB: Vector3;
(-p0 + p2) * t + (-p0 + p2) * t +
(2.0 * p0 - 5.0 * p1 + 4 * p2 - p3) * t2 + (2.0 * p0 - 5.0 * p1 + 4 * p2 - p3) * t2 +
(-p0 + 3.0 * p1 - 3.0 * p2 + p3) * t3) (-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

File diff suppressed because it is too large Load diff

View file

@ -1,17 +1,18 @@
# Copyright 2017 Xored Software, Inc. # Copyright 2018 Xored Software, Inc.
import core.godotbase, godotinternal import core/godotbase, godotinternal
import core.vector2, core.rect2, core.vector3, core.transform2d, core.planes, import core/godotcoretypes
core.quats import core/vector2, core/rect2, core/vector3, core/transform2d, core/planes,
import core.rect3, core.basis, core.transforms, core.colors, core.nodepaths, core/quats
core.rids import core/aabb, core/basis, core/transforms, core/colors, core/nodepaths,
import core.dictionaries, core.arrays, core.poolarrays, core.variants 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, export godotbase, godotcoretypes, vector2, rect2, vector3, transform2d, planes,
rect3, basis, transforms, colors, nodepaths, rids, dictionaries, arrays, quats, aabb, basis, transforms, colors, nodepaths, rids, dictionaries,
poolarrays, variants arrays, poolarrays, variants
export godotmacros, godotnim export godotmacros, godotnim
export GodotPropertyHint, GodotPropertyUsageFlags export GodotPropertyHint, GodotPropertyUsage

File diff suppressed because it is too large Load diff

View file

@ -1,262 +1,85 @@
# Copyright 2017 Xored Software, Inc. # Copyright 2018 Xored Software, Inc.
import internal.godotobjects, internal.godotarrays, internal.godotnodepaths, import internal/godotinternaltypes, internal/godotarrays,
internal.godotpoolarrays, internal.godotstrings, internal.godotvariants, internal/godotnodepaths, internal/godotpoolarrays, internal/godotstrings,
internal.godotdictionaries internal/godotvariants, internal/godotdictionaries
export godotobjects, godotarrays, godotnodepaths, godotpoolarrays, import gdnativeapi
export godotinternaltypes, godotarrays, godotnodepaths, godotpoolarrays,
godotstrings, godotvariants, godotdictionaries 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; proc ptrCall*(methodBind: ptr GodotMethodBind;
instance: ptr GodotObject; instance: ptr GodotObject;
args: ptr array[MAX_ARG_COUNT, pointer]; args: ptr array[MAX_ARG_COUNT, pointer];
ret: pointer) {. ret: pointer) {.inline.} =
importc: "godot_method_bind_ptrcall".} getGDNativeAPI().methodBindPtrCall(methodBind, instance, args, ret)
proc call*(methodBind: ptr GodotMethodBind; proc call*(methodBind: ptr GodotMethodBind;
instance: ptr GodotObject; instance: ptr GodotObject;
args: ptr array[MAX_ARG_COUNT, ptr GodotVariant]; argCount: cint; args: ptr array[MAX_ARG_COUNT, ptr GodotVariant]; argCount: cint;
callError: var VariantCallError): GodotVariant {. callError: var VariantCallError): GodotVariant {.inline.} =
importc: "godot_method_bind_call".} 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 proc nativeScriptRegisterToolClass*(libHandle: pointer; name, base: cstring;
GodotNativeInitOptions* = object createFunc: GodotInstanceCreateFunc;
inEditor*: bool destroyFunc: GodotInstanceDestroyFunc)
coreApiHash*: uint64 {.inline.} =
editorApiHash*: uint64 getGDNativeAPI().nativeScriptRegisterToolClass(
noApiHash*: uint64 libHandle, name, base, createFunc, destroyFunc)
gdNativeLibrary*: ptr GodotObject
GodotNativeTerminateOptions* = object proc nativeScriptRegisterMethod*(libHandle: pointer;
inEditor*: bool name: cstring; function_name: cstring;
attr: GodotMethodAttributes;
meth: GodotInstanceMethod) {.inline.} =
getGDNativeAPI().nativeScriptRegisterMethod(
libHandle, name, functionName, attr, meth)
GodotMethodRPCMode* {.size: sizeof(cint), pure.} = enum proc nativeScriptRegisterProperty*(libHandle: pointer;
Disabled, name, path: cstring;
Remote, attr: ptr GodotPropertyAttributes;
Sync, setFunc: GodotPropertySetFunc;
Master, getFunc: GodotPropertyGetFunc) {.inline.} =
Slave getGDNativeAPI().nativeScriptRegisterProperty(
libHandle, name, path, attr, setFunc, getFunc)
GodotMethodAttributes* = object proc nativeScriptRegisterSignal*(libHandle: pointer; name: cstring;
rpcMode*: GodotMethodRPCMode signal: GodotSignal) {.inline.} =
getGDNativeAPI().nativeScriptRegisterSignal(libHandle, name, signal)
GodotPropertyHint* {.size: sizeof(cint), pure.} = enum proc getUserdata*(instance: ptr GodotObject): pointer {.inline.} =
None, ## no hint provided. getGDNativeAPI().nativeScriptGetUserdata(instance)
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 proc getClassConstructor*(className: cstring): GodotClassConstructor
GODOT_PROPERTY_USAGE_STORAGE_VALUE = 1.cint {.inline.} =
GODOT_PROPERTY_USAGE_EDITOR_VALUE = 2.cint getGDNativeAPI().getClassConstructor(className)
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 = proc deinit*(o: ptr GodotObject) {.inline.} =
GODOT_PROPERTY_USAGE_STORAGE_VALUE or GODOT_PROPERTY_USAGE_EDITOR_VALUE or getGDNativeAPI().objectDestroy(o)
GODOT_PROPERTY_USAGE_NETWORK_VALUE
GODOT_PROPERTY_USAGE_DEFAULT_INTL_VALUE: cint =
GODOT_PROPERTY_USAGE_STORAGE_VALUE or
GODOT_PROPERTY_USAGE_EDITOR_VALUE or GODOT_PROPERTY_USAGE_NETWORK_VALUE or
GODOT_PROPERTY_USAGE_INTERNATIONALIZED_VALUE
GODOT_PROPERTY_USAGE_NOEDITOR_VALUE: cint =
GODOT_PROPERTY_USAGE_STORAGE_VALUE or GODOT_PROPERTY_USAGE_NETWORK_VALUE
type
GodotPropertyUsageFlags* {.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*: GodotPropertyUsageFlags
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*: GodotPropertyUsageFlags
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".}
# print using Godot's error handler list # print using Godot's error handler list
proc godotPrintError*(description: cstring; function: cstring; file: cstring; proc godotPrintError*(description, function, file: cstring;
line: cint) {. line: cint) {.inline.} =
importc: "godot_print_error".} getGDNativeAPI().printError(description, function, file, line)
proc godotPrintWarning*(description: cstring; function: cstring; proc godotPrintWarning*(description, function, file: cstring;
file: cstring; line: cint) {. line: cint) {.inline.} =
importc: "godot_print_warning".} getGDNativeAPI().printWarning(description, function, file, line)
proc godotPrint*(message: GodotString) {. proc godotPrint*(message: GodotString) {.inline.} =
importc: "godot_print".} getGDNativeAPI().print(message)
var getClassMethodBind: ptr GodotMethodBind var getClassMethodBind: ptr GodotMethodBind
proc getClassName*(o: ptr GodotObject): string = proc getClassName*(o: ptr GodotObject): string =
@ -270,22 +93,30 @@ proc getClassName*(o: ptr GodotObject): string =
# There are physics type not known by ClassDB # There are physics type not known by ClassDB
result = result[0..result.len-3] result = result[0..result.len-3]
proc getGodotSingleton*(name: cstring): ptr GodotObject {. proc getClassNameRaw*(o: ptr GodotObject): GodotString =
importc: "godot_global_get_singleton".} 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 # System Functions
proc godotAlloc*(bytes: cint): pointer {. proc godotAlloc*(bytes: cint): pointer {.inline.} =
importc: "godot_alloc".}
## Allocates the specified number of bytes. ## Allocates the specified number of bytes.
## Using this instead of stdlib proc will help Godot track how much memory ## Using this instead of stdlib proc will help Godot track how much memory
## is in use in debug mode. ## is in use in debug mode.
proc godotRealloc*(p: pointer; bytes: cint): pointer {. getGDNativeAPI().alloc(bytes)
importc: "godot_realloc".}
proc godotRealloc*(p: pointer; bytes: cint): pointer {.inline.} =
## Reallocates the pointer for the specified number of bytes. ## Reallocates the pointer for the specified number of bytes.
## Using this instead of stdlib proc will help Godot track how much memory ## Using this instead of stdlib proc will help Godot track how much memory
## is in use in debug mode. ## 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. ## Frees the memory pointed to by the pointer.
## Using this instead of stdlib proc will help Godot track how much memory ## Using this instead of stdlib proc will help Godot track how much memory
## is in use in debug mode. ## is in use in debug mode.
getGDNativeAPI().free(p)

View 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]()

View file

@ -1,119 +1,162 @@
# Copyright (c) 2017 Xored Software, Inc. # Copyright (c) 2018 Xored Software, Inc.
type import godotinternaltypes, gdnativeapi, core/godotcoretypes
GodotArray* {.byref.} = object
data: array[sizeof(int), byte] proc len*(self: GodotArray): cint {.inline.} =
getGDNativeAPI().arraySize(self)
import hashes import hashes
import godotobjects, godotpoolarrays, godotvariants, godotstrings
proc initGodotArray*(dest: var GodotArray) {. proc initGodotArray*(dest: var GodotArray) {.inline.} =
importc: "godot_array_new".} getGDNativeAPI().arrayNew(dest)
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 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; proc initGodotArray*(dest: var GodotArray;
value: GodotVariant) {. pv3a: GodotPoolVector3Array) {.inline.} =
noSideEffect, getGDNativeAPI().arrayNewPoolVector3Array(dest, pv3a)
importc: "godot_array_set".}
proc `[]`*(self: GodotArray; idx: cint): GodotVariant {. proc initGodotArray*(dest: var GodotArray;
noSideEffect, pv2a: GodotPoolVector2Array) {.inline.} =
importc: "godot_array_get".} getGDNativeAPI().arrayNewPoolVector2Array(dest, pv2a)
proc mget*(self: var GodotArray; idx: cint): ptr GodotVariant {.
importc: "godot_array_operator_index".} 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; proc find*(self: GodotArray; what: GodotVariant;
f: cint): cint {. fromIdx: cint): cint {.inline.} =
noSideEffect, getGDNativeAPI().arrayFind(self, what, fromIdx)
importc: "godot_array_find".}
proc findLast*(self: GodotArray; what: GodotVariant): cint {. proc findLast*(self: GodotArray; what: GodotVariant): cint {.inline.} =
noSideEffect, getGDNativeAPI().arrayFindLast(self, what)
importc: "godot_array_find_last".}
proc contains*(self: GodotArray; value: GodotVariant): bool {. proc contains*(self: GodotArray; value: GodotVariant): bool {.inline.} =
noSideEffect, getGDNativeAPI().arrayHas(self, value)
importc: "godot_array_has".}
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.} = proc hash*(self: GodotArray): Hash {.inline.} =
hash(godotHash(self)) hash(godotHash(self))
proc insert*(self: var GodotArray; pos: cint; proc insert*(self: var GodotArray; pos: cint;
value: GodotVariant) {. value: GodotVariant): Error {.discardable, inline.} =
importc: "godot_array_insert".} getGDNativeAPI().arrayInsert(self, pos, value)
proc reverse*(self: var GodotArray) {.importc: "godot_array_invert".}
proc popLast*(self: var GodotArray): GodotVariant {. proc reverse*(self: var GodotArray) {.inline.} =
importc: "godot_array_pop_back".} getGDNativeAPI().arrayInvert(self)
proc popFirst*(self: var GodotArray): GodotVariant {.
importc: "godot_array_pop_front".} proc popLast*(self: var GodotArray): GodotVariant {.inline.} =
proc addLast*(self: var GodotArray; value: GodotVariant) {. getGDNativeAPI().arrayPopBack(self)
importc: "godot_array_push_back".}
proc addFirst*(self: var GodotArray; value: GodotVariant) {. proc popFirst*(self: var GodotArray): GodotVariant {.inline.} =
importc: "godot_array_push_front".} 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; proc rfind*(self: GodotArray; what: GodotVariant;
f: cint): cint {. fromIdx: cint): cint {.inline.} =
noSideEffect, getGDNativeAPI().arrayRFind(self, what, fromIdx)
importc: "godot_array_rfind".}
proc len*(self: GodotArray): cint {.
noSideEffect,
importc: "godot_array_size".}
proc sort*(self: var GodotArray) {.importc: "godot_array_sort".}
proc sortCustom*(self: var GodotArray; obj: var GodotObject;
funcName: GodotString) {.
importc: "godot_array_sort_custom".}
iterator items*(arr: GodotArray): GodotVariant = proc sort*(self: var GodotArray) {.inline.} =
for i in 0..<arr.len: getGDNativeAPI().arraySort(self)
yield arr[i]
iterator mitems*(arr: var GodotArray): var GodotVariant = proc sortCustom*(self: var GodotArray; obj: ptr GodotObject;
for i in 0..<arr.len: funcName: GodotString) {.inline.} =
yield arr.mget(i)[] getGDNativeAPI().arraySortCustom(self, obj, funcName)
iterator pairs*(arr: GodotArray): tuple[key: cint, val: GodotVariant] = proc binarySearch*(self: var GodotArray, val: ptr GodotVariant,
for i in 0..<arr.len: before: bool) {.inline.} =
yield (i, arr[i]) getGDNativeAPI().arrayBSearch(self, val, before)
iterator mpairs*(arr: var GodotArray): tuple[key: cint, val: var GodotVariant] = proc binarySearchCustom*(self: var GodotArray, val: ptr GodotVariant,
for i in 0..<arr.len: obj: ptr GodotObject, funcName: GodotString,
yield (i, arr.mget(i)[]) before: bool) {.inline.} =
getGDNativeAPI().arrayBSearchCustom(self, val, obj, funcName, before)
iterator items*(self: GodotArray): GodotVariant =
for i in 0.cint..<self.len:
yield self[i]
iterator mitems*(self: var GodotArray): var GodotVariant =
for i in 0.cint..<self.len:
yield self.mget(i)[]
iterator pairs*(self: GodotArray): tuple[key: cint, val: GodotVariant] =
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.cint..<self.len:
yield (i, self.mget(i)[])
proc `$`*(self: GodotArray): string =
result = newStringOfCap(32)
result.add('[')
for item in self:
if result.len > 1:
result.add(", ")
result.add($item)
result.add(']')

View file

@ -1,48 +1,56 @@
# Copyright (c) 2017 Xored Software, Inc. # Copyright (c) 2018 Xored Software, Inc.
type import godotinternaltypes, gdnativeapi
GodotDictionary* {.byref.} = object
data: array[sizeof(int), byte]
import godotarrays, godotvariants, godotstrings proc initGodotDictionary*(dest: var GodotDictionary) {.inline.} =
getGDNativeAPI().dictionaryNew(dest)
proc initGodotDictionary*(dest: var GodotDictionary; src: GodotDictionary) {. proc initGodotDictionary*(dest: var GodotDictionary;
importc: "godot_dictionary_new_copy".} src: GodotDictionary) {.inline.} =
getGDNativeAPI().dictionaryNewCopy(dest, src)
proc deinit*(self: var GodotDictionary) {. proc deinit*(self: var GodotDictionary) {.inline.} =
importc: "godot_dictionary_destroy".} getGDNativeAPI().dictionaryDestroy(self)
proc initGodotDictionary*(dest: var GodotDictionary) {. proc len*(self: GodotDictionary): cint {.inline.} =
importc: "godot_dictionary_new".} getGDNativeAPI().dictionarySize(self)
proc len*(self: GodotDictionary): cint {. proc isEmpty*(self: GodotDictionary): bool {.inline.} =
importc: "godot_dictionary_size".} getGDNativeAPI().dictionaryEmpty(self)
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 godotHash*(self: GodotDictionary): cint {. proc clear*(self: var GodotDictionary) {.inline.} =
importc: "godot_dictionary_hash".} getGDNativeAPI().dictionaryClear(self)
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 `==`*(self, other: GodotDictionary): bool {. proc contains*(self: GodotDictionary; key: GodotVariant): bool {.inline.} =
importc: "godot_dictionary_operator_equal".} getGDNativeAPI().dictionaryHas(self, key)
proc toJson*(self: GodotDictionary): GodotString {. proc contains*(self: GodotDictionary; keys: GodotArray): bool {.inline.} =
importc: "godot_dictionary_to_json".} 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)

View 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)))

View file

@ -1,32 +1,40 @@
# Copyright 2017 Xored Software, Inc. # Copyright 2018 Xored Software, Inc.
import godotstrings import godotinternaltypes, gdnativeapi
type proc initGodotNodePath*(dest: var GodotNodePath; s: GodotString) {.inline.} =
GodotNodePath* {.byref.} = object getGDNativeAPI().nodePathNew(dest, s)
data: array[sizeof(int), byte]
proc initGodotNodePath*(dest: var GodotNodePath; s: GodotString) {. proc initGodotNodePath*(dest: var GodotNodePath;
importc: "godot_node_path_new".} src: GodotNodePath) {.inline.} =
proc deinit*(self: var GodotNodePath) {. getGDNativeAPI().nodePathNewCopy(dest, src)
importc: "godot_node_path_destroy".}
proc toGodotString*(self: GodotNodePath): GodotString {.
importc: "godot_node_path_as_string".}
proc isAbsolute*(self: GodotNodePath): bool {. proc deinit*(self: var GodotNodePath) {.inline.} =
noSideEffect, importc: "godot_node_path_is_absolute".} getGDNativeAPI().nodePathDestroy(self)
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 `==`*(a, b: GodotNodePath): bool {. proc toGodotString*(self: GodotNodePath): GodotString {.inline.} =
noSideEffect, importc: "godot_node_path_operator_equal".} 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)

View file

@ -1,4 +0,0 @@
# Copyright 2017 Xored Software, Inc.
type
GodotObject* = object

View file

@ -1,374 +1,269 @@
# Copyright (c) 2017 Xored Software, Inc. # Copyright (c) 2018 Xored Software, Inc.
type import godotinternaltypes, gdnativeapi
GodotPoolByteArray* {.byref.} = object import core/godotcoretypes
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 godotstrings, godotarrays template genPoolArrayAPI(ArrayT, initIdent, DataT,
import core.godotbase, core.colors, core.vector2, core.vector3 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) {. proc initIdent*(dest: var ArrayT; arr: GodotArray) {.inline.} =
importc: "godot_pool_byte_array_new".} getGDNativeAPI().newWithArrayProc(dest, arr)
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 deinit*(self: var GodotPoolByteArray) {. proc deinit*(self: var ArrayT) {.inline.} =
importc: "godot_pool_byte_array_destroy".} getGDNativeAPI().destroyProc(self)
proc add*(self: var GodotPoolByteArray; proc add*(self: var ArrayT; data: DataT) {.inline.} =
data: uint8) {. getGDNativeAPI().pushBackProc(self, data)
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 reverse*(self: var GodotPoolByteArray) {. proc add*(self: var ArrayT; arr: ArrayT) {.inline.} =
importc: "godot_pool_byte_array_invert".} getGDNativeAPI().appendArrayProc(self, arr)
proc setLen*(self: var GodotPoolByteArray; size: cint) {.
importc: "godot_pool_byte_array_resize".}
proc `[]=`*(self: var GodotPoolByteArray; idx: cint; data: uint8) {. proc insert*(self: var ArrayT; idx: cint;
importc: "godot_pool_byte_array_set".} data: DataT): Error {.inline.} =
proc `[]`*(self: GodotPoolByteArray; idx: cint): uint8 {. getGDNativeAPI().insertProc(self, idx, data)
noSideEffect,
importc: "godot_pool_byte_array_get".}
proc len*(self: GodotPoolByteArray): cint {.
noSideEffect,
importc: "godot_pool_byte_array_size".}
iterator items*(arr: GodotPoolByteArray): byte = proc delete*(self: var ArrayT; idx: cint) {.inline.} =
for i in 0..<arr.len: getGDNativeAPI().removeProc(self, idx)
yield arr[i]
iterator pairs*(arr: GodotPoolByteArray): tuple[key: cint, val: byte] = proc reverse*(self: var ArrayT) {.inline.} =
for i in 0..<arr.len: getGDNativeAPI().invertProc(self)
yield (i, arr[i])
proc initGodotPoolIntArray*(dest: var GodotPoolIntArray) {. proc setLen*(self: var ArrayT; size: cint) {.inline.} =
importc: "godot_pool_int_array_new".} getGDNativeAPI().resizeProc(self, size)
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 add*(self: var GodotPoolIntArray; data: cint) {. proc `[]=`*(self: var ArrayT; idx: cint; data: DataT) {.inline.} =
importc: "godot_pool_int_array_append".} getGDNativeAPI().setProc(self, idx, data)
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 setLen*(self: var GodotPoolIntArray; size: cint) {. proc `[]`*(self: ArrayT; idx: cint): DataT {.inline.} =
importc: "godot_pool_int_array_resize".} let data = getGDNativeAPI().getProc(self, idx)
proc `[]=`*(self: var GodotPoolIntArray; idx: cint; data: cint) {. when DataT is Color:
importc: "godot_pool_int_array_set".} data.toColor()
proc `[]`*(self: GodotPoolIntArray; idx: cint): cint {. elif DataT is Vector2:
noSideEffect, data.toVector2()
importc: "godot_pool_int_array_get".} elif DataT is Vector3:
proc len*(self: GodotPoolIntArray): cint {. data.toVector3()
noSideEffect, else:
importc: "godot_pool_int_array_size".} data
iterator items*(arr: GodotPoolIntArray): cint = proc len*(self: ArrayT): cint {.inline.} =
for i in 0..<arr.len: getGDNativeAPI().sizeProc(self)
yield arr[i]
iterator pairs*(arr: GodotPoolIntArray): tuple[key: cint, val: cint] = iterator items*(self: ArrayT): DataT =
for i in 0..<arr.len: let readAccess = getGDNativeAPI().readProc(self)
yield (i, arr[i]) 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) {. iterator pairs*(self: ArrayT): tuple[key: cint, val: DataT] =
importc: "godot_pool_real_array_new".} let readAccess = getGDNativeAPI().readProc(self)
proc initGodotPoolRealArray*(dest: var GodotPoolRealArray; let readPtr = getGDNativeAPI().readAccessPtrProc(readAccess)
src: GodotPoolRealArray) {. for i in 0.cint..<self.len:
importc: "godot_pool_real_array_new_copy".} yield (i, readPtr.offset(i)[])
proc initGodotPoolRealArray*(dest: var GodotPoolRealArray; arr: GodotArray) {. getGDNativeAPI().readAccessDestroyProc(readAccess)
importc: "godot_pool_real_array_new_with_array".}
proc deinit*(self: var GodotPoolRealArray) {. iterator mpairs*(self: var ArrayT): tuple[key: cint, val: var DataT] =
importc: "godot_pool_real_array_destroy".} 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) {. proc subarray*(self: ArrayT, idxFrom, idxTo: cint): ArrayT =
importc: "godot_pool_real_array_append".} ## Indexes are inclusive, negative values count from the end of the array.
proc addFirst*(self: var GodotPoolRealArray; data: float32) {. let ownLen = self.len
importc: "godot_pool_real_array_push_back".} var actualIdxFrom = if idxFrom < 0: idxFrom + ownLen
proc add*(self: var GodotPoolRealArray; arr: GodotPoolRealArray) {. else: idxFrom
importc: "godot_pool_real_array_append_array".} var actualIdxTo = if idxTo < 0: idxTo + ownLen
proc insert*(self: var GodotPoolRealArray; else: idxTo
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".}
iterator items*(arr: GodotPoolRealArray): float32 = initIdent(result)
for i in 0..<arr.len: if actualIdxFrom < 0 or actualIdxFrom >= ownLen:
yield arr[i] 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] = genPoolArrayAPI(GodotPoolByteArray, initGodotPoolByteArray, byte,
for i in 0..<arr.len: poolByteArrayNew,
yield (i, arr[i]) 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) {. genPoolArrayAPI(GodotPoolRealArray, initGodotPoolRealArray, float32,
importc: "godot_pool_string_array_new".} poolRealArrayNew,
proc initGodotPoolStringArray*(dest: var GodotPoolStringArray; poolRealArrayNewCopy,
src: GodotPoolStringArray) {. poolRealArrayNewWithArray,
importc: "godot_pool_string_array_new_copy".} poolRealArrayAppend,
proc initGodotPoolStringArray*(dest: var GodotPoolStringArray; arr: GodotArray) {. poolRealArrayAppendArray,
importc: "godot_pool_string_array_new_with_array".} poolRealArrayInsert,
poolRealArrayInvert,
poolRealArrayPushBack,
poolRealArrayRemove,
poolRealArrayResize,
poolRealArraySet,
poolRealArrayGet,
poolRealArraySize,
poolRealArrayDestroy,
poolRealArrayRead,
poolRealArrayWrite,
poolRealArrayReadAccessPtr,
poolRealArrayWriteAccessPtr,
poolRealArrayReadAccessDestroy,
poolRealArrayWriteAccessDestroy)
proc deinit*(self: var GodotPoolStringArray) {. genPoolArrayAPI(GodotPoolStringArray, initGodotPoolStringArray, GodotString,
importc: "godot_pool_string_array_destroy".} poolStringArrayNew,
poolStringArrayNewCopy,
poolStringArrayNewWithArray,
poolStringArrayAppend,
poolStringArrayAppendArray,
poolStringArrayInsert,
poolStringArrayInvert,
poolStringArrayPushBack,
poolStringArrayRemove,
poolStringArrayResize,
poolStringArraySet,
poolStringArrayGet,
poolStringArraySize,
poolStringArrayDestroy,
poolStringArrayRead,
poolStringArrayWrite,
poolStringArrayReadAccessPtr,
poolStringArrayWriteAccessPtr,
poolStringArrayReadAccessDestroy,
poolStringArrayWriteAccessDestroy)
proc initGodotPoolStringArray*(): GodotPoolStringArray {.inline.} = genPoolArrayAPI(GodotPoolVector2Array, initGodotPoolVector2Array, Vector2,
initGodotPoolStringArray(result) 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.} = genPoolArrayAPI(GodotPoolVector3Array, initGodotPoolVector3Array, Vector3,
initGodotPoolStringArray(result, arr) 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) {. genPoolArrayAPI(GodotPoolColorArray, initGodotPoolColorArray, Color,
importc: "godot_pool_string_array_append".} poolColorArrayNew,
proc addFirst*(self: var GodotPoolStringArray; data: GodotString) {. poolColorArrayNewCopy,
importc: "godot_pool_string_array_push_back".} poolColorArrayNewWithArray,
proc add*(self: var GodotPoolStringArray; arr: GodotPoolStringArray) {. poolColorArrayAppend,
importc: "godot_pool_string_array_append_array".} poolColorArrayAppendArray,
proc insert*(self: var GodotPoolStringArray; poolColorArrayInsert,
idx: cint; data: GodotString): Error {. poolColorArrayInvert,
importc: "godot_pool_string_array_insert".} poolColorArrayPushBack,
proc delete*(self: var GodotPoolStringArray; idx: cint) {. poolColorArrayRemove,
importc: "godot_pool_string_array_remove".} poolColorArrayResize,
proc reverse*(self: var GodotPoolStringArray) {. poolColorArraySet,
importc: "godot_pool_string_array_invert".} poolColorArrayGet,
proc setLen*(self: var GodotPoolStringArray; size: cint) {. poolColorArraySize,
importc: "godot_pool_string_array_resize".} poolColorArrayDestroy,
proc `[]=`*(self: var GodotPoolStringArray; idx: cint; poolColorArrayRead,
data: GodotString) {. poolColorArrayWrite,
importc: "godot_pool_string_array_set".} poolColorArrayReadAccessPtr,
proc `[]`*(self: GodotPoolStringArray; idx: cint): GodotString {. poolColorArrayWriteAccessPtr,
noSideEffect, poolColorArrayReadAccessDestroy,
importc: "godot_pool_string_array_get".} poolColorArrayWriteAccessDestroy)
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])

View file

@ -1,50 +1,50 @@
# Copyright (c) 2017 Xored Software, Inc. # Copyright (c) 2018 Xored Software, Inc.
type import godotinternaltypes, gdnativeapi
GodotString* {.byref.} = object
data: array[sizeof(int), byte] 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; proc initGodotString(dest: var GodotString; contents: cstring;
size: cint) {. size: cint) {.inline.} =
importc: "godot_string_new_data".}
## Initializes ``dest`` from UTF-8 ``contents`` ## Initializes ``dest`` from UTF-8 ``contents``
proc getData(self: GodotString; dest: cstring; dest = getGDNativeAPI().stringCharsToUtf8WithLen(contents, size)
size: var cint) {.
noSideEffect proc `==`*(self, b: GodotString): bool {.inline.} =
importc: "godot_string_get_data".} getGDNativeAPI().stringOperatorEqual(self, b)
## Converts ``self`` into UTF-8 encoding, putting the result into ``dest``.
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.} = proc len*(self: GodotString): cint {.inline.} =
## Returns the length of string in bytes if it is represented as UTF-8. getGDNativeAPI().stringLength(self)
getData(self, nil, result)
proc cstring*(self: GodotString): cstring {. proc dataPtr*(self: GodotString): ptr cwchar_t {.inline.} =
importc: "godot_string_c_str".} getGDNativeAPI().stringWideStr(self)
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 `$`*(self: GodotString): string = proc `$`*(self: GodotString): string =
## Converts the ``GodotString`` into Nim string ## Converts the ``GodotString`` into Nim string
var length = self.len var charStr = getGDNativeAPI().stringUtf8(self)
result = newStringOfCap(length) let length = getGDNativeAPI().charStringLength(charStr)
getData(self, addr result[0], length) result = newString(length)
result.setLen(length) copyMem(addr result[0], getGDNativeAPI().charStringGetData(charStr), length)
assert(result[length] == '\0') getGDNativeAPI().charStringDestroy(charStr)
proc toGodotString*(s: string): GodotString {.inline.} = proc toGodotString*(s: string): GodotString {.inline.} =
## Converts the Nim string into ``GodotString`` ## Converts the Nim string into ``GodotString``
if s.isNil: when (NimMajor, NimMinor, NimPatch) < (0, 19, 0):
initGodotString(result) if s.isNil:
initGodotString(result)
else:
initGodotString(result, cstring(s), cint(s.len + 1))
else: else:
initGodotString(result, unsafeAddr s[0], cint(s.len + 1)) initGodotString(result, cstring(s), cint(s.len + 1))
proc toGodotString*(s: cstring): GodotString {.inline.} = proc toGodotString*(s: cstring): GodotString {.inline.} =
## Converts the cstring into ``GodotString`` ## Converts the cstring into ``GodotString``

View file

@ -1,193 +1,217 @@
# Copyright 2017 Xored Software, Inc. # Copyright 2018 Xored Software, Inc.
type import core/godotcoretypes, godotinternaltypes, gdnativeapi
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
VariantCallErrorType* {.size: sizeof(cint), pure.} = enum proc getType*(p: GodotVariant): VariantType {.inline.} =
OK, getGDNativeAPI().variantGetType(p)
InvalidMethod,
InvalidArgument,
TooManyArguments,
TooFewArguments,
InstanceIsNull
VariantCallError* = object proc initGodotVariant*(dest: var GodotVariant) {.inline.} =
error*: VariantCallErrorType getGDNativeAPI().variantNewNil(dest)
argument*: cint
expected*: VariantType
GodotVariant* {.byref.} = object proc initGodotVariant*(dest: var GodotVariant, src: GodotVariant) {.inline.} =
data: array[4 + sizeof(int) div 4, float32] getGDNativeAPI().variantNewCopy(dest, src)
import godotobjects, godotarrays, godotpoolarrays, proc initGodotVariant*(dest: var GodotVariant; b: bool) {.inline.} =
godotstrings, godotnodepaths, godotdictionaries getGDNativeAPI().variantNewBool(dest, b)
import core.vector2, core.rect2, proc initGodotVariant*(dest: var GodotVariant; i: uint64) {.inline.} =
core.vector3, core.transform2d, core.planes, getGDNativeAPI().variantNewUInt(dest, i)
core.quats, core.rect3, core.basis,
core.transforms, core.colors, core.rids,
core.rect2
proc getType*(p: GodotVariant): VariantType {. proc initGodotVariant*(dest: var GodotVariant; i: int64) {.inline.} =
importc: "godot_variant_get_type".} getGDNativeAPI().variantNewInt(dest, i)
proc initGodotVariant*(dest: var GodotVariant) {. proc initGodotVariant*(dest: var GodotVariant; r: cdouble) {.inline.} =
importc: "godot_variant_new_nil".} getGDNativeAPI().variantNewReal(dest, r)
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 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 {. proc initGodotVariant*(dest: var GodotVariant; v2: Vector2) {.inline.} =
importc: "godot_variant_as_bool".} getGDNativeAPI().variantNewVector2(dest, v2)
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 call*(self: GodotVariant; meth: GodotString; proc initGodotVariant*(dest: var GodotVariant; rect2: Rect2) {.inline.} =
args: var array[128, GodotVariant]; argCount: cint; getGDNativeAPI().variantNewRect2(dest, rect2)
error: var VariantCallError): GodotVariant {.
importc: "godot_variant_call".}
proc hasMethod*(self: GodotVariant; meth: GodotString): bool {. proc initGodotVariant*(dest: var GodotVariant; v3: Vector3) {.inline.} =
importc: "godot_variant_has_method".} getGDNativeAPI().variantNewVector3(dest, v3)
proc `==`*(self, other: GodotVariant): bool {.
importc: "godot_variant_operator_equal".} proc initGodotVariant*(dest: var GodotVariant; t2d: Transform2D) {.inline.} =
proc `<`*(self, other: GodotVariant): bool {. getGDNativeAPI().variantNewTransform2D(dest, t2d)
importc: "godot_variant_operator_less".}
proc hashCompare*(self, other: GodotVariant): bool {. proc initGodotVariant*(dest: var GodotVariant; plane: Plane) {.inline.} =
importc: "godot_variant_hash_compare".} getGDNativeAPI().variantNewPlane(dest, plane)
proc booleanize*(self: GodotVariant; isValid: var bool): bool {.
importc: "godot_variant_booleanize".} 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
s.deinit()

View file

@ -1,8 +1,8 @@
# Copyright 2017 Xored Software, Inc. # Copyright 2018 Xored Software, Inc.
import macros, tables, typetraits import macros, tables, typetraits, strutils, sets, sequtils, options, algorithm
import godotinternal, internal.godotvariants import godotinternal, internal/godotvariants
import godotnim, core.variants import godotnim, core/variants
type type
VarDecl = ref object VarDecl = ref object
@ -10,9 +10,9 @@ type
typ: NimNode typ: NimNode
defaultValue: NimNode defaultValue: NimNode
isNoGodot: bool isNoGodot: bool
hint: string hint: Option[string]
hintTip: string hintStr: Option[string]
usage: string usage: NimNode
isExported: bool isExported: bool
MethodDecl = ref object MethodDecl = ref object
@ -32,6 +32,8 @@ type
ParseError = object of Exception ParseError = object of Exception
include "internal/backwardcompat.inc.nim"
proc godotToNim[T](val: Variant): (T, ConversionResult) = proc godotToNim[T](val: Variant): (T, ConversionResult) =
mixin fromVariant mixin fromVariant
result[1] = fromVariant(result[0], val) result[1] = fromVariant(result[0], val)
@ -41,9 +43,9 @@ proc nimToGodot[T](val: T): Variant =
when compiles(toVariant(val)): when compiles(toVariant(val)):
result = toVariant(val) result = toVariant(val)
else: else:
printError("Failed to convert Nim value of type " & T.name & const err = "Cannot convert Nim value of type " & T.name &
" into Variant") " into Variant"
initNilVariant(result) {.error: err.}
template parseError(node: NimNode, msg: string) = template parseError(node: NimNode, msg: string) =
raise newException(ParseError, lineinfo(node) & ": " & msg) raise newException(ParseError, lineinfo(node) & ": " & msg)
@ -51,49 +53,37 @@ template parseError(node: NimNode, msg: string) =
proc extractNames(definition: NimNode): proc extractNames(definition: NimNode):
tuple[name, parentName: string] = tuple[name, parentName: string] =
if definition.kind == nnkIdent: if definition.kind == nnkIdent:
result.name = $(definition.ident) result.name = definition.strVal
else: 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") parseError(definition, "invalid type definition")
result.name = $(definition[1].ident) result.name = definition[1].strVal
case definition[2].kind: case definition[2].kind:
of nnkIdent: of nnkIdent:
result.parentName = $definition[2].ident result.parentName = definition[2].strVal
else: else:
parseError(definition[2], "parent type expected") parseError(definition[2], "parent type expected")
proc newRStrLit(s: string): NimNode {.compileTime.} = when not declared(newRStrLit):
result = newNimNode(nnkRStrLit) proc newRStrLit(s: string): NimNode {.compileTime.} =
result.strVal = s result = newNimNode(nnkRStrLit)
result.strVal = s
proc newCStringLit(s: string): NimNode {.compileTime.} = proc newCStringLit(s: string): NimNode {.compileTime.} =
newNimNode(nnkCallStrLit).add(ident("cstring"), newRStrLit(s)) newNimNode(nnkCallStrLit).add(ident("cstring"), newRStrLit(s))
iterator pragmas(node: NimNode): iterator pragmas(node: NimNode):
tuple[key: NimIdent, value: string, index: int] = tuple[key: string, value: NimNode, index: int] =
assert node.kind in {nnkPragma, nnkEmpty} assert node.kind in {nnkPragma, nnkEmpty}
for index in countdown(node.len - 1, 0): for index in countdown(node.len - 1, 0):
if node[index].kind == nnkExprColonExpr: if node[index].kind == nnkExprColonExpr:
let val = $(node[index][1]) yield (node[index][0].strVal, node[index][1], index)
yield (node[index][0].ident, val, index)
elif node[index].kind == nnkIdent: elif node[index].kind == nnkIdent:
yield (node[index].ident, nil, index) yield (node[index].strVal, nil, index)
proc removePragma(statement: NimNode, pname: string): bool = proc removePragmaNode(statement: NimNode,
## Removes the pragma from the node and returns whether pragma was removed pname: string): NimNode {.compileTime.} =
if not (RoutineNodes.contains(statement.kind) or
statement.kind == nnkPragmaExpr):
return false
var pragmas = if RoutineNodes.contains(statement.kind): statement.pragma()
else: statement[1]
let pnameIdent = !pname
for ident, val, i in pragmas(pragmas):
if ident == pnameIdent:
pragmas.del(i)
return true
proc removeStrPragma(statement: NimNode,
pname: string): string {.compileTime.} =
## Removes the pragma from the node and returns value of the pragma ## Removes the pragma from the node and returns value of the pragma
## Works for routine nodes or nnkPragmaExpr ## Works for routine nodes or nnkPragmaExpr
if not (RoutineNodes.contains(statement.kind) or if not (RoutineNodes.contains(statement.kind) or
@ -103,11 +93,30 @@ proc removeStrPragma(statement: NimNode,
result = nil result = nil
var pragmas = if RoutineNodes.contains(statement.kind): statement.pragma() var pragmas = if RoutineNodes.contains(statement.kind): statement.pragma()
else: statement[1] else: statement[1]
let pnameIdent = !pname
for ident, val, i in pragmas(pragmas): for ident, val, i in pragmas(pragmas):
if ident == pnameIdent: if ident.eqIdent(pname):
pragmas.del(i) pragmas.del(i)
return (if val.isNil: "" else: val) return val
proc removePragma(statement: NimNode, pname: string): bool =
## Removes the pragma from the node and returns whether pragma was removed
if not (RoutineNodes.contains(statement.kind) or
statement.kind == nnkPragmaExpr):
return false
var pragmas = if RoutineNodes.contains(statement.kind): statement.pragma()
else: statement[1]
for ident, val, i in pragmas(pragmas):
if ident.eqIdent(pname):
pragmas.del(i)
return true
proc removeStrPragma(statement: NimNode,
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: none(string)
else: some($node)
proc isExported(node: NimNode): bool {.compileTime.} = proc isExported(node: NimNode): bool {.compileTime.} =
if node.kind == nnkPragmaExpr: if node.kind == nnkPragmaExpr:
@ -119,39 +128,36 @@ proc identDefsToVarDecls(identDefs: NimNode): seq[VarDecl] =
assert(identDefs.kind == nnkIdentDefs) assert(identDefs.kind == nnkIdentDefs)
result = newSeqOfCap[VarDecl](identDefs.len - 2) result = newSeqOfCap[VarDecl](identDefs.len - 2)
var typ = identDefs[identDefs.len - 2]
if typ.kind == nnkEmpty:
let defaultValue = identDefs[identDefs.len - 1]
if defaultValue.kind != nnkEmpty:
typ = newCall("type", defaultValue)
for i in 0..<(identDefs.len - 2): for i in 0..<(identDefs.len - 2):
let nameNode = identDefs[i].copyNimTree() let nameNode = identDefs[i].copyNimTree()
let hint = removeStrPragma(nameNode, "hint") let hint = removeStrPragma(nameNode, "hint")
let hintTip = removeStrPragma(nameNode, "tip") let hintStr = removeStrPragma(nameNode, "hintStr")
let usage = removeStrPragma(nameNode, "usage") let usage = removePragmaNode(nameNode, "usage")
let isGdExport = removePragma(nameNode, "gdExport") let isGdExport = removePragma(nameNode, "gdExport")
if not nameNode.isExported() and isGdExport:
parseError(nameNode, "gdExport is not applicable for private fields")
let isNoGodot = not nameNode.isExported() or not isGdExport
result.add(VarDecl( result.add(VarDecl(
name: if nameNode.kind == nnkPragmaExpr: nameNode[0].basename() name: if nameNode.kind == nnkPragmaExpr: nameNode[0].basename()
else: nameNode.basename(), else: nameNode.basename(),
typ: identDefs[identDefs.len - 2], typ: typ,
defaultValue: identDefs[identDefs.len - 1], defaultValue: identDefs[identDefs.len - 1],
hint: hint, hint: hint,
hintTip: hintTip, hintStr: hintStr,
isNoGodot: isNoGodot, isNoGodot: not isGdExport,
usage: usage, usage: usage,
isExported: nameNode.isExported() isExported: nameNode.isExported()
)) ))
proc parseMethod(meth: NimNode): MethodDecl = proc parseMethod(meth: NimNode): MethodDecl =
assert(meth.kind in {nnkProcDef, nnkMethodDef}) assert(meth.kind in {nnkProcDef, nnkMethodDef})
let methName = meth[0]
let isGdExport = removePragma(meth, "gdExport") let isGdExport = removePragma(meth, "gdExport")
if not methName.isExported() and isGdExport: let isNoGodot = (meth.kind != nnkMethodDef and not isGdExport) or
parseError(meth, "gdExport is not applicable for private procs/methods") removePragma(meth, "noGdExport")
let isNoGodot = meth.kind != nnkMethodDef and (
not methName.isExported() or
not isGdExport
) or removePragma(meth, "noExport")
result = MethodDecl( result = MethodDecl(
name: $meth[0].basename, name: $meth[0].basename,
args: newSeq[VarDecl](), args: newSeq[VarDecl](),
@ -166,10 +172,15 @@ proc parseMethod(meth: NimNode): MethodDecl =
proc parseVarSection(decl: NimNode): seq[VarDecl] = proc parseVarSection(decl: NimNode): seq[VarDecl] =
assert(decl.kind == nnkVarSection) 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 = proc parseType(ast: NimNode): ObjectDecl =
let body = callSite[^1] let definition = ast[0]
let body = ast[^1]
result = ObjectDecl( result = ObjectDecl(
fields: newSeq[VarDecl](), fields: newSeq[VarDecl](),
methods: newSeq[MethodDecl]() methods: newSeq[MethodDecl]()
@ -177,17 +188,17 @@ proc parseType(definition, callSite: NimNode): ObjectDecl =
(result.name, result.parentName) = extractNames(definition) (result.name, result.parentName) = extractNames(definition)
var isTool = false var isTool = false
for i in 2..(callSite.len - 2): for i in 1..(ast.len - 2):
let option = callSite[i] let option = ast[i]
if option.kind != nnkIdent: if option.kind != nnkIdent:
parseError(option, "type specifier expected") parseError(option, "type specifier expected")
if option.ident == !"tool": if option.strVal == "tool":
isTool = true isTool = true
else: else:
parseError(option, "valid type specifier expected") parseError(option, "valid type specifier expected")
result.isTool = isTool result.isTool = isTool
if result.parentName.isNil: result.parentName = "Object" if result.parentName.len == 0: result.parentName = "Object"
for statement in body: for statement in body:
case statement.kind: case statement.kind:
of nnkVarSection: of nnkVarSection:
@ -204,7 +215,7 @@ proc parseType(definition, callSite: NimNode): ObjectDecl =
macro invokeVarArgs(procIdent, objIdent; macro invokeVarArgs(procIdent, objIdent;
minArgs, maxArgs: static[int], numArgsIdent, minArgs, maxArgs: static[int], numArgsIdent,
argSeqIdent; argTypes: seq[NimNode], argSeqIdent; argTypes: seq[NimNode],
hasReturnValue, isStaticCall: static[bool]): typed = hasReturnValue, isStaticCall: static[bool]): untyped =
## Produces statement in form: ## Produces statement in form:
## ##
## .. code-block:: nim ## .. code-block:: nim
@ -261,8 +272,12 @@ macro invokeVarArgs(procIdent, objIdent;
invocation = newNimNode(nnkCall).add(ident("procCall"), invocation) invocation = newNimNode(nnkCall).add(ident("procCall"), invocation)
if hasReturnValue: 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( let theCall = newNimNode(nnkBracketExpr).add(newNimNode(nnkDotExpr).add(
newCall("toVariant", invocation), ident("godotVariant"))) resultVariant, ident("godotVariant")))
branchBody.add(getAst(initGodotVariantCall(ident("result"), theCall))) branchBody.add(getAst(initGodotVariantCall(ident("result"), theCall)))
else: else:
branchBody.add(invocation) branchBody.add(invocation)
@ -277,18 +292,18 @@ macro invokeVarArgs(procIdent, objIdent;
" arguments, but got " & $numArgs) " arguments, but got " & $numArgs)
result.add(newNimNode(nnkElse).add(getAst( result.add(newNimNode(nnkElse).add(getAst(
printInvokeErr($procIdent.ident, minArgs, maxArgs, numArgsIdent)))) printInvokeErr(procIdent.strVal, minArgs, maxArgs, numArgsIdent))))
proc typeError(nimType: cstring, value: string, godotType: VariantType, proc typeError(nimType: string, value: string, godotType: VariantType,
className: cstring, propertyName: cstring): string = className: cstring, propertyName: cstring): string =
result = "Tried to assign incompatible value " & value & " (" & $godotType & result = "Tried to assign incompatible value " & value & " (" & $godotType &
") to field \"" & $propertyName & "\" (" & $nimType & ") of " & ") to field \"" & $propertyName & ": " & $nimType & "\" of " &
$className $className
proc rangeError(nimType: cstring, value: string, className: cstring, proc rangeError(nimType: string, value: string, className: cstring,
propertyName: cstring): string = propertyName: cstring): string =
result = "Tried to assign the out-of-range value " & value & result = "Tried to assign the out-of-range value " & value &
" to field \"" & $propertyName & "\" (" & $nimType & ") of " & " to field \"" & $propertyName & ": " & $nimType & "\" of " &
$className $className
@ -308,22 +323,29 @@ proc refcountIncremented(obj: ptr GodotObject, methodData: pointer,
userData: pointer, numArgs: cint, userData: pointer, numArgs: cint,
args: var array[MAX_ARG_COUNT, ptr GodotVariant]): args: var array[MAX_ARG_COUNT, ptr GodotVariant]):
GodotVariant {.noconv.} = 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, proc refcountDecremented(obj: ptr GodotObject, methodData: pointer,
userData: pointer, numArgs: cint, userData: pointer, numArgs: cint,
args: var array[MAX_ARG_COUNT, ptr GodotVariant]): args: var array[MAX_ARG_COUNT, ptr GodotVariant]):
GodotVariant {.noconv.} = GodotVariant {.noconv.} =
GC_unref(cast[NimGodotObject](userData)) let nimObj = cast[NimGodotObject](userData)
initGodotVariant(result, false) # destroy when Nim decides 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) = baseNameLit, createFuncIdent; isTool: bool) =
proc createFuncIdent(obj: ptr GodotObject, proc createFuncIdent(obj: ptr GodotObject,
methData: pointer): pointer {.noconv.} = methData: pointer): pointer {.noconv.} =
let nimObj = new(classNameIdent) var nimObj: classNameIdent
nimObj.setOwn() new(nimObj, nimGodotObjectFinalizer[classNameIdent])
nimObj.setGodotObject(obj) nimObj.setGodotObject(obj)
nimObj.isRef = when isRefClass: true else: false
nimObj.setNativeObject(asNimGodotObject[NimGodotObject](
obj, forceNativeObject = true))
GC_ref(nimObj) GC_ref(nimObj)
result = cast[pointer](nimObj) result = cast[pointer](nimObj)
when compiles(nimObj.init()): when compiles(nimObj.init()):
@ -333,20 +355,20 @@ template registerGodotClass(classNameIdent, classNameLit, isRef,
createFunc: createFuncIdent createFunc: createFuncIdent
) )
let destroyFuncObj = GodotInstanceDestroyFunc( let destroyFuncObj = GodotInstanceDestroyFunc(
destroyFunc: when isRef: nimDestroyRefFunc else: nimDestroyFunc destroyFunc: when isRefClass: nimDestroyRefFunc else: nimDestroyFunc
) )
registerClass(classNameIdent, classNameLit, false) registerClass(classNameIdent, classNameLit, false)
when isTool: when isTool:
godotScriptRegisterToolClass(getNativeLibHandle(), classNameLit, baseNameLit, nativeScriptRegisterToolClass(getNativeLibHandle(), classNameLit,
createFuncObj, destroyFuncObj) baseNameLit, createFuncObj, destroyFuncObj)
else: else:
godotScriptRegisterClass(getNativeLibHandle(), classNameLit, baseNameLit, nativeScriptRegisterClass(getNativeLibHandle(), classNameLit,
createFuncObj, destroyFuncObj) baseNameLit, createFuncObj, destroyFuncObj)
template registerGodotField(classNameLit, classNameIdent, propNameLit, template registerGodotField(classNameLit, classNameIdent, propNameLit,
propNameIdent, propTypeLit, propTypeIdent, propNameIdent, propTypeLit, propTypeIdent,
setFuncIdent, getFuncIdent, hintTipLit, setFuncIdent, getFuncIdent, hintStrLit,
hintIdent, usageIdent, hasDefaultValue, hintIdent, usageExpr, hasDefaultValue,
defaultValueNode) = defaultValueNode) =
proc setFuncIdent(obj: ptr GodotObject, methData: pointer, proc setFuncIdent(obj: ptr GodotObject, methData: pointer,
nimPtr: pointer, val: GodotVariant) {.noconv.} = nimPtr: pointer, val: GodotVariant) {.noconv.} =
@ -377,23 +399,34 @@ template registerGodotField(classNameLit, classNameIdent, propNameLit,
let getFunc = GodotPropertyGetFunc( let getFunc = GodotPropertyGetFunc(
getFunc: getFuncIdent getFunc: getFuncIdent
) )
mixin godotTypeInfo
const typeInfo = when compiles(godotTypeInfo(propTypeIdent)):
godotTypeInfo(propTypeIdent)
else: GodotTypeInfo()
const hintStr = when hintStrLit != "NIM":
hintStrLit
else:
typeInfo.hintStr
const hint = when astToStr(hintIdent) != "NIM":
GodotPropertyHint.hintIdent
else:
typeInfo.hint
const variantType = typeInfo.variantType
var hintStrGodot = hintStr.toGodotString()
{.push warning[ProveInit]: off.} # false warning, Nim bug {.push warning[ProveInit]: off.} # false warning, Nim bug
var hintStr = hintTipLit.toGodotString() var attr = GodotPropertyAttributes(
let attr = GodotPropertyAttributes( typ: ord(variantType),
typ: ord(variantType(propTypeIdent)), hint: hint,
hintString: hintStr, hintString: hintStrGodot,
hint: GodotPropertyHint.hintIdent, usage: usageExpr
usage: GodotPropertyUsageFlags.usageIdent
) )
{.push warning[ProveInit]: on.} {.push warning[ProveInit]: on.}
when hasDefaultValue: when hasDefaultValue:
attr.defaultValue = (defaultValueNode).toVariant().godotVariant[] attr.defaultValue = (defaultValueNode).toVariant().godotVariant[]
godotScriptRegisterProperty(getNativeLibHandle(), classNameLit, propNameLit, nativeScriptRegisterProperty(getNativeLibHandle(), classNameLit, propNameLit,
unsafeAddr attr, setFunc, getFunc) unsafeAddr attr, setFunc, getFunc)
hintStr.deinit() hintStrGodot.deinit()
static:
import strutils, sets, sequtils
proc toGodotStyle(s: string): string {.compileTime.} = proc toGodotStyle(s: string): string {.compileTime.} =
result = newStringOfCap(s.len + 10) result = newStringOfCap(s.len + 10)
@ -407,7 +440,7 @@ proc toGodotStyle(s: string): string {.compileTime.} =
proc genType(obj: ObjectDecl): NimNode {.compileTime.} = proc genType(obj: ObjectDecl): NimNode {.compileTime.} =
result = newNimNode(nnkStmtList) result = newNimNode(nnkStmtList)
# 1. Nim type definition # Nim type definition
let typeDef = newNimNode(nnkTypeDef) let typeDef = newNimNode(nnkTypeDef)
result.add(newNimNode(nnkTypeSection).add(typeDef)) result.add(newNimNode(nnkTypeSection).add(typeDef))
typeDef.add(postfix(ident(obj.name), "*")) typeDef.add(postfix(ident(obj.name), "*"))
@ -415,27 +448,50 @@ proc genType(obj: ObjectDecl): NimNode {.compileTime.} =
let objTy = newNimNode(nnkObjectTy) let objTy = newNimNode(nnkObjectTy)
typeDef.add(newNimNode(nnkRefTy).add(objTy)) typeDef.add(newNimNode(nnkRefTy).add(objTy))
objTy.add(newEmptyNode()) objTy.add(newEmptyNode())
if obj.parentName.isNil: if obj.parentName.len == 0:
objTy.add(newEmptyNode()) objTy.add(newEmptyNode())
else: else:
objTy.add(newNimNode(nnkOfInherit).add(ident(obj.parentName))) objTy.add(newNimNode(nnkOfInherit).add(ident(obj.parentName)))
let recList = newNimNode(nnkRecList) let recList = newNimNode(nnkRecList)
objTy.add(recList) objTy.add(recList)
let initBody = newStmtList()
for decl in obj.fields: for decl in obj.fields:
if not decl.defaultValue.isNil and decl.defaultValue.kind != nnkEmpty: if not decl.defaultValue.isNil and decl.defaultValue.kind != nnkEmpty:
parseError(decl.defaultValue, initBody.add(newNimNode(nnkAsgn).add(newDotExpr(ident("self"), decl.name),
"Default values are not supported for fields for now.") decl.defaultValue))
let name = if not decl.isExported: decl.name let name = if not decl.isExported: decl.name
else: postfix(decl.name, "*") else: postfix(decl.name, "*")
recList.add(newIdentDefs(name, decl.typ)) recList.add(newIdentDefs(name, decl.typ))
# 2. {.this: self.} for convenience # Add default values and/or super call to init method
result.add(newNimNode(nnkPragma).add(newNimNode(nnkExprColonExpr).add( initBody.insert(0, newNimNode(nnkCommand).add(ident("procCall"),
ident("this"), ident("self") 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)
# 3. Nim proc defintions 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) var decls = newSeqOfCap[NimNode](obj.methods.len)
for meth in obj.methods: for meth in obj.methods:
let selfArg = newIdentDefs(ident("self"), ident(obj.name)) let selfArg = newIdentDefs(ident("self"), ident(obj.name))
@ -452,49 +508,69 @@ proc genType(obj: ObjectDecl): NimNode {.compileTime.} =
for meth in obj.methods: for meth in obj.methods:
result.add(meth.nimNode) result.add(meth.nimNode)
# 4. Register Godot object # Register Godot object
let parentName = if obj.parentName.isNil: newStrLitNode("Object") let parentName = if obj.parentName.len == 0: newStrLitNode("Object")
else: newStrLitNode(obj.parentName) else: newStrLitNode(obj.parentName)
let classNameLit = newCStringLit(obj.name) let classNameLit = newStrLitNode(obj.name)
let classNameIdent = ident(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 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( result.add(getAst(
registerGodotClass(classNameIdent, classNameLit, isRef, parentName, registerGodotClass(classNameIdent, classNameLit, newLit(isRef), parentName,
genSym(nskProc, "createFunc"), obj.isTool))) genSym(nskProc, "createFunc"), newLit(obj.isTool))))
# 5. Register fields (properties) # Register fields (properties)
for field in obj.fields: for field in obj.fields:
if field.isNoGodot: continue if field.isNoGodot: continue
let hintTip = if field.hintTip.isNil: "" let hintStr = if field.hintStr.isNone: "NIM"
else: field.hintTip else: field.hintStr.get
let hint = if field.hint.isNil: "None" let hint = if field.hint.isNone: "NIM"
else: field.hint else: field.hint.get
let usage = if field.usage.isNil: "Default" let usage =
else: field.usage if field.usage.isNil:
newLit(ord(GodotPropertyUsage.Default) or
ord(GodotPropertyUsage.ScriptVariable))
else: field.usage
let hasDefaultValue = not field.defaultValue.isNil and let hasDefaultValue = not field.defaultValue.isNil and
field.defaultValue.kind != nnkEmpty field.defaultValue.kind != nnkEmpty
let hintIdent = ident(hint) let hintIdent = ident(hint)
let usageIdent = ident(usage) let nimType = repr field.typ
result.add(getAst( result.add(getAst(
registerGodotField(classNameLit, classNameIdent, registerGodotField(classNameLit, classNameIdent,
newCStringLit(toGodotStyle($field.name.basename())), newCStringLit(toGodotStyle($field.name.basename())),
ident(field.name), newCStringLit($field.typ), ident(field.name), nimType,
field.typ, genSym(nskProc, "setFunc"), field.typ, genSym(nskProc, "setFunc"),
genSym(nskProc, "getFunc"), genSym(nskProc, "getFunc"),
newStrLitNode(hintTip), hintIdent, usageIdent, newStrLitNode(hintStr), hintIdent, usage,
ident($hasDefaultValue), field.defaultValue))) ident($hasDefaultValue), field.defaultValue)))
# 6. Register methods # Register methods
template registerGodotMethod(classNameLit, classNameIdent, methodNameIdent, template registerGodotMethod(classNameLit, classNameIdent, methodNameIdent,
methodNameLit, minArgs, maxArgs, methodNameLit, minArgs, maxArgs,
argTypes, methFuncIdent, hasReturnValue) = 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, proc methFuncIdent(obj: ptr GodotObject, methodData: pointer,
userData: pointer, numArgs: cint, userData: pointer, numArgs: cint,
args: var array[MAX_ARG_COUNT, ptr GodotVariant]): args: var array[MAX_ARG_COUNT, ptr GodotVariant]):
GodotVariant {.noconv.} = 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) let self = cast[classNameIdent](userData)
const isStaticCall = methodNameLit == cstring"_ready" or const isStaticCall = methodNameLit == cstring"_ready" or
methodNameLit == cstring"_process" or
methodNameLit == cstring"_fixed_process" or
methodNameLit == cstring"_enter_tree" or methodNameLit == cstring"_enter_tree" or
methodNameLit == cstring"_exit_tree" or methodNameLit == cstring"_exit_tree" or
methodNameLit == cstring"_enter_world" or methodNameLit == cstring"_enter_world" or
@ -515,8 +591,8 @@ proc genType(obj: ObjectDecl): NimNode {.compileTime.} =
let meth = GodotInstanceMethod( let meth = GodotInstanceMethod(
meth: methFuncIdent meth: methFuncIdent
) )
godotScriptRegisterMethod(getNativeLibHandle(), classNameLit, methodNameLit, nativeScriptRegisterMethod(getNativeLibHandle(), classNameLit,
GodotMethodAttributes(), meth) methodNameLit, GodotMethodAttributes(), meth)
for meth in obj.methods: for meth in obj.methods:
if meth.isNoGodot: continue if meth.isNoGodot: continue
@ -533,8 +609,8 @@ proc genType(obj: ObjectDecl): NimNode {.compileTime.} =
else: toGodotStyle(meth.name) else: toGodotStyle(meth.name)
let hasReturnValueBool = not (meth.returnType.isNil or let hasReturnValueBool = not (meth.returnType.isNil or
meth.returnType.kind == nnkEmpty or meth.returnType.kind == nnkEmpty or
(meth.returnType.kind == nnkIdent and (meth.returnType.kind == nnkIdent and
meth.returnType.ident == !"void")) meth.returnType.strVal == "void"))
let hasReturnValue = if hasReturnValueBool: ident("true") let hasReturnValue = if hasReturnValueBool: ident("true")
else: ident("false") else: ident("false")
result.add(getAst( result.add(getAst(
@ -552,19 +628,15 @@ proc genType(obj: ObjectDecl): NimNode {.compileTime.} =
let refDec = GodotInstanceMethod( let refDec = GodotInstanceMethod(
meth: refcountDecremented meth: refcountDecremented
) )
godotScriptRegisterMethod(getNativeLibHandle(), classNameLit, nativeScriptRegisterMethod(getNativeLibHandle(), classNameLit,
cstring"_refcount_incremented", cstring"_refcount_incremented",
GodotMethodAttributes(), refInc) GodotMethodAttributes(), refInc)
godotScriptRegisterMethod(getNativeLibHandle(), classNameLit, nativeScriptRegisterMethod(getNativeLibHandle(), classNameLit,
cstring"_refcount_decremented", cstring"_refcount_decremented",
GodotMethodAttributes(), refDec) GodotMethodAttributes(), refDec)
result.add(getAst(registerRefIncDec(classNameLit))) result.add(getAst(registerRefIncDec(classNameLit)))
{.push warning[Deprecated]: off.} macro gdobj*(ast: varargs[untyped]): untyped =
# 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.} =
## Generates Godot type. Self-documenting example: ## Generates Godot type. Self-documenting example:
## ##
## .. code-block:: nim ## .. code-block:: nim
@ -572,25 +644,25 @@ macro gdobj*(definition: untyped, body: typed): typed {.immediate.} =
## ##
## gdobj MyObj of Node: ## gdobj MyObj of Node:
## var myField: int ## 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, tip: "20".}: string ## var myString* {.gdExport, hint: Length, hintStr: "20".}: string
## ## Exported to Godot as ``my_string``. ## ## Exported to Godot as ``my_string``.
## ## Editor will limit this string to length 20. ## ## Editor will limit this string to length 20.
## ## ``hint` is a value of ``GodotPropertyHint`` enum. ## ## ``hint` is a value of ``GodotPropertyHint`` enum.
## ## ``tip`` depends on the value of ``hint``, its format is described ## ## ``hintStr`` depends on the value of ``hint``, its format is
## ## in ``GodotPropertyHint`` documentation. ## ## described in ``GodotPropertyHint`` documentation.
## ##
## method ready*() = ## method ready*() =
## ## Exported methods are exported to Godot by default, ## ## Exported methods are exported to Godot by default,
## ## and their Godot names are prefixed with ``_`` ## ## and their Godot names are prefixed with ``_``
## ## (in this case ``_ready``) ## ## (in this case ``_ready``)
## print("I am ready! myString is: " & myString) ## print("I am ready! myString is: " & self.myString)
## ##
## proc myProc*() {.gdExport.} = ## proc myProc*() {.gdExport.} =
## ## Exported to Godot as ``my_proc`` ## ## Exported to Godot as ``my_proc``
## print("myProc is called! Incrementing myField.") ## print("myProc is called! Incrementing myField.")
## inc myField ## inc self.myField
## ##
## If parent type is omitted, the type is inherited from ``Object``. ## If parent type is omitted, the type is inherited from ``Object``.
## ##
@ -608,7 +680,5 @@ macro gdobj*(definition: untyped, body: typed): typed {.immediate.} =
## `gdnew <godotnim.html#gdnew>`_ or by using ## `gdnew <godotnim.html#gdnew>`_ or by using
## `load <godotapi/resource_loader.html#load,string,string,bool>`_ or any other way ## `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>`_. ## that you can find in `Godot API <index.html#modules-godot-api>`_.
let typeDef = parseType(definition, callsite()) let typeDef = parseType(ast)
result = genType(typeDef) result = genType(typeDef)
{.push warning[Deprecated]: on.}

File diff suppressed because it is too large Load diff

View file

@ -1 +1,2 @@
--path:"$projectdir/../" --path:"$projectdir/../"
-d:useRealtimeGc

View file

@ -1,23 +0,0 @@
# Copyright 2017 Xored Software, Inc.
import asyncdispatch
import godot, node
{.warning: ("NimRuntime is deprecated - it is no longer necessary to add it " &
"as an AutoLoad class. It will be removed in v0.5.0.").}
gdobj NimRuntime of Node:
method enterTree*() =
discard getTree().connect("idle_frame", self, "idle", newArray())
method exitTree*() =
getTree().disconnect("idle_frame", self, "idle")
proc idle*() {.gdExport.} =
if asyncdispatch.hasPendingOperations():
poll(0)
GC_step(2000, false, 0)
when not defined(release):
onUnhandledException = proc(errorMsg: string) =
printError("Unhandled Nim exception: " & errorMsg)