Compare commits

..

63 Commits

Author SHA1 Message Date
Rémi Verschelde
290d629f14 headers: Sync with Godot 3.1.2
Commit authored long after 3.1.2 was released, just adding this here for the
sake of not having missed a release, if anyone needs its headers.
2021-09-27 13:06:11 +02:00
Rémi Verschelde
2fb605531a Update godot_headers URL after repo move 2021-09-27 13:02:54 +02:00
Bastiaan Olij
e4ad265339 Update godot_headers after we discovered an upstream issue 2019-05-02 22:55:31 +10:00
Bastiaan Olij
9bebf4feb7 Using godot_headers that is in sync with Godot 3.1.1 2019-05-02 21:43:14 +10:00
Bastiaan Olij
7e8c24f0ac Merge pull request #263 from underdoeg/patch-1
changes to cmake file so it can be used as a subdirectory
2019-04-12 22:25:12 +10:00
Philip Whitfield
468dab8f01 Update CMakeLists.txt
changes so this cmake file can be used as a subdirectory
```
add_subdirectory(godot-cpp)

project(project-name)
add_library(project-name SHARED src/init.cpp)
target_link_libraries(project-name godot-cpp)
```
2019-04-11 11:56:42 +02:00
Bastiaan Olij
df04c4097f Merge pull request #259 from BastiaanOlij/update_3.1_stable
Synced with Godot 3.1 stable
2019-04-07 17:05:48 +10:00
Bastiaan Olij
459d3d28e4 Synced with Godot 3.1 stable 2019-04-07 17:59:53 +10:00
Bastiaan Olij
c714f99376 Merge pull request #235 from lzubiaur/fix-osx-arch
Set default arch to 64bits for osx platform
2019-04-07 15:48:22 +10:00
Thomas Herzog
05e5f5cd5e Merge pull request #243 from PoignardAzur/patch-1
Add instructions to use submodules
2019-03-13 16:51:53 +01:00
Olivier FAURE
a76df5c7d1 Add instructions to use submodules
Git submodules are a little tricky to use, but are the default
way to go when adding a github project as a dependency in C++.

Add instructions on how to add godot-cpp as a dependency when
working from an existing repository.
2019-03-13 15:56:53 +01:00
Thomas Herzog
422140dd61 Merge pull request #242 from touilleMan/correct-makefile-args
Fix Makefile platform and bits arguments passing to scons
2019-03-10 19:33:49 +01:00
Emmanuel Leblond
0fa4ad290d Fix Makefile platform and bits arguments passing to scons 2019-03-10 12:38:55 +01:00
Thomas Herzog
cfb4dcfad2 Merge pull request #239 from Calinou/use-markdown-license
Use Markdown format for the license
2019-02-25 08:41:42 +01:00
Hugo Locurcio
45a9f58f5e Use Markdown format for the license 2019-02-24 15:57:29 +01:00
lzubiaur
e0295d7cd4 Set default arch to 64bits for osx platform 2019-02-12 08:32:26 +09:00
Thomas Herzog
2a4e82b77e Merge pull request #229 from arimus/binding-typename-fix
escape 'typename' keyword, which is causing errors when generating bindings
2019-02-04 08:46:19 +01:00
David Castro
30500632b1 escape 'typename' keyword, which is causing errors when generating bindings 2019-02-03 17:55:16 -08:00
Bastiaan Olij
262d53c05e Merge pull request #221 from bruvzg/rect2_pos
Renamed Rect2::pos to Rect2::position
2018-12-28 20:19:44 +11:00
bruvzg
aad175aa09 Renamed Rect2::pos to Rect2::position 2018-12-13 11:10:25 +02:00
Bastiaan Olij
342593c78d Merge pull request #187 from Acclution/cmake
Added cmake build script
2018-12-04 21:58:26 +11:00
Acclution
7a22fd0a78 Updated cmake to the new nativescript 1.1 2018-12-02 22:14:26 +01:00
Bastiaan Olij
a3b936d3b6 Merge pull request #210 from bruvzg/fix_custom_subclass_tags
Fix tags/cast_to for custom subclasses.
2018-12-03 07:48:19 +11:00
Bastiaan Olij
607b8326a3 Merge pull request #214 from marcelofg55/scons_improv_mf
Improvements on SConstruct arch detection
2018-12-02 09:29:07 +11:00
Marcelo Fernandez
2500f308a9 Improvements on SConstruct arch detection 2018-11-28 14:19:50 -03:00
Bastiaan Olij
bcc39bbf4b Merge pull request #212 from BastiaanOlij/fix_sconstruct
Fixing a few typos in SConstruct
2018-11-28 11:06:32 +11:00
Bastiaan Olij
d3d78df0b5 Fixing a few typos in SConstruct 2018-11-28 11:05:27 +11:00
bruvzg
0af05a45ce Fix tags/cast_to for custom subclasses. 2018-11-28 00:08:45 +02:00
Bastiaan Olij
295950efd4 Merge pull request #208 from willnationsdev/scons
Replace ARGUMENTS with opts.Add/env and some cleanup
2018-11-28 08:52:38 +11:00
Bastiaan Olij
6fb835c312 Merge pull request #174 from marcelofg55/profiling_data
Profiling support
2018-11-28 08:50:42 +11:00
Marcelo Fernandez
209dd56cb0 Profiling support 2018-11-27 09:45:56 -03:00
Bastiaan Olij
f4476351f0 Merge pull request #207 from bruvzg/more_nulls
Fix NULL dereferencing in get_from_variant and cast_to
2018-11-27 09:25:47 +11:00
bruvzg
be5a012ff7 Fix NULL dereferencing in get_from_variant and cast_to 2018-11-26 08:11:31 +02:00
Will Nations
7dff130849 Replace ARGUMENTS with opts.Add/env and some cleanup 2018-11-25 23:29:30 -06:00
Bastiaan Olij
5225ab2bac Merge pull request #206 from BastiaanOlij/add_clang_format
Implementing clang-format and applying it to all classes
2018-11-26 11:24:59 +11:00
Bastiaan Olij
fc20fa3fce Implementing clang-format and applying it to all classes 2018-11-24 09:09:41 +11:00
Bastiaan Olij
0a6f5d052a Merge pull request #205 from BastiaanOlij/advance_godot_headers
Hopefully last time for awhile, new godot_headers
2018-11-24 07:58:22 +11:00
Bastiaan Olij
73b661cd6c Hopefully last time for awhile, new godot_headers 2018-11-24 07:56:19 +11:00
Bastiaan Olij
1d3dbf2c51 Merge pull request #204 from bruvzg/fix_ref_2_variant
Fix NULL pointer dereferencing on uninstantiated Ref<T>() conversion to Variant
2018-11-24 07:54:02 +11:00
bruvzg
c2b59773af Fix NULL pointer dereferencing on uninstantiated Ref<T>() conversion to Variant 2018-11-22 23:41:33 +02:00
Bastiaan Olij
f10ce0a6be Merge pull request #203 from BastiaanOlij/new_godot_headers
Update submodule to latest godot_headers
2018-11-22 22:24:03 +11:00
Bastiaan Olij
e7de09f1ce Update submodule to latest godot_headers 2018-11-22 22:23:24 +11:00
Bastiaan Olij
5ce458b50a Merge pull request #202 from BastiaanOlij/redo_190
Redid PR 190 for master now that nativescript 1.1 has been merged
2018-11-22 22:19:17 +11:00
Bastiaan Olij
d7982cfac3 Redid PR 190 for master now that nativescript 1.1 has been merged 2018-11-22 22:14:28 +11:00
Bastiaan Olij
8ffda12b83 Merge pull request #201 from bruvzg/ptrcall_fix_null_args
Fix passing NULL pointers as arguments via ptrcall
2018-11-22 21:29:44 +11:00
bruvzg
715d1dc82b Fix passing NULL pointers as arguments via ptrcall 2018-11-19 22:40:31 +02:00
Bastiaan Olij
5f3d6bc233 Merge pull request #198 from bruvzg/fix_str_find_and_cmp
Add missing String::find from argument, and missing String::casecmp_to functions
2018-11-19 21:29:39 +11:00
Bastiaan Olij
cec7c2a223 Merge pull request #197 from bruvzg/fix_icall_int64_and_tagbd_reg
Fix ptrcall int size and TagDB registration for classes with "_" in the name.
2018-11-19 21:29:03 +11:00
Bastiaan Olij
e83fd994f8 Merge pull request #199 from BastiaanOlij/fix_xform
Redid kirsanium xform fix
2018-11-19 21:20:18 +11:00
Bastiaan Olij
987cca0d4d Redid kirsanium xform fix 2018-11-19 21:16:01 +11:00
bruvzg
39445f144c Add missing String::(r)find(n) form argument
Add missing String::(*)casecmp_to functions
2018-11-18 14:37:06 +02:00
bruvzg
ec5d718191 Fix TagDB registration for classes with underscore in the name. 2018-11-17 18:25:12 +02:00
bruvzg
700310c8c3 Fix ptrcall passing invalid size int. 2018-11-17 18:23:52 +02:00
Bastiaan Olij
d6a8885e31 Merge pull request #195 from BastiaanOlij/branch_info
Added info about the older branches to the README.md
2018-11-07 21:49:53 +11:00
Bastiaan Olij
b7ee774a59 Added info about the older branches to the README.md 2018-11-07 21:48:16 +11:00
Bastiaan Olij
d0d18ca704 Merge pull request #194 from BastiaanOlij/nativescript-1.1-rebased
Nativescript 1.1 rebased
2018-11-07 21:29:40 +11:00
karroffel
200bf226bf Nativescript 1.1
implemented instance binding data usage

This commit changes the way C++ wrapper classes work.
Previously, wrapper classes were merely wrapper *interfaces*.
They used the `this` pointer to store the actual foreign Godot
Object.

With the NativeScript 1.1 extension it is now possible to have
low-overhead language binding data attached to Objects.

The C++ bindings use that feature to implement *proper* wrappers
and enable regular C++ inheritance usage that way.

Some things might still be buggy and untested, but the C++
SimpleDemo works with those changes.

new and free change, custom free will crash engine, be wary

fix exporting of non-object types

fix free() crash with custom resources

added type tags and safe object casting

fix global type registration order

fix cast_to

changed build system to be more self contained

updated .gitignore

use typeid() for type tags now

fix indentation in bindings generator

remove accidentally added files

fix gitignore

Fixed up registering tool and updated godot_headers

Fix crash when calling String::split/split_floats

Was casting to the wrong object type.
Also adds parse_ints function to String with the same logic

Better warning/error macros

Change gitignore so we get our gen folders

New documentation based on nativescript 1.1

Fixed GODOT_SUBCLASS macro

Preventing crash when function returned null ptr

Adds needed include <typeinfo>

 Solves this issue #168 due to not having the include of typeinfo

Fix compile error of 'WARN_PRINT' and 'ERR_PRINT'.

cannot pass non-trivial object of type 'godot::String' to variadic function; expected type from format string was 'char *' [-Wnon-pod-varargs]

update vector3::distance_to

Remove godot_api.json as its now in the godot_headers submodule (api.json)
2018-11-07 21:23:08 +11:00
Thomas Herzog
1729360e6e Merge pull request #192 from marcelofg55/win32_fix
Fix Windows 32 bits builds producing 64 bits code
2018-10-26 08:51:52 +02:00
Marcelo Fernandez
13f4f0e8f8 Fix Windows 32 bits builds producing 64 bits code 2018-10-25 13:35:33 -03:00
Bastiaan Olij
f52cc4c964 Merge pull request #183 from Acclution/master
Fix issue where Vector2::normalize() did not normalize correctly
2018-09-09 17:59:39 +10:00
Christoffer
ffb087caed Fix issue where Vector2::normalize() did not normalize correctly 2018-09-03 19:19:56 +02:00
Thomas Herzog
72d227dd1c Merge pull request #171 from Calinou/improve-buildsystem
Improve the build system
2018-08-17 12:09:23 +02:00
Hugo Locurcio
46fe7ada03 Improve the build system
- The SCons option system is now used for validation
- An help message can now be displayed using `scons -h`
- New `use_mingw` option to compile using MinGW on Windows
- Removed `arch` in favor of `bits`
- Renamed `headers` to `headers_dir`
- Built libraries now contain the target in the file name
2018-08-17 12:01:16 +02:00
58 changed files with 3330 additions and 144015 deletions

126
.clang-format Normal file
View File

@@ -0,0 +1,126 @@
# Commented out parameters are those with the same value as base LLVM style
# We can uncomment them if we want to change their value, or enforce the
# chosen value in case the base style changes (last sync: Clang 6.0.1).
---
### General config, applies to all languages ###
BasedOnStyle: LLVM
AccessModifierOffset: -4
AlignAfterOpenBracket: DontAlign
# AlignConsecutiveAssignments: false
# AlignConsecutiveDeclarations: false
# AlignEscapedNewlines: Right
# AlignOperands: true
AlignTrailingComments: false
AllowAllParametersOfDeclarationOnNextLine: false
# AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: true
AllowShortFunctionsOnASingleLine: Inline
AllowShortIfStatementsOnASingleLine: true
# AllowShortLoopsOnASingleLine: false
# AlwaysBreakAfterDefinitionReturnType: None
# AlwaysBreakAfterReturnType: None
# AlwaysBreakBeforeMultilineStrings: false
# AlwaysBreakTemplateDeclarations: false
# BinPackArguments: true
# BinPackParameters: true
# BraceWrapping:
# AfterClass: false
# AfterControlStatement: false
# AfterEnum: false
# AfterFunction: false
# AfterNamespace: false
# AfterObjCDeclaration: false
# AfterStruct: false
# AfterUnion: false
# AfterExternBlock: false
# BeforeCatch: false
# BeforeElse: false
# IndentBraces: false
# SplitEmptyFunction: true
# SplitEmptyRecord: true
# SplitEmptyNamespace: true
# BreakBeforeBinaryOperators: None
# BreakBeforeBraces: Attach
# BreakBeforeInheritanceComma: false
BreakBeforeTernaryOperators: false
# BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: AfterColon
# BreakStringLiterals: true
ColumnLimit: 0
# CommentPragmas: '^ IWYU pragma:'
# CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 8
ContinuationIndentWidth: 8
Cpp11BracedListStyle: false
# DerivePointerAlignment: false
# DisableFormat: false
# ExperimentalAutoDetectBinPacking: false
# FixNamespaceComments: true
# ForEachMacros:
# - foreach
# - Q_FOREACH
# - BOOST_FOREACH
# IncludeBlocks: Preserve
IncludeCategories:
- Regex: '".*"'
Priority: 1
- Regex: '^<.*\.h>'
Priority: 2
- Regex: '^<.*'
Priority: 3
# IncludeIsMainRegex: '(Test)?$'
IndentCaseLabels: true
# IndentPPDirectives: None
IndentWidth: 4
# IndentWrappedFunctionNames: false
# JavaScriptQuotes: Leave
# JavaScriptWrapImports: true
# KeepEmptyLinesAtTheStartOfBlocks: true
# MacroBlockBegin: ''
# MacroBlockEnd: ''
# MaxEmptyLinesToKeep: 1
# NamespaceIndentation: None
# PenaltyBreakAssignment: 2
# PenaltyBreakBeforeFirstCallParameter: 19
# PenaltyBreakComment: 300
# PenaltyBreakFirstLessLess: 120
# PenaltyBreakString: 1000
# PenaltyExcessCharacter: 1000000
# PenaltyReturnTypeOnItsOwnLine: 60
# PointerAlignment: Right
# RawStringFormats:
# - Delimiter: pb
# Language: TextProto
# BasedOnStyle: google
# ReflowComments: true
# SortIncludes: true
# SortUsingDeclarations: true
# SpaceAfterCStyleCast: false
# SpaceAfterTemplateKeyword: true
# SpaceBeforeAssignmentOperators: true
# SpaceBeforeParens: ControlStatements
# SpaceInEmptyParentheses: false
# SpacesBeforeTrailingComments: 1
# SpacesInAngles: false
# SpacesInContainerLiterals: true
# SpacesInCStyleCastParentheses: false
# SpacesInParentheses: false
# SpacesInSquareBrackets: false
TabWidth: 4
UseTab: Always
---
### C++ specific config ###
Language: Cpp
Standard: Cpp03
---
### ObjC specific config ###
Language: ObjC
ObjCBlockIndentWidth: 4
# ObjCSpaceAfterProperty: false
# ObjCSpaceBeforeProtocolList: true
---
### Java specific config ###
Language: Java
# BreakAfterJavaFieldAnnotations: false
...

2
.gitmodules vendored
View File

@@ -1,3 +1,3 @@
[submodule "godot_headers"] [submodule "godot_headers"]
path = godot_headers path = godot_headers
url = https://github.com/GodotNativeTools/godot_headers url = https://github.com/godotengine/godot-headers

181
CMakeLists.txt Normal file
View File

@@ -0,0 +1,181 @@
# cmake arguments
# CMAKE_BUILD_TYPE: Compilation target (Debug or Release defaults to Debug)
#
# godot-cpp cmake arguments
# GODOT_HEADERS_DIR: This is where the gdnative include folder is (godot_source/modules/gdnative/include)
# GODOT_CUSTOM_API_FILE: This is if you have another path for the godot_api.json
#
# Android cmake arguments
# CMAKE_TOOLCHAIN_FILE: The path to the android cmake toolchain ($ANDROID_NDK/build/cmake/android.toolchain.cmake)
# ANDROID_NDK: The path to the android ndk root folder
# ANDROID_TOOLCHAIN_NAME: The android toolchain (arm-linux-androideabi-4.9 or aarch64-linux-android-4.9 or x86-4.9 or x86_64-4.9)
# ANDROID_PLATFORM: The android platform version (android-23)
# More info here: https://godot.readthedocs.io/en/latest/development/compiling/compiling_for_android.html
#
# Examples
#
# Builds a debug version:
# cmake .
# cmake --build .
#
# Builds a release version with clang
# CC=/usr/bin/clang CXX=/usr/bin/clang++ cmake -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" .
# cmake --build .
#
# Builds an android armeabi-v7a debug version:
# cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_NDK=$ANDROID_NDK \
# -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 -DANDROID_PLATFORM=android-23 -DCMAKE_BUILD_TYPE=Debug .
# cmake --build .
#
# Protip
# Generate the buildfiles in a sub directory to not clutter the root directory with build files:
# mkdir build && cd build && cmake -G "Unix Makefiles" .. && cmake --build .
#
# Todo
# Test build for Windows, Mac and mingw.
project(godot-cpp)
cmake_minimum_required(VERSION 3.6)
# Change the output directory to the bin directory
set(BUILD_PATH ${CMAKE_SOURCE_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${BUILD_PATH}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${BUILD_PATH}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${BUILD_PATH}")
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${BUILD_PATH}")
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${BUILD_PATH}")
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${BUILD_PATH}")
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${BUILD_PATH}")
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${BUILD_PATH}")
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${BUILD_PATH}")
# Default build type is Debug in the SConstruct
if(CMAKE_BUILD_TYPE STREQUAL "")
set(CMAKE_BUILD_TYPE Debug)
endif()
if(CMAKE_BUILD_TYPE MATCHES Debug)
add_definitions(-D_DEBUG)
else()
add_definitions(-DNDEBUG)
endif(CMAKE_BUILD_TYPE MATCHES Debug)
# Set the c++ standard to c++14
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Input from user for godot headers and the api file
set(GODOT_HEADERS_DIR "godot_headers" CACHE STRING "")
set(GODOT_CUSTOM_API_FILE "godot_headers/api.json" CACHE STRING "")
set(GODOT_COMPILE_FLAGS )
set(GODOT_LINKER_FLAGS )
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
# using Visual Studio C++
set(GODOT_COMPILE_FLAGS "/EHsc /WX") # /GF /MP
if(CMAKE_BUILD_TYPE MATCHES Debug)
set(GODOT_COMPILE_FLAGS "${GODOT_COMPILE_FLAGS} /MDd") # /Od /RTC1 /Zi
else()
set(GODOT_COMPILE_FLAGS "${GODOT_COMPILE_FLAGS} /MD /O2") # /Oy /GL /Gy
STRING(REGEX REPLACE "/RTC(su|[1su])" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
string(REPLACE "/RTC1" "" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
endif(CMAKE_BUILD_TYPE MATCHES Debug)
# Disable conversion warning, trunkation, unreferenced var, signed missmatch
set(GODOT_COMPILE_FLAGS "${GODOT_COMPILE_FLAGS} /wd4244 /wd4305 /wd4101 /wd4018 /wd4267")
# Todo: Check if needed.
add_definitions(-DWIN32_LEAN_AND_MEAN -D_CRT_SECURE_NO_WARNINGS)
# Unkomment for warning level 4
#if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
# string(REGEX REPLACE "/W[0-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
#endif()
else()
#elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
# using Clang
#elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
# using GCC and maybe MinGW?
set(GODOT_LINKER_FLAGS "-static-libgcc -static-libstdc++ -Wl,-R,'$$ORIGIN'")
# Hmm.. maybe to strikt?
set(GODOT_COMPILE_FLAGS "-fPIC -g -Wwrite-strings")
set(GODOT_COMPILE_FLAGS "${GODOT_COMPILE_FLAGS} -Wchar-subscripts -Wcomment -Wdisabled-optimization")
set(GODOT_COMPILE_FLAGS "${GODOT_COMPILE_FLAGS} -Wformat -Wformat=2 -Wformat-security -Wformat-y2k")
set(GODOT_COMPILE_FLAGS "${GODOT_COMPILE_FLAGS} -Wimport -Winit-self -Winline -Winvalid-pch -Werror")
set(GODOT_COMPILE_FLAGS "${GODOT_COMPILE_FLAGS} -Wlong-long -Wmissing-braces -Wmissing-format-attribute")
set(GODOT_COMPILE_FLAGS "${GODOT_COMPILE_FLAGS} -Wmissing-include-dirs -Wmissing-noreturn -Wpacked -Wpointer-arith")
set(GODOT_COMPILE_FLAGS "${GODOT_COMPILE_FLAGS} -Wredundant-decls -Wreturn-type -Wsequence-point")
set(GODOT_COMPILE_FLAGS "${GODOT_COMPILE_FLAGS} -Wswitch -Wswitch-enum -Wtrigraphs")
set(GODOT_COMPILE_FLAGS "${GODOT_COMPILE_FLAGS} -Wuninitialized -Wunknown-pragmas -Wunreachable-code -Wunused-label")
set(GODOT_COMPILE_FLAGS "${GODOT_COMPILE_FLAGS} -Wunused-value -Wvariadic-macros -Wvolatile-register-var -Wno-error=attributes")
# -Wshadow -Wextra -Wall -Weffc++ -Wfloat-equal -Wstack-protector -Wunused-parameter -Wsign-compare -Wunused-variable -Wcast-align
# -Wunused-function -Wstrict-aliasing -Wstrict-aliasing=2 -Wmissing-field-initializers
if(NOT CMAKE_SYSTEM_NAME STREQUAL "Android")
set(GODOT_COMPILE_FLAGS "${GODOT_COMPILE_FLAGS} -Wno-ignored-attributes")
endif()
if(CMAKE_BUILD_TYPE MATCHES Debug)
set(GODOT_COMPILE_FLAGS "${GODOT_COMPILE_FLAGS} -fno-omit-frame-pointer -O0")
else()
set(GODOT_COMPILE_FLAGS "${GODOT_COMPILE_FLAGS} -O3")
endif(CMAKE_BUILD_TYPE MATCHES Debug)
endif()
# Generate source from the bindings file
message(STATUS "Generating Bindings")
execute_process(COMMAND "python" "-c" "import binding_generator; binding_generator.generate_bindings(\"${GODOT_CUSTOM_API_FILE}\")"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
RESULT_VARIABLE GENERATION_RESULT
OUTPUT_VARIABLE GENERATION_OUTPUT)
message(STATUS ${GENERATION_RESULT} ${GENERATION_OUTPUT})
# Get Sources
file(GLOB_RECURSE SOURCES src/*.c**)
file(GLOB_RECURSE HEADERS include/*.h**)
# Define our godot-cpp library
add_library(${PROJECT_NAME} ${SOURCES} ${HEADERS})
target_include_directories(${PROJECT_NAME}
PUBLIC
include
include/core
include/gen
)
# Put godot headers as SYSTEM PUBLIC to exclude warnings from irrelevant headers
target_include_directories(${PROJECT_NAME}
SYSTEM PUBLIC
${GODOT_HEADERS_DIR}
)
# Add the compile flags
set_property(TARGET ${PROJECT_NAME} APPEND_STRING PROPERTY COMPILE_FLAGS ${GODOT_COMPILE_FLAGS})
set_property(TARGET ${PROJECT_NAME} APPEND_STRING PROPERTY LINK_FLAGS ${GODOT_LINKER_FLAGS})
# Create the correct name (godot.os.build_type.system_bits)
set(BITS 32)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(BITS 64)
endif(CMAKE_SIZEOF_VOID_P EQUAL 8)
string(TOLOWER ${CMAKE_SYSTEM_NAME} SYSTEM_NAME)
string(TOLOWER ${CMAKE_BUILD_TYPE} BUILD_TYPE)
if(ANDROID)
# Added the android abi after system name
set(SYSTEM_NAME ${SYSTEM_NAME}.${ANDROID_ABI})
# Android does not have the bits at the end if you look at the main godot repo build
set_property(TARGET ${PROJECT_NAME} PROPERTY OUTPUT_NAME "godot-cpp.${SYSTEM_NAME}.${BUILD_TYPE}")
else()
set_property(TARGET ${PROJECT_NAME} PROPERTY OUTPUT_NAME "godot-cpp.${SYSTEM_NAME}.${BUILD_TYPE}.${BITS}")
endif()

View File

@@ -1,6 +1,6 @@
MIT License # MIT License
Copyright (c) 2017 GodotNativeTools Copyright (c) 2017-2019 GodotNativeTools
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,13 +1,12 @@
GENERATE_BINDINGS = no GENERATE_BINDINGS = no
HEADERS = godot_headers HEADERS = godot_headers
TARGET = debug TARGET = debug
NAME = godot-cpp
USE_CLANG = no USE_CLANG = no
BASE = scons n=$(NAME) use_llvm=$(USE_CLANG) generate_bindings=$(GENERATE_BINDINGS) target=$(TARGET) headers=$(HEADERS) -j4 BASE = scons use_llvm=$(USE_CLANG) generate_bindings=$(GENERATE_BINDINGS) target=$(TARGET) headers=$(HEADERS) -j4
LINUX = $(BASE) p=linux LINUX = $(BASE) platform=linux
WINDOWS = $(BASE) p=windows WINDOWS = $(BASE) platform=windows
OSX = $(BASE) p=osx OSX = $(BASE) platform=osx
all: all:
@@ -20,10 +19,10 @@ linux:
make linux64 make linux64
linux32: SConstruct linux32: SConstruct
$(LINUX) a=32 $(LINUX) bits=32
linux64: SConstruct linux64: SConstruct
$(LINUX) a=64 $(LINUX) bits=64
windows: windows:
@@ -31,10 +30,10 @@ windows:
make windows64 make windows64
windows32: SConstruct windows32: SConstruct
$(WINDOWS) a=32 $(WINDOWS) bits=32
windows64: SConstruct windows64: SConstruct
$(WINDOWS) a=64 $(WINDOWS) bits=64
osx: osx:
@@ -42,7 +41,7 @@ osx:
make osx64 make osx64
osx32: SConstruct osx32: SConstruct
$(OSX) a=32 $(OSX) bits=32
osx64: SConstruct osx64: SConstruct
$(OSX) a=64 $(OSX) bits=64

View File

@@ -1,14 +1,26 @@
# godot-cpp # godot-cpp
C++ bindings for the Godot script API C++ bindings for the Godot script API
Note that the master branch in this repository is for use with Godot build from its latest master. The instructions below feature the new NativeScript 1.1 class structure and will only work for modules created for Godot 3.1 and later. Use the following branches for older implementations:
If you need to support older versions of Godot use the relevant branch for that version in this repository.
The instructions below feature the new NativeScript 1.1 class structure and will only work for modules created for Godot 3.1 and later. Version | Branch
--- | ---
**Godot 3.0 Nativescript 1.0** | [3.0](https://github.com/GodotNativeTools/godot-cpp/tree/3.0)
**Godot 3.1 Nativescript 1.0** | [nativescript-1.0](https://github.com/GodotNativeTools/godot-cpp/tree/nativescript-1.0)
Index:
- [**Contributing**](#contributing)
- [**Getting Started**](#getting-started) - [**Getting Started**](#getting-started)
- [**Creating a simple class**](#creating-a-simple-class) - [**Creating a simple class**](#creating-a-simple-class)
## Contributing
We greatly appreciate help in maintaining and extending this project.
If you wish to help out ensure you have an account on Github and create a "fork" of the this repo.
Rémi "Akien" Verschelde wrote an excellent bit of documentation for the main Godot project on this:
https://docs.godotengine.org/en/3.0/community/contributing/pr_workflow.html
It is advisible to also install clang-format and copy the files in `misc/hooks` into `.git/hooks` so format checking is done before your changes are submitted.
## Getting Started ## Getting Started
| **Build latest version of Godot** | [**GitHub**](https://github.com/godotengine/godot) | [**Docs**](https://godot.readthedocs.io/en/latest/development/compiling/index.html) | | **Build latest version of Godot** | [**GitHub**](https://github.com/godotengine/godot) | [**Docs**](https://godot.readthedocs.io/en/latest/development/compiling/index.html) |
@@ -31,6 +43,12 @@ Note that if you wish to use a specific branch, add the -b option to the clone c
$ git clone --recursive https://github.com/GodotNativeTools/godot-cpp -b 3.0 $ git clone --recursive https://github.com/GodotNativeTools/godot-cpp -b 3.0
``` ```
If your project is an existing repository, use git submodule instead:
```
$ git submodule add https://github.com/GodotNativeTools/godot-cpp
$ git submodule update --init --recursive
```
Right now our directory structure should look like this: Right now our directory structure should look like this:
``` ```
SimpleLibrary/ SimpleLibrary/
@@ -43,13 +61,13 @@ SimpleLibrary/
### Updating the api.json ### Updating the api.json
Our api.json file contains meta data of all the classes that are part of the Godot core and are needed to generate the C++ binding classes for use in GDNative modules. Our api.json file contains meta data of all the classes that are part of the Godot core and are needed to generate the C++ binding classes for use in GDNative modules.
A file is supplied in our repository for your convinience but if you are running a custom build of Godot and need access to classes that have recent changes a new api.json file must be generated. You do this by starting your Godot executable with the following parameters: This file is supplied with our godot_headers repository for your convinience but if you are running a custom build of Godot and need access to classes that have recent changes a new api.json file must be generated. You do this by starting your Godot executable with the following parameters:
``` ```
$ godot --gdnative-generate-json-api api.json $ godot --gdnative-generate-json-api api.json
``` ```
Now copy the api.json file into your folder structure so its easy to access. Now copy the api.json file into your folder structure so its easy to access. **Note** the remark below for the extra ```custom_api_file``` command line parameter needed to tell scons where to find your file.
### Compiling the cpp bindings library ### Compiling the cpp bindings library
The final step is to compile our cpp bindings library: The final step is to compile our cpp bindings library:

View File

@@ -8,109 +8,133 @@ def add_sources(sources, dir, extension):
if f.endswith('.' + extension): if f.endswith('.' + extension):
sources.append(dir + '/' + f) sources.append(dir + '/' + f)
# Try to detect the host platform automatically
# This is used if no `platform` argument is passed
if sys.platform.startswith('linux'):
host_platform = 'linux'
elif sys.platform == 'darwin':
host_platform = 'osx'
elif sys.platform == 'win32':
host_platform = 'windows'
else:
raise ValueError('Could not detect platform automatically, please specify with platform=<platform>')
opts = Variables([], ARGUMENTS)
opts.Add(EnumVariable('platform', 'Target platform', host_platform,
allowed_values=('linux', 'osx', 'windows'),
ignorecase=2))
opts.Add(EnumVariable('bits', 'Target platform bits', 'default', ('default', '32', '64')))
opts.Add(BoolVariable('use_llvm', 'Use the LLVM compiler - only effective when targeting Linux', False))
opts.Add(BoolVariable('use_mingw', 'Use the MinGW compiler - only effective on Windows', False))
# Must be the same setting as used for cpp_bindings
opts.Add(EnumVariable('target', 'Compilation target', 'debug',
allowed_values=('debug', 'release'),
ignorecase=2))
opts.Add(PathVariable('headers_dir', 'Path to the directory containing Godot headers', 'godot_headers', PathVariable.PathIsDir))
opts.Add(BoolVariable('use_custom_api_file', 'Use a custom JSON API file', False))
opts.Add(PathVariable('custom_api_file', 'Path to the custom JSON API file', None, PathVariable.PathIsFile))
opts.Add(BoolVariable('generate_bindings', 'Generate GDNative API bindings', False))
unknown = opts.UnknownVariables()
if unknown:
print("Unknown variables:" + unknown.keys())
Exit(1)
env = Environment() env = Environment()
host_platform = platform.system() opts.Update(env)
target_platform = ARGUMENTS.get('p', ARGUMENTS.get('platform', 'linux')) Help(opts.GenerateHelpText(env))
target_arch = ARGUMENTS.get('a', ARGUMENTS.get('arch', '64'))
# default to debug build, must be same setting as used for cpp_bindings
target = ARGUMENTS.get('target', 'debug')
# Local dependency paths, adapt them to your setup
godot_headers = ARGUMENTS.get('headers', 'godot_headers')
result_path = 'bin'
result_name = ARGUMENTS.get('n', ARGUMENTS.get('name', os.path.relpath('.', '..')))
# This makes sure to keep the session environment variables on Windows
# This way, you can run SCons in a Visual Studio 2017 prompt and it will find all the required tools
if env['platform'] == 'windows':
if env['bits'] == '64':
env = Environment(TARGET_ARCH='amd64')
elif env['bits'] == '32':
env = Environment(TARGET_ARCH='x86')
else:
print("Warning: bits argument not specified, target arch is=" + env['TARGET_ARCH'])
opts.Update(env)
if target_platform == 'linux' or platform == "x11": is64 = False
result_name += '.linux.' + target_arch if (env['platform'] == 'osx' or env['TARGET_ARCH'] == 'amd64' or env['TARGET_ARCH'] == 'emt64' or env['TARGET_ARCH'] == 'x86_64'):
is64 = True
if env['bits'] == 'default':
env['bits'] = '64' if is64 else '32'
env['CXX']='g++' if env['platform'] == 'linux':
if ARGUMENTS.get('use_llvm', 'no') == 'yes': if env['use_llvm']:
env['CXX'] = 'clang++' env['CXX'] = 'clang++'
env.Append(CCFLAGS = [ '-fPIC', '-g', '-Og', '-std=c++14', '-Wwrite-strings' ]) env.Append(CCFLAGS=['-fPIC', '-g', '-std=c++14', '-Wwrite-strings'])
env.Append(LINKFLAGS = [ '-Wl,-R,\'$$ORIGIN\'' ]) env.Append(LINKFLAGS=["-Wl,-R,'$$ORIGIN'"])
if target == 'debug': if env['target'] == 'debug':
env.Append(CCFLAGS=['-Og']) env.Append(CCFLAGS=['-Og'])
else: elif env['target'] == 'release':
env.Append(CCFLAGS=['-O3']) env.Append(CCFLAGS=['-O3'])
if target_arch == '32': if env['bits'] == '64':
env.Append(CCFLAGS = [ '-m32' ])
env.Append(LINKFLAGS = [ '-m32' ])
elif target_arch == '64':
env.Append(CCFLAGS=['-m64']) env.Append(CCFLAGS=['-m64'])
env.Append(LINKFLAGS=['-m64']) env.Append(LINKFLAGS=['-m64'])
elif env['bits'] == '32':
env.Append(CCFLAGS=['-m32'])
env.Append(LINKFLAGS=['-m32'])
elif target_platform == 'windows': elif env['platform'] == 'osx':
# This makes sure to keep the session environment variables on windows, if env['bits'] == '32':
# that way you can run scons in a vs 2017 prompt and it will find all the required tools raise ValueError('Only 64-bit builds are supported for the macOS target.')
if (target_arch == '64'):
env = Environment(ENV = os.environ, TARGET_ARCH='amd64')
else:
env = Environment(ENV = os.environ, TARGET_ARCH='x86')
result_name += '.windows.' + target_arch env.Append(CCFLAGS=['-g', '-std=c++14', '-arch', 'x86_64'])
env.Append(LINKFLAGS=['-arch', 'x86_64', '-framework', 'Cocoa', '-Wl,-undefined,dynamic_lookup'])
if host_platform == 'Windows': if env['target'] == 'debug':
result_name += '.lib' env.Append(CCFLAGS=['-Og'])
elif env['target'] == 'release':
env.Append(CCFLAGS=['-O3'])
elif env['platform'] == 'windows':
if host_platform == 'windows' and not env['use_mingw']:
# MSVC
env.Append(LINKFLAGS=['/WX']) env.Append(LINKFLAGS=['/WX'])
if target == 'debug': if env['target'] == 'debug':
env.Append(CCFLAGS=['/EHsc', '/D_DEBUG', '/MDd']) env.Append(CCFLAGS=['/EHsc', '/D_DEBUG', '/MDd'])
else: elif env['target'] == 'release':
env.Append(CCFLAGS=['/O2', '/EHsc', '/DNDEBUG', '/MD']) env.Append(CCFLAGS=['/O2', '/EHsc', '/DNDEBUG', '/MD'])
else: else:
if target_arch == '32': # MinGW
env['CXX']='i686-w64-mingw32-g++' if env['bits'] == '64':
elif target_arch == '64':
env['CXX'] = 'x86_64-w64-mingw32-g++' env['CXX'] = 'x86_64-w64-mingw32-g++'
elif env['bits'] == '32':
env['CXX'] = 'i686-w64-mingw32-g++'
env.Append(CCFLAGS=['-g', '-O3', '-std=c++14', '-Wwrite-strings']) env.Append(CCFLAGS=['-g', '-O3', '-std=c++14', '-Wwrite-strings'])
env.Append(LINKFLAGS=['--static', '-Wl,--no-undefined', '-static-libgcc', '-static-libstdc++']) env.Append(LINKFLAGS=['--static', '-Wl,--no-undefined', '-static-libgcc', '-static-libstdc++'])
elif target_platform == 'osx':
if ARGUMENTS.get('use_llvm', 'no') == 'yes':
env['CXX'] = 'clang++'
# Only 64-bits is supported for OS X env.Append(CPPPATH=['.', env['headers_dir'], 'include', 'include/gen', 'include/core'])
target_arch = '64'
result_name += '.osx.' + target_arch
env.Append(CCFLAGS = [ '-g','-O3', '-std=c++14', '-arch', 'x86_64' ])
env.Append(LINKFLAGS = [ '-arch', 'x86_64', '-framework', 'Cocoa', '-Wl,-undefined,dynamic_lookup' ])
else:
print("The only supported targets are 'osx', 'linux' and 'windows'.")
sys.exit(255)
env.Append(CPPPATH=['.', godot_headers, 'include', 'include/gen', 'include/core'])
# Generate bindings? # Generate bindings?
json_api_file = '' json_api_file = ''
# Generate bindings? if env['use_custom_api_file']:
json_api_file = '' json_api_file = env['custom_api_file']
if ARGUMENTS.get('use_custom_api_file', 'no') == 'yes':
json_api_file = ARGUMENTS.get('custom_api_file', '')
else: else:
json_api_file = os.path.join(os.getcwd(), 'godot_headers', 'api.json') json_api_file = os.path.join(os.getcwd(), 'godot_headers', 'api.json')
if ARGUMENTS.get('generate_bindings', 'no') == 'yes': if env['generate_bindings']:
# actually create the bindings here # Actually create the bindings here
import binding_generator import binding_generator
binding_generator.generate_bindings(json_api_file) binding_generator.generate_bindings(json_api_file)
# source to compile # source to compile
sources = [] sources = []
add_sources(sources, 'src/core', 'cpp') add_sources(sources, 'src/core', 'cpp')
add_sources(sources, 'src/gen', 'cpp') add_sources(sources, 'src/gen', 'cpp')
library = env.StaticLibrary(
library = env.StaticLibrary(target=result_path + '/' + result_name, source=sources) target='bin/' + 'libgodot-cpp.{}.{}.{}'.format(env['platform'], env['target'], env['bits']), source=sources
)
Default(library) Default(library)

View File

@@ -155,7 +155,7 @@ def generate_class_header(used_classes, c):
# ___get_class_name # ___get_class_name
source.append("\tstatic inline const char *___get_class_name() { return (const char *) \"" + strip_name(c["name"]) + "\"; }") source.append("\tstatic inline const char *___get_class_name() { return (const char *) \"" + strip_name(c["name"]) + "\"; }")
source.append("\tstatic inline Object *___get_from_variant(Variant a) { godot_object *o = (godot_object*) a; return (Object *) godot::nativescript_1_1_api->godot_nativescript_get_instance_binding_data(godot::_RegisterState::language_index, o); }") source.append("\tstatic inline Object *___get_from_variant(Variant a) { godot_object *o = (godot_object*) a; return (o) ? (Object *) godot::nativescript_1_1_api->godot_nativescript_get_instance_binding_data(godot::_RegisterState::language_index, o) : nullptr; }")
enum_values = [] enum_values = []
@@ -541,6 +541,8 @@ def generate_icall_header(icalls):
if is_core_type(arg): if is_core_type(arg):
method_signature += arg + "&" method_signature += arg + "&"
elif arg == "int":
method_signature += "int64_t "
elif arg == "float": elif arg == "float":
method_signature += "double " method_signature += "double "
elif is_primitive(arg): elif is_primitive(arg):
@@ -594,6 +596,8 @@ def generate_icall_implementation(icalls):
if is_core_type(arg): if is_core_type(arg):
method_signature += arg + "& " method_signature += arg + "& "
elif arg == "int":
method_signature += "int64_t "
elif arg == "float": elif arg == "float":
method_signature += "double " method_signature += "double "
elif is_primitive(arg): elif is_primitive(arg):
@@ -621,7 +625,7 @@ def generate_icall_implementation(icalls):
if is_primitive(arg) or is_core_type(arg): if is_primitive(arg) or is_core_type(arg):
wrapped_argument += "(void *) &arg" + str(i) wrapped_argument += "(void *) &arg" + str(i)
else: else:
wrapped_argument += "(void *) arg" + str(i) + "->_owner" wrapped_argument += "(void *) (arg" + str(i) + ") ? arg" + str(i) + "->_owner : nullptr"
wrapped_argument += "," wrapped_argument += ","
source.append(wrapped_argument) source.append(wrapped_argument)
@@ -680,7 +684,7 @@ def generate_type_registry(classes):
if base_class_name == "": if base_class_name == "":
base_class_type_hash = "0" base_class_type_hash = "0"
source.append("\tgodot::_TagDB::register_global_type(\"" + class_name + "\", " + class_type_hash + ", " + base_class_type_hash + ");") source.append("\tgodot::_TagDB::register_global_type(\"" + c["name"] + "\", " + class_type_hash + ", " + base_class_type_hash + ");")
source.append("}") source.append("}")
@@ -820,7 +824,8 @@ def escape_cpp(name):
"export": "_export", "export": "_export",
"template": "_template", "template": "_template",
"new": "new_", "new": "new_",
"operator": "_operator" "operator": "_operator",
"typename": "_typename"
} }
if name in escapes: if name in escapes:
return escapes[name] return escapes[name]

File diff suppressed because it is too large Load Diff

View File

@@ -30,7 +30,6 @@ public:
inline const Vector3 &get_size() const { return size; } inline const Vector3 &get_size() const { return size; }
inline void set_size(const Vector3 &p_size) { size = p_size; } inline void set_size(const Vector3 &p_size) { size = p_size; }
bool operator==(const AABB &p_rval) const; bool operator==(const AABB &p_rval) const;
bool operator!=(const AABB &p_rval) const; bool operator!=(const AABB &p_rval) const;
@@ -51,7 +50,6 @@ public:
bool has_point(const Vector3 &p_point) const; bool has_point(const Vector3 &p_point) const;
Vector3 get_support(const Vector3 &p_normal) const; Vector3 get_support(const Vector3 &p_normal) const;
Vector3 get_longest_axis() const; Vector3 get_longest_axis() const;
int get_longest_axis_index() const; int get_longest_axis_index() const;
real_t get_longest_axis_size() const; real_t get_longest_axis_size() const;
@@ -73,11 +71,12 @@ public:
operator String() const; operator String() const;
inline AABB() {} inline AABB() {}
inline AABB(const Vector3 &p_pos,const Vector3& p_size) { position=p_pos; size=p_size; } inline AABB(const Vector3 &p_pos, const Vector3 &p_size) {
position = p_pos;
size = p_size;
}
}; };
} } // namespace godot
#endif // RECT3_H #endif // RECT3_H

View File

@@ -21,6 +21,7 @@ class Object;
class Array { class Array {
godot_array _godot_array; godot_array _godot_array;
public: public:
Array(); Array();
Array(const Array &other); Array(const Array &other);
@@ -98,9 +99,8 @@ public:
void sort_custom(Object *obj, const String &func); void sort_custom(Object *obj, const String &func);
~Array(); ~Array();
}; };
} } // namespace godot
#endif // ARRAY_H #endif // ARRAY_H

View File

@@ -26,10 +26,6 @@ public:
Basis(); Basis();
const Vector3 &operator[](int axis) const; const Vector3 &operator[](int axis) const;
Vector3 &operator[](int axis); Vector3 &operator[](int axis);
@@ -37,7 +33,6 @@ public:
bool isequal_approx(const Basis &a, const Basis &b) const; bool isequal_approx(const Basis &a, const Basis &b) const;
bool is_orthogonal() const; bool is_orthogonal() const;
bool is_rotation() const; bool is_rotation() const;
@@ -88,7 +83,6 @@ public:
Basis operator*(const Basis &p_matrix) const; Basis operator*(const Basis &p_matrix) const;
void operator+=(const Basis &p_matrix); void operator+=(const Basis &p_matrix);
Basis operator+(const Basis &p_matrix) const; Basis operator+(const Basis &p_matrix) const;
@@ -105,14 +99,12 @@ public:
void set_orthogonal_index(int p_index); // down below void set_orthogonal_index(int p_index); // down below
operator String() const; operator String() const;
void get_axis_and_angle(Vector3 &r_axis, real_t &r_angle) const; void get_axis_and_angle(Vector3 &r_axis, real_t &r_angle) const;
/* create / set */ /* create / set */
void set(real_t xx, real_t xy, real_t xz, real_t yx, real_t yy, real_t yz, real_t zx, real_t zy, real_t zz); void set(real_t xx, real_t xy, real_t xz, real_t yx, real_t yy, real_t yz, real_t zx, real_t zy, real_t zz);
Vector3 get_column(int i) const; Vector3 get_column(int i) const;
@@ -133,10 +125,8 @@ public:
Basis diagonalize(); Basis diagonalize();
operator Quat() const; operator Quat() const;
}; };
} } // namespace godot
#endif // BASIS_H #endif // BASIS_H

View File

@@ -9,14 +9,11 @@
namespace godot { namespace godot {
struct Color { struct Color {
private: private:
// static float _parse_col(const String& p_str, int p_ofs); // static float _parse_col(const String& p_str, int p_ofs);
public: public:
union { union {
struct { struct {
@@ -82,15 +79,23 @@ public:
* No construct parameters, r=0, g=0, b=0. a=255 * No construct parameters, r=0, g=0, b=0. a=255
*/ */
inline Color() { inline Color() {
r=0; g=0; b=0; a=1.0; r = 0;
g = 0;
b = 0;
a = 1.0;
} }
/** /**
* RGB / RGBA construct parameters. Alpha is optional, but defaults to 1.0 * RGB / RGBA construct parameters. Alpha is optional, but defaults to 1.0
*/ */
inline Color(float p_r,float p_g,float p_b,float p_a=1.0) { r=p_r; g=p_g; b=p_b; a=p_a; } inline Color(float p_r, float p_g, float p_b, float p_a = 1.0) {
r = p_r;
g = p_g;
b = p_b;
a = p_a;
}
}; };
} } // namespace godot
#endif // COLOR_H #endif // COLOR_H

View File

@@ -12,8 +12,8 @@
#include "Plane.hpp" #include "Plane.hpp"
#include "PoolArrays.hpp" #include "PoolArrays.hpp"
#include "Quat.hpp" #include "Quat.hpp"
#include "Rect2.hpp"
#include "RID.hpp" #include "RID.hpp"
#include "Rect2.hpp"
#include "String.hpp" #include "String.hpp"
#include "Transform.hpp" #include "Transform.hpp"
#include "Transform2D.hpp" #include "Transform2D.hpp"
@@ -23,5 +23,4 @@
#include "Wrapped.hpp" #include "Wrapped.hpp"
#endif // CORETYPES_H #endif // CORETYPES_H

View File

@@ -1,7 +1,6 @@
#ifndef DEFS_H #ifndef DEFS_H
#define DEFS_H #define DEFS_H
namespace godot { namespace godot {
enum class Error { enum class Error {
@@ -92,9 +91,9 @@ enum class Error {
KV add_all(KV kv) { KV add_all(KV kv) {
return kv; return kv;
} }
} } // namespace helpers
} } // namespace godot
#include <stdio.h> #include <stdio.h>
@@ -109,7 +108,9 @@ typedef float real_t;
// ERR/WARN macros // ERR/WARN macros
#ifndef WARN_PRINT #ifndef WARN_PRINT
#define WARN_PRINT(msg) fprintf(stdout, "ERROR: %s\n", msg); fflush(stdout) #define WARN_PRINT(msg) \
fprintf(stdout, "ERROR: %s\n", msg); \
fflush(stdout)
#endif #endif
#ifndef WARN_PRINTS #ifndef WARN_PRINTS
@@ -129,24 +130,51 @@ typedef float real_t;
#endif #endif
#ifndef ERR_FAIL_V #ifndef ERR_FAIL_V
#define ERR_FAIL_V(a) { ERR_FAIL(); return a; } #define ERR_FAIL_V(a) \
{ \
ERR_FAIL(); \
return a; \
}
#endif #endif
#ifndef ERR_FAIL_COND #ifndef ERR_FAIL_COND
#define ERR_FAIL_COND(a) do { if (a) { ERR_PRINT(#a); return; } } while(0) #define ERR_FAIL_COND(a) \
do { \
if (a) { \
ERR_PRINT(#a); \
return; \
} \
} while (0)
#endif #endif
#ifndef ERR_FAIL_COND_V #ifndef ERR_FAIL_COND_V
#define ERR_FAIL_COND_V(cond, ret) do { if (cond) { ERR_PRINT(#cond); return ret; } } while(0) #define ERR_FAIL_COND_V(cond, ret) \
do { \
if (cond) { \
ERR_PRINT(#cond); \
return ret; \
} \
} while (0)
#endif #endif
#ifndef ERR_FAIL_INDEX #ifndef ERR_FAIL_INDEX
#define ERR_FAIL_INDEX(a, b) do { if (a < 0 || a >= b) { ERR_FAIL(); return; } } while(0) #define ERR_FAIL_INDEX(a, b) \
do { \
if (a < 0 || a >= b) { \
ERR_FAIL(); \
return; \
} \
} while (0)
#endif #endif
#ifndef ERR_FAIL_INDEX_V #ifndef ERR_FAIL_INDEX_V
#define ERR_FAIL_INDEX_V(a, b, c) do { if (a < 0 || a >= b) { ERR_FAIL(); return c; } } while(0) #define ERR_FAIL_INDEX_V(a, b, c) \
do { \
if (a < 0 || a >= b) { \
ERR_FAIL(); \
return c; \
} \
} while (0)
#endif #endif
#endif // DEFS_H #endif // DEFS_H

View File

@@ -11,6 +11,7 @@ namespace godot {
class Dictionary { class Dictionary {
godot_dictionary _godot_dictionary; godot_dictionary _godot_dictionary;
public: public:
Dictionary(); Dictionary();
Dictionary(const Dictionary &other); Dictionary(const Dictionary &other);
@@ -46,9 +47,8 @@ public:
Array values() const; Array values() const;
~Dictionary(); ~Dictionary();
}; };
} } // namespace godot
#endif // DICTIONARY_H #endif // DICTIONARY_H

View File

@@ -9,82 +9,94 @@
#include <typeinfo> #include <typeinfo>
#include "CoreTypes.hpp" #include "CoreTypes.hpp"
#include "Variant.hpp"
#include "Ref.hpp" #include "Ref.hpp"
#include "TagDB.hpp" #include "TagDB.hpp"
#include "Variant.hpp"
#include "Object.hpp" #include "Object.hpp"
#include "GodotGlobal.hpp" #include "GodotGlobal.hpp"
#include <NativeScript.hpp>
#include <GDNativeLibrary.hpp> #include <GDNativeLibrary.hpp>
#include <NativeScript.hpp>
namespace godot { namespace godot {
template <class T> template <class T>
T *as(const Object *obj) T *as(const Object *obj) {
{ return (obj) ? (T *)godot::nativescript_api->godot_nativescript_get_userdata(obj->_owner) : nullptr;
return (T *) godot::nativescript_api->godot_nativescript_get_userdata(obj->_owner);
} }
template <class T> template <class T>
T *get_wrapper(godot_object *obj) T *get_wrapper(godot_object *obj) {
{
return (T *)godot::nativescript_1_1_api->godot_nativescript_get_instance_binding_data(godot::_RegisterState::language_index, obj); return (T *)godot::nativescript_1_1_api->godot_nativescript_get_instance_binding_data(godot::_RegisterState::language_index, obj);
} }
#define GODOT_CLASS(Name, Base) \ #define GODOT_CLASS(Name, Base) \
public: inline static const char *___get_type_name() { return static_cast<const char *>(#Name); } \ \
enum { ___CLASS_IS_SCRIPT = 1, }; \ public: \
inline static Name *_new() { godot::NativeScript *script = godot::NativeScript::_new(); script->set_library(godot::get_wrapper<godot::GDNativeLibrary>((godot_object *) godot::gdnlib)); script->set_class_name(#Name); Name *instance = godot::as<Name>(script->new_()); return instance; } \ inline static const char *___get_type_name() { return static_cast<const char *>(#Name); } \
enum { ___CLASS_IS_SCRIPT = 1, \
}; \
inline static Name *_new() { \
godot::NativeScript *script = godot::NativeScript::_new(); \
script->set_library(godot::get_wrapper<godot::GDNativeLibrary>((godot_object *)godot::gdnlib)); \
script->set_class_name(#Name); \
Name *instance = godot::as<Name>(script->new_()); \
return instance; \
} \
inline static size_t ___get_id() { return typeid(Name).hash_code(); }; \
inline static size_t ___get_base_id() { return typeid(Base).hash_code(); }; \
inline static const char *___get_base_type_name() { return Base::___get_class_name(); } \ inline static const char *___get_base_type_name() { return Base::___get_class_name(); } \
inline static Object *___get_from_variant(godot::Variant a) { return (godot::Object *)godot::as<Name>(godot::Object::___get_from_variant(a)); } \ inline static Object *___get_from_variant(godot::Variant a) { return (godot::Object *)godot::as<Name>(godot::Object::___get_from_variant(a)); } \
\
private: private:
#define GODOT_SUBCLASS(Name, Base) \ #define GODOT_SUBCLASS(Name, Base) \
public: inline static const char *___get_type_name() { return static_cast<const char *>(#Name); } \ \
enum { ___CLASS_IS_SCRIPT = 1, }; \ public: \
inline static Name *_new() { godot::NativeScript *script = godot::NativeScript::_new(); script->set_library(godot::get_wrapper<godot::GDNativeLibrary>((godot_object *) godot::gdnlib)); script->set_class_name(#Name); Name *instance = godot::as<Name>(script->new_()); return instance; } \ inline static const char *___get_type_name() { return static_cast<const char *>(#Name); } \
enum { ___CLASS_IS_SCRIPT = 1, \
}; \
inline static Name *_new() { \
godot::NativeScript *script = godot::NativeScript::_new(); \
script->set_library(godot::get_wrapper<godot::GDNativeLibrary>((godot_object *)godot::gdnlib)); \
script->set_class_name(#Name); \
Name *instance = godot::as<Name>(script->new_()); \
return instance; \
} \
inline static size_t ___get_id() { return typeid(Name).hash_code(); }; \
inline static size_t ___get_base_id() { return typeid(Base).hash_code(); }; \
inline static const char *___get_base_type_name() { return #Base; } \ inline static const char *___get_base_type_name() { return #Base; } \
inline static Object *___get_from_variant(godot::Variant a) { return (godot::Object *)godot::as<Name>(godot::Object::___get_from_variant(a)); } \ inline static Object *___get_from_variant(godot::Variant a) { return (godot::Object *)godot::as<Name>(godot::Object::___get_from_variant(a)); } \
\
private: private:
template <class T> template <class T>
struct _ArgCast { struct _ArgCast {
static T _arg_cast(Variant a) static T _arg_cast(Variant a) {
{
return a; return a;
} }
}; };
template <class T> template <class T>
struct _ArgCast<T *> { struct _ArgCast<T *> {
static T *_arg_cast(Variant a) static T *_arg_cast(Variant a) {
{
return (T *)T::___get_from_variant(a); return (T *)T::___get_from_variant(a);
} }
}; };
template <> template <>
struct _ArgCast<Variant> { struct _ArgCast<Variant> {
static Variant _arg_cast(Variant a) static Variant _arg_cast(Variant a) {
{
return a; return a;
} }
}; };
// instance and destroy funcs // instance and destroy funcs
template <class T> template <class T>
void *_godot_class_instance_func(godot_object *p, void *method_data) void *_godot_class_instance_func(godot_object *p, void *method_data) {
{
T *d = new T(); T *d = new T();
d->_owner = p; d->_owner = p;
d->_type_tag = typeid(T).hash_code(); d->_type_tag = typeid(T).hash_code();
@@ -93,23 +105,20 @@ void *_godot_class_instance_func(godot_object *p, void *method_data)
} }
template <class T> template <class T>
void _godot_class_destroy_func(godot_object *p, void *method_data, void *data) void _godot_class_destroy_func(godot_object *p, void *method_data, void *data) {
{
T *d = (T *)data; T *d = (T *)data;
delete d; delete d;
} }
template <class T> template <class T>
void register_class() void register_class() {
{
godot_instance_create_func create = {}; godot_instance_create_func create = {};
create.create_func = _godot_class_instance_func<T>; create.create_func = _godot_class_instance_func<T>;
godot_instance_destroy_func destroy = {}; godot_instance_destroy_func destroy = {};
destroy.destroy_func = _godot_class_destroy_func<T>; destroy.destroy_func = _godot_class_destroy_func<T>;
_TagDB::register_type(typeid(T).hash_code(), typeid(T).hash_code()); _TagDB::register_type(T::___get_id(), T::___get_base_id());
godot::nativescript_api->godot_nativescript_register_class(godot::_RegisterState::nativescript_handle, T::___get_type_name(), T::___get_base_type_name(), create, destroy); godot::nativescript_api->godot_nativescript_register_class(godot::_RegisterState::nativescript_handle, T::___get_type_name(), T::___get_base_type_name(), create, destroy);
godot::nativescript_1_1_api->godot_nativescript_set_type_tag(godot::_RegisterState::nativescript_handle, T::___get_type_name(), (const void *)typeid(T).hash_code()); godot::nativescript_1_1_api->godot_nativescript_set_type_tag(godot::_RegisterState::nativescript_handle, T::___get_type_name(), (const void *)typeid(T).hash_code());
@@ -117,59 +126,37 @@ void register_class()
} }
template <class T> template <class T>
void register_tool_class() void register_tool_class() {
{
godot_instance_create_func create = {}; godot_instance_create_func create = {};
create.create_func = _godot_class_instance_func<T>; create.create_func = _godot_class_instance_func<T>;
godot_instance_destroy_func destroy = {}; godot_instance_destroy_func destroy = {};
destroy.destroy_func = _godot_class_destroy_func<T>; destroy.destroy_func = _godot_class_destroy_func<T>;
_TagDB::register_type(typeid(T).hash_code(), typeid(T).hash_code()); _TagDB::register_type(T::___get_id(), T::___get_base_id());
godot::nativescript_api->godot_nativescript_register_tool_class(godot::_RegisterState::nativescript_handle, T::___get_type_name(), T::___get_base_type_name(), create, destroy); godot::nativescript_api->godot_nativescript_register_tool_class(godot::_RegisterState::nativescript_handle, T::___get_type_name(), T::___get_base_type_name(), create, destroy);
godot::nativescript_1_1_api->godot_nativescript_set_type_tag(godot::_RegisterState::nativescript_handle, T::___get_type_name(), (const void *)typeid(T).hash_code()); godot::nativescript_1_1_api->godot_nativescript_set_type_tag(godot::_RegisterState::nativescript_handle, T::___get_type_name(), (const void *)typeid(T).hash_code());
T::_register_methods(); T::_register_methods();
} }
// method registering // method registering
typedef godot_variant (*__godot_wrapper_method)(godot_object *, void *, void *, int, godot_variant **); typedef godot_variant (*__godot_wrapper_method)(godot_object *, void *, void *, int, godot_variant **);
template <class T, class R, class... args> template <class T, class R, class... args>
const char *___get_method_class_name(R (T::*p)(args... a)) const char *___get_method_class_name(R (T::*p)(args... a)) {
{
return T::___get_type_name(); return T::___get_type_name();
} }
template <class T, class R, class... args> template <class T, class R, class... args>
const char *___get_method_class_name(R (T::*p)(args... a) const) const char *___get_method_class_name(R (T::*p)(args... a) const) {
{
return T::___get_type_name(); return T::___get_type_name();
} }
// Okay, time for some template magic. // Okay, time for some template magic.
// Many thanks to manpat from the GDL Discord Server. // Many thanks to manpat from the GDL Discord Server.
// This is stuff that's available in C++14 I think, but whatever. // This is stuff that's available in C++14 I think, but whatever.
template <int... I> template <int... I>
@@ -185,11 +172,11 @@ struct __construct_sequence<0, I...> {
using type = __Sequence<I...>; using type = __Sequence<I...>;
}; };
// Now the wrapping part. // Now the wrapping part.
template <class T, class R, class... As> template <class T, class R, class... As>
struct _WrappedMethod { struct _WrappedMethod {
R (T::*f)(As...); R(T::*f)
(As...);
template <int... I> template <int... I>
void apply(Variant *ret, T *obj, Variant **args, __Sequence<I...>) { void apply(Variant *ret, T *obj, Variant **args, __Sequence<I...>) {
@@ -207,10 +194,8 @@ struct _WrappedMethod<T, void, As...> {
} }
}; };
template <class T, class R, class... As> template <class T, class R, class... As>
godot_variant __wrapped_method(godot_object *, void *method_data, void *user_data, int num_args, godot_variant **args) godot_variant __wrapped_method(godot_object *, void *method_data, void *user_data, int num_args, godot_variant **args) {
{
godot_variant v; godot_variant v;
godot::api->godot_variant_new_nil(&v); godot::api->godot_variant_new_nil(&v);
@@ -226,8 +211,7 @@ godot_variant __wrapped_method(godot_object *, void *method_data, void *user_dat
} }
template <class T, class R, class... As> template <class T, class R, class... As>
void *___make_wrapper_function(R (T::*f)(As...)) void *___make_wrapper_function(R (T::*f)(As...)) {
{
using MethodType = _WrappedMethod<T, R, As...>; using MethodType = _WrappedMethod<T, R, As...>;
MethodType *p = (MethodType *)godot::api->godot_alloc(sizeof(MethodType)); MethodType *p = (MethodType *)godot::api->godot_alloc(sizeof(MethodType));
p->f = f; p->f = f;
@@ -235,62 +219,37 @@ void *___make_wrapper_function(R (T::*f)(As...))
} }
template <class T, class R, class... As> template <class T, class R, class... As>
__godot_wrapper_method ___get_wrapper_function(R (T::*f)(As...)) __godot_wrapper_method ___get_wrapper_function(R (T::*f)(As...)) {
{
return (__godot_wrapper_method)&__wrapped_method<T, R, As...>; return (__godot_wrapper_method)&__wrapped_method<T, R, As...>;
} }
template <class T, class R, class... A> template <class T, class R, class... A>
void *___make_wrapper_function(R (T::*f)(A...) const) void *___make_wrapper_function(R (T::*f)(A...) const) {
{
return ___make_wrapper_function((R(T::*)(A...))f); return ___make_wrapper_function((R(T::*)(A...))f);
} }
template <class T, class R, class... A> template <class T, class R, class... A>
__godot_wrapper_method ___get_wrapper_function(R (T::*f)(A...) const) __godot_wrapper_method ___get_wrapper_function(R (T::*f)(A...) const) {
{
return ___get_wrapper_function((R(T::*)(A...))f); return ___get_wrapper_function((R(T::*)(A...))f);
} }
template <class M> template <class M>
void register_method(const char *name, M method_ptr, godot_method_rpc_mode rpc_type = GODOT_METHOD_RPC_MODE_DISABLED) void register_method(const char *name, M method_ptr, godot_method_rpc_mode rpc_type = GODOT_METHOD_RPC_MODE_DISABLED) {
{
godot_instance_method method = {}; godot_instance_method method = {};
method.method_data = ___make_wrapper_function(method_ptr); method.method_data = ___make_wrapper_function(method_ptr);
method.free_func = godot::api->godot_free; method.free_func = godot::api->godot_free;
method.method = (__godot_wrapper_method)___get_wrapper_function(method_ptr); method.method = (__godot_wrapper_method)___get_wrapper_function(method_ptr);
godot_method_attributes attr = {}; godot_method_attributes attr = {};
attr.rpc_type = rpc_type; attr.rpc_type = rpc_type;
godot::nativescript_api->godot_nativescript_register_method(godot::_RegisterState::nativescript_handle, ___get_method_class_name(method_ptr), name, attr, method); godot::nativescript_api->godot_nativescript_register_method(godot::_RegisterState::nativescript_handle, ___get_method_class_name(method_ptr), name, attr, method);
} }
template <class T, class P> template <class T, class P>
struct _PropertySetFunc { struct _PropertySetFunc {
void (T::*f)(P); void (T::*f)(P);
static void _wrapped_setter(godot_object *object, void *method_data, void *user_data, godot_variant *value) static void _wrapped_setter(godot_object *object, void *method_data, void *user_data, godot_variant *value) {
{
_PropertySetFunc<T, P> *set_func = (_PropertySetFunc<T, P> *)method_data; _PropertySetFunc<T, P> *set_func = (_PropertySetFunc<T, P> *)method_data;
T *obj = (T *)user_data; T *obj = (T *)user_data;
@@ -302,9 +261,9 @@ struct _PropertySetFunc {
template <class T, class P> template <class T, class P>
struct _PropertyGetFunc { struct _PropertyGetFunc {
P (T::*f)(); P(T::*f)
static godot_variant _wrapped_getter(godot_object *object, void *method_data, void *user_data) ();
{ static godot_variant _wrapped_getter(godot_object *object, void *method_data, void *user_data) {
_PropertyGetFunc<T, P> *get_func = (_PropertyGetFunc<T, P> *)method_data; _PropertyGetFunc<T, P> *get_func = (_PropertyGetFunc<T, P> *)method_data;
T *obj = (T *)user_data; T *obj = (T *)user_data;
@@ -319,16 +278,10 @@ struct _PropertyGetFunc {
} }
}; };
template <class T, class P> template <class T, class P>
struct _PropertyDefaultSetFunc { struct _PropertyDefaultSetFunc {
P(T::*f); P(T::*f);
static void _wrapped_setter(godot_object *object, void *method_data, void *user_data, godot_variant *value) static void _wrapped_setter(godot_object *object, void *method_data, void *user_data, godot_variant *value) {
{
_PropertyDefaultSetFunc<T, P> *set_func = (_PropertyDefaultSetFunc<T, P> *)method_data; _PropertyDefaultSetFunc<T, P> *set_func = (_PropertyDefaultSetFunc<T, P> *)method_data;
T *obj = (T *)user_data; T *obj = (T *)user_data;
@@ -341,8 +294,7 @@ struct _PropertyDefaultSetFunc {
template <class T, class P> template <class T, class P>
struct _PropertyDefaultGetFunc { struct _PropertyDefaultGetFunc {
P(T::*f); P(T::*f);
static godot_variant _wrapped_getter(godot_object *object, void *method_data, void *user_data) static godot_variant _wrapped_getter(godot_object *object, void *method_data, void *user_data) {
{
_PropertyDefaultGetFunc<T, P> *get_func = (_PropertyDefaultGetFunc<T, P> *)method_data; _PropertyDefaultGetFunc<T, P> *get_func = (_PropertyDefaultGetFunc<T, P> *)method_data;
T *obj = (T *)user_data; T *obj = (T *)user_data;
@@ -357,10 +309,8 @@ struct _PropertyDefaultGetFunc {
} }
}; };
template <class T, class P> template <class T, class P>
void register_property(const char *name, P (T::*var), P default_value, godot_method_rpc_mode rpc_mode = GODOT_METHOD_RPC_MODE_DISABLED, godot_property_usage_flags usage = GODOT_PROPERTY_USAGE_DEFAULT, godot_property_hint hint = GODOT_PROPERTY_HINT_NONE, String hint_string = "") void register_property(const char *name, P(T::*var), P default_value, godot_method_rpc_mode rpc_mode = GODOT_METHOD_RPC_MODE_DISABLED, godot_property_usage_flags usage = GODOT_PROPERTY_USAGE_DEFAULT, godot_property_hint hint = GODOT_PROPERTY_HINT_NONE, String hint_string = "") {
{
Variant def_val = default_value; Variant def_val = default_value;
usage = (godot_property_usage_flags)((int)usage | GODOT_PROPERTY_USAGE_SCRIPT_VARIABLE); usage = (godot_property_usage_flags)((int)usage | GODOT_PROPERTY_USAGE_SCRIPT_VARIABLE);
@@ -402,12 +352,8 @@ void register_property(const char *name, P (T::*var), P default_value, godot_met
godot::nativescript_api->godot_nativescript_register_property(godot::_RegisterState::nativescript_handle, T::___get_type_name(), name, &attr, set_func, get_func); godot::nativescript_api->godot_nativescript_register_property(godot::_RegisterState::nativescript_handle, T::___get_type_name(), name, &attr, set_func, get_func);
} }
template <class T, class P> template <class T, class P>
void register_property(const char *name, void (T::*setter)(P), P (T::*getter)(), P default_value, godot_method_rpc_mode rpc_mode = GODOT_METHOD_RPC_MODE_DISABLED, godot_property_usage_flags usage = GODOT_PROPERTY_USAGE_DEFAULT, godot_property_hint hint = GODOT_PROPERTY_HINT_NONE, String hint_string = "") void register_property(const char *name, void (T::*setter)(P), P (T::*getter)(), P default_value, godot_method_rpc_mode rpc_mode = GODOT_METHOD_RPC_MODE_DISABLED, godot_property_usage_flags usage = GODOT_PROPERTY_USAGE_DEFAULT, godot_property_hint hint = GODOT_PROPERTY_HINT_NONE, String hint_string = "") {
{
Variant def_val = default_value; Variant def_val = default_value;
godot_property_attributes attr = {}; godot_property_attributes attr = {};
@@ -434,18 +380,15 @@ void register_property(const char *name, void (T::*setter)(P), P (T::*getter)(),
get_func.get_func = &_PropertyGetFunc<T, P>::_wrapped_getter; get_func.get_func = &_PropertyGetFunc<T, P>::_wrapped_getter;
godot::nativescript_api->godot_nativescript_register_property(godot::_RegisterState::nativescript_handle, T::___get_type_name(), name, &attr, set_func, get_func); godot::nativescript_api->godot_nativescript_register_property(godot::_RegisterState::nativescript_handle, T::___get_type_name(), name, &attr, set_func, get_func);
} }
template <class T, class P> template <class T, class P>
void register_property(const char *name, void (T::*setter)(P), P (T::*getter)() const, P default_value, godot_method_rpc_mode rpc_mode = GODOT_METHOD_RPC_MODE_DISABLED, godot_property_usage_flags usage = GODOT_PROPERTY_USAGE_DEFAULT, godot_property_hint hint = GODOT_PROPERTY_HINT_NONE, String hint_string = "") void register_property(const char *name, void (T::*setter)(P), P (T::*getter)() const, P default_value, godot_method_rpc_mode rpc_mode = GODOT_METHOD_RPC_MODE_DISABLED, godot_property_usage_flags usage = GODOT_PROPERTY_USAGE_DEFAULT, godot_property_hint hint = GODOT_PROPERTY_HINT_NONE, String hint_string = "") {
{
register_property(name, setter, (P(T::*)())getter, default_value, rpc_mode, usage, hint, hint_string); register_property(name, setter, (P(T::*)())getter, default_value, rpc_mode, usage, hint, hint_string);
} }
template <class T> template <class T>
void register_signal(String name, Dictionary args = Dictionary()) void register_signal(String name, Dictionary args = Dictionary()) {
{
godot_signal signal = {}; godot_signal signal = {};
signal.name = *(godot_string *)&name; signal.name = *(godot_string *)&name;
signal.num_args = args.size(); signal.num_args = args.size();
@@ -482,19 +425,16 @@ void register_signal(String name, Dictionary args = Dictionary())
} }
template <class T, class... Args> template <class T, class... Args>
void register_signal(String name, Args... varargs) void register_signal(String name, Args... varargs) {
{
register_signal<T>(name, Dictionary::make(varargs...)); register_signal<T>(name, Dictionary::make(varargs...));
} }
#ifndef GODOT_CPP_NO_OBJECT_CAST #ifndef GODOT_CPP_NO_OBJECT_CAST
template <class T> template <class T>
T *Object::cast_to(const Object *obj) T *Object::cast_to(const Object *obj) {
{ if (!obj)
return nullptr;
size_t have_tag = (size_t)godot::nativescript_1_1_api->godot_nativescript_get_type_tag(obj->_owner); size_t have_tag = (size_t)godot::nativescript_1_1_api->godot_nativescript_get_type_tag(obj->_owner);
if (have_tag) { if (have_tag) {
@@ -515,7 +455,6 @@ T *Object::cast_to(const Object *obj)
} }
#endif #endif
} // namespace godot
}
#endif // GODOT_H #endif // GODOT_H

View File

@@ -1,9 +1,9 @@
#ifndef GODOT_GLOBAL_HPP #ifndef GODOT_GLOBAL_HPP
#define GODOT_GLOBAL_HPP #define GODOT_GLOBAL_HPP
#include <gdnative_api_struct.gen.h>
#include "String.hpp"
#include "Array.hpp" #include "Array.hpp"
#include "String.hpp"
#include <gdnative_api_struct.gen.h>
namespace godot { namespace godot {
@@ -25,19 +25,19 @@ public:
static void nativescript_init(void *handle); static void nativescript_init(void *handle);
static void nativescript_terminate(void *handle); static void nativescript_terminate(void *handle);
static void gdnative_profiling_add_data(const char *p_signature, uint64_t p_time);
template <class... Args> template <class... Args>
static void print(const String &fmt, Args... values) { static void print(const String &fmt, Args... values) {
print(fmt.format(Array::make(values...))); print(fmt.format(Array::make(values...)));
} }
}; };
struct _RegisterState { struct _RegisterState {
static void *nativescript_handle; static void *nativescript_handle;
static int language_index; static int language_index;
}; };
} } // namespace godot
#endif #endif

View File

@@ -0,0 +1,34 @@
#ifndef GODOT_PROFILING_HPP
#define GODOT_PROFILING_HPP
#include "OS.hpp"
namespace godot {
class FunctionProfiling {
char signature[1024];
uint64_t ticks;
public:
FunctionProfiling(const char *p_function, const int p_line) {
snprintf(signature, 1024, "::%d::%s", p_line, p_function);
ticks = OS::get_singleton()->get_ticks_usec();
}
~FunctionProfiling() {
uint64_t t = OS::get_singleton()->get_ticks_usec() - ticks;
if (t > 0) {
Godot::gdnative_profiling_add_data(signature, t);
}
}
};
}
#ifdef DEBUG_ENABLED
#define GODOT_PROFILING_FUNCTION FunctionProfiling __function_profiling(__FUNCTION__, __LINE__);
#else
#define GODOT_PROFILING_FUNCTION
#endif
#endif

View File

@@ -7,10 +7,9 @@
namespace godot { namespace godot {
class NodePath {
class NodePath
{
godot_node_path _node_path; godot_node_path _node_path;
public: public:
NodePath(); NodePath();
@@ -41,8 +40,6 @@ public:
~NodePath(); ~NodePath();
}; };
} // namespace godot
}
#endif // NODEPATH_H #endif // NODEPATH_H

View File

@@ -5,10 +5,8 @@
#include <cmath> #include <cmath>
namespace godot { namespace godot {
enum ClockDirection { enum ClockDirection {
CLOCKWISE, CLOCKWISE,
@@ -56,14 +54,15 @@ public:
operator String() const; operator String() const;
inline Plane() { d = 0; } inline Plane() { d = 0; }
inline Plane(real_t p_a, real_t p_b, real_t p_c, real_t p_d) : normal(p_a,p_b,p_c), d(p_d) { } inline Plane(real_t p_a, real_t p_b, real_t p_c, real_t p_d) :
normal(p_a, p_b, p_c),
d(p_d) {}
Plane(const Vector3 &p_normal, real_t p_d); Plane(const Vector3 &p_normal, real_t p_d);
Plane(const Vector3 &p_point, const Vector3 &p_normal); Plane(const Vector3 &p_point, const Vector3 &p_normal);
Plane(const Vector3 &p_point1, const Vector3 &p_point2, const Vector3 &p_point3, ClockDirection p_dir = CLOCKWISE); Plane(const Vector3 &p_point1, const Vector3 &p_point2, const Vector3 &p_point3, ClockDirection p_dir = CLOCKWISE);
}; };
} } // namespace godot
#endif // PLANE_H #endif // PLANE_H

View File

@@ -3,11 +3,11 @@
#include "Defs.hpp" #include "Defs.hpp"
#include "String.hpp"
#include "Color.hpp" #include "Color.hpp"
#include "GodotGlobal.hpp"
#include "String.hpp"
#include "Vector2.hpp" #include "Vector2.hpp"
#include "Vector3.hpp" #include "Vector3.hpp"
#include "GodotGlobal.hpp"
#include <gdnative/pool_arrays.h> #include <gdnative/pool_arrays.h>
@@ -17,12 +17,13 @@ class Array;
class PoolByteArray { class PoolByteArray {
godot_pool_byte_array _godot_array; godot_pool_byte_array _godot_array;
public:
public:
class Read { class Read {
friend class PoolByteArray; friend class PoolByteArray;
godot_pool_byte_array_read_access *_read_access; godot_pool_byte_array_read_access *_read_access;
public: public:
inline Read() { inline Read() {
_read_access = nullptr; _read_access = nullptr;
@@ -52,6 +53,7 @@ public:
class Write { class Write {
friend class PoolByteArray; friend class PoolByteArray;
godot_pool_byte_array_write_access *_write_access; godot_pool_byte_array_write_access *_write_access;
public: public:
inline Write() { inline Write() {
_write_access = nullptr; _write_access = nullptr;
@@ -111,14 +113,14 @@ public:
~PoolByteArray(); ~PoolByteArray();
}; };
class PoolIntArray { class PoolIntArray {
godot_pool_int_array _godot_array; godot_pool_int_array _godot_array;
public:
public:
class Read { class Read {
friend class PoolIntArray; friend class PoolIntArray;
godot_pool_int_array_read_access *_read_access; godot_pool_int_array_read_access *_read_access;
public: public:
inline Read() { inline Read() {
_read_access = nullptr; _read_access = nullptr;
@@ -148,6 +150,7 @@ public:
class Write { class Write {
friend class PoolIntArray; friend class PoolIntArray;
godot_pool_int_array_write_access *_write_access; godot_pool_int_array_write_access *_write_access;
public: public:
inline Write() { inline Write() {
_write_access = nullptr; _write_access = nullptr;
@@ -207,14 +210,14 @@ public:
~PoolIntArray(); ~PoolIntArray();
}; };
class PoolRealArray { class PoolRealArray {
godot_pool_real_array _godot_array; godot_pool_real_array _godot_array;
public:
public:
class Read { class Read {
friend class PoolRealArray; friend class PoolRealArray;
godot_pool_real_array_read_access *_read_access; godot_pool_real_array_read_access *_read_access;
public: public:
inline Read() { inline Read() {
_read_access = nullptr; _read_access = nullptr;
@@ -244,6 +247,7 @@ public:
class Write { class Write {
friend class PoolRealArray; friend class PoolRealArray;
godot_pool_real_array_write_access *_write_access; godot_pool_real_array_write_access *_write_access;
public: public:
inline Write() { inline Write() {
_write_access = nullptr; _write_access = nullptr;
@@ -303,14 +307,14 @@ public:
~PoolRealArray(); ~PoolRealArray();
}; };
class PoolStringArray { class PoolStringArray {
godot_pool_string_array _godot_array; godot_pool_string_array _godot_array;
public:
public:
class Read { class Read {
friend class PoolStringArray; friend class PoolStringArray;
godot_pool_string_array_read_access *_read_access; godot_pool_string_array_read_access *_read_access;
public: public:
inline Read() { inline Read() {
_read_access = nullptr; _read_access = nullptr;
@@ -340,6 +344,7 @@ public:
class Write { class Write {
friend class PoolStringArray; friend class PoolStringArray;
godot_pool_string_array_write_access *_write_access; godot_pool_string_array_write_access *_write_access;
public: public:
inline Write() { inline Write() {
_write_access = nullptr; _write_access = nullptr;
@@ -399,15 +404,14 @@ public:
~PoolStringArray(); ~PoolStringArray();
}; };
class PoolVector2Array { class PoolVector2Array {
godot_pool_vector2_array _godot_array; godot_pool_vector2_array _godot_array;
public:
public:
class Read { class Read {
friend class PoolVector2Array; friend class PoolVector2Array;
godot_pool_vector2_array_read_access *_read_access; godot_pool_vector2_array_read_access *_read_access;
public: public:
inline Read() { inline Read() {
_read_access = nullptr; _read_access = nullptr;
@@ -437,6 +441,7 @@ public:
class Write { class Write {
friend class PoolVector2Array; friend class PoolVector2Array;
godot_pool_vector2_array_write_access *_write_access; godot_pool_vector2_array_write_access *_write_access;
public: public:
inline Write() { inline Write() {
_write_access = nullptr; _write_access = nullptr;
@@ -496,14 +501,14 @@ public:
~PoolVector2Array(); ~PoolVector2Array();
}; };
class PoolVector3Array { class PoolVector3Array {
godot_pool_vector3_array _godot_array; godot_pool_vector3_array _godot_array;
public:
public:
class Read { class Read {
friend class PoolVector3Array; friend class PoolVector3Array;
godot_pool_vector3_array_read_access *_read_access; godot_pool_vector3_array_read_access *_read_access;
public: public:
inline Read() { inline Read() {
_read_access = nullptr; _read_access = nullptr;
@@ -533,6 +538,7 @@ public:
class Write { class Write {
friend class PoolVector3Array; friend class PoolVector3Array;
godot_pool_vector3_array_write_access *_write_access; godot_pool_vector3_array_write_access *_write_access;
public: public:
inline Write() { inline Write() {
_write_access = nullptr; _write_access = nullptr;
@@ -592,14 +598,14 @@ public:
~PoolVector3Array(); ~PoolVector3Array();
}; };
class PoolColorArray { class PoolColorArray {
godot_pool_color_array _godot_array; godot_pool_color_array _godot_array;
public:
public:
class Read { class Read {
friend class PoolColorArray; friend class PoolColorArray;
godot_pool_color_array_read_access *_read_access; godot_pool_color_array_read_access *_read_access;
public: public:
inline Read() { inline Read() {
_read_access = nullptr; _read_access = nullptr;
@@ -629,6 +635,7 @@ public:
class Write { class Write {
friend class PoolColorArray; friend class PoolColorArray;
godot_pool_color_array_write_access *_write_access; godot_pool_color_array_write_access *_write_access;
public: public:
inline Write() { inline Write() {
_write_access = nullptr; _write_access = nullptr;
@@ -688,9 +695,6 @@ public:
~PoolColorArray(); ~PoolColorArray();
}; };
} // namespace godot
}
#endif // POOLARRAYS_H #endif // POOLARRAYS_H

View File

@@ -11,7 +11,6 @@ namespace godot {
class Quat { class Quat {
public: public:
real_t x, y, z, w; real_t x, y, z, w;
real_t length_squared() const; real_t length_squared() const;
@@ -44,13 +43,10 @@ public:
void operator*=(const Quat &q); void operator*=(const Quat &q);
Quat operator*(const Quat &q) const; Quat operator*(const Quat &q) const;
Quat operator*(const Vector3 &v) const; Quat operator*(const Vector3 &v) const;
Vector3 xform(const Vector3 &v) const; Vector3 xform(const Vector3 &v) const;
void operator+=(const Quat &q); void operator+=(const Quat &q);
void operator-=(const Quat &q); void operator-=(const Quat &q);
void operator*=(const real_t &s); void operator*=(const real_t &s);
@@ -61,27 +57,33 @@ public:
Quat operator*(const real_t &s) const; Quat operator*(const real_t &s) const;
Quat operator/(const real_t &s) const; Quat operator/(const real_t &s) const;
bool operator==(const Quat &p_quat) const; bool operator==(const Quat &p_quat) const;
bool operator!=(const Quat &p_quat) const; bool operator!=(const Quat &p_quat) const;
operator String() const; operator String() const;
inline void set(real_t p_x, real_t p_y, real_t p_z, real_t p_w) { inline void set(real_t p_x, real_t p_y, real_t p_z, real_t p_w) {
x=p_x; y=p_y; z=p_z; w=p_w; x = p_x;
y = p_y;
z = p_z;
w = p_w;
} }
inline Quat(real_t p_x, real_t p_y, real_t p_z, real_t p_w) { inline Quat(real_t p_x, real_t p_y, real_t p_z, real_t p_w) {
x=p_x; y=p_y; z=p_z; w=p_w; x = p_x;
y = p_y;
z = p_z;
w = p_w;
} }
Quat(const Vector3 &axis, const real_t &angle); Quat(const Vector3 &axis, const real_t &angle);
Quat(const Vector3 &v0, const Vector3 &v1); Quat(const Vector3 &v0, const Vector3 &v1);
inline Quat() {x=y=z=0; w=1; } inline Quat() {
x = y = z = 0;
w = 1;
}
}; };
} // namespace godot
}
#endif // QUAT_H #endif // QUAT_H

View File

@@ -9,8 +9,8 @@ class Object;
class RID { class RID {
godot_rid _godot_rid; godot_rid _godot_rid;
public:
public:
RID(); RID();
RID(Object *p); RID(Object *p);
@@ -28,9 +28,8 @@ public:
bool operator>(const RID &p_other) const; bool operator>(const RID &p_other) const;
bool operator<=(const RID &p_other) const; bool operator<=(const RID &p_other) const;
bool operator>=(const RID &p_other) const; bool operator>=(const RID &p_other) const;
}; };
} } // namespace godot
#endif // RID_H #endif // RID_H

View File

@@ -18,24 +18,24 @@ struct Transform2D;
struct Rect2 { struct Rect2 {
Point2 pos; Point2 position;
Size2 size; Size2 size;
inline const Vector2& get_pos() const { return pos; } inline const Vector2 &get_position() const { return position; }
inline void set_pos(const Vector2& p_pos) { pos=p_pos; } inline void set_position(const Vector2 &p_position) { position = p_position; }
inline const Vector2 &get_size() const { return size; } inline const Vector2 &get_size() const { return size; }
inline void set_size(const Vector2 &p_size) { size = p_size; } inline void set_size(const Vector2 &p_size) { size = p_size; }
inline real_t get_area() const { return size.width * size.height; } inline real_t get_area() const { return size.width * size.height; }
inline bool intersects(const Rect2 &p_rect) const { inline bool intersects(const Rect2 &p_rect) const {
if ( pos.x >= (p_rect.pos.x + p_rect.size.width) ) if (position.x >= (p_rect.position.x + p_rect.size.width))
return false; return false;
if ( (pos.x+size.width) <= p_rect.pos.x ) if ((position.x + size.width) <= p_rect.position.x)
return false; return false;
if ( pos.y >= (p_rect.pos.y + p_rect.size.height) ) if (position.y >= (p_rect.position.y + p_rect.size.height))
return false; return false;
if ( (pos.y+size.height) <= p_rect.pos.y ) if ((position.y + size.height) <= p_rect.position.y)
return false; return false;
return true; return true;
@@ -45,34 +45,32 @@ struct Rect2 {
bool intersects_transformed(const Transform2D &p_xform, const Rect2 &p_rect) const; bool intersects_transformed(const Transform2D &p_xform, const Rect2 &p_rect) const;
bool intersects_segment(const Point2& p_from, const Point2& p_to, Point2* r_pos=nullptr, Point2* r_normal=nullptr) const; bool intersects_segment(const Point2 &p_from, const Point2 &p_to, Point2 *r_position = nullptr, Point2 *r_normal = nullptr) const;
inline bool encloses(const Rect2 &p_rect) const { inline bool encloses(const Rect2 &p_rect) const {
return (p_rect.pos.x>=pos.x) && (p_rect.pos.y>=pos.y) && return (p_rect.position.x >= position.x) && (p_rect.position.y >= position.y) &&
((p_rect.pos.x+p_rect.size.x)<(pos.x+size.x)) && ((p_rect.position.x + p_rect.size.x) < (position.x + size.x)) &&
((p_rect.pos.y+p_rect.size.y)<(pos.y+size.y)); ((p_rect.position.y + p_rect.size.y) < (position.y + size.y));
} }
inline bool has_no_area() const { inline bool has_no_area() const {
return (size.x <= 0 || size.y <= 0); return (size.x <= 0 || size.y <= 0);
} }
Rect2 clip(const Rect2 &p_rect) const; Rect2 clip(const Rect2 &p_rect) const;
Rect2 merge(const Rect2 &p_rect) const; Rect2 merge(const Rect2 &p_rect) const;
inline bool has_point(const Point2 &p_point) const { inline bool has_point(const Point2 &p_point) const {
if (p_point.x < pos.x) if (p_point.x < position.x)
return false; return false;
if (p_point.y < pos.y) if (p_point.y < position.y)
return false; return false;
if (p_point.x >= (pos.x+size.x) ) if (p_point.x >= (position.x + size.x))
return false; return false;
if (p_point.y >= (pos.y+size.y) ) if (p_point.y >= (position.y + size.y))
return false; return false;
return true; return true;
@@ -80,14 +78,14 @@ struct Rect2 {
inline bool no_area() const { return (size.width <= 0 || size.height <= 0); } inline bool no_area() const { return (size.width <= 0 || size.height <= 0); }
inline bool operator==(const Rect2& p_rect) const { return pos==p_rect.pos && size==p_rect.size; } inline bool operator==(const Rect2 &p_rect) const { return position == p_rect.position && size == p_rect.size; }
inline bool operator!=(const Rect2& p_rect) const { return pos!=p_rect.pos || size!=p_rect.size; } inline bool operator!=(const Rect2 &p_rect) const { return position != p_rect.position || size != p_rect.size; }
inline Rect2 grow(real_t p_by) const { inline Rect2 grow(real_t p_by) const {
Rect2 g = *this; Rect2 g = *this;
g.pos.x-=p_by; g.position.x -= p_by;
g.pos.y-=p_by; g.position.y -= p_by;
g.size.width += p_by * 2; g.size.width += p_by * 2;
g.size.height += p_by * 2; g.size.height += p_by * 2;
return g; return g;
@@ -102,8 +100,8 @@ struct Rect2 {
inline void expand_to(const Vector2 &p_vector) { //in place function for speed inline void expand_to(const Vector2 &p_vector) { //in place function for speed
Vector2 begin=pos; Vector2 begin = position;
Vector2 end=pos+size; Vector2 end = position + size;
if (p_vector.x < begin.x) if (p_vector.x < begin.x)
begin.x = p_vector.x; begin.x = p_vector.x;
@@ -115,19 +113,23 @@ struct Rect2 {
if (p_vector.y > end.y) if (p_vector.y > end.y)
end.y = p_vector.y; end.y = p_vector.y;
pos=begin; position = begin;
size = end - begin; size = end - begin;
} }
operator String() const; operator String() const;
inline Rect2() {} inline Rect2() {}
inline Rect2( real_t p_x, real_t p_y, real_t p_width, real_t p_height) { pos=Point2(p_x,p_y); size=Size2( p_width, p_height ); } inline Rect2(real_t p_x, real_t p_y, real_t p_width, real_t p_height) {
inline Rect2( const Point2& p_pos, const Size2& p_size ) { pos=p_pos; size=p_size; } position = Point2(p_x, p_y);
size = Size2(p_width, p_height);
}
inline Rect2(const Point2 &p_position, const Size2 &p_size) {
position = p_position;
size = p_size;
}
}; };
} // namespace godot
}
#endif // RECT2_H #endif // RECT2_H

View File

@@ -1,9 +1,9 @@
#ifndef REF_H #ifndef REF_H
#define REF_H #define REF_H
#include "Variant.hpp"
#include "GodotGlobal.hpp" #include "GodotGlobal.hpp"
#include "Reference.hpp" #include "Reference.hpp"
#include "Variant.hpp"
namespace godot { namespace godot {
@@ -202,14 +202,13 @@ public:
// Used exclusively in the bindings to recreate the Ref Godot encapsulates in return values, // Used exclusively in the bindings to recreate the Ref Godot encapsulates in return values,
// without adding to the refcount. // without adding to the refcount.
inline static Ref<T> __internal_constructor(Object *obj) inline static Ref<T> __internal_constructor(Object *obj) {
{
Ref<T> r; Ref<T> r;
r.reference = (T *)obj; r.reference = (T *)obj;
return r; return r;
} }
}; };
} } // namespace godot
#endif #endif

View File

@@ -68,8 +68,6 @@ public:
CharString utf8() const; CharString utf8() const;
CharString ascii(bool p_extended = false) const; CharString ascii(bool p_extended = false) const;
int64_t find(String p_what) const;
int64_t find_from(String p_what, int64_t p_from) const;
bool begins_with(String &s) const; bool begins_with(String &s) const;
bool begins_with_char_array(const char *p_char_array) const; bool begins_with_char_array(const char *p_char_array) const;
PoolStringArray bigrams() const; PoolStringArray bigrams() const;
@@ -131,12 +129,14 @@ public:
String to_upper() const; String to_upper() const;
String xml_escape() const; String xml_escape() const;
String xml_unescape() const; String xml_unescape() const;
signed char casecmp_to(String p_str) const;
signed char nocasecmp_to(String p_str) const;
signed char naturalnocasecmp_to(String p_str) const;
}; };
String operator+(const char *a, const String &b); String operator+(const char *a, const String &b);
String operator+(const wchar_t *a, const String &b); String operator+(const wchar_t *a, const String &b);
} } // namespace godot
#endif // STRING_H #endif // STRING_H

View File

@@ -12,8 +12,8 @@ bool is_type_known(size_t type_tag);
void register_global_type(const char *name, size_t type_tag, size_t base_type_tag); void register_global_type(const char *name, size_t type_tag, size_t base_type_tag);
bool is_type_compatible(size_t type_tag, size_t base_type_tag); bool is_type_compatible(size_t type_tag, size_t base_type_tag);
} } // namespace _TagDB
} } // namespace godot
#endif // TAGDB_HPP #endif // TAGDB_HPP

View File

@@ -3,14 +3,13 @@
#include "Basis.hpp" #include "Basis.hpp"
#include "Plane.hpp"
#include "AABB.hpp" #include "AABB.hpp"
#include "Plane.hpp"
namespace godot { namespace godot {
class Transform { class Transform {
public: public:
Basis basis; Basis basis;
Vector3 origin; Vector3 origin;
@@ -73,9 +72,8 @@ public:
Transform(const Basis &p_basis, const Vector3 &p_origin = Vector3()); Transform(const Basis &p_basis, const Vector3 &p_origin = Vector3());
inline Transform() {} inline Transform() {}
}; };
} } // namespace godot
#endif // TRANSFORM_H #endif // TRANSFORM_H

View File

@@ -3,7 +3,6 @@
#include "Vector2.hpp" #include "Vector2.hpp"
namespace godot { namespace godot {
typedef Vector2 Size2; typedef Vector2 Size2;
@@ -30,8 +29,14 @@ struct Transform2D {
inline const Vector2 &operator[](int p_idx) const { return elements[p_idx]; } inline const Vector2 &operator[](int p_idx) const { return elements[p_idx]; }
inline Vector2 &operator[](int p_idx) { return elements[p_idx]; } inline Vector2 &operator[](int p_idx) { return elements[p_idx]; }
inline Vector2 get_axis(int p_axis) const { ERR_FAIL_INDEX_V(p_axis,3,Vector2()); return elements[p_axis]; } inline Vector2 get_axis(int p_axis) const {
inline void set_axis(int p_axis,const Vector2& p_vec) { ERR_FAIL_INDEX(p_axis,3); elements[p_axis]=p_vec; } ERR_FAIL_INDEX_V(p_axis, 3, Vector2());
return elements[p_axis];
}
inline void set_axis(int p_axis, const Vector2 &p_vec) {
ERR_FAIL_INDEX(p_axis, 3);
elements[p_axis] = p_vec;
}
void invert(); void invert();
Transform2D inverse() const; Transform2D inverse() const;
@@ -86,9 +91,12 @@ struct Transform2D {
Transform2D(real_t xx, real_t xy, real_t yx, real_t yy, real_t ox, real_t oy); Transform2D(real_t xx, real_t xy, real_t yx, real_t yy, real_t ox, real_t oy);
Transform2D(real_t p_rot, const Vector2 &p_pos); Transform2D(real_t p_rot, const Vector2 &p_pos);
inline Transform2D() { elements[0][0]=1.0; elements[1][1]=1.0; } inline Transform2D() {
elements[0][0] = 1.0;
elements[1][1] = 1.0;
}
}; };
} } // namespace godot
#endif // TRANSFORM2D_H #endif // TRANSFORM2D_H

View File

@@ -12,8 +12,8 @@
#include "Plane.hpp" #include "Plane.hpp"
#include "PoolArrays.hpp" #include "PoolArrays.hpp"
#include "Quat.hpp" #include "Quat.hpp"
#include "Rect2.hpp"
#include "RID.hpp" #include "RID.hpp"
#include "Rect2.hpp"
#include "String.hpp" #include "String.hpp"
#include "Transform.hpp" #include "Transform.hpp"
#include "Transform2D.hpp" #include "Transform2D.hpp"
@@ -30,6 +30,7 @@ class Array;
class Variant { class Variant {
godot_variant _godot_variant; godot_variant _godot_variant;
public: public:
enum Type { enum Type {
@@ -126,11 +127,14 @@ public:
Variant(signed short p_short); Variant(signed short p_short);
inline Variant(unsigned short p_short) : Variant((unsigned int) p_short) {} inline Variant(unsigned short p_short) :
Variant((unsigned int)p_short) {}
inline Variant(signed char p_char) : Variant((signed int) p_char) {} inline Variant(signed char p_char) :
Variant((signed int)p_char) {}
inline Variant(unsigned char p_char) : Variant((unsigned int) p_char) {} inline Variant(unsigned char p_char) :
Variant((unsigned int)p_char) {}
Variant(int64_t p_char); Variant(int64_t p_char);
Variant(uint64_t p_char); Variant(uint64_t p_char);
@@ -153,7 +157,6 @@ public:
Variant(const Plane &p_plane); Variant(const Plane &p_plane);
Variant(const AABB &p_aabb); Variant(const AABB &p_aabb);
Variant(const Quat &p_quat); Variant(const Quat &p_quat);
@@ -190,10 +193,8 @@ public:
Variant(const PoolColorArray &p_color_array); Variant(const PoolColorArray &p_color_array);
Variant &operator=(const Variant &v); Variant &operator=(const Variant &v);
operator bool() const; operator bool() const;
operator signed int() const; operator signed int() const;
operator unsigned int() const; operator unsigned int() const;
@@ -204,7 +205,6 @@ public:
operator int64_t() const; operator int64_t() const;
operator uint64_t() const; operator uint64_t() const;
operator wchar_t() const; operator wchar_t() const;
operator float() const; operator float() const;
@@ -240,7 +240,6 @@ public:
Type get_type() const; Type get_type() const;
Variant call(const String &method, const Variant **args, const int arg_count); Variant call(const String &method, const Variant **args, const int arg_count);
bool has_method(const String &method); bool has_method(const String &method);
@@ -262,10 +261,8 @@ public:
bool booleanize() const; bool booleanize() const;
~Variant(); ~Variant();
}; };
} } // namespace godot
#endif // VARIANT_H #endif // VARIANT_H

View File

@@ -20,7 +20,6 @@ struct Vector2 {
real_t height; real_t height;
}; };
inline real_t &operator[](int p_idx) { inline real_t &operator[](int p_idx) {
return p_idx ? y : x; return p_idx ? y : x;
} }
@@ -59,7 +58,6 @@ struct Vector2 {
inline bool operator<(const Vector2 &p_vec2) const { return (x == p_vec2.x) ? (y < p_vec2.y) : (x < p_vec2.x); } inline bool operator<(const Vector2 &p_vec2) const { return (x == p_vec2.x) ? (y < p_vec2.y) : (x < p_vec2.x); }
inline bool operator<=(const Vector2 &p_vec2) const { return (x == p_vec2.x) ? (y <= p_vec2.y) : (x <= p_vec2.x); } inline bool operator<=(const Vector2 &p_vec2) const { return (x == p_vec2.x) ? (y <= p_vec2.y) : (x <= p_vec2.x); }
void normalize(); void normalize();
Vector2 normalized() const; Vector2 normalized() const;
@@ -89,7 +87,6 @@ struct Vector2 {
Vector2 linear_interpolate(const Vector2 &p_b, real_t p_t) const; Vector2 linear_interpolate(const Vector2 &p_b, real_t p_t) const;
Vector2 cubic_interpolate(const Vector2 &p_b, const Vector2 &p_pre_a, const Vector2 &p_post_b, real_t p_t) const; Vector2 cubic_interpolate(const Vector2 &p_b, const Vector2 &p_pre_a, const Vector2 &p_post_b, real_t p_t) const;
Vector2 slide(const Vector2 &p_vec) const; Vector2 slide(const Vector2 &p_vec) const;
Vector2 reflect(const Vector2 &p_vec) const; Vector2 reflect(const Vector2 &p_vec) const;
@@ -108,21 +105,22 @@ struct Vector2 {
Vector2 snapped(const Vector2 &p_by) const; Vector2 snapped(const Vector2 &p_by) const;
inline real_t aspect() const { return width / height; } inline real_t aspect() const { return width / height; }
operator String() const; operator String() const;
inline Vector2(real_t p_x,real_t p_y) { x=p_x; y=p_y; } inline Vector2(real_t p_x, real_t p_y) {
inline Vector2() { x=0; y=0; } x = p_x;
y = p_y;
}
inline Vector2() {
x = 0;
y = 0;
}
}; };
inline Vector2 operator*(real_t p_scalar, const Vector2 &p_vec) {
inline Vector2 operator*(real_t p_scalar, const Vector2& p_vec)
{
return p_vec * p_scalar; return p_vec * p_scalar;
} }
} // namespace godot
}
#endif // VECTOR2_H #endif // VECTOR2_H

View File

@@ -51,7 +51,6 @@ struct Vector3 {
Vector3 operator/(const Vector3 &p_v) const; Vector3 operator/(const Vector3 &p_v) const;
Vector3 &operator*=(real_t p_scalar); Vector3 &operator*=(real_t p_scalar);
Vector3 operator*(real_t p_scalar) const; Vector3 operator*(real_t p_scalar) const;
@@ -102,7 +101,6 @@ struct Vector3 {
Basis outer(const Vector3 &b) const; Basis outer(const Vector3 &b) const;
int max_axis() const; int max_axis() const;
int min_axis() const; int min_axis() const;
@@ -126,8 +124,7 @@ struct Vector3 {
operator String() const; operator String() const;
}; };
inline Vector3 operator*(real_t p_scalar, const Vector3& p_vec) inline Vector3 operator*(real_t p_scalar, const Vector3 &p_vec) {
{
return p_vec * p_scalar; return p_vec * p_scalar;
} }
@@ -136,6 +133,6 @@ inline Vector3 vec3_cross(const Vector3& p_a, const Vector3& p_b) {
return p_a.cross(p_b); return p_a.cross(p_b);
} }
} } // namespace godot
#endif // VECTOR3_H #endif // VECTOR3_H

View File

@@ -11,6 +11,6 @@ public:
size_t _type_tag; size_t _type_tag;
}; };
} } // namespace godot
#endif // WRAPPED_HPP #endif // WRAPPED_HPP

18
misc/hooks/README.md Normal file
View File

@@ -0,0 +1,18 @@
# Git hooks for Godot Engine
This folder contains git hooks meant to be installed locally by Godot Engine
contributors to make sure they comply with our requirements.
## List of hooks
- Pre-commit hook for clang-format: Applies clang-format to the staged files
before accepting a commit; blocks the commit and generates a patch if the
style is not respected.
Should work on Linux and macOS. You may need to edit the file if your
clang-format binary is not in the $PATH, or if you want to enable colored
output with pygmentize.
## Installation
Copy all the files from this folder into your .git/hooks folder, and make sure
the hooks and helper scripts are executable.

View File

@@ -0,0 +1,48 @@
#!/bin/sh
# Provide the canonicalize filename (physical filename with out any symlinks)
# like the GNU version readlink with the -f option regardless of the version of
# readlink (GNU or BSD).
# This file is part of a set of unofficial pre-commit hooks available
# at github.
# Link: https://github.com/githubbrowser/Pre-commit-hooks
# Contact: David Martin, david.martin.mailbox@googlemail.com
###########################################################
# There should be no need to change anything below this line.
# Canonicalize by recursively following every symlink in every component of the
# specified filename. This should reproduce the results of the GNU version of
# readlink with the -f option.
#
# Reference: http://stackoverflow.com/questions/1055671/how-can-i-get-the-behavior-of-gnus-readlink-f-on-a-mac
canonicalize_filename () {
local target_file="$1"
local physical_directory=""
local result=""
# Need to restore the working directory after work.
local working_dir="`pwd`"
cd -- "$(dirname -- "$target_file")"
target_file="$(basename -- "$target_file")"
# Iterate down a (possible) chain of symlinks
while [ -L "$target_file" ]
do
target_file="$(readlink -- "$target_file")"
cd -- "$(dirname -- "$target_file")"
target_file="$(basename -- "$target_file")"
done
# Compute the canonicalized name by finding the physical path
# for the directory we're in and appending the target file.
physical_directory="`pwd -P`"
result="$physical_directory/$target_file"
# restore the working directory after work.
cd -- "$working_dir"
echo "$result"
}

50
misc/hooks/pre-commit Normal file
View File

@@ -0,0 +1,50 @@
#!/bin/sh
# Git pre-commit hook that runs multiple hooks specified in $HOOKS.
# Make sure this script is executable. Bypass hooks with git commit --no-verify.
# This file is part of a set of unofficial pre-commit hooks available
# at github.
# Link: https://github.com/githubbrowser/Pre-commit-hooks
# Contact: David Martin, david.martin.mailbox@googlemail.com
###########################################################
# CONFIGURATION:
# pre-commit hooks to be executed. They should be in the same .git/hooks/ folder
# as this script. Hooks should return 0 if successful and nonzero to cancel the
# commit. They are executed in the order in which they are listed.
#HOOKS="pre-commit-compile pre-commit-uncrustify"
HOOKS="pre-commit-clang-format"
###########################################################
# There should be no need to change anything below this line.
. "$(dirname -- "$0")/canonicalize_filename.sh"
# exit on error
set -e
# Absolute path to this script, e.g. /home/user/bin/foo.sh
SCRIPT="$(canonicalize_filename "$0")"
# Absolute path this script is in, thus /home/user/bin
SCRIPTPATH="$(dirname -- "$SCRIPT")"
for hook in $HOOKS
do
echo "Running hook: $hook"
# run hook if it exists
# if it returns with nonzero exit with 1 and thus abort the commit
if [ -f "$SCRIPTPATH/$hook" ]; then
"$SCRIPTPATH/$hook"
if [ $? != 0 ]; then
exit 1
fi
else
echo "Error: file $hook not found."
echo "Aborting commit. Make sure the hook is in $SCRIPTPATH and executable."
echo "You can disable it by removing it from the list in $SCRIPT."
echo "You can skip all pre-commit hooks with --no-verify (not recommended)."
exit 1
fi
done

View File

@@ -0,0 +1,147 @@
#!/usr/bin/env bash
# git pre-commit hook that runs a clang-format stylecheck.
# Features:
# - abort commit when commit does not comply with the style guidelines
# - create a patch of the proposed style changes
# Modifications for clang-format by rene.milk@wwu.de
# This file is part of a set of unofficial pre-commit hooks available
# at github.
# Link: https://github.com/githubbrowser/Pre-commit-hooks
# Contact: David Martin, david.martin.mailbox@googlemail.com
# Some quality of life modifications made for Godot Engine.
##################################################################
# SETTINGS
# Set path to clang-format binary
# CLANG_FORMAT="/usr/bin/clang-format"
CLANG_FORMAT=`which clang-format`
# Remove any older patches from previous commits. Set to true or false.
# DELETE_OLD_PATCHES=false
DELETE_OLD_PATCHES=false
# Only parse files with the extensions in FILE_EXTS. Set to true or false.
# If false every changed file in the commit will be parsed with clang-format.
# If true only files matching one of the extensions are parsed with clang-format.
# PARSE_EXTS=true
PARSE_EXTS=true
# File types to parse. Only effective when PARSE_EXTS is true.
# FILE_EXTS=".c .h .cpp .hpp"
FILE_EXTS=".c .h .cpp .hpp .cc .hh .cxx .m .mm .inc .java .glsl"
# Use pygmentize instead of cat to parse diff with highlighting.
# Install it with `pip install pygments` (Linux) or `easy_install Pygments` (Mac)
# READER="pygmentize -l diff"
READER=cat
##################################################################
# There should be no need to change anything below this line.
. "$(dirname -- "$0")/canonicalize_filename.sh"
# exit on error
set -e
# check whether the given file matches any of the set extensions
matches_extension() {
local filename=$(basename "$1")
local extension=".${filename##*.}"
local ext
for ext in $FILE_EXTS; do [[ "$ext" == "$extension" ]] && return 0; done
return 1
}
# necessary check for initial commit
if git rev-parse --verify HEAD >/dev/null 2>&1 ; then
against=HEAD
else
# Initial commit: diff against an empty tree object
against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
if [ ! -x "$CLANG_FORMAT" ] ; then
printf "Error: clang-format executable not found.\n"
printf "Set the correct path in $(canonicalize_filename "$0").\n"
exit 1
fi
# create a random filename to store our generated patch
prefix="pre-commit-clang-format"
suffix="$(date +%s)"
patch="/tmp/$prefix-$suffix.patch"
# clean up any older clang-format patches
$DELETE_OLD_PATCHES && rm -f /tmp/$prefix*.patch
# create one patch containing all changes to the files
git diff-index --cached --diff-filter=ACMR --name-only $against -- | while read file;
do
# ignore thirdparty files
if grep -q "thirdparty" <<< $file; then
continue;
fi
# ignore file if we do check for file extensions and the file
# does not match any of the extensions specified in $FILE_EXTS
if $PARSE_EXTS && ! matches_extension "$file"; then
continue;
fi
# clang-format our sourcefile, create a patch with diff and append it to our $patch
# The sed call is necessary to transform the patch from
# --- $file timestamp
# +++ - timestamp
# to both lines working on the same file and having a/ and b/ prefix.
# Else it can not be applied with 'git apply'.
"$CLANG_FORMAT" -style=file "$file" | \
diff -u "$file" - | \
sed -e "1s|--- |--- a/|" -e "2s|+++ -|+++ b/$file|" >> "$patch"
done
# if no patch has been generated all is ok, clean up the file stub and exit
if [ ! -s "$patch" ] ; then
printf "Files in this commit comply with the clang-format rules.\n"
rm -f "$patch"
exit 0
fi
# a patch has been created, notify the user and exit
printf "\nThe following differences were found between the code to commit "
printf "and the clang-format rules:\n\n"
$READER "$patch"
printf "\n"
# Allows us to read user input below, assigns stdin to keyboard
exec < /dev/tty
while true; do
read -p "Do you want to apply that patch (Y - Apply, N - Do not apply, S - Apply and stage files)? [Y/N/S] " yn
case $yn in
[Yy] ) git apply $patch;
printf "The patch was applied. You can now stage the changes and commit again.\n\n";
break
;;
[Nn] ) printf "\nYou can apply these changes with:\n git apply $patch\n";
printf "(may need to be called from the root directory of your repository)\n";
printf "Aborting commit. Apply changes and commit again or skip checking with";
printf " --no-verify (not recommended).\n\n";
break
;;
[Ss] ) git apply $patch;
git diff-index --cached --diff-filter=ACMR --name-only $against -- | while read file;
do git add $file;
done
printf "The patch was applied and the changed files staged. You can now commit.\n\n";
break
;;
* ) echo "Please answer yes or no."
;;
esac
done
exit 1 # we don't commit in any case

View File

@@ -1,6 +1,6 @@
#include "AABB.hpp" #include "AABB.hpp"
#include "Vector3.hpp"
#include "Plane.hpp" #include "Plane.hpp"
#include "Vector3.hpp"
#include <algorithm> #include <algorithm>
@@ -56,7 +56,6 @@ bool AABB::encloses(const AABB & p_aabb) const {
(src_max.y > dst_max.y) && (src_max.y > dst_max.y) &&
(src_min.z <= dst_min.z) && (src_min.z <= dst_min.z) &&
(src_max.z > dst_max.z)); (src_max.z > dst_max.z));
} }
Vector3 AABB::get_support(const Vector3 &p_normal) const { Vector3 AABB::get_support(const Vector3 &p_normal) const {
@@ -67,11 +66,10 @@ Vector3 AABB::get_support(const Vector3& p_normal) const {
return Vector3( return Vector3(
(p_normal.x > 0) ? -half_extents.x : half_extents.x, (p_normal.x > 0) ? -half_extents.x : half_extents.x,
(p_normal.y > 0) ? -half_extents.y : half_extents.y, (p_normal.y > 0) ? -half_extents.y : half_extents.y,
(p_normal.z>0) ? -half_extents.z : half_extents.z (p_normal.z > 0) ? -half_extents.z : half_extents.z) +
)+ofs; ofs;
} }
Vector3 AABB::get_endpoint(int p_point) const { Vector3 AABB::get_endpoint(int p_point) const {
switch (p_point) { switch (p_point) {
@@ -98,8 +96,7 @@ bool AABB::intersects_convex_shape(const Plane *p_planes, int p_plane_count) con
Vector3 point( Vector3 point(
(p.normal.x > 0) ? -half_extents.x : half_extents.x, (p.normal.x > 0) ? -half_extents.x : half_extents.x,
(p.normal.y > 0) ? -half_extents.y : half_extents.y, (p.normal.y > 0) ? -half_extents.y : half_extents.y,
(p.normal.z>0) ? -half_extents.z : half_extents.z (p.normal.z > 0) ? -half_extents.z : half_extents.z);
);
point += ofs; point += ofs;
if (p.is_point_over(point)) if (p.is_point_over(point))
return false; return false;
@@ -126,7 +123,6 @@ bool AABB::has_point(const Vector3& p_point) const {
return true; return true;
} }
void AABB::expand_to(const Vector3 &p_vector) { void AABB::expand_to(const Vector3 &p_vector) {
Vector3 begin = position; Vector3 begin = position;
@@ -202,16 +198,14 @@ bool AABB::smits_intersect_ray(const Vector3 &from,const Vector3& dir, real_t t0
if (dir.x >= 0) { if (dir.x >= 0) {
tmin = (position.x - from.x) * divx; tmin = (position.x - from.x) * divx;
tmax = (upbound.x - from.x) * divx; tmax = (upbound.x - from.x) * divx;
} } else {
else {
tmin = (upbound.x - from.x) * divx; tmin = (upbound.x - from.x) * divx;
tmax = (position.x - from.x) * divx; tmax = (position.x - from.x) * divx;
} }
if (dir.y >= 0) { if (dir.y >= 0) {
tymin = (position.y - from.y) * divy; tymin = (position.y - from.y) * divy;
tymax = (upbound.y - from.y) * divy; tymax = (upbound.y - from.y) * divy;
} } else {
else {
tymin = (upbound.y - from.y) * divy; tymin = (upbound.y - from.y) * divy;
tymax = (position.y - from.y) * divy; tymax = (position.y - from.y) * divy;
} }
@@ -224,8 +218,7 @@ bool AABB::smits_intersect_ray(const Vector3 &from,const Vector3& dir, real_t t0
if (dir.z >= 0) { if (dir.z >= 0) {
tzmin = (position.z - from.z) * divz; tzmin = (position.z - from.z) * divz;
tzmax = (upbound.z - from.z) * divz; tzmax = (upbound.z - from.z) * divz;
} } else {
else {
tzmin = (upbound.z - from.z) * divz; tzmin = (upbound.z - from.z) * divz;
tzmax = (position.z - from.z) * divz; tzmax = (position.z - from.z) * divz;
} }
@@ -248,22 +241,18 @@ void AABB::grow_by(real_t p_amount) {
size.z += 2.0 * p_amount; size.z += 2.0 * p_amount;
} }
real_t AABB::get_area() const { real_t AABB::get_area() const {
return size.x * size.y * size.z; return size.x * size.y * size.z;
} }
bool AABB::operator==(const AABB &p_rval) const { bool AABB::operator==(const AABB &p_rval) const {
return ((position == p_rval.position) && (size == p_rval.size)); return ((position == p_rval.position) && (size == p_rval.size));
} }
bool AABB::operator!=(const AABB &p_rval) const { bool AABB::operator!=(const AABB &p_rval) const {
return ((position != p_rval.position) || (size != p_rval.size)); return ((position != p_rval.position) || (size != p_rval.size));
} }
void AABB::merge_with(const AABB &p_aabb) { void AABB::merge_with(const AABB &p_aabb) {
@@ -304,7 +293,6 @@ AABB AABB::intersection(const AABB& p_aabb) const {
min.x = (src_min.x > dst_min.x) ? src_min.x : dst_min.x; min.x = (src_min.x > dst_min.x) ? src_min.x : dst_min.x;
max.x = (src_max.x < dst_max.x) ? src_max.x : dst_max.x; max.x = (src_max.x < dst_max.x) ? src_max.x : dst_max.x;
} }
if (src_min.y > dst_max.y || src_max.y < dst_min.y) if (src_min.y > dst_max.y || src_max.y < dst_min.y)
@@ -313,7 +301,6 @@ AABB AABB::intersection(const AABB& p_aabb) const {
min.y = (src_min.y > dst_min.y) ? src_min.y : dst_min.y; min.y = (src_min.y > dst_min.y) ? src_min.y : dst_min.y;
max.y = (src_max.y < dst_max.y) ? src_max.y : dst_max.y; max.y = (src_max.y < dst_max.y) ? src_max.y : dst_max.y;
} }
if (src_min.z > dst_max.z || src_max.z < dst_min.z) if (src_min.z > dst_max.z || src_max.z < dst_min.z)
@@ -322,10 +309,8 @@ AABB AABB::intersection(const AABB& p_aabb) const {
min.z = (src_min.z > dst_min.z) ? src_min.z : dst_min.z; min.z = (src_min.z > dst_min.z) ? src_min.z : dst_min.z;
max.z = (src_max.z < dst_max.z) ? src_max.z : dst_max.z; max.z = (src_max.z < dst_max.z) ? src_max.z : dst_max.z;
} }
return AABB(min, max - min); return AABB(min, max - min);
} }
@@ -370,10 +355,8 @@ bool AABB::intersects_ray(const Vector3& p_from, const Vector3& p_dir,Vector3* r
} }
return true; return true;
} }
bool AABB::intersects_segment(const Vector3 &p_from, const Vector3 &p_to, Vector3 *r_clip, Vector3 *r_normal) const { bool AABB::intersects_segment(const Vector3 &p_from, const Vector3 &p_to, Vector3 *r_clip, Vector3 *r_normal) const {
real_t min = 0, max = 1; real_t min = 0, max = 1;
@@ -418,7 +401,6 @@ bool AABB::intersects_segment(const Vector3& p_from, const Vector3& p_to,Vector3
return false; return false;
} }
Vector3 rel = p_to - p_from; Vector3 rel = p_to - p_from;
if (r_normal) { if (r_normal) {
@@ -431,10 +413,8 @@ bool AABB::intersects_segment(const Vector3& p_from, const Vector3& p_to,Vector3
*r_clip = p_from + rel * min; *r_clip = p_from + rel * min;
return true; return true;
} }
bool AABB::intersects_plane(const Plane &p_plane) const { bool AABB::intersects_plane(const Plane &p_plane) const {
Vector3 points[8] = { Vector3 points[8] = {
@@ -457,14 +437,11 @@ bool AABB::intersects_plane(const Plane &p_plane) const {
over = true; over = true;
else else
under = true; under = true;
} }
return under && over; return under && over;
} }
Vector3 AABB::get_longest_axis() const { Vector3 AABB::get_longest_axis() const {
Vector3 axis(1, 0, 0); Vector3 axis(1, 0, 0);
@@ -500,7 +477,6 @@ int AABB::get_longest_axis_index() const {
return axis; return axis;
} }
Vector3 AABB::get_shortest_axis() const { Vector3 AABB::get_shortest_axis() const {
Vector3 axis(1, 0, 0); Vector3 axis(1, 0, 0);
@@ -546,7 +522,6 @@ AABB AABB::expand(const Vector3& p_vector) const {
AABB aabb = *this; AABB aabb = *this;
aabb.expand_to(p_vector); aabb.expand_to(p_vector);
return aabb; return aabb;
} }
AABB AABB::grow(real_t p_by) const { AABB AABB::grow(real_t p_by) const {
@@ -626,9 +601,7 @@ void AABB::get_edge(int p_edge,Vector3& r_from,Vector3& r_to) const {
r_to = Vector3(position.x + size.x, position.y + size.y, position.z + size.z); r_to = Vector3(position.x + size.x, position.y + size.y, position.z + size.z);
} break; } break;
} }
} }
AABB::operator String() const { AABB::operator String() const {
@@ -636,4 +609,4 @@ AABB::operator String() const {
return String() + position + " - " + size; return String() + position + " - " + size;
} }
} } // namespace godot

View File

@@ -1,6 +1,6 @@
#include "Array.hpp" #include "Array.hpp"
#include "Variant.hpp"
#include "GodotGlobal.hpp" #include "GodotGlobal.hpp"
#include "Variant.hpp"
#include <cstdlib> #include <cstdlib>
@@ -8,194 +8,158 @@ namespace godot {
class Object; class Object;
Array::Array() Array::Array() {
{
godot::api->godot_array_new(&_godot_array); godot::api->godot_array_new(&_godot_array);
} }
Array::Array(const Array & other) Array::Array(const Array &other) {
{
godot::api->godot_array_new_copy(&_godot_array, &other._godot_array); godot::api->godot_array_new_copy(&_godot_array, &other._godot_array);
} }
Array & Array::operator=(const Array & other) Array &Array::operator=(const Array &other) {
{
godot::api->godot_array_destroy(&_godot_array); godot::api->godot_array_destroy(&_godot_array);
godot::api->godot_array_new_copy(&_godot_array, &other._godot_array); godot::api->godot_array_new_copy(&_godot_array, &other._godot_array);
return *this; return *this;
} }
Array::Array(const PoolByteArray& a) Array::Array(const PoolByteArray &a) {
{
godot::api->godot_array_new_pool_byte_array(&_godot_array, (godot_pool_byte_array *)&a); godot::api->godot_array_new_pool_byte_array(&_godot_array, (godot_pool_byte_array *)&a);
} }
Array::Array(const PoolIntArray& a) Array::Array(const PoolIntArray &a) {
{
godot::api->godot_array_new_pool_int_array(&_godot_array, (godot_pool_int_array *)&a); godot::api->godot_array_new_pool_int_array(&_godot_array, (godot_pool_int_array *)&a);
} }
Array::Array(const PoolRealArray& a) Array::Array(const PoolRealArray &a) {
{
godot::api->godot_array_new_pool_real_array(&_godot_array, (godot_pool_real_array *)&a); godot::api->godot_array_new_pool_real_array(&_godot_array, (godot_pool_real_array *)&a);
} }
Array::Array(const PoolStringArray& a) Array::Array(const PoolStringArray &a) {
{
godot::api->godot_array_new_pool_string_array(&_godot_array, (godot_pool_string_array *)&a); godot::api->godot_array_new_pool_string_array(&_godot_array, (godot_pool_string_array *)&a);
} }
Array::Array(const PoolVector2Array& a) Array::Array(const PoolVector2Array &a) {
{
godot::api->godot_array_new_pool_vector2_array(&_godot_array, (godot_pool_vector2_array *)&a); godot::api->godot_array_new_pool_vector2_array(&_godot_array, (godot_pool_vector2_array *)&a);
} }
Array::Array(const PoolVector3Array& a) Array::Array(const PoolVector3Array &a) {
{
godot::api->godot_array_new_pool_vector3_array(&_godot_array, (godot_pool_vector3_array *)&a); godot::api->godot_array_new_pool_vector3_array(&_godot_array, (godot_pool_vector3_array *)&a);
} }
Array::Array(const PoolColorArray& a) Array::Array(const PoolColorArray &a) {
{
godot::api->godot_array_new_pool_color_array(&_godot_array, (godot_pool_color_array *)&a); godot::api->godot_array_new_pool_color_array(&_godot_array, (godot_pool_color_array *)&a);
} }
Variant& Array::operator [](const int idx) Variant &Array::operator[](const int idx) {
{
godot_variant *v = godot::api->godot_array_operator_index(&_godot_array, idx); godot_variant *v = godot::api->godot_array_operator_index(&_godot_array, idx);
return *(Variant *)v; return *(Variant *)v;
} }
Variant Array::operator [](const int idx) const Variant Array::operator[](const int idx) const {
{
// Yes, I'm casting away the const... you can hate me now. // Yes, I'm casting away the const... you can hate me now.
// since the result is // since the result is
godot_variant *v = godot::api->godot_array_operator_index((godot_array *)&_godot_array, idx); godot_variant *v = godot::api->godot_array_operator_index((godot_array *)&_godot_array, idx);
return *(Variant *)v; return *(Variant *)v;
} }
void Array::append(const Variant& v) void Array::append(const Variant &v) {
{
godot::api->godot_array_append(&_godot_array, (godot_variant *)&v); godot::api->godot_array_append(&_godot_array, (godot_variant *)&v);
} }
void Array::clear() void Array::clear() {
{
godot::api->godot_array_clear(&_godot_array); godot::api->godot_array_clear(&_godot_array);
} }
int Array::count(const Variant& v) int Array::count(const Variant &v) {
{
return godot::api->godot_array_count(&_godot_array, (godot_variant *)&v); return godot::api->godot_array_count(&_godot_array, (godot_variant *)&v);
} }
bool Array::empty() const bool Array::empty() const {
{
return godot::api->godot_array_empty(&_godot_array); return godot::api->godot_array_empty(&_godot_array);
} }
void Array::erase(const Variant& v) void Array::erase(const Variant &v) {
{
godot::api->godot_array_erase(&_godot_array, (godot_variant *)&v); godot::api->godot_array_erase(&_godot_array, (godot_variant *)&v);
} }
Variant Array::front() const Variant Array::front() const {
{
godot_variant v = godot::api->godot_array_front(&_godot_array); godot_variant v = godot::api->godot_array_front(&_godot_array);
return *(Variant *)&v; return *(Variant *)&v;
} }
Variant Array::back() const Variant Array::back() const {
{
godot_variant v = godot::api->godot_array_back(&_godot_array); godot_variant v = godot::api->godot_array_back(&_godot_array);
return *(Variant *)&v; return *(Variant *)&v;
} }
int Array::find(const Variant& what, const int from) int Array::find(const Variant &what, const int from) {
{
return godot::api->godot_array_find(&_godot_array, (godot_variant *)&what, from); return godot::api->godot_array_find(&_godot_array, (godot_variant *)&what, from);
} }
int Array::find_last(const Variant& what) int Array::find_last(const Variant &what) {
{
return godot::api->godot_array_find_last(&_godot_array, (godot_variant *)&what); return godot::api->godot_array_find_last(&_godot_array, (godot_variant *)&what);
} }
bool Array::has(const Variant& what) const bool Array::has(const Variant &what) const {
{
return godot::api->godot_array_has(&_godot_array, (godot_variant *)&what); return godot::api->godot_array_has(&_godot_array, (godot_variant *)&what);
} }
uint32_t Array::hash() const uint32_t Array::hash() const {
{
return godot::api->godot_array_hash(&_godot_array); return godot::api->godot_array_hash(&_godot_array);
} }
void Array::insert(const int pos, const Variant& value) void Array::insert(const int pos, const Variant &value) {
{
godot::api->godot_array_insert(&_godot_array, pos, (godot_variant *)&value); godot::api->godot_array_insert(&_godot_array, pos, (godot_variant *)&value);
} }
void Array::invert() void Array::invert() {
{
godot::api->godot_array_invert(&_godot_array); godot::api->godot_array_invert(&_godot_array);
} }
Variant Array::pop_back() Variant Array::pop_back() {
{
godot_variant v = godot::api->godot_array_pop_back(&_godot_array); godot_variant v = godot::api->godot_array_pop_back(&_godot_array);
return *(Variant *)&v; return *(Variant *)&v;
} }
Variant Array::pop_front() Variant Array::pop_front() {
{
godot_variant v = godot::api->godot_array_pop_front(&_godot_array); godot_variant v = godot::api->godot_array_pop_front(&_godot_array);
return *(Variant *)&v; return *(Variant *)&v;
} }
void Array::push_back(const Variant& v) void Array::push_back(const Variant &v) {
{
godot::api->godot_array_push_back(&_godot_array, (godot_variant *)&v); godot::api->godot_array_push_back(&_godot_array, (godot_variant *)&v);
} }
void Array::push_front(const Variant& v) void Array::push_front(const Variant &v) {
{
godot::api->godot_array_push_front(&_godot_array, (godot_variant *)&v); godot::api->godot_array_push_front(&_godot_array, (godot_variant *)&v);
} }
void Array::remove(const int idx) void Array::remove(const int idx) {
{
godot::api->godot_array_remove(&_godot_array, idx); godot::api->godot_array_remove(&_godot_array, idx);
} }
int Array::size() const int Array::size() const {
{
return godot::api->godot_array_size(&_godot_array); return godot::api->godot_array_size(&_godot_array);
} }
void Array::resize(const int size) void Array::resize(const int size) {
{
godot::api->godot_array_resize(&_godot_array, size); godot::api->godot_array_resize(&_godot_array, size);
} }
int Array::rfind(const Variant& what, const int from) int Array::rfind(const Variant &what, const int from) {
{
return godot::api->godot_array_rfind(&_godot_array, (godot_variant *)&what, from); return godot::api->godot_array_rfind(&_godot_array, (godot_variant *)&what, from);
} }
void Array::sort() void Array::sort() {
{
godot::api->godot_array_sort(&_godot_array); godot::api->godot_array_sort(&_godot_array);
} }
void Array::sort_custom(Object *obj, const String& func) void Array::sort_custom(Object *obj, const String &func) {
{
godot::api->godot_array_sort_custom(&_godot_array, (godot_object *)obj, (godot_string *)&func); godot::api->godot_array_sort_custom(&_godot_array, (godot_object *)obj, (godot_string *)&func);
} }
Array::~Array() Array::~Array() {
{
godot::api->godot_array_destroy(&_godot_array); godot::api->godot_array_destroy(&_godot_array);
} }
} } // namespace godot

View File

@@ -1,15 +1,13 @@
#include "Basis.hpp" #include "Basis.hpp"
#include "Defs.hpp" #include "Defs.hpp"
#include "Vector3.hpp"
#include "Quat.hpp" #include "Quat.hpp"
#include "Vector3.hpp"
#include <algorithm> #include <algorithm>
namespace godot { namespace godot {
Basis::Basis(const Vector3 &row0, const Vector3 &row1, const Vector3 &row2) {
Basis::Basis(const Vector3& row0, const Vector3& row1, const Vector3& row2)
{
elements[0] = row0; elements[0] = row0;
elements[1] = row1; elements[1] = row1;
elements[2] = row2; elements[2] = row2;
@@ -33,10 +31,6 @@ Basis::Basis() {
elements[2][2] = 1; elements[2][2] = 1;
} }
const Vector3 &Basis::operator[](int axis) const { const Vector3 &Basis::operator[](int axis) const {
return elements[axis]; return elements[axis];
@@ -49,8 +43,7 @@ Vector3&Basis:: operator[](int axis) {
#define cofac(row1, col1, row2, col2) \ #define cofac(row1, col1, row2, col2) \
(elements[row1][col1] * elements[row2][col2] - elements[row1][col2] * elements[row2][col1]) (elements[row1][col1] * elements[row2][col2] - elements[row1][col2] * elements[row2][col1])
void Basis::invert() void Basis::invert() {
{
real_t co[3] = { real_t co[3] = {
cofac(1, 1, 2, 2), cofac(1, 2, 2, 0), cofac(1, 0, 2, 1) cofac(1, 1, 2, 2), cofac(1, 2, 2, 0), cofac(1, 0, 2, 1)
}; };
@@ -58,7 +51,6 @@ void Basis::invert()
elements[0][1] * co[1] + elements[0][1] * co[1] +
elements[0][2] * co[2]; elements[0][2] * co[2];
ERR_FAIL_COND(det == 0); ERR_FAIL_COND(det == 0);
real_t s = 1.0 / det; real_t s = 1.0 / det;
@@ -81,43 +73,36 @@ bool Basis::isequal_approx(const Basis& a, const Basis& b) const {
return true; return true;
} }
bool Basis::is_orthogonal() const {
bool Basis::is_orthogonal() const
{
Basis id; Basis id;
Basis m = (*this) * transposed(); Basis m = (*this) * transposed();
return isequal_approx(id, m); return isequal_approx(id, m);
} }
bool Basis::is_rotation() const bool Basis::is_rotation() const {
{
return ::fabs(determinant() - 1) < CMP_EPSILON && is_orthogonal(); return ::fabs(determinant() - 1) < CMP_EPSILON && is_orthogonal();
} }
void Basis::transpose() void Basis::transpose() {
{
std::swap(elements[0][1], elements[1][0]); std::swap(elements[0][1], elements[1][0]);
std::swap(elements[0][2], elements[2][0]); std::swap(elements[0][2], elements[2][0]);
std::swap(elements[1][2], elements[2][1]); std::swap(elements[1][2], elements[2][1]);
} }
Basis Basis::inverse() const Basis Basis::inverse() const {
{
Basis b = *this; Basis b = *this;
b.invert(); b.invert();
return b; return b;
} }
Basis Basis::transposed() const Basis Basis::transposed() const {
{
Basis b = *this; Basis b = *this;
b.transpose(); b.transpose();
return b; return b;
} }
real_t Basis::determinant() const real_t Basis::determinant() const {
{
return elements[0][0] * (elements[1][1] * elements[2][2] - elements[2][1] * elements[1][2]) - return elements[0][0] * (elements[1][1] * elements[2][2] - elements[2][1] * elements[1][2]) -
elements[1][0] * (elements[0][1] * elements[2][2] - elements[2][1] * elements[0][2]) + elements[1][0] * (elements[0][1] * elements[2][2] - elements[2][1] * elements[0][2]) +
elements[2][0] * (elements[0][1] * elements[1][2] - elements[1][1] * elements[0][2]); elements[2][0] * (elements[0][1] * elements[1][2] - elements[1][1] * elements[0][2]);
@@ -134,18 +119,15 @@ void Basis::set_axis(int p_axis, const Vector3& p_value) {
elements[2][p_axis] = p_value.z; elements[2][p_axis] = p_value.z;
} }
void Basis::rotate(const Vector3& p_axis, real_t p_phi) void Basis::rotate(const Vector3 &p_axis, real_t p_phi) {
{
*this = rotated(p_axis, p_phi); *this = rotated(p_axis, p_phi);
} }
Basis Basis::rotated(const Vector3& p_axis, real_t p_phi) const Basis Basis::rotated(const Vector3 &p_axis, real_t p_phi) const {
{
return Basis(p_axis, p_phi) * (*this); return Basis(p_axis, p_phi) * (*this);
} }
void Basis::scale( const Vector3& p_scale ) void Basis::scale(const Vector3 &p_scale) {
{
elements[0][0] *= p_scale.x; elements[0][0] *= p_scale.x;
elements[0][1] *= p_scale.x; elements[0][1] *= p_scale.x;
elements[0][2] *= p_scale.x; elements[0][2] *= p_scale.x;
@@ -157,15 +139,13 @@ void Basis::scale( const Vector3& p_scale )
elements[2][2] *= p_scale.z; elements[2][2] *= p_scale.z;
} }
Basis Basis::scaled( const Vector3& p_scale ) const Basis Basis::scaled(const Vector3 &p_scale) const {
{
Basis b = *this; Basis b = *this;
b.scale(p_scale); b.scale(p_scale);
return b; return b;
} }
Vector3 Basis::get_scale() const Vector3 Basis::get_scale() const {
{
// We are assuming M = R.S, and performing a polar decomposition to extract R and S. // We are assuming M = R.S, and performing a polar decomposition to extract R and S.
// FIXME: We eventually need a proper polar decomposition. // FIXME: We eventually need a proper polar decomposition.
// As a cheap workaround until then, to ensure that R is a proper rotation matrix with determinant +1 // As a cheap workaround until then, to ensure that R is a proper rotation matrix with determinant +1
@@ -175,8 +155,7 @@ Vector3 Basis::get_scale() const
return det_sign * Vector3( return det_sign * Vector3(
Vector3(elements[0][0], elements[1][0], elements[2][0]).length(), Vector3(elements[0][0], elements[1][0], elements[2][0]).length(),
Vector3(elements[0][1], elements[1][1], elements[2][1]).length(), Vector3(elements[0][1], elements[1][1], elements[2][1]).length(),
Vector3(elements[0][2],elements[1][2],elements[2][2]).length() Vector3(elements[0][2], elements[1][2], elements[2][2]).length());
);
} }
// get_euler_xyz returns a vector containing the Euler angles in the format // get_euler_xyz returns a vector containing the Euler angles in the format
@@ -322,8 +301,6 @@ void Basis::set_euler_yxz(const Vector3 &p_euler) {
*this = ymat * xmat * zmat; *this = ymat * xmat * zmat;
} }
// transposed dot products // transposed dot products
real_t Basis::tdotx(const Vector3 &v) const { real_t Basis::tdotx(const Vector3 &v) const {
return elements[0][0] * v[0] + elements[1][0] * v[1] + elements[2][0] * v[2]; return elements[0][0] * v[0] + elements[1][0] * v[1] + elements[2][0] * v[2];
@@ -335,8 +312,7 @@ real_t Basis::tdotz(const Vector3& v) const {
return elements[0][2] * v[0] + elements[1][2] * v[1] + elements[2][2] * v[2]; return elements[0][2] * v[0] + elements[1][2] * v[1] + elements[2][2] * v[2];
} }
bool Basis::operator==(const Basis& p_matrix) const bool Basis::operator==(const Basis &p_matrix) const {
{
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) { for (int j = 0; j < 3; j++) {
if (elements[i][j] != p_matrix.elements[i][j]) if (elements[i][j] != p_matrix.elements[i][j])
@@ -347,8 +323,7 @@ bool Basis::operator==(const Basis& p_matrix) const
return true; return true;
} }
bool Basis::operator!=(const Basis& p_matrix) const bool Basis::operator!=(const Basis &p_matrix) const {
{
return (!(*this == p_matrix)); return (!(*this == p_matrix));
} }
@@ -357,8 +332,7 @@ Vector3 Basis::xform(const Vector3& p_vector) const {
return Vector3( return Vector3(
elements[0].dot(p_vector), elements[0].dot(p_vector),
elements[1].dot(p_vector), elements[1].dot(p_vector),
elements[2].dot(p_vector) elements[2].dot(p_vector));
);
} }
Vector3 Basis::xform_inv(const Vector3 &p_vector) const { Vector3 Basis::xform_inv(const Vector3 &p_vector) const {
@@ -366,28 +340,22 @@ Vector3 Basis::xform_inv(const Vector3& p_vector) const {
return Vector3( return Vector3(
(elements[0][0] * p_vector.x) + (elements[1][0] * p_vector.y) + (elements[2][0] * p_vector.z), (elements[0][0] * p_vector.x) + (elements[1][0] * p_vector.y) + (elements[2][0] * p_vector.z),
(elements[0][1] * p_vector.x) + (elements[1][1] * p_vector.y) + (elements[2][1] * p_vector.z), (elements[0][1] * p_vector.x) + (elements[1][1] * p_vector.y) + (elements[2][1] * p_vector.z),
(elements[0][2]*p_vector.x ) + ( elements[1][2]*p_vector.y ) + ( elements[2][2]*p_vector.z ) (elements[0][2] * p_vector.x) + (elements[1][2] * p_vector.y) + (elements[2][2] * p_vector.z));
);
} }
void Basis::operator*=(const Basis& p_matrix) void Basis::operator*=(const Basis &p_matrix) {
{
set( set(
p_matrix.tdotx(elements[0]), p_matrix.tdoty(elements[0]), p_matrix.tdotz(elements[0]), p_matrix.tdotx(elements[0]), p_matrix.tdoty(elements[0]), p_matrix.tdotz(elements[0]),
p_matrix.tdotx(elements[1]), p_matrix.tdoty(elements[1]), p_matrix.tdotz(elements[1]), p_matrix.tdotx(elements[1]), p_matrix.tdoty(elements[1]), p_matrix.tdotz(elements[1]),
p_matrix.tdotx(elements[2]), p_matrix.tdoty(elements[2]), p_matrix.tdotz(elements[2])); p_matrix.tdotx(elements[2]), p_matrix.tdoty(elements[2]), p_matrix.tdotz(elements[2]));
} }
Basis Basis::operator*(const Basis& p_matrix) const Basis Basis::operator*(const Basis &p_matrix) const {
{
return Basis( return Basis(
p_matrix.tdotx(elements[0]), p_matrix.tdoty(elements[0]), p_matrix.tdotz(elements[0]), p_matrix.tdotx(elements[0]), p_matrix.tdoty(elements[0]), p_matrix.tdotz(elements[0]),
p_matrix.tdotx(elements[1]), p_matrix.tdoty(elements[1]), p_matrix.tdotz(elements[1]), p_matrix.tdotx(elements[1]), p_matrix.tdoty(elements[1]), p_matrix.tdotz(elements[1]),
p_matrix.tdotx(elements[2]), p_matrix.tdoty(elements[2]), p_matrix.tdotz(elements[2])); p_matrix.tdotx(elements[2]), p_matrix.tdoty(elements[2]), p_matrix.tdotz(elements[2]));
} }
void Basis::operator+=(const Basis &p_matrix) { void Basis::operator+=(const Basis &p_matrix) {
elements[0] += p_matrix.elements[0]; elements[0] += p_matrix.elements[0];
@@ -430,9 +398,7 @@ Basis Basis::operator*(real_t p_val) const {
return ret; return ret;
} }
Basis::operator String() const {
Basis::operator String() const
{
String s; String s;
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
@@ -449,7 +415,6 @@ Basis::operator String() const
/* create / set */ /* create / set */
void Basis::set(real_t xx, real_t xy, real_t xz, real_t yx, real_t yy, real_t yz, real_t zx, real_t zy, real_t zz) { void Basis::set(real_t xx, real_t xy, real_t xz, real_t yx, real_t yy, real_t yz, real_t zx, real_t zy, real_t zz) {
elements[0][0] = xx; elements[0][0] = xx;
@@ -481,8 +446,7 @@ void Basis::set_row(int i, const Vector3& p_row) {
elements[i][2] = p_row.z; elements[i][2] = p_row.z;
} }
Basis Basis::transpose_xform(const Basis& m) const Basis Basis::transpose_xform(const Basis &m) const {
{
return Basis( return Basis(
elements[0].x * m[0].x + elements[1].x * m[1].x + elements[2].x * m[2].x, elements[0].x * m[0].x + elements[1].x * m[1].x + elements[2].x * m[2].x,
elements[0].x * m[0].y + elements[1].x * m[1].y + elements[2].x * m[2].y, elements[0].x * m[0].y + elements[1].x * m[1].y + elements[2].x * m[2].y,
@@ -495,8 +459,7 @@ Basis Basis::transpose_xform(const Basis& m) const
elements[0].z * m[0].z + elements[1].z * m[1].z + elements[2].z * m[2].z); elements[0].z * m[0].z + elements[1].z * m[1].z + elements[2].z * m[2].z);
} }
void Basis::orthonormalize() void Basis::orthonormalize() {
{
ERR_FAIL_COND(determinant() == 0); ERR_FAIL_COND(determinant() == 0);
// Gram-Schmidt Process // Gram-Schmidt Process
@@ -516,15 +479,13 @@ void Basis::orthonormalize()
set_axis(2, z); set_axis(2, z);
} }
Basis Basis::orthonormalized() const Basis Basis::orthonormalized() const {
{
Basis b = *this; Basis b = *this;
b.orthonormalize(); b.orthonormalize();
return b; return b;
} }
bool Basis::is_symmetric() const bool Basis::is_symmetric() const {
{
if (::fabs(elements[0][1] - elements[1][0]) > CMP_EPSILON) if (::fabs(elements[0][1] - elements[1][0]) > CMP_EPSILON)
return false; return false;
if (::fabs(elements[0][2] - elements[2][0]) > CMP_EPSILON) if (::fabs(elements[0][2] - elements[2][0]) > CMP_EPSILON)
@@ -535,8 +496,7 @@ bool Basis::is_symmetric() const
return true; return true;
} }
Basis Basis::diagonalize() Basis Basis::diagonalize() {
{
// I love copy paste // I love copy paste
if (!is_symmetric()) if (!is_symmetric())
@@ -596,7 +556,6 @@ Basis Basis::diagonalize()
return acc_rot; return acc_rot;
} }
static const Basis _ortho_bases[24] = { static const Basis _ortho_bases[24] = {
Basis(1, 0, 0, 0, 1, 0, 0, 0, 1), Basis(1, 0, 0, 0, 1, 0, 0, 0, 1),
Basis(0, -1, 0, 1, 0, 0, 0, 0, 1), Basis(0, -1, 0, 1, 0, 0, 0, 0, 1),
@@ -624,9 +583,7 @@ static const Basis _ortho_bases[24]={
Basis(0, -1, 0, 0, 0, -1, 1, 0, 0) Basis(0, -1, 0, 0, 0, -1, 1, 0, 0)
}; };
int Basis::get_orthogonal_index() const {
int Basis::get_orthogonal_index() const
{
//could be sped up if i come up with a way //could be sped up if i come up with a way
Basis orth = *this; Basis orth = *this;
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
@@ -648,32 +605,25 @@ int Basis::get_orthogonal_index() const
if (_ortho_bases[i] == orth) if (_ortho_bases[i] == orth)
return i; return i;
} }
return 0; return 0;
} }
void Basis::set_orthogonal_index(int p_index) { void Basis::set_orthogonal_index(int p_index) {
//there only exist 24 orthogonal bases in r3 //there only exist 24 orthogonal bases in r3
ERR_FAIL_COND(p_index >= 24); ERR_FAIL_COND(p_index >= 24);
*this = _ortho_bases[p_index]; *this = _ortho_bases[p_index];
} }
Basis::Basis(const Vector3 &p_euler) { Basis::Basis(const Vector3 &p_euler) {
set_euler(p_euler); set_euler(p_euler);
} }
} } // namespace godot
#include "Quat.hpp" #include "Quat.hpp"
@@ -690,7 +640,6 @@ Basis::Basis(const Quat& p_quat) {
set(1.0 - (yy + zz), xy - wz, xz + wy, set(1.0 - (yy + zz), xy - wz, xz + wy,
xy + wz, 1.0 - (xx + zz), yz - wx, xy + wz, 1.0 - (xx + zz), yz - wx,
xz - wy, yz + wx, 1.0 - (xx + yy)); xz - wy, yz + wx, 1.0 - (xx + yy));
} }
Basis::Basis(const Vector3 &p_axis, real_t p_phi) { Basis::Basis(const Vector3 &p_axis, real_t p_phi) {
@@ -712,7 +661,6 @@ Basis::Basis(const Vector3& p_axis, real_t p_phi) {
elements[2][0] = p_axis.z * p_axis.x * (1.0 - cosine) - p_axis.y * sine; elements[2][0] = p_axis.z * p_axis.x * (1.0 - cosine) - p_axis.y * sine;
elements[2][1] = p_axis.y * p_axis.z * (1.0 - cosine) + p_axis.x * sine; elements[2][1] = p_axis.y * p_axis.z * (1.0 - cosine) + p_axis.x * sine;
elements[2][2] = axis_sq.z + cosine * (1.0 - axis_sq.z); elements[2][2] = axis_sq.z + cosine * (1.0 - axis_sq.z);
} }
Basis::operator Quat() const { Basis::operator Quat() const {
@@ -722,8 +670,7 @@ Basis::operator Quat() const {
real_t trace = elements[0][0] + elements[1][1] + elements[2][2]; real_t trace = elements[0][0] + elements[1][1] + elements[2][2];
real_t temp[4]; real_t temp[4];
if (trace > 0.0) if (trace > 0.0) {
{
real_t s = ::sqrt(trace + 1.0); real_t s = ::sqrt(trace + 1.0);
temp[3] = (s * 0.5); temp[3] = (s * 0.5);
s = 0.5 / s; s = 0.5 / s;
@@ -731,9 +678,7 @@ Basis::operator Quat() const {
temp[0] = ((elements[2][1] - elements[1][2]) * s); temp[0] = ((elements[2][1] - elements[1][2]) * s);
temp[1] = ((elements[0][2] - elements[2][0]) * s); temp[1] = ((elements[0][2] - elements[2][0]) * s);
temp[2] = ((elements[1][0] - elements[0][1]) * s); temp[2] = ((elements[1][0] - elements[0][1]) * s);
} } else {
else
{
int i = elements[0][0] < elements[1][1] ? int i = elements[0][0] < elements[1][1] ?
(elements[1][1] < elements[2][2] ? 2 : 1) : (elements[1][1] < elements[2][2] ? 2 : 1) :
(elements[0][0] < elements[2][2] ? 2 : 0); (elements[0][0] < elements[2][2] ? 2 : 0);
@@ -750,10 +695,6 @@ Basis::operator Quat() const {
} }
return Quat(temp[0], temp[1], temp[2], temp[3]); return Quat(temp[0], temp[1], temp[2], temp[3]);
} }
} // namespace godot
}

View File

@@ -37,15 +37,12 @@ static float _parse_col(const String& p_str, int p_ofs) {
ig += v * 16; ig += v * 16;
else else
ig += v; ig += v;
} }
return ig; return ig;
} }
uint32_t Color::to_32() const uint32_t Color::to_32() const {
{
uint32_t c = (uint8_t)(a * 255); uint32_t c = (uint8_t)(a * 255);
c <<= 8; c <<= 8;
@@ -58,8 +55,7 @@ uint32_t Color::to_32() const
return c; return c;
} }
uint32_t Color::to_ARGB32() const uint32_t Color::to_ARGB32() const {
{
uint32_t c = (uint8_t)(a * 255); uint32_t c = (uint8_t)(a * 255);
c <<= 8; c <<= 8;
c |= (uint8_t)(r * 255); c |= (uint8_t)(r * 255);
@@ -71,13 +67,11 @@ uint32_t Color::to_ARGB32() const
return c; return c;
} }
float Color::gray() const float Color::gray() const {
{
return (r + g + b) / 3.0; return (r + g + b) / 3.0;
} }
float Color::get_h() const float Color::get_h() const {
{
float min = MIN(r, g); float min = MIN(r, g);
min = MIN(min, b); min = MIN(min, b);
@@ -104,26 +98,22 @@ float Color::get_h() const
return h; return h;
} }
float Color::get_s() const float Color::get_s() const {
{
float min = MIN(r, g); float min = MIN(r, g);
min = MIN(min, b); min = MIN(min, b);
float max = MAX(r, g); float max = MAX(r, g);
max = MAX(max, b); max = MAX(max, b);
float delta = max - min; float delta = max - min;
return (max != 0) ? (delta / max) : 0; return (max != 0) ? (delta / max) : 0;
} }
float Color::get_v() const float Color::get_v() const {
{
float max = MAX(r, g); float max = MAX(r, g);
max = MAX(max, b); max = MAX(max, b);
return max; return max;
} }
void Color::set_hsv(float p_h, float p_s, float p_v, float p_alpha) void Color::set_hsv(float p_h, float p_s, float p_v, float p_alpha) {
{
int i; int i;
float f, p, q, t; float f, p, q, t;
a = p_alpha; a = p_alpha;
@@ -177,27 +167,23 @@ void Color::set_hsv(float p_h, float p_s, float p_v, float p_alpha)
} }
} }
void Color::invert() void Color::invert() {
{
r = 1.0 - r; r = 1.0 - r;
g = 1.0 - g; g = 1.0 - g;
b = 1.0 - b; b = 1.0 - b;
} }
void Color::contrast() void Color::contrast() {
{
r = ::fmod(r + 0.5, 1.0); r = ::fmod(r + 0.5, 1.0);
g = ::fmod(g + 0.5, 1.0); g = ::fmod(g + 0.5, 1.0);
b = ::fmod(b + 0.5, 1.0); b = ::fmod(b + 0.5, 1.0);
} }
Color Color::inverted() const Color Color::inverted() const {
{
Color c = *this; Color c = *this;
c.invert(); c.invert();
return c; return c;
} }
Color Color::contrasted() const Color Color::contrasted() const {
{
Color c = *this; Color c = *this;
c.contrast(); c.contrast();
return c; return c;
@@ -217,7 +203,6 @@ Color Color::linear_interpolate(const Color& p_b, float p_t) const {
Color Color::blend(const Color &p_over) const { Color Color::blend(const Color &p_over) const {
Color res; Color res;
float sa = 1.0 - p_over.a; float sa = 1.0 - p_over.a;
res.a = a * sa + p_over.a; res.a = a * sa + p_over.a;
@@ -237,12 +222,10 @@ Color Color::to_linear() const {
r < 0.04045 ? r * (1.0 / 12.92) : ::pow((r + 0.055) * (1.0 / (1 + 0.055)), 2.4), r < 0.04045 ? r * (1.0 / 12.92) : ::pow((r + 0.055) * (1.0 / (1 + 0.055)), 2.4),
g < 0.04045 ? g * (1.0 / 12.92) : ::pow((g + 0.055) * (1.0 / (1 + 0.055)), 2.4), g < 0.04045 ? g * (1.0 / 12.92) : ::pow((g + 0.055) * (1.0 / (1 + 0.055)), 2.4),
b < 0.04045 ? b * (1.0 / 12.92) : ::pow((b + 0.055) * (1.0 / (1 + 0.055)), 2.4), b < 0.04045 ? b * (1.0 / 12.92) : ::pow((b + 0.055) * (1.0 / (1 + 0.055)), 2.4),
a a);
);
} }
Color Color::hex(uint32_t p_hex) Color Color::hex(uint32_t p_hex) {
{
float a = (p_hex & 0xFF) / 255.0; float a = (p_hex & 0xFF) / 255.0;
p_hex >>= 8; p_hex >>= 8;
float b = (p_hex & 0xFF) / 255.0; float b = (p_hex & 0xFF) / 255.0;
@@ -254,8 +237,7 @@ Color Color::hex(uint32_t p_hex)
return Color(r, g, b, a); return Color(r, g, b, a);
} }
Color Color::html(const String& p_color) Color Color::html(const String &p_color) {
{
String color = p_color; String color = p_color;
if (color.length() == 0) if (color.length() == 0)
return Color(); return Color();
@@ -303,8 +285,7 @@ Color Color::html(const String& p_color)
return Color(r / 255.0, g / 255.0, b / 255.0, a / 255.0); return Color(r / 255.0, g / 255.0, b / 255.0, a / 255.0);
} }
bool Color::html_is_valid(const String& p_color) bool Color::html_is_valid(const String &p_color) {
{
String color = p_color; String color = p_color;
if (color.length() == 0) if (color.length() == 0)
@@ -372,11 +353,9 @@ static String _to_hex(float p_val) {
} }
return ret; return ret;
} }
String Color::to_html(bool p_alpha) const String Color::to_html(bool p_alpha) const {
{
String txt; String txt;
txt += _to_hex(r); txt += _to_hex(r);
txt += _to_hex(g); txt += _to_hex(g);
@@ -386,12 +365,10 @@ String Color::to_html(bool p_alpha) const
return txt; return txt;
} }
Color::operator String() const Color::operator String() const {
{
return String::num(r) + ", " + String::num(g) + ", " + String::num(b) + ", " + String::num(a); return String::num(r) + ", " + String::num(g) + ", " + String::num(b) + ", " + String::num(a);
} }
bool Color::operator<(const Color &p_color) const { bool Color::operator<(const Color &p_color) const {
if (r == p_color.r) { if (r == p_color.r) {
@@ -404,7 +381,6 @@ bool Color::operator<(const Color& p_color) const {
return g < p_color.g; return g < p_color.g;
} else } else
return r < p_color.r; return r < p_color.r;
} }
} } // namespace godot

View File

@@ -1,95 +1,78 @@
#include "Dictionary.hpp" #include "Dictionary.hpp"
#include "Variant.hpp"
#include "Array.hpp" #include "Array.hpp"
#include "GodotGlobal.hpp" #include "GodotGlobal.hpp"
#include "Variant.hpp"
namespace godot { namespace godot {
Dictionary::Dictionary() Dictionary::Dictionary() {
{
godot::api->godot_dictionary_new(&_godot_dictionary); godot::api->godot_dictionary_new(&_godot_dictionary);
} }
Dictionary::Dictionary(const Dictionary & other) Dictionary::Dictionary(const Dictionary &other) {
{
godot::api->godot_dictionary_new_copy(&_godot_dictionary, &other._godot_dictionary); godot::api->godot_dictionary_new_copy(&_godot_dictionary, &other._godot_dictionary);
} }
Dictionary & Dictionary::operator=(const Dictionary & other) Dictionary &Dictionary::operator=(const Dictionary &other) {
{
godot::api->godot_dictionary_destroy(&_godot_dictionary); godot::api->godot_dictionary_destroy(&_godot_dictionary);
godot::api->godot_dictionary_new_copy(&_godot_dictionary, &other._godot_dictionary); godot::api->godot_dictionary_new_copy(&_godot_dictionary, &other._godot_dictionary);
return *this; return *this;
} }
void Dictionary::clear() void Dictionary::clear() {
{
godot::api->godot_dictionary_clear(&_godot_dictionary); godot::api->godot_dictionary_clear(&_godot_dictionary);
} }
bool Dictionary::empty() const bool Dictionary::empty() const {
{
return godot::api->godot_dictionary_empty(&_godot_dictionary); return godot::api->godot_dictionary_empty(&_godot_dictionary);
} }
void Dictionary::erase(const Variant& key) void Dictionary::erase(const Variant &key) {
{
godot::api->godot_dictionary_erase(&_godot_dictionary, (godot_variant *)&key); godot::api->godot_dictionary_erase(&_godot_dictionary, (godot_variant *)&key);
} }
bool Dictionary::has(const Variant& key) const bool Dictionary::has(const Variant &key) const {
{
return godot::api->godot_dictionary_has(&_godot_dictionary, (godot_variant *)&key); return godot::api->godot_dictionary_has(&_godot_dictionary, (godot_variant *)&key);
} }
bool Dictionary::has_all(const Array& keys) const bool Dictionary::has_all(const Array &keys) const {
{
return godot::api->godot_dictionary_has_all(&_godot_dictionary, (godot_array *)&keys); return godot::api->godot_dictionary_has_all(&_godot_dictionary, (godot_array *)&keys);
} }
uint32_t Dictionary::hash() const uint32_t Dictionary::hash() const {
{
return godot::api->godot_dictionary_hash(&_godot_dictionary); return godot::api->godot_dictionary_hash(&_godot_dictionary);
} }
Array Dictionary::keys() const Array Dictionary::keys() const {
{
godot_array a = godot::api->godot_dictionary_keys(&_godot_dictionary); godot_array a = godot::api->godot_dictionary_keys(&_godot_dictionary);
return *(Array *)&a; return *(Array *)&a;
} }
Variant &Dictionary::operator [](const Variant& key) Variant &Dictionary::operator[](const Variant &key) {
{
return *(Variant *)godot::api->godot_dictionary_operator_index(&_godot_dictionary, (godot_variant *)&key); return *(Variant *)godot::api->godot_dictionary_operator_index(&_godot_dictionary, (godot_variant *)&key);
} }
const Variant &Dictionary::operator [](const Variant& key) const const Variant &Dictionary::operator[](const Variant &key) const {
{
// oops I did it again // oops I did it again
return *(Variant *)godot::api->godot_dictionary_operator_index((godot_dictionary *)&_godot_dictionary, (godot_variant *)&key); return *(Variant *)godot::api->godot_dictionary_operator_index((godot_dictionary *)&_godot_dictionary, (godot_variant *)&key);
} }
int Dictionary::size() const int Dictionary::size() const {
{
return godot::api->godot_dictionary_size(&_godot_dictionary); return godot::api->godot_dictionary_size(&_godot_dictionary);
} }
String Dictionary::to_json() const String Dictionary::to_json() const {
{
godot_string s = godot::api->godot_dictionary_to_json(&_godot_dictionary); godot_string s = godot::api->godot_dictionary_to_json(&_godot_dictionary);
return *(String *)&s; return *(String *)&s;
} }
Array Dictionary::values() const Array Dictionary::values() const {
{
godot_array a = godot::api->godot_dictionary_values(&_godot_dictionary); godot_array a = godot::api->godot_dictionary_values(&_godot_dictionary);
return *(Array *)&a; return *(Array *)&a;
} }
Dictionary::~Dictionary() Dictionary::~Dictionary() {
{
godot::api->godot_dictionary_destroy(&_godot_dictionary); godot::api->godot_dictionary_destroy(&_godot_dictionary);
} }
} // namespace godot
}

View File

@@ -4,8 +4,7 @@
#include "Wrapped.hpp" #include "Wrapped.hpp"
static GDCALLINGCONV void *wrapper_create(void *data, const void *type_tag, godot_object *instance) static GDCALLINGCONV void *wrapper_create(void *data, const void *type_tag, godot_object *instance) {
{
godot::_Wrapped *wrapper_memory = (godot::_Wrapped *)godot::api->godot_alloc(sizeof(godot::_Wrapped)); godot::_Wrapped *wrapper_memory = (godot::_Wrapped *)godot::api->godot_alloc(sizeof(godot::_Wrapped));
if (!wrapper_memory) if (!wrapper_memory)
@@ -16,8 +15,7 @@ static GDCALLINGCONV void *wrapper_create(void *data, const void *type_tag, godo
return (void *)wrapper_memory; return (void *)wrapper_memory;
} }
static GDCALLINGCONV void wrapper_destroy(void *data, void *wrapper) static GDCALLINGCONV void wrapper_destroy(void *data, void *wrapper) {
{
if (wrapper) if (wrapper)
godot::api->godot_free(wrapper); godot::api->godot_free(wrapper);
} }
@@ -32,13 +30,11 @@ const godot_gdnative_ext_nativescript_1_1_api_struct *nativescript_1_1_api = nul
const void *gdnlib = NULL; const void *gdnlib = NULL;
void Godot::print(const String& message) void Godot::print(const String &message) {
{
godot::api->godot_print((godot_string *)&message); godot::api->godot_print((godot_string *)&message);
} }
void Godot::print_warning(const String& description, const String& function, const String& file, int line) void Godot::print_warning(const String &description, const String &function, const String &file, int line) {
{
int len; int len;
char *c_desc = description.alloc_c_string(); char *c_desc = description.alloc_c_string();
@@ -54,8 +50,7 @@ void Godot::print_warning(const String& description, const String& function, con
if (c_file != nullptr) godot::api->godot_free(c_file); if (c_file != nullptr) godot::api->godot_free(c_file);
} }
void Godot::print_error(const String& description, const String& function, const String& file, int line) void Godot::print_error(const String &description, const String &function, const String &file, int line) {
{
int len; int len;
char *c_desc = description.alloc_c_string(); char *c_desc = description.alloc_c_string();
@@ -73,8 +68,7 @@ void Godot::print_error(const String& description, const String& function, const
void ___register_types(); void ___register_types();
void Godot::gdnative_init(godot_gdnative_init_options *options) void Godot::gdnative_init(godot_gdnative_init_options *options) {
{
godot::api = options->api_struct; godot::api = options->api_struct;
godot::gdnlib = options->gd_native_library; godot::gdnlib = options->gd_native_library;
@@ -97,16 +91,17 @@ void Godot::gdnative_init(godot_gdnative_init_options *options)
default: break; default: break;
} }
} }
} }
void Godot::gdnative_terminate(godot_gdnative_terminate_options *options) void Godot::gdnative_terminate(godot_gdnative_terminate_options *options) {
{
// reserved for future use. // reserved for future use.
} }
void Godot::nativescript_init(void *handle) void Godot::gdnative_profiling_add_data(const char *p_signature, uint64_t p_time) {
{ godot::nativescript_1_1_api->godot_nativescript_profiling_add_data(p_signature, p_time);
}
void Godot::nativescript_init(void *handle) {
godot::_RegisterState::nativescript_handle = handle; godot::_RegisterState::nativescript_handle = handle;
godot_instance_binding_functions binding_funcs = {}; godot_instance_binding_functions binding_funcs = {};
@@ -118,9 +113,8 @@ void Godot::nativescript_init(void *handle)
___register_types(); ___register_types();
} }
void Godot::nativescript_terminate(void *handle) void Godot::nativescript_terminate(void *handle) {
{
godot::nativescript_1_1_api->godot_nativescript_unregister_instance_binding_data_functions(godot::_RegisterState::language_index); godot::nativescript_1_1_api->godot_nativescript_unregister_instance_binding_data_functions(godot::_RegisterState::language_index);
} }
} } // namespace godot

View File

@@ -1,82 +1,68 @@
#include "NodePath.hpp" #include "NodePath.hpp"
#include "String.hpp"
#include "GodotGlobal.hpp" #include "GodotGlobal.hpp"
#include "String.hpp"
#include <gdnative/node_path.h> #include <gdnative/node_path.h>
namespace godot { namespace godot {
NodePath::NodePath() {
NodePath::NodePath()
{
String from = ""; String from = "";
godot::api->godot_node_path_new(&_node_path, (godot_string *)&from); godot::api->godot_node_path_new(&_node_path, (godot_string *)&from);
} }
NodePath::NodePath(const NodePath &other) NodePath::NodePath(const NodePath &other) {
{
String from = other; String from = other;
godot::api->godot_node_path_new(&_node_path, (godot_string *)&from); godot::api->godot_node_path_new(&_node_path, (godot_string *)&from);
} }
NodePath::NodePath(const String &from) NodePath::NodePath(const String &from) {
{
godot::api->godot_node_path_new(&_node_path, (godot_string *)&from); godot::api->godot_node_path_new(&_node_path, (godot_string *)&from);
} }
NodePath::NodePath(const char *contents) NodePath::NodePath(const char *contents) {
{
String from = contents; String from = contents;
godot::api->godot_node_path_new(&_node_path, (godot_string *)&from); godot::api->godot_node_path_new(&_node_path, (godot_string *)&from);
} }
String NodePath::get_name(const int idx) const String NodePath::get_name(const int idx) const {
{
godot_string str = godot::api->godot_node_path_get_name(&_node_path, idx); godot_string str = godot::api->godot_node_path_get_name(&_node_path, idx);
return *(String *)&str; return *(String *)&str;
} }
int NodePath::get_name_count() const int NodePath::get_name_count() const {
{
return godot::api->godot_node_path_get_name_count(&_node_path); return godot::api->godot_node_path_get_name_count(&_node_path);
} }
String NodePath::get_subname(const int idx) const String NodePath::get_subname(const int idx) const {
{
godot_string str = godot::api->godot_node_path_get_subname(&_node_path, idx); godot_string str = godot::api->godot_node_path_get_subname(&_node_path, idx);
return *(String *)&str; return *(String *)&str;
} }
int NodePath::get_subname_count() const int NodePath::get_subname_count() const {
{
return godot::api->godot_node_path_get_subname_count(&_node_path); return godot::api->godot_node_path_get_subname_count(&_node_path);
} }
bool NodePath::is_absolute() const bool NodePath::is_absolute() const {
{
return godot::api->godot_node_path_is_absolute(&_node_path); return godot::api->godot_node_path_is_absolute(&_node_path);
} }
bool NodePath::is_empty() const bool NodePath::is_empty() const {
{
return godot::api->godot_node_path_is_empty(&_node_path); return godot::api->godot_node_path_is_empty(&_node_path);
} }
NodePath::operator String() const NodePath::operator String() const {
{
godot_string str = godot::api->godot_node_path_as_string(&_node_path); godot_string str = godot::api->godot_node_path_as_string(&_node_path);
return *(String *)&str; return *(String *)&str;
} }
bool NodePath::operator ==(const NodePath& other) bool NodePath::operator==(const NodePath &other) {
{
return godot::api->godot_node_path_operator_equal(&_node_path, &other._node_path); return godot::api->godot_node_path_operator_equal(&_node_path, &other._node_path);
} }
void NodePath::operator =(const NodePath& other) void NodePath::operator=(const NodePath &other) {
{
godot::api->godot_node_path_destroy(&_node_path); godot::api->godot_node_path_destroy(&_node_path);
String other_string = (String)other; String other_string = (String)other;
@@ -84,11 +70,8 @@ void NodePath::operator =(const NodePath& other)
godot::api->godot_node_path_new(&_node_path, (godot_string *)&other_string); godot::api->godot_node_path_new(&_node_path, (godot_string *)&other_string);
} }
NodePath::~NodePath() NodePath::~NodePath() {
{
godot::api->godot_node_path_destroy(&_node_path); godot::api->godot_node_path_destroy(&_node_path);
} }
} // namespace godot
}

View File

@@ -5,9 +5,7 @@
namespace godot { namespace godot {
void Plane::set_normal(const Vector3 &p_normal) {
void Plane::set_normal(const Vector3& p_normal)
{
this->normal = p_normal; this->normal = p_normal;
} }
@@ -16,7 +14,6 @@ Vector3 Plane::project(const Vector3& p_point) const {
return p_point - normal * distance_to(p_point); return p_point - normal * distance_to(p_point);
} }
void Plane::normalize() { void Plane::normalize() {
real_t l = normal.length(); real_t l = normal.length();
@@ -57,7 +54,6 @@ Vector3 Plane::get_any_perpendicular_normal() const {
return p; return p;
} }
/* intersections */ /* intersections */
bool Plane::intersect_3(const Plane &p_plane1, const Plane &p_plane2, Vector3 *r_result) const { bool Plane::intersect_3(const Plane &p_plane1, const Plane &p_plane2, Vector3 *r_result) const {
@@ -75,13 +71,13 @@ bool Plane::intersect_3(const Plane &p_plane1, const Plane &p_plane2, Vector3 *r
if (r_result) { if (r_result) {
*r_result = ((vec3_cross(normal1, normal2) * p_plane0.d) + *r_result = ((vec3_cross(normal1, normal2) * p_plane0.d) +
(vec3_cross(normal2, normal0) * p_plane1.d) + (vec3_cross(normal2, normal0) * p_plane1.d) +
(vec3_cross(normal0, normal1) * p_plane2.d) )/denom; (vec3_cross(normal0, normal1) * p_plane2.d)) /
denom;
} }
return true; return true;
} }
bool Plane::intersects_ray(Vector3 p_from, Vector3 p_dir, Vector3 *p_intersection) const { bool Plane::intersects_ray(Vector3 p_from, Vector3 p_dir, Vector3 *p_intersection) const {
Vector3 segment = p_dir; Vector3 segment = p_dir;
@@ -139,15 +135,12 @@ bool Plane::is_almost_like(const Plane& p_plane) const {
return (normal.dot(p_plane.normal) > _PLANE_EQ_DOT_EPSILON && ::fabs(d - p_plane.d) < _PLANE_EQ_D_EPSILON); return (normal.dot(p_plane.normal) > _PLANE_EQ_DOT_EPSILON && ::fabs(d - p_plane.d) < _PLANE_EQ_D_EPSILON);
} }
Plane::operator String() const { Plane::operator String() const {
// return normal.operator String() + ", " + rtos(d); // return normal.operator String() + ", " + rtos(d);
return String(); // @Todo return String(); // @Todo
} }
bool Plane::is_point_over(const Vector3 &p_point) const { bool Plane::is_point_over(const Vector3 &p_point) const {
return (normal.dot(p_point) > d); return (normal.dot(p_point) > d);
@@ -163,7 +156,6 @@ bool Plane::has_point(const Vector3 &p_point,real_t _epsilon) const {
real_t dist = normal.dot(p_point) - d; real_t dist = normal.dot(p_point) - d;
dist = ::fabs(dist); dist = ::fabs(dist);
return (dist <= _epsilon); return (dist <= _epsilon);
} }
Plane::Plane(const Vector3 &p_normal, real_t p_d) { Plane::Plane(const Vector3 &p_normal, real_t p_d) {
@@ -185,11 +177,8 @@ Plane::Plane(const Vector3 &p_point1, const Vector3 &p_point2, const Vector3 &p_
else else
normal = (p_point1 - p_point2).cross(p_point1 - p_point3); normal = (p_point1 - p_point2).cross(p_point1 - p_point3);
normal.normalize(); normal.normalize();
d = normal.dot(p_point1); d = normal.dot(p_point1);
} }
bool Plane::operator==(const Plane &p_plane) const { bool Plane::operator==(const Plane &p_plane) const {
@@ -200,10 +189,6 @@ bool Plane::operator==(const Plane& p_plane) const {
bool Plane::operator!=(const Plane &p_plane) const { bool Plane::operator!=(const Plane &p_plane) const {
return normal != p_plane.normal || d != p_plane.d; return normal != p_plane.normal || d != p_plane.d;
} }
} // namespace godot
}

View File

@@ -1,374 +1,300 @@
#include "PoolArrays.hpp" #include "PoolArrays.hpp"
#include "Defs.hpp"
#include "String.hpp"
#include "Color.hpp" #include "Color.hpp"
#include "Defs.hpp"
#include "GodotGlobal.hpp"
#include "String.hpp"
#include "Vector2.hpp" #include "Vector2.hpp"
#include "Vector3.hpp" #include "Vector3.hpp"
#include "GodotGlobal.hpp"
#include <gdnative/pool_arrays.h> #include <gdnative/pool_arrays.h>
namespace godot { namespace godot {
PoolByteArray::PoolByteArray() PoolByteArray::PoolByteArray() {
{
godot::api->godot_pool_byte_array_new(&_godot_array); godot::api->godot_pool_byte_array_new(&_godot_array);
} }
PoolByteArray::PoolByteArray(const PoolByteArray &p_other) PoolByteArray::PoolByteArray(const PoolByteArray &p_other) {
{
godot::api->godot_pool_byte_array_new_copy(&_godot_array, &p_other._godot_array); godot::api->godot_pool_byte_array_new_copy(&_godot_array, &p_other._godot_array);
} }
PoolByteArray &PoolByteArray::operator=(const PoolByteArray & p_other) PoolByteArray &PoolByteArray::operator=(const PoolByteArray &p_other) {
{
godot::api->godot_pool_byte_array_destroy(&_godot_array); godot::api->godot_pool_byte_array_destroy(&_godot_array);
godot::api->godot_pool_byte_array_new_copy(&_godot_array, &p_other._godot_array); godot::api->godot_pool_byte_array_new_copy(&_godot_array, &p_other._godot_array);
return *this; return *this;
} }
PoolByteArray::PoolByteArray(const Array& array) PoolByteArray::PoolByteArray(const Array &array) {
{
godot::api->godot_pool_byte_array_new_with_array(&_godot_array, (godot_array *)&array); godot::api->godot_pool_byte_array_new_with_array(&_godot_array, (godot_array *)&array);
} }
PoolByteArray::Read PoolByteArray::read() const PoolByteArray::Read PoolByteArray::read() const {
{
Read read; Read read;
read._read_access = godot::api->godot_pool_byte_array_read(&_godot_array); read._read_access = godot::api->godot_pool_byte_array_read(&_godot_array);
return read; return read;
} }
PoolByteArray::Write PoolByteArray::write() PoolByteArray::Write PoolByteArray::write() {
{
Write write; Write write;
write._write_access = godot::api->godot_pool_byte_array_write(&_godot_array); write._write_access = godot::api->godot_pool_byte_array_write(&_godot_array);
return write; return write;
} }
void PoolByteArray::append(const uint8_t data) void PoolByteArray::append(const uint8_t data) {
{
godot::api->godot_pool_byte_array_append(&_godot_array, data); godot::api->godot_pool_byte_array_append(&_godot_array, data);
} }
void PoolByteArray::append_array(const PoolByteArray& array) void PoolByteArray::append_array(const PoolByteArray &array) {
{
godot::api->godot_pool_byte_array_append_array(&_godot_array, &array._godot_array); godot::api->godot_pool_byte_array_append_array(&_godot_array, &array._godot_array);
} }
int PoolByteArray::insert(const int idx, const uint8_t data) int PoolByteArray::insert(const int idx, const uint8_t data) {
{
return godot::api->godot_pool_byte_array_insert(&_godot_array, idx, data); return godot::api->godot_pool_byte_array_insert(&_godot_array, idx, data);
} }
void PoolByteArray::invert() void PoolByteArray::invert() {
{
godot::api->godot_pool_byte_array_invert(&_godot_array); godot::api->godot_pool_byte_array_invert(&_godot_array);
} }
void PoolByteArray::push_back(const uint8_t data) void PoolByteArray::push_back(const uint8_t data) {
{
godot::api->godot_pool_byte_array_push_back(&_godot_array, data); godot::api->godot_pool_byte_array_push_back(&_godot_array, data);
} }
void PoolByteArray::remove(const int idx) void PoolByteArray::remove(const int idx) {
{
godot::api->godot_pool_byte_array_remove(&_godot_array, idx); godot::api->godot_pool_byte_array_remove(&_godot_array, idx);
} }
void PoolByteArray::resize(const int size) void PoolByteArray::resize(const int size) {
{
godot::api->godot_pool_byte_array_resize(&_godot_array, size); godot::api->godot_pool_byte_array_resize(&_godot_array, size);
} }
void PoolByteArray::set(const int idx, const uint8_t data) void PoolByteArray::set(const int idx, const uint8_t data) {
{
godot::api->godot_pool_byte_array_set(&_godot_array, idx, data); godot::api->godot_pool_byte_array_set(&_godot_array, idx, data);
} }
uint8_t PoolByteArray::operator [](const int idx) uint8_t PoolByteArray::operator[](const int idx) {
{
return godot::api->godot_pool_byte_array_get(&_godot_array, idx); return godot::api->godot_pool_byte_array_get(&_godot_array, idx);
} }
int PoolByteArray::size() const int PoolByteArray::size() const {
{
return godot::api->godot_pool_byte_array_size(&_godot_array); return godot::api->godot_pool_byte_array_size(&_godot_array);
} }
PoolByteArray::~PoolByteArray() {
PoolByteArray::~PoolByteArray()
{
godot::api->godot_pool_byte_array_destroy(&_godot_array); godot::api->godot_pool_byte_array_destroy(&_godot_array);
} }
PoolIntArray::PoolIntArray() {
PoolIntArray::PoolIntArray()
{
godot::api->godot_pool_int_array_new(&_godot_array); godot::api->godot_pool_int_array_new(&_godot_array);
} }
PoolIntArray::PoolIntArray(const PoolIntArray &p_other) PoolIntArray::PoolIntArray(const PoolIntArray &p_other) {
{
godot::api->godot_pool_int_array_new_copy(&_godot_array, &p_other._godot_array); godot::api->godot_pool_int_array_new_copy(&_godot_array, &p_other._godot_array);
} }
PoolIntArray &PoolIntArray::operator=(const PoolIntArray &p_other) PoolIntArray &PoolIntArray::operator=(const PoolIntArray &p_other) {
{
godot::api->godot_pool_int_array_destroy(&_godot_array); godot::api->godot_pool_int_array_destroy(&_godot_array);
godot::api->godot_pool_int_array_new_copy(&_godot_array, &p_other._godot_array); godot::api->godot_pool_int_array_new_copy(&_godot_array, &p_other._godot_array);
return *this; return *this;
} }
PoolIntArray::PoolIntArray(const Array& array) PoolIntArray::PoolIntArray(const Array &array) {
{
godot::api->godot_pool_int_array_new_with_array(&_godot_array, (godot_array *)&array); godot::api->godot_pool_int_array_new_with_array(&_godot_array, (godot_array *)&array);
} }
PoolIntArray::Read PoolIntArray::read() const PoolIntArray::Read PoolIntArray::read() const {
{
Read read; Read read;
read._read_access = godot::api->godot_pool_int_array_read(&_godot_array); read._read_access = godot::api->godot_pool_int_array_read(&_godot_array);
return read; return read;
} }
PoolIntArray::Write PoolIntArray::write() PoolIntArray::Write PoolIntArray::write() {
{
Write write; Write write;
write._write_access = godot::api->godot_pool_int_array_write(&_godot_array); write._write_access = godot::api->godot_pool_int_array_write(&_godot_array);
return write; return write;
} }
void PoolIntArray::append(const int data) void PoolIntArray::append(const int data) {
{
godot::api->godot_pool_int_array_append(&_godot_array, data); godot::api->godot_pool_int_array_append(&_godot_array, data);
} }
void PoolIntArray::append_array(const PoolIntArray& array) void PoolIntArray::append_array(const PoolIntArray &array) {
{
godot::api->godot_pool_int_array_append_array(&_godot_array, &array._godot_array); godot::api->godot_pool_int_array_append_array(&_godot_array, &array._godot_array);
} }
int PoolIntArray::insert(const int idx, const int data) int PoolIntArray::insert(const int idx, const int data) {
{
return godot::api->godot_pool_int_array_insert(&_godot_array, idx, data); return godot::api->godot_pool_int_array_insert(&_godot_array, idx, data);
} }
void PoolIntArray::invert() void PoolIntArray::invert() {
{
godot::api->godot_pool_int_array_invert(&_godot_array); godot::api->godot_pool_int_array_invert(&_godot_array);
} }
void PoolIntArray::push_back(const int data) void PoolIntArray::push_back(const int data) {
{
godot::api->godot_pool_int_array_push_back(&_godot_array, data); godot::api->godot_pool_int_array_push_back(&_godot_array, data);
} }
void PoolIntArray::remove(const int idx) void PoolIntArray::remove(const int idx) {
{
godot::api->godot_pool_int_array_remove(&_godot_array, idx); godot::api->godot_pool_int_array_remove(&_godot_array, idx);
} }
void PoolIntArray::resize(const int size) void PoolIntArray::resize(const int size) {
{
godot::api->godot_pool_int_array_resize(&_godot_array, size); godot::api->godot_pool_int_array_resize(&_godot_array, size);
} }
void PoolIntArray::set(const int idx, const int data) void PoolIntArray::set(const int idx, const int data) {
{
godot::api->godot_pool_int_array_set(&_godot_array, idx, data); godot::api->godot_pool_int_array_set(&_godot_array, idx, data);
} }
int PoolIntArray::operator [](const int idx) int PoolIntArray::operator[](const int idx) {
{
return godot::api->godot_pool_int_array_get(&_godot_array, idx); return godot::api->godot_pool_int_array_get(&_godot_array, idx);
} }
int PoolIntArray::size() const int PoolIntArray::size() const {
{
return godot::api->godot_pool_int_array_size(&_godot_array); return godot::api->godot_pool_int_array_size(&_godot_array);
} }
PoolIntArray::~PoolIntArray() {
PoolIntArray::~PoolIntArray()
{
godot::api->godot_pool_int_array_destroy(&_godot_array); godot::api->godot_pool_int_array_destroy(&_godot_array);
} }
PoolRealArray::PoolRealArray() {
PoolRealArray::PoolRealArray()
{
godot::api->godot_pool_real_array_new(&_godot_array); godot::api->godot_pool_real_array_new(&_godot_array);
} }
PoolRealArray::PoolRealArray(const PoolRealArray &p_other) PoolRealArray::PoolRealArray(const PoolRealArray &p_other) {
{
godot::api->godot_pool_real_array_new_copy(&_godot_array, &p_other._godot_array); godot::api->godot_pool_real_array_new_copy(&_godot_array, &p_other._godot_array);
} }
PoolRealArray &PoolRealArray::operator=(const PoolRealArray &p_other) PoolRealArray &PoolRealArray::operator=(const PoolRealArray &p_other) {
{
godot::api->godot_pool_real_array_destroy(&_godot_array); godot::api->godot_pool_real_array_destroy(&_godot_array);
godot::api->godot_pool_real_array_new_copy(&_godot_array, &p_other._godot_array); godot::api->godot_pool_real_array_new_copy(&_godot_array, &p_other._godot_array);
return *this; return *this;
} }
PoolRealArray::Read PoolRealArray::read() const PoolRealArray::Read PoolRealArray::read() const {
{
Read read; Read read;
read._read_access = godot::api->godot_pool_real_array_read(&_godot_array); read._read_access = godot::api->godot_pool_real_array_read(&_godot_array);
return read; return read;
} }
PoolRealArray::Write PoolRealArray::write() PoolRealArray::Write PoolRealArray::write() {
{
Write write; Write write;
write._write_access = godot::api->godot_pool_real_array_write(&_godot_array); write._write_access = godot::api->godot_pool_real_array_write(&_godot_array);
return write; return write;
} }
PoolRealArray::PoolRealArray(const Array& array) PoolRealArray::PoolRealArray(const Array &array) {
{
godot::api->godot_pool_real_array_new_with_array(&_godot_array, (godot_array *)&array); godot::api->godot_pool_real_array_new_with_array(&_godot_array, (godot_array *)&array);
} }
void PoolRealArray::append(const real_t data) void PoolRealArray::append(const real_t data) {
{
godot::api->godot_pool_real_array_append(&_godot_array, data); godot::api->godot_pool_real_array_append(&_godot_array, data);
} }
void PoolRealArray::append_array(const PoolRealArray& array) void PoolRealArray::append_array(const PoolRealArray &array) {
{
godot::api->godot_pool_real_array_append_array(&_godot_array, &array._godot_array); godot::api->godot_pool_real_array_append_array(&_godot_array, &array._godot_array);
} }
int PoolRealArray::insert(const int idx, const real_t data) int PoolRealArray::insert(const int idx, const real_t data) {
{
return godot::api->godot_pool_real_array_insert(&_godot_array, idx, data); return godot::api->godot_pool_real_array_insert(&_godot_array, idx, data);
} }
void PoolRealArray::invert() void PoolRealArray::invert() {
{
godot::api->godot_pool_real_array_invert(&_godot_array); godot::api->godot_pool_real_array_invert(&_godot_array);
} }
void PoolRealArray::push_back(const real_t data) void PoolRealArray::push_back(const real_t data) {
{
godot::api->godot_pool_real_array_push_back(&_godot_array, data); godot::api->godot_pool_real_array_push_back(&_godot_array, data);
} }
void PoolRealArray::remove(const int idx) void PoolRealArray::remove(const int idx) {
{
godot::api->godot_pool_real_array_remove(&_godot_array, idx); godot::api->godot_pool_real_array_remove(&_godot_array, idx);
} }
void PoolRealArray::resize(const int size) void PoolRealArray::resize(const int size) {
{
godot::api->godot_pool_real_array_resize(&_godot_array, size); godot::api->godot_pool_real_array_resize(&_godot_array, size);
} }
void PoolRealArray::set(const int idx, const real_t data) void PoolRealArray::set(const int idx, const real_t data) {
{
godot::api->godot_pool_real_array_set(&_godot_array, idx, data); godot::api->godot_pool_real_array_set(&_godot_array, idx, data);
} }
real_t PoolRealArray::operator [](const int idx) real_t PoolRealArray::operator[](const int idx) {
{
return godot::api->godot_pool_real_array_get(&_godot_array, idx); return godot::api->godot_pool_real_array_get(&_godot_array, idx);
} }
int PoolRealArray::size() const int PoolRealArray::size() const {
{
return godot::api->godot_pool_real_array_size(&_godot_array); return godot::api->godot_pool_real_array_size(&_godot_array);
} }
PoolRealArray::~PoolRealArray() {
PoolRealArray::~PoolRealArray()
{
godot::api->godot_pool_real_array_destroy(&_godot_array); godot::api->godot_pool_real_array_destroy(&_godot_array);
} }
PoolStringArray::PoolStringArray() {
PoolStringArray::PoolStringArray()
{
godot::api->godot_pool_string_array_new(&_godot_array); godot::api->godot_pool_string_array_new(&_godot_array);
} }
PoolStringArray::PoolStringArray(const PoolStringArray &p_other) PoolStringArray::PoolStringArray(const PoolStringArray &p_other) {
{
godot::api->godot_pool_string_array_new_copy(&_godot_array, &p_other._godot_array); godot::api->godot_pool_string_array_new_copy(&_godot_array, &p_other._godot_array);
} }
PoolStringArray &PoolStringArray::operator=(const PoolStringArray &p_other) PoolStringArray &PoolStringArray::operator=(const PoolStringArray &p_other) {
{
godot::api->godot_pool_string_array_destroy(&_godot_array); godot::api->godot_pool_string_array_destroy(&_godot_array);
godot::api->godot_pool_string_array_new_copy(&_godot_array, &p_other._godot_array); godot::api->godot_pool_string_array_new_copy(&_godot_array, &p_other._godot_array);
return *this; return *this;
} }
PoolStringArray::PoolStringArray(const Array& array) PoolStringArray::PoolStringArray(const Array &array) {
{
godot::api->godot_pool_string_array_new_with_array(&_godot_array, (godot_array *)&array); godot::api->godot_pool_string_array_new_with_array(&_godot_array, (godot_array *)&array);
} }
PoolStringArray::Read PoolStringArray::read() const PoolStringArray::Read PoolStringArray::read() const {
{
Read read; Read read;
read._read_access = godot::api->godot_pool_string_array_read(&_godot_array); read._read_access = godot::api->godot_pool_string_array_read(&_godot_array);
return read; return read;
} }
PoolStringArray::Write PoolStringArray::write() PoolStringArray::Write PoolStringArray::write() {
{
Write write; Write write;
write._write_access = godot::api->godot_pool_string_array_write(&_godot_array); write._write_access = godot::api->godot_pool_string_array_write(&_godot_array);
return write; return write;
} }
void PoolStringArray::append(const String& data) void PoolStringArray::append(const String &data) {
{
godot::api->godot_pool_string_array_append(&_godot_array, (godot_string *)&data); godot::api->godot_pool_string_array_append(&_godot_array, (godot_string *)&data);
} }
void PoolStringArray::append_array(const PoolStringArray& array) void PoolStringArray::append_array(const PoolStringArray &array) {
{
godot::api->godot_pool_string_array_append_array(&_godot_array, &array._godot_array); godot::api->godot_pool_string_array_append_array(&_godot_array, &array._godot_array);
} }
int PoolStringArray::insert(const int idx, const String& data) int PoolStringArray::insert(const int idx, const String &data) {
{
return godot::api->godot_pool_string_array_insert(&_godot_array, idx, (godot_string *)&data); return godot::api->godot_pool_string_array_insert(&_godot_array, idx, (godot_string *)&data);
} }
void PoolStringArray::invert() void PoolStringArray::invert() {
{
godot::api->godot_pool_string_array_invert(&_godot_array); godot::api->godot_pool_string_array_invert(&_godot_array);
} }
void PoolStringArray::push_back(const String& data) void PoolStringArray::push_back(const String &data) {
{
godot::api->godot_pool_string_array_push_back(&_godot_array, (godot_string *)&data); godot::api->godot_pool_string_array_push_back(&_godot_array, (godot_string *)&data);
} }
void PoolStringArray::remove(const int idx) void PoolStringArray::remove(const int idx) {
{
godot::api->godot_pool_string_array_remove(&_godot_array, idx); godot::api->godot_pool_string_array_remove(&_godot_array, idx);
} }
void PoolStringArray::resize(const int size) void PoolStringArray::resize(const int size) {
{
godot::api->godot_pool_string_array_resize(&_godot_array, size); godot::api->godot_pool_string_array_resize(&_godot_array, size);
} }
void PoolStringArray::set(const int idx, const String& data) void PoolStringArray::set(const int idx, const String &data) {
{
godot::api->godot_pool_string_array_set(&_godot_array, idx, (godot_string *)&data); godot::api->godot_pool_string_array_set(&_godot_array, idx, (godot_string *)&data);
} }
const String PoolStringArray::operator [](const int idx) const String PoolStringArray::operator[](const int idx) {
{
String s; String s;
godot_string str = godot::api->godot_pool_string_array_get(&_godot_array, idx); godot_string str = godot::api->godot_pool_string_array_get(&_godot_array, idx);
godot::api->godot_string_new_copy((godot_string *)&s, &str); godot::api->godot_string_new_copy((godot_string *)&s, &str);
@@ -376,304 +302,240 @@ const String PoolStringArray::operator [](const int idx)
return s; return s;
} }
int PoolStringArray::size() const int PoolStringArray::size() const {
{
return godot::api->godot_pool_string_array_size(&_godot_array); return godot::api->godot_pool_string_array_size(&_godot_array);
} }
PoolStringArray::~PoolStringArray() {
PoolStringArray::~PoolStringArray()
{
godot::api->godot_pool_string_array_destroy(&_godot_array); godot::api->godot_pool_string_array_destroy(&_godot_array);
} }
PoolVector2Array::PoolVector2Array() {
PoolVector2Array::PoolVector2Array()
{
godot::api->godot_pool_vector2_array_new(&_godot_array); godot::api->godot_pool_vector2_array_new(&_godot_array);
} }
PoolVector2Array::PoolVector2Array(const PoolVector2Array &p_other) PoolVector2Array::PoolVector2Array(const PoolVector2Array &p_other) {
{
godot::api->godot_pool_vector2_array_new_copy(&_godot_array, &p_other._godot_array); godot::api->godot_pool_vector2_array_new_copy(&_godot_array, &p_other._godot_array);
} }
PoolVector2Array &PoolVector2Array::operator=(const PoolVector2Array &p_other) PoolVector2Array &PoolVector2Array::operator=(const PoolVector2Array &p_other) {
{
godot::api->godot_pool_vector2_array_destroy(&_godot_array); godot::api->godot_pool_vector2_array_destroy(&_godot_array);
godot::api->godot_pool_vector2_array_new_copy(&_godot_array, &p_other._godot_array); godot::api->godot_pool_vector2_array_new_copy(&_godot_array, &p_other._godot_array);
return *this; return *this;
} }
PoolVector2Array::PoolVector2Array(const Array& array) PoolVector2Array::PoolVector2Array(const Array &array) {
{
godot::api->godot_pool_vector2_array_new_with_array(&_godot_array, (godot_array *)&array); godot::api->godot_pool_vector2_array_new_with_array(&_godot_array, (godot_array *)&array);
} }
PoolVector2Array::Read PoolVector2Array::read() const PoolVector2Array::Read PoolVector2Array::read() const {
{
Read read; Read read;
read._read_access = godot::api->godot_pool_vector2_array_read(&_godot_array); read._read_access = godot::api->godot_pool_vector2_array_read(&_godot_array);
return read; return read;
} }
PoolVector2Array::Write PoolVector2Array::write() PoolVector2Array::Write PoolVector2Array::write() {
{
Write write; Write write;
write._write_access = godot::api->godot_pool_vector2_array_write(&_godot_array); write._write_access = godot::api->godot_pool_vector2_array_write(&_godot_array);
return write; return write;
} }
void PoolVector2Array::append(const Vector2& data) void PoolVector2Array::append(const Vector2 &data) {
{
godot::api->godot_pool_vector2_array_append(&_godot_array, (godot_vector2 *)&data); godot::api->godot_pool_vector2_array_append(&_godot_array, (godot_vector2 *)&data);
} }
void PoolVector2Array::append_array(const PoolVector2Array& array) void PoolVector2Array::append_array(const PoolVector2Array &array) {
{
godot::api->godot_pool_vector2_array_append_array(&_godot_array, &array._godot_array); godot::api->godot_pool_vector2_array_append_array(&_godot_array, &array._godot_array);
} }
int PoolVector2Array::insert(const int idx, const Vector2& data) int PoolVector2Array::insert(const int idx, const Vector2 &data) {
{
return godot::api->godot_pool_vector2_array_insert(&_godot_array, idx, (godot_vector2 *)&data); return godot::api->godot_pool_vector2_array_insert(&_godot_array, idx, (godot_vector2 *)&data);
} }
void PoolVector2Array::invert() void PoolVector2Array::invert() {
{
godot::api->godot_pool_vector2_array_invert(&_godot_array); godot::api->godot_pool_vector2_array_invert(&_godot_array);
} }
void PoolVector2Array::push_back(const Vector2& data) void PoolVector2Array::push_back(const Vector2 &data) {
{
godot::api->godot_pool_vector2_array_push_back(&_godot_array, (godot_vector2 *)&data); godot::api->godot_pool_vector2_array_push_back(&_godot_array, (godot_vector2 *)&data);
} }
void PoolVector2Array::remove(const int idx) void PoolVector2Array::remove(const int idx) {
{
godot::api->godot_pool_vector2_array_remove(&_godot_array, idx); godot::api->godot_pool_vector2_array_remove(&_godot_array, idx);
} }
void PoolVector2Array::resize(const int size) void PoolVector2Array::resize(const int size) {
{
godot::api->godot_pool_vector2_array_resize(&_godot_array, size); godot::api->godot_pool_vector2_array_resize(&_godot_array, size);
} }
void PoolVector2Array::set(const int idx, const Vector2& data) void PoolVector2Array::set(const int idx, const Vector2 &data) {
{
godot::api->godot_pool_vector2_array_set(&_godot_array, idx, (godot_vector2 *)&data); godot::api->godot_pool_vector2_array_set(&_godot_array, idx, (godot_vector2 *)&data);
} }
const Vector2 PoolVector2Array::operator [](const int idx) const Vector2 PoolVector2Array::operator[](const int idx) {
{
Vector2 v; Vector2 v;
*(godot_vector2 *)&v = godot::api->godot_pool_vector2_array_get(&_godot_array, idx); *(godot_vector2 *)&v = godot::api->godot_pool_vector2_array_get(&_godot_array, idx);
return v; return v;
} }
int PoolVector2Array::size() const int PoolVector2Array::size() const {
{
return godot::api->godot_pool_vector2_array_size(&_godot_array); return godot::api->godot_pool_vector2_array_size(&_godot_array);
} }
PoolVector2Array::~PoolVector2Array() {
PoolVector2Array::~PoolVector2Array()
{
godot::api->godot_pool_vector2_array_destroy(&_godot_array); godot::api->godot_pool_vector2_array_destroy(&_godot_array);
} }
PoolVector3Array::PoolVector3Array() {
PoolVector3Array::PoolVector3Array()
{
godot::api->godot_pool_vector3_array_new(&_godot_array); godot::api->godot_pool_vector3_array_new(&_godot_array);
} }
PoolVector3Array::PoolVector3Array(const PoolVector3Array &p_other) PoolVector3Array::PoolVector3Array(const PoolVector3Array &p_other) {
{
godot::api->godot_pool_vector3_array_new_copy(&_godot_array, &p_other._godot_array); godot::api->godot_pool_vector3_array_new_copy(&_godot_array, &p_other._godot_array);
} }
PoolVector3Array &PoolVector3Array::operator=(const PoolVector3Array &p_other) PoolVector3Array &PoolVector3Array::operator=(const PoolVector3Array &p_other) {
{
godot::api->godot_pool_vector3_array_destroy(&_godot_array); godot::api->godot_pool_vector3_array_destroy(&_godot_array);
godot::api->godot_pool_vector3_array_new_copy(&_godot_array, &p_other._godot_array); godot::api->godot_pool_vector3_array_new_copy(&_godot_array, &p_other._godot_array);
return *this; return *this;
} }
PoolVector3Array::PoolVector3Array(const Array& array) PoolVector3Array::PoolVector3Array(const Array &array) {
{
godot::api->godot_pool_vector3_array_new_with_array(&_godot_array, (godot_array *)&array); godot::api->godot_pool_vector3_array_new_with_array(&_godot_array, (godot_array *)&array);
} }
PoolVector3Array::Read PoolVector3Array::read() const PoolVector3Array::Read PoolVector3Array::read() const {
{
Read read; Read read;
read._read_access = godot::api->godot_pool_vector3_array_read(&_godot_array); read._read_access = godot::api->godot_pool_vector3_array_read(&_godot_array);
return read; return read;
} }
PoolVector3Array::Write PoolVector3Array::write() PoolVector3Array::Write PoolVector3Array::write() {
{
Write write; Write write;
write._write_access = godot::api->godot_pool_vector3_array_write(&_godot_array); write._write_access = godot::api->godot_pool_vector3_array_write(&_godot_array);
return write; return write;
} }
void PoolVector3Array::append(const Vector3& data) void PoolVector3Array::append(const Vector3 &data) {
{
godot::api->godot_pool_vector3_array_append(&_godot_array, (godot_vector3 *)&data); godot::api->godot_pool_vector3_array_append(&_godot_array, (godot_vector3 *)&data);
} }
void PoolVector3Array::append_array(const PoolVector3Array& array) void PoolVector3Array::append_array(const PoolVector3Array &array) {
{
godot::api->godot_pool_vector3_array_append_array(&_godot_array, &array._godot_array); godot::api->godot_pool_vector3_array_append_array(&_godot_array, &array._godot_array);
} }
int PoolVector3Array::insert(const int idx, const Vector3& data) int PoolVector3Array::insert(const int idx, const Vector3 &data) {
{
return godot::api->godot_pool_vector3_array_insert(&_godot_array, idx, (godot_vector3 *)&data); return godot::api->godot_pool_vector3_array_insert(&_godot_array, idx, (godot_vector3 *)&data);
} }
void PoolVector3Array::invert() void PoolVector3Array::invert() {
{
godot::api->godot_pool_vector3_array_invert(&_godot_array); godot::api->godot_pool_vector3_array_invert(&_godot_array);
} }
void PoolVector3Array::push_back(const Vector3& data) void PoolVector3Array::push_back(const Vector3 &data) {
{
godot::api->godot_pool_vector3_array_push_back(&_godot_array, (godot_vector3 *)&data); godot::api->godot_pool_vector3_array_push_back(&_godot_array, (godot_vector3 *)&data);
} }
void PoolVector3Array::remove(const int idx) void PoolVector3Array::remove(const int idx) {
{
godot::api->godot_pool_vector3_array_remove(&_godot_array, idx); godot::api->godot_pool_vector3_array_remove(&_godot_array, idx);
} }
void PoolVector3Array::resize(const int size) void PoolVector3Array::resize(const int size) {
{
godot::api->godot_pool_vector3_array_resize(&_godot_array, size); godot::api->godot_pool_vector3_array_resize(&_godot_array, size);
} }
void PoolVector3Array::set(const int idx, const Vector3& data) void PoolVector3Array::set(const int idx, const Vector3 &data) {
{
godot::api->godot_pool_vector3_array_set(&_godot_array, idx, (godot_vector3 *)&data); godot::api->godot_pool_vector3_array_set(&_godot_array, idx, (godot_vector3 *)&data);
} }
const Vector3 PoolVector3Array::operator [](const int idx) const Vector3 PoolVector3Array::operator[](const int idx) {
{
Vector3 v; Vector3 v;
*(godot_vector3 *)&v = godot::api->godot_pool_vector3_array_get(&_godot_array, idx); *(godot_vector3 *)&v = godot::api->godot_pool_vector3_array_get(&_godot_array, idx);
return v; return v;
} }
int PoolVector3Array::size() const int PoolVector3Array::size() const {
{
return godot::api->godot_pool_vector3_array_size(&_godot_array); return godot::api->godot_pool_vector3_array_size(&_godot_array);
} }
PoolVector3Array::~PoolVector3Array() {
PoolVector3Array::~PoolVector3Array()
{
godot::api->godot_pool_vector3_array_destroy(&_godot_array); godot::api->godot_pool_vector3_array_destroy(&_godot_array);
} }
PoolColorArray::PoolColorArray() {
PoolColorArray::PoolColorArray()
{
godot::api->godot_pool_color_array_new(&_godot_array); godot::api->godot_pool_color_array_new(&_godot_array);
} }
PoolColorArray::PoolColorArray(const PoolColorArray &p_other) PoolColorArray::PoolColorArray(const PoolColorArray &p_other) {
{
godot::api->godot_pool_color_array_new_copy(&_godot_array, &p_other._godot_array); godot::api->godot_pool_color_array_new_copy(&_godot_array, &p_other._godot_array);
} }
PoolColorArray &PoolColorArray::operator=(const PoolColorArray &p_other) PoolColorArray &PoolColorArray::operator=(const PoolColorArray &p_other) {
{
godot::api->godot_pool_color_array_destroy(&_godot_array); godot::api->godot_pool_color_array_destroy(&_godot_array);
godot::api->godot_pool_color_array_new_copy(&_godot_array, &p_other._godot_array); godot::api->godot_pool_color_array_new_copy(&_godot_array, &p_other._godot_array);
return *this; return *this;
} }
PoolColorArray::PoolColorArray(const Array& array) PoolColorArray::PoolColorArray(const Array &array) {
{
godot::api->godot_pool_color_array_new_with_array(&_godot_array, (godot_array *)&array); godot::api->godot_pool_color_array_new_with_array(&_godot_array, (godot_array *)&array);
} }
PoolColorArray::Read PoolColorArray::read() const PoolColorArray::Read PoolColorArray::read() const {
{
Read read; Read read;
read._read_access = godot::api->godot_pool_color_array_read(&_godot_array); read._read_access = godot::api->godot_pool_color_array_read(&_godot_array);
return read; return read;
} }
PoolColorArray::Write PoolColorArray::write() PoolColorArray::Write PoolColorArray::write() {
{
Write write; Write write;
write._write_access = godot::api->godot_pool_color_array_write(&_godot_array); write._write_access = godot::api->godot_pool_color_array_write(&_godot_array);
return write; return write;
} }
void PoolColorArray::append(const Color& data) void PoolColorArray::append(const Color &data) {
{
godot::api->godot_pool_color_array_append(&_godot_array, (godot_color *)&data); godot::api->godot_pool_color_array_append(&_godot_array, (godot_color *)&data);
} }
void PoolColorArray::append_array(const PoolColorArray& array) void PoolColorArray::append_array(const PoolColorArray &array) {
{
godot::api->godot_pool_color_array_append_array(&_godot_array, &array._godot_array); godot::api->godot_pool_color_array_append_array(&_godot_array, &array._godot_array);
} }
int PoolColorArray::insert(const int idx, const Color& data) int PoolColorArray::insert(const int idx, const Color &data) {
{
return godot::api->godot_pool_color_array_insert(&_godot_array, idx, (godot_color *)&data); return godot::api->godot_pool_color_array_insert(&_godot_array, idx, (godot_color *)&data);
} }
void PoolColorArray::invert() void PoolColorArray::invert() {
{
godot::api->godot_pool_color_array_invert(&_godot_array); godot::api->godot_pool_color_array_invert(&_godot_array);
} }
void PoolColorArray::push_back(const Color& data) void PoolColorArray::push_back(const Color &data) {
{
godot::api->godot_pool_color_array_push_back(&_godot_array, (godot_color *)&data); godot::api->godot_pool_color_array_push_back(&_godot_array, (godot_color *)&data);
} }
void PoolColorArray::remove(const int idx) void PoolColorArray::remove(const int idx) {
{
godot::api->godot_pool_color_array_remove(&_godot_array, idx); godot::api->godot_pool_color_array_remove(&_godot_array, idx);
} }
void PoolColorArray::resize(const int size) void PoolColorArray::resize(const int size) {
{
godot::api->godot_pool_color_array_resize(&_godot_array, size); godot::api->godot_pool_color_array_resize(&_godot_array, size);
} }
void PoolColorArray::set(const int idx, const Color& data) void PoolColorArray::set(const int idx, const Color &data) {
{
godot::api->godot_pool_color_array_set(&_godot_array, idx, (godot_color *)&data); godot::api->godot_pool_color_array_set(&_godot_array, idx, (godot_color *)&data);
} }
const Color PoolColorArray::operator [](const int idx) const Color PoolColorArray::operator[](const int idx) {
{
Color v; Color v;
*(godot_color *)&v = godot::api->godot_pool_color_array_get(&_godot_array, idx); *(godot_color *)&v = godot::api->godot_pool_color_array_get(&_godot_array, idx);
return v; return v;
} }
int PoolColorArray::size() const int PoolColorArray::size() const {
{
return godot::api->godot_pool_color_array_size(&_godot_array); return godot::api->godot_pool_color_array_size(&_godot_array);
} }
PoolColorArray::~PoolColorArray() {
PoolColorArray::~PoolColorArray()
{
godot::api->godot_pool_color_array_destroy(&_godot_array); godot::api->godot_pool_color_array_destroy(&_godot_array);
} }
} // namespace godot
}

View File

@@ -1,7 +1,7 @@
#include "Quat.hpp" #include "Quat.hpp"
#include "Basis.hpp"
#include "Defs.hpp" #include "Defs.hpp"
#include "Vector3.hpp" #include "Vector3.hpp"
#include "Basis.hpp"
#include <cmath> #include <cmath>
@@ -77,23 +77,19 @@ Vector3 Quat::get_euler_yxz() const {
return m.get_euler_yxz(); return m.get_euler_yxz();
} }
real_t Quat::length() const real_t Quat::length() const {
{
return ::sqrt(length_squared()); return ::sqrt(length_squared());
} }
void Quat::normalize() void Quat::normalize() {
{
*this /= length(); *this /= length();
} }
Quat Quat::normalized() const Quat Quat::normalized() const {
{
return *this / length(); return *this / length();
} }
Quat Quat::inverse() const Quat Quat::inverse() const {
{
return Quat(-x, -y, -z, w); return Quat(-x, -y, -z, w);
} }
@@ -102,7 +98,6 @@ Quat Quat::slerp(const Quat& q, const real_t& t) const {
Quat to1; Quat to1;
real_t omega, cosom, sinom, scale0, scale1; real_t omega, cosom, sinom, scale0, scale1;
// calc cosine // calc cosine
cosom = dot(q); cosom = dot(q);
@@ -120,7 +115,6 @@ Quat Quat::slerp(const Quat& q, const real_t& t) const {
to1.w = q.w; to1.w = q.w;
} }
// calculate coefficients // calculate coefficients
if ((1.0 - cosom) > CMP_EPSILON) { if ((1.0 - cosom) > CMP_EPSILON) {
@@ -140,8 +134,7 @@ Quat Quat::slerp(const Quat& q, const real_t& t) const {
scale0 * x + scale1 * to1.x, scale0 * x + scale1 * to1.x,
scale0 * y + scale1 * to1.y, scale0 * y + scale1 * to1.y,
scale0 * z + scale1 * to1.z, scale0 * z + scale1 * to1.z,
scale0 * w + scale1 * to1.w scale0 * w + scale1 * to1.w);
);
} }
Quat Quat::slerpni(const Quat &q, const real_t &t) const { Quat Quat::slerpni(const Quat &q, const real_t &t) const {
@@ -163,8 +156,7 @@ Quat Quat::slerpni(const Quat& q, const real_t& t) const {
invFactor * from.w + newFactor * q.w); invFactor * from.w + newFactor * q.w);
} }
Quat Quat::cubic_slerp(const Quat& q, const Quat& prep, const Quat& postq,const real_t& t) const Quat Quat::cubic_slerp(const Quat &q, const Quat &prep, const Quat &postq, const real_t &t) const {
{
//the only way to do slerp :| //the only way to do slerp :|
real_t t2 = (1.0 - t) * t * 2; real_t t2 = (1.0 - t) * t * 2;
Quat sp = this->slerp(q, t); Quat sp = this->slerp(q, t);
@@ -179,10 +171,7 @@ void Quat::get_axis_and_angle(Vector3& r_axis, real_t &r_angle) const {
r_axis.z = z / ::sqrt(1 - w * w); r_axis.z = z / ::sqrt(1 - w * w);
} }
Quat Quat::operator*(const Vector3 &v) const {
Quat Quat::operator*(const Vector3& v) const
{
return Quat(w * v.x + y * v.z - z * v.y, return Quat(w * v.x + y * v.z - z * v.y,
w * v.y + z * v.x - x * v.z, w * v.y + z * v.x - x * v.z,
w * v.z + x * v.y - y * v.x, w * v.z + x * v.y - y * v.x,
@@ -196,15 +185,11 @@ Vector3 Quat::xform(const Vector3& v) const {
return Vector3(q.x, q.y, q.z); return Vector3(q.x, q.y, q.z);
} }
Quat::operator String() const {
Quat::operator String() const
{
return String(); // @Todo return String(); // @Todo
} }
Quat::Quat(const Vector3 &axis, const real_t &angle) {
Quat::Quat(const Vector3& axis, const real_t& angle)
{
real_t d = axis.length(); real_t d = axis.length();
if (d == 0) if (d == 0)
set(0, 0, 0, 0); set(0, 0, 0, 0);
@@ -239,7 +224,6 @@ Quat::Quat(const Vector3& v0, const Vector3& v1) // shortest arc
} }
} }
real_t Quat::dot(const Quat &q) const { real_t Quat::dot(const Quat &q) const {
return x * q.x + y * q.y + z * q.z + w * q.w; return x * q.x + y * q.y + z * q.z + w * q.w;
} }
@@ -249,23 +233,33 @@ real_t Quat::length_squared() const {
} }
void Quat::operator+=(const Quat &q) { void Quat::operator+=(const Quat &q) {
x += q.x; y += q.y; z += q.z; w += q.w; x += q.x;
y += q.y;
z += q.z;
w += q.w;
} }
void Quat::operator-=(const Quat &q) { void Quat::operator-=(const Quat &q) {
x -= q.x; y -= q.y; z -= q.z; w -= q.w; x -= q.x;
y -= q.y;
z -= q.z;
w -= q.w;
} }
void Quat::operator*=(const Quat &q) { void Quat::operator*=(const Quat &q) {
x *= q.x; y *= q.y; z *= q.z; w *= q.w; x *= q.x;
y *= q.y;
z *= q.z;
w *= q.w;
} }
void Quat::operator*=(const real_t &s) { void Quat::operator*=(const real_t &s) {
x *= s; y *= s; z *= s; w *= s; x *= s;
y *= s;
z *= s;
w *= s;
} }
void Quat::operator/=(const real_t &s) { void Quat::operator/=(const real_t &s) {
*this *= 1.0 / s; *this *= 1.0 / s;
@@ -287,7 +281,6 @@ Quat Quat::operator*(const Quat& q2) const {
return q1; return q1;
} }
Quat Quat::operator-() const { Quat Quat::operator-() const {
const Quat &q2 = *this; const Quat &q2 = *this;
return Quat(-q2.x, -q2.y, -q2.z, -q2.w); return Quat(-q2.x, -q2.y, -q2.z, -q2.w);
@@ -301,7 +294,6 @@ Quat Quat::operator/(const real_t& s) const {
return *this * (1.0 / s); return *this * (1.0 / s);
} }
bool Quat::operator==(const Quat &p_quat) const { bool Quat::operator==(const Quat &p_quat) const {
return x == p_quat.x && y == p_quat.y && z == p_quat.z && w == p_quat.w; return x == p_quat.x && y == p_quat.y && z == p_quat.z && w == p_quat.w;
} }
@@ -310,4 +302,4 @@ bool Quat::operator!=(const Quat& p_quat) const {
return x != p_quat.x || y != p_quat.y || z != p_quat.z || w != p_quat.w; return x != p_quat.x || y != p_quat.y || z != p_quat.z || w != p_quat.w;
} }
} } // namespace godot

View File

@@ -6,50 +6,40 @@
namespace godot { namespace godot {
RID::RID() RID::RID() {
{
godot::api->godot_rid_new(&_godot_rid); godot::api->godot_rid_new(&_godot_rid);
} }
RID::RID(Object *p) RID::RID(Object *p) {
{
godot::api->godot_rid_new_with_resource(&_godot_rid, (const godot_object *)p); godot::api->godot_rid_new_with_resource(&_godot_rid, (const godot_object *)p);
} }
int32_t RID::get_rid() const int32_t RID::get_rid() const {
{
return godot::api->godot_rid_get_id(&_godot_rid); return godot::api->godot_rid_get_id(&_godot_rid);
} }
bool RID::operator==(const RID & p_other) const bool RID::operator==(const RID &p_other) const {
{
return godot::api->godot_rid_operator_equal(&_godot_rid, &p_other._godot_rid); return godot::api->godot_rid_operator_equal(&_godot_rid, &p_other._godot_rid);
} }
bool RID::operator!=(const RID & p_other) const bool RID::operator!=(const RID &p_other) const {
{
return !(*this == p_other); return !(*this == p_other);
} }
bool RID::operator<(const RID & p_other) const bool RID::operator<(const RID &p_other) const {
{
return godot::api->godot_rid_operator_less(&_godot_rid, &p_other._godot_rid); return godot::api->godot_rid_operator_less(&_godot_rid, &p_other._godot_rid);
} }
bool RID::operator>(const RID & p_other) const bool RID::operator>(const RID &p_other) const {
{
return !(*this < p_other) && *this != p_other; return !(*this < p_other) && *this != p_other;
} }
bool RID::operator<=(const RID & p_other) const bool RID::operator<=(const RID &p_other) const {
{
return (*this < p_other) || *this == p_other; return (*this < p_other) || *this == p_other;
} }
bool RID::operator>=(const RID & p_other) const bool RID::operator>=(const RID &p_other) const {
{
return !(*this < p_other); return !(*this < p_other);
} }
} // namespace godot
}

View File

@@ -1,7 +1,7 @@
#include "Rect2.hpp" #include "Rect2.hpp"
#include "Vector2.hpp"
#include "String.hpp" #include "String.hpp"
#include "Transform2D.hpp" #include "Transform2D.hpp"
#include "Vector2.hpp"
#include <cmath> #include <cmath>
@@ -15,22 +15,21 @@ namespace godot {
#define MIN(a, b) (a < b ? a : b) #define MIN(a, b) (a < b ? a : b)
#endif #endif
real_t Rect2::distance_to(const Vector2 &p_point) const { real_t Rect2::distance_to(const Vector2 &p_point) const {
real_t dist = 1e20; real_t dist = 1e20;
if (p_point.x < pos.x) { if (p_point.x < position.x) {
dist=MIN(dist,pos.x-p_point.x); dist = MIN(dist, position.x - p_point.x);
} }
if (p_point.y < pos.y) { if (p_point.y < position.y) {
dist=MIN(dist,pos.y-p_point.y); dist = MIN(dist, position.y - p_point.y);
} }
if (p_point.x >= (pos.x+size.x) ) { if (p_point.x >= (position.x + size.x)) {
dist=MIN(p_point.x-(pos.x+size.x),dist); dist = MIN(p_point.x - (position.x + size.x), dist);
} }
if (p_point.y >= (pos.y+size.y) ) { if (p_point.y >= (position.y + size.y)) {
dist=MIN(p_point.y-(pos.y+size.y),dist); dist = MIN(p_point.y - (position.y + size.y), dist);
} }
if (dist == 1e20) if (dist == 1e20)
@@ -46,14 +45,14 @@ Rect2 Rect2::clip(const Rect2& p_rect) const { /// return a clipped rect
if (!intersects(new_rect)) if (!intersects(new_rect))
return Rect2(); return Rect2();
new_rect.pos.x = MAX( p_rect.pos.x , pos.x ); new_rect.position.x = MAX(p_rect.position.x, position.x);
new_rect.pos.y = MAX( p_rect.pos.y , pos.y ); new_rect.position.y = MAX(p_rect.position.y, position.y);
Point2 p_rect_end=p_rect.pos+p_rect.size; Point2 p_rect_end = p_rect.position + p_rect.size;
Point2 end=pos+size; Point2 end = position + size;
new_rect.size.x=MIN(p_rect_end.x,end.x) - new_rect.pos.x; new_rect.size.x = MIN(p_rect_end.x, end.x) - new_rect.position.x;
new_rect.size.y=MIN(p_rect_end.y,end.y) - new_rect.pos.y; new_rect.size.y = MIN(p_rect_end.y, end.y) - new_rect.position.y;
return new_rect; return new_rect;
} }
@@ -62,27 +61,22 @@ Rect2 Rect2::merge(const Rect2& p_rect) const { ///< return a merged rect
Rect2 new_rect; Rect2 new_rect;
new_rect.pos.x=MIN( p_rect.pos.x , pos.x ); new_rect.position.x = MIN(p_rect.position.x, position.x);
new_rect.pos.y=MIN( p_rect.pos.y , pos.y ); new_rect.position.y = MIN(p_rect.position.y, position.y);
new_rect.size.x = MAX(p_rect.position.x + p_rect.size.x, position.x + size.x);
new_rect.size.y = MAX(p_rect.position.y + p_rect.size.y, position.y + size.y);
new_rect.size.x = MAX( p_rect.pos.x+p_rect.size.x , pos.x+size.x ); new_rect.size = new_rect.size - new_rect.position; //make relative again
new_rect.size.y = MAX( p_rect.pos.y+p_rect.size.y , pos.y+size.y );
new_rect.size = new_rect.size - new_rect.pos; //make relative again
return new_rect; return new_rect;
} }
Rect2::operator String() const {
return String(position) + ", " + String(size);
Rect2::operator String() const
{
return String(pos)+", "+String(size);
} }
bool Rect2::intersects_segment(const Point2 &p_from, const Point2 &p_to, Point2 *r_position, Point2 *r_normal) const {
bool Rect2::intersects_segment(const Point2& p_from, const Point2& p_to, Point2* r_pos,Point2* r_normal) const {
real_t min = 0, max = 1; real_t min = 0, max = 1;
int axis = 0; int axis = 0;
@@ -91,7 +85,7 @@ bool Rect2::intersects_segment(const Point2& p_from, const Point2& p_to, Point2*
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
real_t seg_from = p_from[i]; real_t seg_from = p_from[i];
real_t seg_to = p_to[i]; real_t seg_to = p_to[i];
real_t box_begin=pos[i]; real_t box_begin = position[i];
real_t box_end = box_begin + size[i]; real_t box_end = box_begin + size[i];
real_t cmin, cmax; real_t cmin, cmax;
real_t csign; real_t csign;
@@ -126,7 +120,6 @@ bool Rect2::intersects_segment(const Point2& p_from, const Point2& p_to, Point2*
return false; return false;
} }
Vector2 rel = p_to - p_from; Vector2 rel = p_to - p_from;
if (r_normal) { if (r_normal) {
@@ -135,42 +128,41 @@ bool Rect2::intersects_segment(const Point2& p_from, const Point2& p_to, Point2*
*r_normal = normal; *r_normal = normal;
} }
if (r_pos) if (r_position)
*r_pos=p_from+rel*min; *r_position = p_from + rel * min;
return true; return true;
} }
bool Rect2::intersects_transformed(const Transform2D &p_xform, const Rect2 &p_rect) const { bool Rect2::intersects_transformed(const Transform2D &p_xform, const Rect2 &p_rect) const {
//SAT intersection between local and transformed rect2 //SAT intersection between local and transformed rect2
Vector2 xf_points[4] = { Vector2 xf_points[4] = {
p_xform.xform(p_rect.pos), p_xform.xform(p_rect.position),
p_xform.xform(Vector2(p_rect.pos.x+p_rect.size.x,p_rect.pos.y)), p_xform.xform(Vector2(p_rect.position.x + p_rect.size.x, p_rect.position.y)),
p_xform.xform(Vector2(p_rect.pos.x,p_rect.pos.y+p_rect.size.y)), p_xform.xform(Vector2(p_rect.position.x, p_rect.position.y + p_rect.size.y)),
p_xform.xform(Vector2(p_rect.pos.x+p_rect.size.x,p_rect.pos.y+p_rect.size.y)), p_xform.xform(Vector2(p_rect.position.x + p_rect.size.x, p_rect.position.y + p_rect.size.y)),
}; };
real_t low_limit; real_t low_limit;
//base rect2 first (faster) //base rect2 first (faster)
if (xf_points[0].y>pos.y) if (xf_points[0].y > position.y)
goto next1; goto next1;
if (xf_points[1].y>pos.y) if (xf_points[1].y > position.y)
goto next1; goto next1;
if (xf_points[2].y>pos.y) if (xf_points[2].y > position.y)
goto next1; goto next1;
if (xf_points[3].y>pos.y) if (xf_points[3].y > position.y)
goto next1; goto next1;
return false; return false;
next1: next1:
low_limit=pos.y+size.y; low_limit = position.y + size.y;
if (xf_points[0].y < low_limit) if (xf_points[0].y < low_limit)
goto next2; goto next2;
@@ -185,20 +177,20 @@ bool Rect2::intersects_transformed(const Transform2D& p_xform, const Rect2& p_re
next2: next2:
if (xf_points[0].x>pos.x) if (xf_points[0].x > position.x)
goto next3; goto next3;
if (xf_points[1].x>pos.x) if (xf_points[1].x > position.x)
goto next3; goto next3;
if (xf_points[2].x>pos.x) if (xf_points[2].x > position.x)
goto next3; goto next3;
if (xf_points[3].x>pos.x) if (xf_points[3].x > position.x)
goto next3; goto next3;
return false; return false;
next3: next3:
low_limit=pos.x+size.x; low_limit = position.x + size.x;
if (xf_points[0].x < low_limit) if (xf_points[0].x < low_limit)
goto next4; goto next4;
@@ -214,10 +206,10 @@ bool Rect2::intersects_transformed(const Transform2D& p_xform, const Rect2& p_re
next4: next4:
Vector2 xf_points2[4] = { Vector2 xf_points2[4] = {
pos, position,
Vector2(pos.x+size.x,pos.y), Vector2(position.x + size.x, position.y),
Vector2(pos.x,pos.y+size.y), Vector2(position.x, position.y + size.y),
Vector2(pos.x+size.x,pos.y+size.y), Vector2(position.x + size.x, position.y + size.y),
}; };
real_t maxa = p_xform.elements[0].dot(xf_points2[0]); real_t maxa = p_xform.elements[0].dot(xf_points2[0]);
@@ -250,7 +242,6 @@ bool Rect2::intersects_transformed(const Transform2D& p_xform, const Rect2& p_re
maxb = MAX(dp, maxb); maxb = MAX(dp, maxb);
minb = MIN(dp, minb); minb = MIN(dp, minb);
if (mina > maxb) if (mina > maxb)
return false; return false;
if (minb > maxa) if (minb > maxa)
@@ -286,15 +277,12 @@ bool Rect2::intersects_transformed(const Transform2D& p_xform, const Rect2& p_re
maxb = MAX(dp, maxb); maxb = MAX(dp, maxb);
minb = MIN(dp, minb); minb = MIN(dp, minb);
if (mina > maxb) if (mina > maxb)
return false; return false;
if (minb > maxa) if (minb > maxa)
return false; return false;
return true; return true;
} }
} } // namespace godot

View File

@@ -1,10 +1,10 @@
#include "String.hpp" #include "String.hpp"
#include "Array.hpp" #include "Array.hpp"
#include "GodotGlobal.hpp"
#include "NodePath.hpp" #include "NodePath.hpp"
#include "PoolArrays.hpp" #include "PoolArrays.hpp"
#include "Variant.hpp" #include "Variant.hpp"
#include "GodotGlobal.hpp"
#include <gdnative/string.h> #include <gdnative/string.h>
@@ -99,7 +99,7 @@ String::~String() {
} }
wchar_t &String::operator[](const int idx) { wchar_t &String::operator[](const int idx) {
return *godot::api->godot_string_operator_index(&_godot_string, idx); return *const_cast<wchar_t *>(godot::api->godot_string_operator_index(&_godot_string, idx));
} }
wchar_t String::operator[](const int idx) const { wchar_t String::operator[](const int idx) const {
@@ -256,15 +256,15 @@ void String::erase(int position, int chars) {
} }
int String::find(String p_what, int p_from) const { int String::find(String p_what, int p_from) const {
return godot::api->godot_string_find(&_godot_string, p_what._godot_string); return godot::api->godot_string_find_from(&_godot_string, p_what._godot_string, p_from);
} }
int String::find_last(String what) const { int String::find_last(String p_what) const {
return godot::api->godot_string_find_last(&_godot_string, what._godot_string); return godot::api->godot_string_find_last(&_godot_string, p_what._godot_string);
} }
int String::findn(String what, int from) const { int String::findn(String p_what, int p_from) const {
return godot::api->godot_string_findn(&_godot_string, what._godot_string); return godot::api->godot_string_findn_from(&_godot_string, p_what._godot_string, p_from);
} }
String String::format(Variant values) const { String String::format(Variant values) const {
@@ -443,13 +443,12 @@ String String::replacen(String what, String forwhat) const {
return new_string; return new_string;
} }
int String::rfind(String what, int from) const { int String::rfind(String p_what, int p_from) const {
return godot::api->godot_string_rfind(&_godot_string, what._godot_string); return godot::api->godot_string_rfind_from(&_godot_string, p_what._godot_string, p_from);
} }
int String::rfindn(String what, int from) const { int String::rfindn(String p_what, int p_from) const {
// From -1 return godot::api->godot_string_rfindn_from(&_godot_string, p_what._godot_string, p_from);
return godot::api->godot_string_rfindn(&_godot_string, what._godot_string);
} }
String String::right(int position) const { String String::right(int position) const {
@@ -543,4 +542,17 @@ String String::xml_unescape() const {
return new_string; return new_string;
} }
signed char String::casecmp_to(String p_str) const {
return godot::api->godot_string_casecmp_to(&_godot_string, &p_str._godot_string);
} }
signed char String::nocasecmp_to(String p_str) const {
return godot::api->godot_string_nocasecmp_to(&_godot_string, &p_str._godot_string);
}
signed char String::naturalnocasecmp_to(String p_str) const {
return godot::api->godot_string_naturalnocasecmp_to(&_godot_string, &p_str._godot_string);
}
} // namespace godot

View File

@@ -10,29 +10,25 @@ namespace _TagDB {
std::unordered_map<size_t, size_t> parent_to; std::unordered_map<size_t, size_t> parent_to;
void register_type(size_t type_tag, size_t base_type_tag) void register_type(size_t type_tag, size_t base_type_tag) {
{
if (type_tag == base_type_tag) { if (type_tag == base_type_tag) {
return; return;
} }
parent_to[type_tag] = base_type_tag; parent_to[type_tag] = base_type_tag;
} }
bool is_type_known(size_t type_tag) bool is_type_known(size_t type_tag) {
{
return parent_to.find(type_tag) != parent_to.end(); return parent_to.find(type_tag) != parent_to.end();
} }
void register_global_type(const char *name, size_t type_tag, size_t base_type_tag) void register_global_type(const char *name, size_t type_tag, size_t base_type_tag) {
{
godot::nativescript_1_1_api->godot_nativescript_set_global_type_tag(godot::_RegisterState::language_index, name, (const void *)type_tag); godot::nativescript_1_1_api->godot_nativescript_set_global_type_tag(godot::_RegisterState::language_index, name, (const void *)type_tag);
register_type(type_tag, base_type_tag); register_type(type_tag, base_type_tag);
} }
bool is_type_compatible(size_t ask_tag, size_t have_tag) bool is_type_compatible(size_t ask_tag, size_t have_tag) {
{
if (have_tag == 0) if (have_tag == 0)
return false; return false;
@@ -49,7 +45,6 @@ bool is_type_compatible(size_t ask_tag, size_t have_tag)
return false; return false;
} }
} } // namespace _TagDB
} // namespace godot
}

View File

@@ -2,15 +2,13 @@
#include "Basis.hpp" #include "Basis.hpp"
#include "Plane.hpp"
#include "AABB.hpp" #include "AABB.hpp"
#include "Plane.hpp"
#include "Quat.hpp" #include "Quat.hpp"
namespace godot { namespace godot {
Transform Transform::inverse_xform(const Transform &t) const { Transform Transform::inverse_xform(const Transform &t) const {
Vector3 v = t.origin - origin; Vector3 v = t.origin - origin;
@@ -34,15 +32,12 @@ void Transform::set(real_t xx, real_t xy, real_t xz, real_t yx, real_t yy, real_
origin.z = tz; origin.z = tz;
} }
Vector3 Transform::xform(const Vector3 &p_vector) const { Vector3 Transform::xform(const Vector3 &p_vector) const {
return Vector3( return Vector3(
basis[0].dot(p_vector) + origin.x, basis[0].dot(p_vector) + origin.x,
basis[1].dot(p_vector) + origin.y, basis[1].dot(p_vector) + origin.y,
basis[2].dot(p_vector)+origin.z basis[2].dot(p_vector) + origin.z);
);
} }
Vector3 Transform::xform_inv(const Vector3 &p_vector) const { Vector3 Transform::xform_inv(const Vector3 &p_vector) const {
@@ -51,13 +46,11 @@ Vector3 Transform::xform_inv(const Vector3& p_vector) const {
return Vector3( return Vector3(
(basis.elements[0][0] * v.x) + (basis.elements[1][0] * v.y) + (basis.elements[2][0] * v.z), (basis.elements[0][0] * v.x) + (basis.elements[1][0] * v.y) + (basis.elements[2][0] * v.z),
(basis.elements[0][1] * v.x) + (basis.elements[1][1] * v.y) + (basis.elements[2][1] * v.z), (basis.elements[0][1] * v.x) + (basis.elements[1][1] * v.y) + (basis.elements[2][1] * v.z),
(basis.elements[0][2]*v.x ) + ( basis.elements[1][2]*v.y ) + ( basis.elements[2][2]*v.z ) (basis.elements[0][2] * v.x) + (basis.elements[1][2] * v.y) + (basis.elements[2][2] * v.z));
);
} }
Plane Transform::xform(const Plane &p_plane) const { Plane Transform::xform(const Plane &p_plane) const {
Vector3 point = p_plane.normal * p_plane.d; Vector3 point = p_plane.normal * p_plane.d;
Vector3 point_dir = point + p_plane.normal; Vector3 point_dir = point + p_plane.normal;
point = xform(point); point = xform(point);
@@ -68,21 +61,19 @@ Plane Transform::xform(const Plane& p_plane) const {
real_t d = normal.dot(point); real_t d = normal.dot(point);
return Plane(normal, d); return Plane(normal, d);
} }
Plane Transform::xform_inv(const Plane &p_plane) const { Plane Transform::xform_inv(const Plane &p_plane) const {
Vector3 point = p_plane.normal * p_plane.d; Vector3 point = p_plane.normal * p_plane.d;
Vector3 point_dir = point + p_plane.normal; Vector3 point_dir = point + p_plane.normal;
xform_inv(point); point = xform_inv(point);
xform_inv(point_dir); point_dir = xform_inv(point_dir);
Vector3 normal = point_dir - point; Vector3 normal = point_dir - point;
normal.normalize(); normal.normalize();
real_t d = normal.dot(point); real_t d = normal.dot(point);
return Plane(normal, d); return Plane(normal, d);
} }
AABB Transform::xform(const AABB &p_aabb) const { AABB Transform::xform(const AABB &p_aabb) const {
@@ -102,7 +93,6 @@ AABB Transform::xform(const AABB& p_aabb) const {
new_aabb.expand_to(pos + y + z); new_aabb.expand_to(pos + y + z);
new_aabb.expand_to(pos + x + y + z); new_aabb.expand_to(pos + x + y + z);
return new_aabb; return new_aabb;
} }
AABB Transform::xform_inv(const AABB &p_aabb) const { AABB Transform::xform_inv(const AABB &p_aabb) const {
@@ -118,7 +108,6 @@ AABB Transform::xform_inv(const AABB& p_aabb) const {
Vector3(p_aabb.position.x, p_aabb.position.y, p_aabb.position.z) Vector3(p_aabb.position.x, p_aabb.position.y, p_aabb.position.z)
}; };
AABB ret; AABB ret;
ret.position = xform_inv(vertices[0]); ret.position = xform_inv(vertices[0]);
@@ -129,7 +118,6 @@ AABB Transform::xform_inv(const AABB& p_aabb) const {
} }
return ret; return ret;
} }
void Transform::affine_invert() { void Transform::affine_invert() {
@@ -143,10 +131,8 @@ Transform Transform::affine_inverse() const {
Transform ret = *this; Transform ret = *this;
ret.affine_invert(); ret.affine_invert();
return ret; return ret;
} }
void Transform::invert() { void Transform::invert() {
basis.transpose(); basis.transpose();
@@ -161,7 +147,6 @@ Transform Transform::inverse() const {
return ret; return ret;
} }
void Transform::rotate(const Vector3 &p_axis, real_t p_phi) { void Transform::rotate(const Vector3 &p_axis, real_t p_phi) {
*this = rotated(p_axis, p_phi); *this = rotated(p_axis, p_phi);
@@ -198,7 +183,6 @@ void Transform::set_look_at( const Vector3& p_eye, const Vector3& p_target, cons
v_y = p_up; v_y = p_up;
v_x = v_y.cross(v_z); v_x = v_y.cross(v_z);
/* Recompute Y = Z cross X */ /* Recompute Y = Z cross X */
@@ -211,7 +195,6 @@ void Transform::set_look_at( const Vector3& p_eye, const Vector3& p_target, cons
basis.set_axis(1, v_y); basis.set_axis(1, v_y);
basis.set_axis(2, v_z); basis.set_axis(2, v_z);
origin = p_eye; origin = p_eye;
} }
Transform Transform::interpolate_with(const Transform &p_transform, real_t p_c) const { Transform Transform::interpolate_with(const Transform &p_transform, real_t p_c) const {
@@ -254,7 +237,6 @@ void Transform::scale_basis(const Vector3& p_scale) {
void Transform::translate(real_t p_tx, real_t p_ty, real_t p_tz) { void Transform::translate(real_t p_tx, real_t p_ty, real_t p_tz) {
translate(Vector3(p_tx, p_ty, p_tz)); translate(Vector3(p_tx, p_ty, p_tz));
} }
void Transform::translate(const Vector3 &p_translation) { void Transform::translate(const Vector3 &p_translation) {
@@ -309,11 +291,10 @@ Transform::operator String() const {
return basis.operator String() + " - " + origin.operator String(); return basis.operator String() + " - " + origin.operator String();
} }
Transform::Transform(const Basis &p_basis, const Vector3 &p_origin) { Transform::Transform(const Basis &p_basis, const Vector3 &p_origin) {
basis = p_basis; basis = p_basis;
origin = p_origin; origin = p_origin;
} }
} } // namespace godot

View File

@@ -1,7 +1,7 @@
#include "Transform2D.hpp" #include "Transform2D.hpp"
#include "Vector2.hpp"
#include "String.hpp"
#include "Rect2.hpp" #include "Rect2.hpp"
#include "String.hpp"
#include "Vector2.hpp"
#include <algorithm> #include <algorithm>
@@ -17,30 +17,26 @@ Transform2D::Transform2D(real_t xx, real_t xy, real_t yx, real_t yy, real_t ox,
elements[2][1] = oy; elements[2][1] = oy;
} }
Vector2 Transform2D::basis_xform(const Vector2 &v) const { Vector2 Transform2D::basis_xform(const Vector2 &v) const {
return Vector2( return Vector2(
tdotx(v), tdotx(v),
tdoty(v) tdoty(v));
);
} }
Vector2 Transform2D::basis_xform_inv(const Vector2 &v) const { Vector2 Transform2D::basis_xform_inv(const Vector2 &v) const {
return Vector2( return Vector2(
elements[0].dot(v), elements[0].dot(v),
elements[1].dot(v) elements[1].dot(v));
);
} }
Vector2 Transform2D::xform(const Vector2 &v) const { Vector2 Transform2D::xform(const Vector2 &v) const {
return Vector2( return Vector2(
tdotx(v), tdotx(v),
tdoty(v) tdoty(v)) +
) + elements[2]; elements[2];
} }
Vector2 Transform2D::xform_inv(const Vector2 &p_vec) const { Vector2 Transform2D::xform_inv(const Vector2 &p_vec) const {
@@ -48,21 +44,19 @@ Vector2 Transform2D::xform_inv(const Vector2& p_vec) const {
return Vector2( return Vector2(
elements[0].dot(v), elements[0].dot(v),
elements[1].dot(v) elements[1].dot(v));
);
} }
Rect2 Transform2D::xform(const Rect2 &p_rect) const { Rect2 Transform2D::xform(const Rect2 &p_rect) const {
Vector2 x = elements[0] * p_rect.size.x; Vector2 x = elements[0] * p_rect.size.x;
Vector2 y = elements[1] * p_rect.size.y; Vector2 y = elements[1] * p_rect.size.y;
Vector2 pos = xform( p_rect.pos ); Vector2 position = xform(p_rect.position);
Rect2 new_rect; Rect2 new_rect;
new_rect.pos=pos; new_rect.position = position;
new_rect.expand_to( pos+x ); new_rect.expand_to(position + x);
new_rect.expand_to( pos+y ); new_rect.expand_to(position + y);
new_rect.expand_to( pos+x+y ); new_rect.expand_to(position + x + y);
return new_rect; return new_rect;
} }
@@ -72,20 +66,19 @@ void Transform2D::set_rotation_and_scale(real_t p_rot,const Size2& p_scale) {
elements[1][1] = ::cos(p_rot) * p_scale.y; elements[1][1] = ::cos(p_rot) * p_scale.y;
elements[1][0] = -::sin(p_rot) * p_scale.y; elements[1][0] = -::sin(p_rot) * p_scale.y;
elements[0][1] = ::sin(p_rot) * p_scale.x; elements[0][1] = ::sin(p_rot) * p_scale.x;
} }
Rect2 Transform2D::xform_inv(const Rect2 &p_rect) const { Rect2 Transform2D::xform_inv(const Rect2 &p_rect) const {
Vector2 ends[4] = { Vector2 ends[4] = {
xform_inv( p_rect.pos ), xform_inv(p_rect.position),
xform_inv( Vector2(p_rect.pos.x,p_rect.pos.y+p_rect.size.y ) ), xform_inv(Vector2(p_rect.position.x, p_rect.position.y + p_rect.size.y)),
xform_inv( Vector2(p_rect.pos.x+p_rect.size.x,p_rect.pos.y+p_rect.size.y ) ), xform_inv(Vector2(p_rect.position.x + p_rect.size.x, p_rect.position.y + p_rect.size.y)),
xform_inv( Vector2(p_rect.pos.x+p_rect.size.x,p_rect.pos.y ) ) xform_inv(Vector2(p_rect.position.x + p_rect.size.x, p_rect.position.y))
}; };
Rect2 new_rect; Rect2 new_rect;
new_rect.pos=ends[0]; new_rect.position = ends[0];
new_rect.expand_to(ends[1]); new_rect.expand_to(ends[1]);
new_rect.expand_to(ends[2]); new_rect.expand_to(ends[2]);
new_rect.expand_to(ends[3]); new_rect.expand_to(ends[3]);
@@ -105,7 +98,6 @@ Transform2D Transform2D::inverse() const {
Transform2D inv = *this; Transform2D inv = *this;
inv.invert(); inv.invert();
return inv; return inv;
} }
void Transform2D::affine_invert() { void Transform2D::affine_invert() {
@@ -119,7 +111,6 @@ void Transform2D::affine_invert() {
elements[1] *= Vector2(-idet, idet); elements[1] *= Vector2(-idet, idet);
elements[2] = basis_xform(-elements[2]); elements[2] = basis_xform(-elements[2]);
} }
Transform2D Transform2D::affine_inverse() const { Transform2D Transform2D::affine_inverse() const {
@@ -152,7 +143,7 @@ void Transform2D::set_rotation(real_t p_rot) {
elements[1][1] = cr; elements[1][1] = cr;
} }
Transform2D::Transform2D(real_t p_rot, const Vector2& p_pos) { Transform2D::Transform2D(real_t p_rot, const Vector2 &p_position) {
real_t cr = ::cos(p_rot); real_t cr = ::cos(p_rot);
real_t sr = ::sin(p_rot); real_t sr = ::sin(p_rot);
@@ -160,7 +151,7 @@ Transform2D::Transform2D(real_t p_rot, const Vector2& p_pos) {
elements[0][1] = sr; elements[0][1] = sr;
elements[1][0] = -sr; elements[1][0] = -sr;
elements[1][1] = cr; elements[1][1] = cr;
elements[2]=p_pos; elements[2] = p_position;
} }
Size2 Transform2D::get_scale() const { Size2 Transform2D::get_scale() const {
@@ -178,7 +169,6 @@ void Transform2D::scale_basis(const Size2& p_scale) {
elements[0][1] *= p_scale.y; elements[0][1] *= p_scale.y;
elements[1][0] *= p_scale.x; elements[1][0] *= p_scale.x;
elements[1][1] *= p_scale.y; elements[1][1] *= p_scale.y;
} }
void Transform2D::translate(real_t p_tx, real_t p_ty) { void Transform2D::translate(real_t p_tx, real_t p_ty) {
@@ -208,7 +198,6 @@ Transform2D Transform2D::orthonormalized() const {
Transform2D on = *this; Transform2D on = *this;
on.orthonormalize(); on.orthonormalize();
return on; return on;
} }
bool Transform2D::operator==(const Transform2D &p_transform) const { bool Transform2D::operator==(const Transform2D &p_transform) const {
@@ -229,7 +218,6 @@ bool Transform2D::operator!=(const Transform2D& p_transform) const {
} }
return false; return false;
} }
void Transform2D::operator*=(const Transform2D &p_transform) { void Transform2D::operator*=(const Transform2D &p_transform) {
@@ -249,13 +237,11 @@ void Transform2D::operator*=(const Transform2D& p_transform) {
elements[1][1] = y1; elements[1][1] = y1;
} }
Transform2D Transform2D::operator*(const Transform2D &p_transform) const { Transform2D Transform2D::operator*(const Transform2D &p_transform) const {
Transform2D t = *this; Transform2D t = *this;
t *= p_transform; t *= p_transform;
return t; return t;
} }
Transform2D Transform2D::scaled(const Size2 &p_scale) const { Transform2D Transform2D::scaled(const Size2 &p_scale) const {
@@ -263,7 +249,6 @@ Transform2D Transform2D::scaled(const Size2& p_scale) const {
Transform2D copy = *this; Transform2D copy = *this;
copy.scale(p_scale); copy.scale(p_scale);
return copy; return copy;
} }
Transform2D Transform2D::basis_scaled(const Size2 &p_scale) const { Transform2D Transform2D::basis_scaled(const Size2 &p_scale) const {
@@ -271,7 +256,6 @@ Transform2D Transform2D::basis_scaled(const Size2& p_scale) const {
Transform2D copy = *this; Transform2D copy = *this;
copy.scale_basis(p_scale); copy.scale_basis(p_scale);
return copy; return copy;
} }
Transform2D Transform2D::untranslated() const { Transform2D Transform2D::untranslated() const {
@@ -286,7 +270,6 @@ Transform2D Transform2D::translated(const Vector2& p_offset) const {
Transform2D copy = *this; Transform2D copy = *this;
copy.translate(p_offset); copy.translate(p_offset);
return copy; return copy;
} }
Transform2D Transform2D::rotated(real_t p_phi) const { Transform2D Transform2D::rotated(real_t p_phi) const {
@@ -294,7 +277,6 @@ Transform2D Transform2D::rotated(real_t p_phi) const {
Transform2D copy = *this; Transform2D copy = *this;
copy.rotate(p_phi); copy.rotate(p_phi);
return copy; return copy;
} }
real_t Transform2D::basis_determinant() const { real_t Transform2D::basis_determinant() const {
@@ -343,4 +325,4 @@ Transform2D::operator String() const {
return String(String() + elements[0] + ", " + elements[1] + ", " + elements[2]); return String(String() + elements[0] + ", " + elements[1] + ", " + elements[2]);
} }
} } // namespace godot

View File

@@ -2,8 +2,8 @@
#include <gdnative/variant.h> #include <gdnative/variant.h>
#include "Defs.hpp"
#include "CoreTypes.hpp" #include "CoreTypes.hpp"
#include "Defs.hpp"
#include "GodotGlobal.hpp" #include "GodotGlobal.hpp"
#include "Object.hpp" #include "Object.hpp"
@@ -11,18 +11,15 @@
namespace godot { namespace godot {
Variant::Variant() Variant::Variant() {
{
godot::api->godot_variant_new_nil(&_godot_variant); godot::api->godot_variant_new_nil(&_godot_variant);
} }
Variant::Variant(const Variant& v) Variant::Variant(const Variant &v) {
{
godot::api->godot_variant_new_copy(&_godot_variant, &v._godot_variant); godot::api->godot_variant_new_copy(&_godot_variant, &v._godot_variant);
} }
Variant::Variant(bool p_bool) Variant::Variant(bool p_bool) {
{
godot::api->godot_variant_new_bool(&_godot_variant, p_bool); godot::api->godot_variant_new_bool(&_godot_variant, p_bool);
} }
@@ -31,8 +28,7 @@ Variant::Variant(signed int p_int) // real one
godot::api->godot_variant_new_int(&_godot_variant, p_int); godot::api->godot_variant_new_int(&_godot_variant, p_int);
} }
Variant::Variant(unsigned int p_int) Variant::Variant(unsigned int p_int) {
{
godot::api->godot_variant_new_uint(&_godot_variant, p_int); godot::api->godot_variant_new_uint(&_godot_variant, p_int);
} }
@@ -41,326 +37,262 @@ Variant::Variant(signed short p_short) // real one
godot::api->godot_variant_new_int(&_godot_variant, (int)p_short); godot::api->godot_variant_new_int(&_godot_variant, (int)p_short);
} }
Variant::Variant(int64_t p_char) // real one Variant::Variant(int64_t p_char) // real one
{ {
godot::api->godot_variant_new_int(&_godot_variant, p_char); godot::api->godot_variant_new_int(&_godot_variant, p_char);
} }
Variant::Variant(uint64_t p_char) Variant::Variant(uint64_t p_char) {
{
godot::api->godot_variant_new_uint(&_godot_variant, p_char); godot::api->godot_variant_new_uint(&_godot_variant, p_char);
} }
Variant::Variant(float p_float) Variant::Variant(float p_float) {
{
godot::api->godot_variant_new_real(&_godot_variant, p_float); godot::api->godot_variant_new_real(&_godot_variant, p_float);
} }
Variant::Variant(double p_double) Variant::Variant(double p_double) {
{
godot::api->godot_variant_new_real(&_godot_variant, p_double); godot::api->godot_variant_new_real(&_godot_variant, p_double);
} }
Variant::Variant(const String& p_string) Variant::Variant(const String &p_string) {
{
godot::api->godot_variant_new_string(&_godot_variant, (godot_string *)&p_string); godot::api->godot_variant_new_string(&_godot_variant, (godot_string *)&p_string);
} }
Variant::Variant(const char * const p_cstring) Variant::Variant(const char *const p_cstring) {
{
String s = String(p_cstring); String s = String(p_cstring);
godot::api->godot_variant_new_string(&_godot_variant, (godot_string *)&s); godot::api->godot_variant_new_string(&_godot_variant, (godot_string *)&s);
} }
Variant::Variant(const wchar_t * p_wstring) Variant::Variant(const wchar_t *p_wstring) {
{
String s = p_wstring; String s = p_wstring;
godot::api->godot_variant_new_string(&_godot_variant, (godot_string *)&s); godot::api->godot_variant_new_string(&_godot_variant, (godot_string *)&s);
} }
Variant::Variant(const Vector2& p_vector2) Variant::Variant(const Vector2 &p_vector2) {
{
godot::api->godot_variant_new_vector2(&_godot_variant, (godot_vector2 *)&p_vector2); godot::api->godot_variant_new_vector2(&_godot_variant, (godot_vector2 *)&p_vector2);
} }
Variant::Variant(const Rect2& p_rect2) Variant::Variant(const Rect2 &p_rect2) {
{
godot::api->godot_variant_new_rect2(&_godot_variant, (godot_rect2 *)&p_rect2); godot::api->godot_variant_new_rect2(&_godot_variant, (godot_rect2 *)&p_rect2);
} }
Variant::Variant(const Vector3& p_vector3) Variant::Variant(const Vector3 &p_vector3) {
{
godot::api->godot_variant_new_vector3(&_godot_variant, (godot_vector3 *)&p_vector3); godot::api->godot_variant_new_vector3(&_godot_variant, (godot_vector3 *)&p_vector3);
} }
Variant::Variant(const Plane& p_plane) Variant::Variant(const Plane &p_plane) {
{
godot::api->godot_variant_new_plane(&_godot_variant, (godot_plane *)&p_plane); godot::api->godot_variant_new_plane(&_godot_variant, (godot_plane *)&p_plane);
} }
Variant::Variant(const AABB &p_aabb) {
Variant::Variant(const AABB& p_aabb)
{
godot::api->godot_variant_new_aabb(&_godot_variant, (godot_aabb *)&p_aabb); godot::api->godot_variant_new_aabb(&_godot_variant, (godot_aabb *)&p_aabb);
} }
Variant::Variant(const Quat& p_quat) Variant::Variant(const Quat &p_quat) {
{
godot::api->godot_variant_new_quat(&_godot_variant, (godot_quat *)&p_quat); godot::api->godot_variant_new_quat(&_godot_variant, (godot_quat *)&p_quat);
} }
Variant::Variant(const Basis& p_transform) Variant::Variant(const Basis &p_transform) {
{
godot::api->godot_variant_new_basis(&_godot_variant, (godot_basis *)&p_transform); godot::api->godot_variant_new_basis(&_godot_variant, (godot_basis *)&p_transform);
} }
Variant::Variant(const Transform2D& p_transform) Variant::Variant(const Transform2D &p_transform) {
{
godot::api->godot_variant_new_transform2d(&_godot_variant, (godot_transform2d *)&p_transform); godot::api->godot_variant_new_transform2d(&_godot_variant, (godot_transform2d *)&p_transform);
} }
Variant::Variant(const Transform& p_transform) Variant::Variant(const Transform &p_transform) {
{
godot::api->godot_variant_new_transform(&_godot_variant, (godot_transform *)&p_transform); godot::api->godot_variant_new_transform(&_godot_variant, (godot_transform *)&p_transform);
} }
Variant::Variant(const Color& p_color) Variant::Variant(const Color &p_color) {
{
godot::api->godot_variant_new_color(&_godot_variant, (godot_color *)&p_color); godot::api->godot_variant_new_color(&_godot_variant, (godot_color *)&p_color);
} }
Variant::Variant(const NodePath& p_path) Variant::Variant(const NodePath &p_path) {
{
godot::api->godot_variant_new_node_path(&_godot_variant, (godot_node_path *)&p_path); godot::api->godot_variant_new_node_path(&_godot_variant, (godot_node_path *)&p_path);
} }
Variant::Variant(const RID& p_rid) Variant::Variant(const RID &p_rid) {
{
godot::api->godot_variant_new_rid(&_godot_variant, (godot_rid *)&p_rid); godot::api->godot_variant_new_rid(&_godot_variant, (godot_rid *)&p_rid);
} }
Variant::Variant(const Object* p_object) Variant::Variant(const Object *p_object) {
{ if (p_object)
godot::api->godot_variant_new_object(&_godot_variant, p_object->_owner); godot::api->godot_variant_new_object(&_godot_variant, p_object->_owner);
else
godot::api->godot_variant_new_nil(&_godot_variant);
} }
Variant::Variant(const Dictionary& p_dictionary) Variant::Variant(const Dictionary &p_dictionary) {
{
godot::api->godot_variant_new_dictionary(&_godot_variant, (godot_dictionary *)&p_dictionary); godot::api->godot_variant_new_dictionary(&_godot_variant, (godot_dictionary *)&p_dictionary);
} }
Variant::Variant(const Array& p_array) Variant::Variant(const Array &p_array) {
{
godot::api->godot_variant_new_array(&_godot_variant, (godot_array *)&p_array); godot::api->godot_variant_new_array(&_godot_variant, (godot_array *)&p_array);
} }
Variant::Variant(const PoolByteArray& p_raw_array) Variant::Variant(const PoolByteArray &p_raw_array) {
{
godot::api->godot_variant_new_pool_byte_array(&_godot_variant, (godot_pool_byte_array *)&p_raw_array); godot::api->godot_variant_new_pool_byte_array(&_godot_variant, (godot_pool_byte_array *)&p_raw_array);
} }
Variant::Variant(const PoolIntArray& p_int_array) Variant::Variant(const PoolIntArray &p_int_array) {
{
godot::api->godot_variant_new_pool_int_array(&_godot_variant, (godot_pool_int_array *)&p_int_array); godot::api->godot_variant_new_pool_int_array(&_godot_variant, (godot_pool_int_array *)&p_int_array);
} }
Variant::Variant(const PoolRealArray& p_real_array) Variant::Variant(const PoolRealArray &p_real_array) {
{
godot::api->godot_variant_new_pool_real_array(&_godot_variant, (godot_pool_real_array *)&p_real_array); godot::api->godot_variant_new_pool_real_array(&_godot_variant, (godot_pool_real_array *)&p_real_array);
} }
Variant::Variant(const PoolStringArray& p_string_array) Variant::Variant(const PoolStringArray &p_string_array) {
{
godot::api->godot_variant_new_pool_string_array(&_godot_variant, (godot_pool_string_array *)&p_string_array); godot::api->godot_variant_new_pool_string_array(&_godot_variant, (godot_pool_string_array *)&p_string_array);
} }
Variant::Variant(const PoolVector2Array& p_vector2_array) Variant::Variant(const PoolVector2Array &p_vector2_array) {
{
godot::api->godot_variant_new_pool_vector2_array(&_godot_variant, (godot_pool_vector2_array *)&p_vector2_array); godot::api->godot_variant_new_pool_vector2_array(&_godot_variant, (godot_pool_vector2_array *)&p_vector2_array);
} }
Variant::Variant(const PoolVector3Array& p_vector3_array) Variant::Variant(const PoolVector3Array &p_vector3_array) {
{
godot::api->godot_variant_new_pool_vector3_array(&_godot_variant, (godot_pool_vector3_array *)&p_vector3_array); godot::api->godot_variant_new_pool_vector3_array(&_godot_variant, (godot_pool_vector3_array *)&p_vector3_array);
} }
Variant::Variant(const PoolColorArray& p_color_array) Variant::Variant(const PoolColorArray &p_color_array) {
{
godot::api->godot_variant_new_pool_color_array(&_godot_variant, (godot_pool_color_array *)&p_color_array); godot::api->godot_variant_new_pool_color_array(&_godot_variant, (godot_pool_color_array *)&p_color_array);
} }
Variant &Variant::operator=(const Variant &v) {
Variant &Variant::operator =(const Variant& v)
{
godot::api->godot_variant_new_copy(&_godot_variant, &v._godot_variant); godot::api->godot_variant_new_copy(&_godot_variant, &v._godot_variant);
return *this; return *this;
} }
Variant::operator bool() const {
Variant::operator bool() const
{
return booleanize(); return booleanize();
} }
Variant::operator signed int() const Variant::operator signed int() const {
{
return godot::api->godot_variant_as_int(&_godot_variant); return godot::api->godot_variant_as_int(&_godot_variant);
} }
Variant::operator unsigned int() const // this is the real one Variant::operator unsigned int() const // this is the real one
{ {
return godot::api->godot_variant_as_uint(&_godot_variant); return godot::api->godot_variant_as_uint(&_godot_variant);
} }
Variant::operator signed short() const Variant::operator signed short() const {
{
return godot::api->godot_variant_as_int(&_godot_variant); return godot::api->godot_variant_as_int(&_godot_variant);
} }
Variant::operator unsigned short() const Variant::operator unsigned short() const {
{
return godot::api->godot_variant_as_uint(&_godot_variant); return godot::api->godot_variant_as_uint(&_godot_variant);
} }
Variant::operator signed char() const Variant::operator signed char() const {
{
return godot::api->godot_variant_as_int(&_godot_variant); return godot::api->godot_variant_as_int(&_godot_variant);
} }
Variant::operator unsigned char() const Variant::operator unsigned char() const {
{
return godot::api->godot_variant_as_uint(&_godot_variant); return godot::api->godot_variant_as_uint(&_godot_variant);
} }
Variant::operator int64_t() const Variant::operator int64_t() const {
{
return godot::api->godot_variant_as_int(&_godot_variant); return godot::api->godot_variant_as_int(&_godot_variant);
} }
Variant::operator uint64_t() const Variant::operator uint64_t() const {
{
return godot::api->godot_variant_as_uint(&_godot_variant); return godot::api->godot_variant_as_uint(&_godot_variant);
} }
Variant::operator wchar_t() const {
Variant::operator wchar_t() const
{
return godot::api->godot_variant_as_int(&_godot_variant); return godot::api->godot_variant_as_int(&_godot_variant);
} }
Variant::operator float() const Variant::operator float() const {
{
return godot::api->godot_variant_as_real(&_godot_variant); return godot::api->godot_variant_as_real(&_godot_variant);
} }
Variant::operator double() const Variant::operator double() const {
{
return godot::api->godot_variant_as_real(&_godot_variant); return godot::api->godot_variant_as_real(&_godot_variant);
} }
Variant::operator String() const Variant::operator String() const {
{
godot_string s = godot::api->godot_variant_as_string(&_godot_variant); godot_string s = godot::api->godot_variant_as_string(&_godot_variant);
return *(String *)&s; return *(String *)&s;
} }
Variant::operator Vector2() const Variant::operator Vector2() const {
{
godot_vector2 s = godot::api->godot_variant_as_vector2(&_godot_variant); godot_vector2 s = godot::api->godot_variant_as_vector2(&_godot_variant);
return *(Vector2 *)&s; return *(Vector2 *)&s;
} }
Variant::operator Rect2() const Variant::operator Rect2() const {
{
godot_rect2 s = godot::api->godot_variant_as_rect2(&_godot_variant); godot_rect2 s = godot::api->godot_variant_as_rect2(&_godot_variant);
return *(Rect2 *)&s; return *(Rect2 *)&s;
} }
Variant::operator Vector3() const Variant::operator Vector3() const {
{
godot_vector3 s = godot::api->godot_variant_as_vector3(&_godot_variant); godot_vector3 s = godot::api->godot_variant_as_vector3(&_godot_variant);
return *(Vector3 *)&s; return *(Vector3 *)&s;
} }
Variant::operator Plane() const Variant::operator Plane() const {
{
godot_plane s = godot::api->godot_variant_as_plane(&_godot_variant); godot_plane s = godot::api->godot_variant_as_plane(&_godot_variant);
return *(Plane *)&s; return *(Plane *)&s;
} }
Variant::operator AABB() const Variant::operator AABB() const {
{
godot_aabb s = godot::api->godot_variant_as_aabb(&_godot_variant); godot_aabb s = godot::api->godot_variant_as_aabb(&_godot_variant);
return *(AABB *)&s; return *(AABB *)&s;
} }
Variant::operator Quat() const Variant::operator Quat() const {
{
godot_quat s = godot::api->godot_variant_as_quat(&_godot_variant); godot_quat s = godot::api->godot_variant_as_quat(&_godot_variant);
return *(Quat *)&s; return *(Quat *)&s;
} }
Variant::operator Basis() const Variant::operator Basis() const {
{
godot_basis s = godot::api->godot_variant_as_basis(&_godot_variant); godot_basis s = godot::api->godot_variant_as_basis(&_godot_variant);
return *(Basis *)&s; return *(Basis *)&s;
} }
Variant::operator Transform() const Variant::operator Transform() const {
{
godot_transform s = godot::api->godot_variant_as_transform(&_godot_variant); godot_transform s = godot::api->godot_variant_as_transform(&_godot_variant);
return *(Transform *)&s; return *(Transform *)&s;
} }
Variant::operator Transform2D() const Variant::operator Transform2D() const {
{
godot_transform2d s = godot::api->godot_variant_as_transform2d(&_godot_variant); godot_transform2d s = godot::api->godot_variant_as_transform2d(&_godot_variant);
return *(Transform2D *)&s; return *(Transform2D *)&s;
} }
Variant::operator Color() const Variant::operator Color() const {
{
godot_color s = godot::api->godot_variant_as_color(&_godot_variant); godot_color s = godot::api->godot_variant_as_color(&_godot_variant);
return *(Color *)&s; return *(Color *)&s;
} }
Variant::operator NodePath() const Variant::operator NodePath() const {
{
godot_node_path s = godot::api->godot_variant_as_node_path(&_godot_variant); godot_node_path s = godot::api->godot_variant_as_node_path(&_godot_variant);
return *(NodePath *)&s; return *(NodePath *)&s;
} }
Variant::operator RID() const Variant::operator RID() const {
{
godot_rid s = godot::api->godot_variant_as_rid(&_godot_variant); godot_rid s = godot::api->godot_variant_as_rid(&_godot_variant);
return *(RID *)&s; return *(RID *)&s;
} }
Variant::operator Dictionary() const Variant::operator Dictionary() const {
{
godot_dictionary d = godot::api->godot_variant_as_dictionary(&_godot_variant); godot_dictionary d = godot::api->godot_variant_as_dictionary(&_godot_variant);
return *(Dictionary *)&d; return *(Dictionary *)&d;
} }
Variant::operator Array() const Variant::operator Array() const {
{
godot_array s = godot::api->godot_variant_as_array(&_godot_variant); godot_array s = godot::api->godot_variant_as_array(&_godot_variant);
return *(Array *)&s; return *(Array *)&s;
} }
Variant::operator PoolByteArray() const Variant::operator PoolByteArray() const {
{
godot_pool_byte_array s = godot::api->godot_variant_as_pool_byte_array(&_godot_variant); godot_pool_byte_array s = godot::api->godot_variant_as_pool_byte_array(&_godot_variant);
return *(PoolByteArray *)&s; return *(PoolByteArray *)&s;
} }
Variant::operator PoolIntArray() const Variant::operator PoolIntArray() const {
{
godot_pool_int_array s = godot::api->godot_variant_as_pool_int_array(&_godot_variant); godot_pool_int_array s = godot::api->godot_variant_as_pool_int_array(&_godot_variant);
return *(PoolIntArray *)&s; return *(PoolIntArray *)&s;
} }
Variant::operator PoolRealArray() const Variant::operator PoolRealArray() const {
{
godot_pool_real_array s = godot::api->godot_variant_as_pool_real_array(&_godot_variant); godot_pool_real_array s = godot::api->godot_variant_as_pool_real_array(&_godot_variant);
return *(PoolRealArray *)&s; return *(PoolRealArray *)&s;
} }
Variant::operator PoolStringArray() const Variant::operator PoolStringArray() const {
{
godot_pool_string_array s = godot::api->godot_variant_as_pool_string_array(&_godot_variant); godot_pool_string_array s = godot::api->godot_variant_as_pool_string_array(&_godot_variant);
return *(PoolStringArray *)&s; return *(PoolStringArray *)&s;
} }
Variant::operator PoolVector2Array() const Variant::operator PoolVector2Array() const {
{
godot_pool_vector2_array s = godot::api->godot_variant_as_pool_vector2_array(&_godot_variant); godot_pool_vector2_array s = godot::api->godot_variant_as_pool_vector2_array(&_godot_variant);
return *(PoolVector2Array *)&s; return *(PoolVector2Array *)&s;
} }
Variant::operator PoolVector3Array() const Variant::operator PoolVector3Array() const {
{
godot_pool_vector3_array s = godot::api->godot_variant_as_pool_vector3_array(&_godot_variant); godot_pool_vector3_array s = godot::api->godot_variant_as_pool_vector3_array(&_godot_variant);
return *(PoolVector3Array *)&s; return *(PoolVector3Array *)&s;
} }
Variant::operator PoolColorArray() const Variant::operator PoolColorArray() const {
{
godot_pool_color_array s = godot::api->godot_variant_as_pool_color_array(&_godot_variant); godot_pool_color_array s = godot::api->godot_variant_as_pool_color_array(&_godot_variant);
return *(PoolColorArray *)&s; return *(PoolColorArray *)&s;
} }
@@ -368,70 +300,54 @@ Variant::operator godot_object*() const {
return godot::api->godot_variant_as_object(&_godot_variant); return godot::api->godot_variant_as_object(&_godot_variant);
} }
Variant::Type Variant::get_type() const Variant::Type Variant::get_type() const {
{
return (Type)godot::api->godot_variant_get_type(&_godot_variant); return (Type)godot::api->godot_variant_get_type(&_godot_variant);
} }
Variant Variant::call(const String &method, const Variant **args, const int arg_count) {
Variant Variant::call(const String& method, const Variant **args, const int arg_count)
{
Variant v; Variant v;
*(godot_variant *)&v = godot::api->godot_variant_call(&_godot_variant, (godot_string *)&method, (const godot_variant **)args, arg_count, nullptr); *(godot_variant *)&v = godot::api->godot_variant_call(&_godot_variant, (godot_string *)&method, (const godot_variant **)args, arg_count, nullptr);
return v; return v;
} }
bool Variant::has_method(const String& method) bool Variant::has_method(const String &method) {
{
return godot::api->godot_variant_has_method(&_godot_variant, (godot_string *)&method); return godot::api->godot_variant_has_method(&_godot_variant, (godot_string *)&method);
} }
bool Variant::operator ==(const Variant& b) const bool Variant::operator==(const Variant &b) const {
{
return godot::api->godot_variant_operator_equal(&_godot_variant, &b._godot_variant); return godot::api->godot_variant_operator_equal(&_godot_variant, &b._godot_variant);
} }
bool Variant::operator !=(const Variant& b) const bool Variant::operator!=(const Variant &b) const {
{
return !(*this == b); return !(*this == b);
} }
bool Variant::operator <(const Variant& b) const bool Variant::operator<(const Variant &b) const {
{
return godot::api->godot_variant_operator_less(&_godot_variant, &b._godot_variant); return godot::api->godot_variant_operator_less(&_godot_variant, &b._godot_variant);
} }
bool Variant::operator <=(const Variant& b) const bool Variant::operator<=(const Variant &b) const {
{
return (*this < b) || (*this == b); return (*this < b) || (*this == b);
} }
bool Variant::operator >(const Variant& b) const bool Variant::operator>(const Variant &b) const {
{
return !(*this <= b); return !(*this <= b);
} }
bool Variant::operator >=(const Variant& b) const bool Variant::operator>=(const Variant &b) const {
{
return !(*this < b); return !(*this < b);
} }
bool Variant::hash_compare(const Variant& b) const bool Variant::hash_compare(const Variant &b) const {
{
return godot::api->godot_variant_hash_compare(&_godot_variant, &b._godot_variant); return godot::api->godot_variant_hash_compare(&_godot_variant, &b._godot_variant);
} }
bool Variant::booleanize() const bool Variant::booleanize() const {
{
return godot::api->godot_variant_booleanize(&_godot_variant); return godot::api->godot_variant_booleanize(&_godot_variant);
} }
Variant::~Variant() Variant::~Variant() {
{
godot::api->godot_variant_destroy(&_godot_variant); godot::api->godot_variant_destroy(&_godot_variant);
} }
} // namespace godot
}

View File

@@ -8,150 +8,123 @@
namespace godot { namespace godot {
Vector2 Vector2::operator+(const Vector2& p_v) const Vector2 Vector2::operator+(const Vector2 &p_v) const {
{
return Vector2(x + p_v.x, y + p_v.y); return Vector2(x + p_v.x, y + p_v.y);
} }
void Vector2::operator+=(const Vector2& p_v) void Vector2::operator+=(const Vector2 &p_v) {
{
x += p_v.x; x += p_v.x;
y += p_v.y; y += p_v.y;
} }
Vector2 Vector2::operator-(const Vector2& p_v) const Vector2 Vector2::operator-(const Vector2 &p_v) const {
{
return Vector2(x - p_v.x, y - p_v.y); return Vector2(x - p_v.x, y - p_v.y);
} }
void Vector2::operator-=(const Vector2& p_v) void Vector2::operator-=(const Vector2 &p_v) {
{
x -= p_v.x; x -= p_v.x;
y -= p_v.y; y -= p_v.y;
} }
Vector2 Vector2::operator*(const Vector2 &p_v1) const Vector2 Vector2::operator*(const Vector2 &p_v1) const {
{
return Vector2(x * p_v1.x, y * p_v1.y); return Vector2(x * p_v1.x, y * p_v1.y);
} }
Vector2 Vector2::operator*(const real_t &rvalue) const Vector2 Vector2::operator*(const real_t &rvalue) const {
{
return Vector2(x * rvalue, y * rvalue); return Vector2(x * rvalue, y * rvalue);
} }
void Vector2::operator*=(const real_t &rvalue) void Vector2::operator*=(const real_t &rvalue) {
{
x *= rvalue; x *= rvalue;
y *= rvalue; y *= rvalue;
} }
Vector2 Vector2::operator/(const Vector2 &p_v1) const Vector2 Vector2::operator/(const Vector2 &p_v1) const {
{
return Vector2(x / p_v1.x, y / p_v1.y); return Vector2(x / p_v1.x, y / p_v1.y);
} }
Vector2 Vector2::operator/(const real_t &rvalue) const Vector2 Vector2::operator/(const real_t &rvalue) const {
{
return Vector2(x / rvalue, y / rvalue); return Vector2(x / rvalue, y / rvalue);
} }
void Vector2::operator/=(const real_t &rvalue) void Vector2::operator/=(const real_t &rvalue) {
{
x /= rvalue; x /= rvalue;
y /= rvalue; y /= rvalue;
} }
Vector2 Vector2::operator-() const Vector2 Vector2::operator-() const {
{
return Vector2(-x, -y); return Vector2(-x, -y);
} }
bool Vector2::operator==(const Vector2& p_vec2) const bool Vector2::operator==(const Vector2 &p_vec2) const {
{
return x == p_vec2.x && y == p_vec2.y; return x == p_vec2.x && y == p_vec2.y;
} }
bool Vector2::operator!=(const Vector2& p_vec2) const bool Vector2::operator!=(const Vector2 &p_vec2) const {
{
return x != p_vec2.x || y != p_vec2.y; return x != p_vec2.x || y != p_vec2.y;
} }
void Vector2::normalize() void Vector2::normalize() {
{
real_t l = x * x + y * y; real_t l = x * x + y * y;
if (l != 0) { if (l != 0) {
l = (l); l = sqrt(l);
x /= l; x /= l;
y /= l; y /= l;
} }
} }
Vector2 Vector2::normalized() const Vector2 Vector2::normalized() const {
{
Vector2 v = *this; Vector2 v = *this;
v.normalize(); v.normalize();
return v; return v;
} }
real_t Vector2::length() const real_t Vector2::length() const {
{
return sqrt(x * x + y * y); return sqrt(x * x + y * y);
} }
real_t Vector2::length_squared() const real_t Vector2::length_squared() const {
{
return x * x + y * y; return x * x + y * y;
} }
real_t Vector2::distance_to(const Vector2& p_vector2) const real_t Vector2::distance_to(const Vector2 &p_vector2) const {
{
return sqrt((x - p_vector2.x) * (x - p_vector2.x) + (y - p_vector2.y) * (y - p_vector2.y)); return sqrt((x - p_vector2.x) * (x - p_vector2.x) + (y - p_vector2.y) * (y - p_vector2.y));
} }
real_t Vector2::distance_squared_to(const Vector2& p_vector2) const real_t Vector2::distance_squared_to(const Vector2 &p_vector2) const {
{
return (x - p_vector2.x) * (x - p_vector2.x) + (y - p_vector2.y) * (y - p_vector2.y); return (x - p_vector2.x) * (x - p_vector2.x) + (y - p_vector2.y) * (y - p_vector2.y);
} }
real_t Vector2::angle_to(const Vector2& p_vector2) const real_t Vector2::angle_to(const Vector2 &p_vector2) const {
{
return atan2(cross(p_vector2), dot(p_vector2)); return atan2(cross(p_vector2), dot(p_vector2));
} }
real_t Vector2::angle_to_point(const Vector2& p_vector2) const real_t Vector2::angle_to_point(const Vector2 &p_vector2) const {
{
return atan2(y - p_vector2.y, x - p_vector2.x); return atan2(y - p_vector2.y, x - p_vector2.x);
} }
real_t Vector2::dot(const Vector2& p_other) const real_t Vector2::dot(const Vector2 &p_other) const {
{
return x * p_other.x + y * p_other.y; return x * p_other.x + y * p_other.y;
} }
real_t Vector2::cross(const Vector2& p_other) const real_t Vector2::cross(const Vector2 &p_other) const {
{
return x * p_other.y - y * p_other.x; return x * p_other.y - y * p_other.x;
} }
Vector2 Vector2::cross(real_t p_other) const Vector2 Vector2::cross(real_t p_other) const {
{
return Vector2(p_other * y, -p_other * x); return Vector2(p_other * y, -p_other * x);
} }
Vector2 Vector2::project(const Vector2& p_vec) const Vector2 Vector2::project(const Vector2 &p_vec) const {
{
Vector2 v1 = p_vec; Vector2 v1 = p_vec;
Vector2 v2 = *this; Vector2 v2 = *this;
return v2 * (v1.dot(v2) / v2.dot(v2)); return v2 * (v1.dot(v2) / v2.dot(v2));
} }
Vector2 Vector2::plane_project(real_t p_d, const Vector2& p_vec) const Vector2 Vector2::plane_project(real_t p_d, const Vector2 &p_vec) const {
{
return p_vec - *this * (dot(p_vec) - p_d); return p_vec - *this * (dot(p_vec) - p_d);
} }
Vector2 Vector2::clamped(real_t p_len) const Vector2 Vector2::clamped(real_t p_len) const {
{
real_t l = length(); real_t l = length();
Vector2 v = *this; Vector2 v = *this;
if (l > 0 && p_len < l) { if (l > 0 && p_len < l) {
@@ -161,24 +134,20 @@ Vector2 Vector2::clamped(real_t p_len) const
return v; return v;
} }
Vector2 Vector2::linear_interpolate(const Vector2& p_a, const Vector2& p_b,real_t p_t) Vector2 Vector2::linear_interpolate(const Vector2 &p_a, const Vector2 &p_b, real_t p_t) {
{
Vector2 res = p_a; Vector2 res = p_a;
res.x += (p_t * (p_b.x - p_a.x)); res.x += (p_t * (p_b.x - p_a.x));
res.y += (p_t * (p_b.y - p_a.y)); res.y += (p_t * (p_b.y - p_a.y));
return res; return res;
} }
Vector2 Vector2::linear_interpolate(const Vector2& p_b,real_t p_t) const Vector2 Vector2::linear_interpolate(const Vector2 &p_b, real_t p_t) const {
{
Vector2 res = *this; Vector2 res = *this;
res.x += (p_t * (p_b.x - x)); res.x += (p_t * (p_b.x - x));
res.y += (p_t * (p_b.y - y)); res.y += (p_t * (p_b.y - y));
return res; return res;
} }
Vector2 Vector2::cubic_interpolate(const Vector2& p_b,const Vector2& p_pre_a, const Vector2& p_post_b,real_t p_t) const Vector2 Vector2::cubic_interpolate(const Vector2 &p_b, const Vector2 &p_pre_a, const Vector2 &p_post_b, real_t p_t) const {
{
Vector2 p0 = p_pre_a; Vector2 p0 = p_pre_a;
Vector2 p1 = *this; Vector2 p1 = *this;
Vector2 p2 = p_b; Vector2 p2 = p_b;
@@ -192,24 +161,21 @@ Vector2 Vector2::cubic_interpolate(const Vector2& p_b,const Vector2& p_pre_a, co
out = ((p1 * 2.0) + out = ((p1 * 2.0) +
(-p0 + p2) * t + (-p0 + p2) * t +
(p0 * 2.0 - p1 * 5.0 + p2 * 4 - p3) * t2 + (p0 * 2.0 - p1 * 5.0 + p2 * 4 - p3) * t2 +
( -p0 + p1 * 3.0 - p2 * 3.0 + p3 ) * t3 ) * 0.5; (-p0 + p1 * 3.0 - p2 * 3.0 + p3) * t3) *
0.5;
return out; return out;
} }
Vector2 Vector2::slide(const Vector2 &p_vec) const {
Vector2 Vector2::slide(const Vector2& p_vec) const
{
return p_vec - *this * this->dot(p_vec); return p_vec - *this * this->dot(p_vec);
} }
Vector2 Vector2::reflect(const Vector2& p_vec) const Vector2 Vector2::reflect(const Vector2 &p_vec) const {
{
return p_vec - *this * this->dot(p_vec) * 2.0; return p_vec - *this * this->dot(p_vec) * 2.0;
} }
real_t Vector2::angle() const real_t Vector2::angle() const {
{
return atan2(y, x); return atan2(y, x);
} }
@@ -224,8 +190,7 @@ Vector2 Vector2::abs() const {
return Vector2(fabs(x), fabs(y)); return Vector2(fabs(x), fabs(y));
} }
Vector2 Vector2::rotated(real_t p_by) const Vector2 Vector2::rotated(real_t p_by) const {
{
Vector2 v; Vector2 v;
v.set_rotation(angle() + p_by); v.set_rotation(angle() + p_by);
v *= length(); v *= length();
@@ -237,23 +202,18 @@ Vector2 Vector2::tangent() const {
return Vector2(y, -x); return Vector2(y, -x);
} }
Vector2 Vector2::floor() const Vector2 Vector2::floor() const {
{
return Vector2(::floor(x), ::floor(y)); return Vector2(::floor(x), ::floor(y));
} }
Vector2 Vector2::snapped(const Vector2& p_by) const Vector2 Vector2::snapped(const Vector2 &p_by) const {
{
return Vector2( return Vector2(
p_by.x != 0 ? ::floor(x / p_by.x + 0.5) * p_by.x : x, p_by.x != 0 ? ::floor(x / p_by.x + 0.5) * p_by.x : x,
p_by.y != 0 ? ::floor(y / p_by.y + 0.5) * p_by.y : y p_by.y != 0 ? ::floor(y / p_by.y + 0.5) * p_by.y : y);
);
} }
Vector2::operator String() const Vector2::operator String() const {
{
return String::num(x) + ", " + String::num(y); return String::num(x) + ", " + String::num(y);
} }
} // namespace godot
}

View File

@@ -2,143 +2,121 @@
#include "String.hpp" #include "String.hpp"
#include "Basis.hpp"
#include <stdlib.h> #include <stdlib.h>
#include <cmath> #include <cmath>
#include "Basis.hpp"
namespace godot { namespace godot {
Vector3::Vector3(real_t x, real_t y, real_t z) {
Vector3::Vector3(real_t x, real_t y, real_t z)
{
this->x = x; this->x = x;
this->y = y; this->y = y;
this->z = z; this->z = z;
} }
Vector3::Vector3() Vector3::Vector3() {
{
this->x = 0; this->x = 0;
this->y = 0; this->y = 0;
this->z = 0; this->z = 0;
} }
const real_t& Vector3::operator[](int p_axis) const const real_t &Vector3::operator[](int p_axis) const {
{
return coord[p_axis]; return coord[p_axis];
} }
real_t& Vector3::operator[](int p_axis) real_t &Vector3::operator[](int p_axis) {
{
return coord[p_axis]; return coord[p_axis];
} }
Vector3& Vector3::operator+=(const Vector3& p_v) Vector3 &Vector3::operator+=(const Vector3 &p_v) {
{
x += p_v.x; x += p_v.x;
y += p_v.y; y += p_v.y;
z += p_v.z; z += p_v.z;
return *this; return *this;
} }
Vector3 Vector3::operator+(const Vector3& p_v) const Vector3 Vector3::operator+(const Vector3 &p_v) const {
{
Vector3 v = *this; Vector3 v = *this;
v += p_v; v += p_v;
return v; return v;
} }
Vector3& Vector3::operator-=(const Vector3& p_v) Vector3 &Vector3::operator-=(const Vector3 &p_v) {
{
x -= p_v.x; x -= p_v.x;
y -= p_v.y; y -= p_v.y;
z -= p_v.z; z -= p_v.z;
return *this; return *this;
} }
Vector3 Vector3::operator-(const Vector3& p_v) const Vector3 Vector3::operator-(const Vector3 &p_v) const {
{
Vector3 v = *this; Vector3 v = *this;
v -= p_v; v -= p_v;
return v; return v;
} }
Vector3& Vector3::operator*=(const Vector3& p_v) Vector3 &Vector3::operator*=(const Vector3 &p_v) {
{
x *= p_v.x; x *= p_v.x;
y *= p_v.y; y *= p_v.y;
z *= p_v.z; z *= p_v.z;
return *this; return *this;
} }
Vector3 Vector3::operator*(const Vector3& p_v) const Vector3 Vector3::operator*(const Vector3 &p_v) const {
{
Vector3 v = *this; Vector3 v = *this;
v *= p_v; v *= p_v;
return v; return v;
} }
Vector3& Vector3::operator/=(const Vector3& p_v) Vector3 &Vector3::operator/=(const Vector3 &p_v) {
{
x /= p_v.x; x /= p_v.x;
y /= p_v.y; y /= p_v.y;
z /= p_v.z; z /= p_v.z;
return *this; return *this;
} }
Vector3 Vector3::operator/(const Vector3& p_v) const Vector3 Vector3::operator/(const Vector3 &p_v) const {
{
Vector3 v = *this; Vector3 v = *this;
v /= p_v; v /= p_v;
return v; return v;
} }
Vector3 &Vector3::operator*=(real_t p_scalar) {
Vector3& Vector3::operator*=(real_t p_scalar)
{
*this *= Vector3(p_scalar, p_scalar, p_scalar); *this *= Vector3(p_scalar, p_scalar, p_scalar);
return *this; return *this;
} }
Vector3 Vector3::operator*(real_t p_scalar) const Vector3 Vector3::operator*(real_t p_scalar) const {
{
Vector3 v = *this; Vector3 v = *this;
v *= p_scalar; v *= p_scalar;
return v; return v;
} }
Vector3& Vector3::operator/=(real_t p_scalar) Vector3 &Vector3::operator/=(real_t p_scalar) {
{
*this /= Vector3(p_scalar, p_scalar, p_scalar); *this /= Vector3(p_scalar, p_scalar, p_scalar);
return *this; return *this;
} }
Vector3 Vector3::operator/(real_t p_scalar) const Vector3 Vector3::operator/(real_t p_scalar) const {
{
Vector3 v = *this; Vector3 v = *this;
v /= p_scalar; v /= p_scalar;
return v; return v;
} }
Vector3 Vector3::operator-() const Vector3 Vector3::operator-() const {
{
return Vector3(-x, -y, -z); return Vector3(-x, -y, -z);
} }
bool Vector3::operator==(const Vector3& p_v) const bool Vector3::operator==(const Vector3 &p_v) const {
{
return (x == p_v.x && y == p_v.y && z == p_v.z); return (x == p_v.x && y == p_v.y && z == p_v.z);
} }
bool Vector3::operator!=(const Vector3& p_v) const bool Vector3::operator!=(const Vector3 &p_v) const {
{
return (x != p_v.x || y != p_v.y || z != p_v.z); return (x != p_v.x || y != p_v.y || z != p_v.z);
} }
bool Vector3::operator<(const Vector3& p_v) const bool Vector3::operator<(const Vector3 &p_v) const {
{
if (x == p_v.x) { if (x == p_v.x) {
if (y == p_v.y) if (y == p_v.y)
return z < p_v.z; return z < p_v.z;
@@ -149,8 +127,7 @@ bool Vector3::operator<(const Vector3& p_v) const
} }
} }
bool Vector3::operator<=(const Vector3& p_v) const bool Vector3::operator<=(const Vector3 &p_v) const {
{
if (x == p_v.x) { if (x == p_v.x) {
if (y == p_v.y) if (y == p_v.y)
return z <= p_v.z; return z <= p_v.z;
@@ -161,38 +138,31 @@ bool Vector3::operator<=(const Vector3& p_v) const
} }
} }
Vector3 Vector3::abs() const Vector3 Vector3::abs() const {
{
return Vector3(::fabs(x), ::fabs(y), ::fabs(z)); return Vector3(::fabs(x), ::fabs(y), ::fabs(z));
} }
Vector3 Vector3::ceil() const Vector3 Vector3::ceil() const {
{
return Vector3(::ceil(x), ::ceil(y), ::ceil(z)); return Vector3(::ceil(x), ::ceil(y), ::ceil(z));
} }
Vector3 Vector3::cross(const Vector3& b) const Vector3 Vector3::cross(const Vector3 &b) const {
{
Vector3 ret( Vector3 ret(
(y * b.z) - (z * b.y), (y * b.z) - (z * b.y),
(z * b.x) - (x * b.z), (z * b.x) - (x * b.z),
(x * b.y) - (y * b.x) (x * b.y) - (y * b.x));
);
return ret; return ret;
} }
Vector3 Vector3::linear_interpolate(const Vector3& p_b,real_t p_t) const Vector3 Vector3::linear_interpolate(const Vector3 &p_b, real_t p_t) const {
{
return Vector3( return Vector3(
x + (p_t * (p_b.x - x)), x + (p_t * (p_b.x - x)),
y + (p_t * (p_b.y - y)), y + (p_t * (p_b.y - y)),
z+(p_t * (p_b.z-z)) z + (p_t * (p_b.z - z)));
);
} }
Vector3 Vector3::cubic_interpolate(const Vector3& b, const Vector3& pre_a, const Vector3& post_b, const real_t t) const Vector3 Vector3::cubic_interpolate(const Vector3 &b, const Vector3 &pre_a, const Vector3 &post_b, const real_t t) const {
{
Vector3 p0 = pre_a; Vector3 p0 = pre_a;
Vector3 p1 = *this; Vector3 p1 = *this;
Vector3 p2 = b; Vector3 p2 = b;
@@ -205,17 +175,16 @@ Vector3 Vector3::cubic_interpolate(const Vector3& b, const Vector3& pre_a, const
out = ((p1 * 2.0) + out = ((p1 * 2.0) +
(-p0 + p2) * t + (-p0 + p2) * t +
(p0 * 2.0 - p1 * 5.0 + p2 * 4 - p3) * t2 + (p0 * 2.0 - p1 * 5.0 + p2 * 4 - p3) * t2 +
( -p0 + p1 * 3.0 - p2 * 3.0 + p3 ) * t3 ) * 0.5; (-p0 + p1 * 3.0 - p2 * 3.0 + p3) * t3) *
0.5;
return out; return out;
} }
Vector3 Vector3::bounce(const Vector3& p_normal) const Vector3 Vector3::bounce(const Vector3 &p_normal) const {
{
return -reflect(p_normal); return -reflect(p_normal);
} }
real_t Vector3::length() const real_t Vector3::length() const {
{
real_t x2 = x * x; real_t x2 = x * x;
real_t y2 = y * y; real_t y2 = y * y;
real_t z2 = z * z; real_t z2 = z * z;
@@ -223,8 +192,7 @@ real_t Vector3::length() const
return ::sqrt(x2 + y2 + z2); return ::sqrt(x2 + y2 + z2);
} }
real_t Vector3::length_squared() const real_t Vector3::length_squared() const {
{
real_t x2 = x * x; real_t x2 = x * x;
real_t y2 = y * y; real_t y2 = y * y;
real_t z2 = z * z; real_t z2 = z * z;
@@ -232,63 +200,50 @@ real_t Vector3::length_squared() const
return x2 + y2 + z2; return x2 + y2 + z2;
} }
real_t Vector3::distance_squared_to(const Vector3& b) const real_t Vector3::distance_squared_to(const Vector3 &b) const {
{
return (b - *this).length_squared(); return (b - *this).length_squared();
} }
real_t Vector3::distance_to(const Vector3& b) const real_t Vector3::distance_to(const Vector3 &b) const {
{
return (b - *this).length(); return (b - *this).length();
} }
real_t Vector3::dot(const Vector3& b) const real_t Vector3::dot(const Vector3 &b) const {
{
return x * b.x + y * b.y + z * b.z; return x * b.x + y * b.y + z * b.z;
} }
real_t Vector3::angle_to(const Vector3& b) const real_t Vector3::angle_to(const Vector3 &b) const {
{
return std::atan2(cross(b).length(), dot(b)); return std::atan2(cross(b).length(), dot(b));
} }
Vector3 Vector3::floor() const Vector3 Vector3::floor() const {
{
return Vector3(::floor(x), ::floor(y), ::floor(z)); return Vector3(::floor(x), ::floor(y), ::floor(z));
} }
Vector3 Vector3::inverse() const Vector3 Vector3::inverse() const {
{
return Vector3(1.0 / x, 1.0 / y, 1.0 / z); return Vector3(1.0 / x, 1.0 / y, 1.0 / z);
} }
bool Vector3::is_normalized() const bool Vector3::is_normalized() const {
{
return std::abs(length_squared() - 1.0) < 0.00001; return std::abs(length_squared() - 1.0) < 0.00001;
} }
Basis Vector3::outer(const Vector3& b) const Basis Vector3::outer(const Vector3 &b) const {
{
Vector3 row0(x * b.x, x * b.y, x * b.z); Vector3 row0(x * b.x, x * b.y, x * b.z);
Vector3 row1(y * b.x, y * b.y, y * b.z); Vector3 row1(y * b.x, y * b.y, y * b.z);
Vector3 row2(z * b.x, z * b.y, z * b.z); Vector3 row2(z * b.x, z * b.y, z * b.z);
return Basis(row0, row1, row2); return Basis(row0, row1, row2);
} }
int Vector3::max_axis() const {
int Vector3::max_axis() const
{
return x < y ? (y < z ? 2 : 1) : (x < z ? 2 : 0); return x < y ? (y < z ? 2 : 1) : (x < z ? 2 : 0);
} }
int Vector3::min_axis() const int Vector3::min_axis() const {
{
return x < y ? (x < z ? 0 : 2) : (y < z ? 1 : 2); return x < y ? (x < z ? 0 : 2) : (y < z ? 1 : 2);
} }
void Vector3::normalize() void Vector3::normalize() {
{
real_t l = length(); real_t l = length();
if (l == 0) { if (l == 0) {
x = y = z = 0; x = y = z = 0;
@@ -299,40 +254,34 @@ void Vector3::normalize()
} }
} }
Vector3 Vector3::normalized() const Vector3 Vector3::normalized() const {
{
Vector3 v = *this; Vector3 v = *this;
v.normalize(); v.normalize();
return v; return v;
} }
Vector3 Vector3::reflect(const Vector3& by) const Vector3 Vector3::reflect(const Vector3 &by) const {
{
return by - *this * this->dot(by) * 2.0; return by - *this * this->dot(by) * 2.0;
} }
Vector3 Vector3::rotated(const Vector3& axis, const real_t phi) const Vector3 Vector3::rotated(const Vector3 &axis, const real_t phi) const {
{
Vector3 v = *this; Vector3 v = *this;
v.rotate(axis, phi); v.rotate(axis, phi);
return v; return v;
} }
void Vector3::rotate(const Vector3& p_axis,real_t p_phi) void Vector3::rotate(const Vector3 &p_axis, real_t p_phi) {
{
*this = Basis(p_axis, p_phi).xform(*this); *this = Basis(p_axis, p_phi).xform(*this);
} }
Vector3 Vector3::slide(const Vector3& by) const Vector3 Vector3::slide(const Vector3 &by) const {
{
return by - *this * this->dot(by); return by - *this * this->dot(by);
} }
// this is ugly as well, but hey, I'm a simple man // this is ugly as well, but hey, I'm a simple man
#define _ugly_stepify(val, step) (step != 0 ? ::floor(val / step + 0.5) * step : val) #define _ugly_stepify(val, step) (step != 0 ? ::floor(val / step + 0.5) * step : val)
void Vector3::snap(real_t p_val) void Vector3::snap(real_t p_val) {
{
x = _ugly_stepify(x, p_val); x = _ugly_stepify(x, p_val);
y = _ugly_stepify(y, p_val); y = _ugly_stepify(y, p_val);
z = _ugly_stepify(z, p_val); z = _ugly_stepify(z, p_val);
@@ -340,18 +289,14 @@ void Vector3::snap(real_t p_val)
#undef _ugly_stepify #undef _ugly_stepify
Vector3 Vector3::snapped(const float by) Vector3 Vector3::snapped(const float by) {
{
Vector3 v = *this; Vector3 v = *this;
v.snap(by); v.snap(by);
return v; return v;
} }
Vector3::operator String() const Vector3::operator String() const {
{
return String::num(x) + ", " + String::num(y) + ", " + String::num(z); return String::num(x) + ", " + String::num(y) + ", " + String::num(z);
} }
} // namespace godot
}