Update clang-format to version 11
This is taken from the Godot repository, so formatting is similar. This updates the style rules as well. Also fix style in files to conform with this version.pull/525/head
parent
77d41fa179
commit
cba90d6301
|
@ -13,9 +13,9 @@ AlignAfterOpenBracket: DontAlign
|
||||||
AlignTrailingComments: false
|
AlignTrailingComments: false
|
||||||
AllowAllParametersOfDeclarationOnNextLine: false
|
AllowAllParametersOfDeclarationOnNextLine: false
|
||||||
# AllowShortBlocksOnASingleLine: false
|
# AllowShortBlocksOnASingleLine: false
|
||||||
AllowShortCaseLabelsOnASingleLine: true
|
# AllowShortCaseLabelsOnASingleLine: false
|
||||||
AllowShortFunctionsOnASingleLine: Inline
|
AllowShortFunctionsOnASingleLine: Inline
|
||||||
AllowShortIfStatementsOnASingleLine: true
|
# AllowShortIfStatementsOnASingleLine: false
|
||||||
# AllowShortLoopsOnASingleLine: false
|
# AllowShortLoopsOnASingleLine: false
|
||||||
# AlwaysBreakAfterDefinitionReturnType: None
|
# AlwaysBreakAfterDefinitionReturnType: None
|
||||||
# AlwaysBreakAfterReturnType: None
|
# AlwaysBreakAfterReturnType: None
|
||||||
|
@ -76,7 +76,7 @@ IndentWidth: 4
|
||||||
# IndentWrappedFunctionNames: false
|
# IndentWrappedFunctionNames: false
|
||||||
# JavaScriptQuotes: Leave
|
# JavaScriptQuotes: Leave
|
||||||
# JavaScriptWrapImports: true
|
# JavaScriptWrapImports: true
|
||||||
# KeepEmptyLinesAtTheStartOfBlocks: true
|
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||||
# MacroBlockBegin: ''
|
# MacroBlockBegin: ''
|
||||||
# MacroBlockEnd: ''
|
# MacroBlockEnd: ''
|
||||||
# MaxEmptyLinesToKeep: 1
|
# MaxEmptyLinesToKeep: 1
|
||||||
|
@ -112,10 +112,11 @@ UseTab: Always
|
||||||
---
|
---
|
||||||
### C++ specific config ###
|
### C++ specific config ###
|
||||||
Language: Cpp
|
Language: Cpp
|
||||||
Standard: Cpp03
|
Standard: Cpp11
|
||||||
---
|
---
|
||||||
### ObjC specific config ###
|
### ObjC specific config ###
|
||||||
Language: ObjC
|
Language: ObjC
|
||||||
|
Standard: Cpp11
|
||||||
ObjCBlockIndentWidth: 4
|
ObjCBlockIndentWidth: 4
|
||||||
# ObjCSpaceAfterProperty: false
|
# ObjCSpaceAfterProperty: false
|
||||||
# ObjCSpaceBeforeProtocolList: true
|
# ObjCSpaceBeforeProtocolList: true
|
||||||
|
@ -123,4 +124,5 @@ ObjCBlockIndentWidth: 4
|
||||||
### Java specific config ###
|
### Java specific config ###
|
||||||
Language: Java
|
Language: Java
|
||||||
# BreakAfterJavaFieldAnnotations: false
|
# BreakAfterJavaFieldAnnotations: false
|
||||||
|
JavaImportGroups: ['org.godotengine', 'android', 'androidx', 'com.android', 'com.google', 'java', 'javax']
|
||||||
...
|
...
|
||||||
|
|
|
@ -147,14 +147,22 @@ jobs:
|
||||||
|
|
||||||
static-checks:
|
static-checks:
|
||||||
name: Static Checks (clang-format)
|
name: Static Checks (clang-format)
|
||||||
runs-on: ubuntu-16.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2.3.4
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Make apt sources.list use the default Ubuntu repositories
|
||||||
|
run: |
|
||||||
|
sudo rm -f /etc/apt/sources.list.d/*
|
||||||
|
sudo cp -f misc/ci/sources.list /etc/apt/sources.list
|
||||||
|
sudo apt-get update
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get install clang-format-8
|
sudo apt-get install -qq dos2unix recode clang-format-11
|
||||||
|
sudo update-alternatives --remove-all clang-format
|
||||||
|
sudo update-alternatives --install /usr/bin/clang-format clang-format /usr/bin/clang-format-11 100
|
||||||
|
|
||||||
- name: Style checks via clang-format
|
- name: Style checks via clang-format
|
||||||
run: |
|
run: |
|
||||||
|
|
|
@ -16,12 +16,10 @@ public:
|
||||||
|
|
||||||
real_t get_area() const; /// get area
|
real_t get_area() const; /// get area
|
||||||
inline bool has_no_area() const {
|
inline bool has_no_area() const {
|
||||||
|
|
||||||
return (size.x <= CMP_EPSILON || size.y <= CMP_EPSILON || size.z <= CMP_EPSILON);
|
return (size.x <= CMP_EPSILON || size.y <= CMP_EPSILON || size.z <= CMP_EPSILON);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool has_no_surface() const {
|
inline bool has_no_surface() const {
|
||||||
|
|
||||||
return (size.x <= CMP_EPSILON && size.y <= CMP_EPSILON && size.z <= CMP_EPSILON);
|
return (size.x <= CMP_EPSILON && size.y <= CMP_EPSILON && size.z <= CMP_EPSILON);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,6 @@ using namespace godot;
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
struct CameraMatrix {
|
struct CameraMatrix {
|
||||||
|
|
||||||
enum Planes {
|
enum Planes {
|
||||||
PLANE_NEAR,
|
PLANE_NEAR,
|
||||||
PLANE_FAR,
|
PLANE_FAR,
|
||||||
|
@ -84,7 +83,6 @@ struct CameraMatrix {
|
||||||
};
|
};
|
||||||
|
|
||||||
Vector3 CameraMatrix::xform(const Vector3 &p_vec3) const {
|
Vector3 CameraMatrix::xform(const Vector3 &p_vec3) const {
|
||||||
|
|
||||||
Vector3 ret;
|
Vector3 ret;
|
||||||
ret.x = matrix[0][0] * p_vec3.x + matrix[1][0] * p_vec3.y + matrix[2][0] * p_vec3.z + matrix[3][0];
|
ret.x = matrix[0][0] * p_vec3.x + matrix[1][0] * p_vec3.y + matrix[2][0] * p_vec3.z + matrix[3][0];
|
||||||
ret.y = matrix[0][1] * p_vec3.x + matrix[1][1] * p_vec3.y + matrix[2][1] * p_vec3.z + matrix[3][1];
|
ret.y = matrix[0][1] * p_vec3.x + matrix[1][1] * p_vec3.y + matrix[2][1] * p_vec3.z + matrix[3][1];
|
||||||
|
|
|
@ -11,12 +11,10 @@
|
||||||
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 {
|
||||||
float r;
|
float r;
|
||||||
float g;
|
float g;
|
||||||
|
|
|
@ -321,7 +321,6 @@ void register_method(const char *name, M method_ptr, godot_method_rpc_mode rpc_t
|
||||||
template <class D, class B, class R, class... As>
|
template <class D, class B, class R, class... As>
|
||||||
void register_method_explicit(const char *name, R (B::*method_ptr)(As...),
|
void register_method_explicit(const char *name, R (B::*method_ptr)(As...),
|
||||||
godot_method_rpc_mode rpc_type = GODOT_METHOD_RPC_MODE_DISABLED) {
|
godot_method_rpc_mode rpc_type = GODOT_METHOD_RPC_MODE_DISABLED) {
|
||||||
|
|
||||||
static_assert(std::is_base_of<B, D>::value, "Explicit class must derive from method class");
|
static_assert(std::is_base_of<B, D>::value, "Explicit class must derive from method class");
|
||||||
register_method(name, static_cast<R (D::*)(As...)>(method_ptr), rpc_type);
|
register_method(name, static_cast<R (D::*)(As...)>(method_ptr), rpc_type);
|
||||||
}
|
}
|
||||||
|
@ -394,7 +393,6 @@ void register_property(const char *name, P(T::*var), P default_value,
|
||||||
godot_method_rpc_mode rpc_mode = GODOT_METHOD_RPC_MODE_DISABLED,
|
godot_method_rpc_mode rpc_mode = GODOT_METHOD_RPC_MODE_DISABLED,
|
||||||
godot_property_usage_flags usage = GODOT_PROPERTY_USAGE_DEFAULT,
|
godot_property_usage_flags usage = GODOT_PROPERTY_USAGE_DEFAULT,
|
||||||
godot_property_hint hint = GODOT_PROPERTY_HINT_NONE, String hint_string = "") {
|
godot_property_hint hint = GODOT_PROPERTY_HINT_NONE, String hint_string = "") {
|
||||||
|
|
||||||
static_assert(T::___CLASS_IS_SCRIPT, "This function must only be used on custom classes");
|
static_assert(T::___CLASS_IS_SCRIPT, "This function must only be used on custom classes");
|
||||||
|
|
||||||
Variant def_val = default_value;
|
Variant def_val = default_value;
|
||||||
|
@ -451,7 +449,6 @@ void register_property(const char *name, void (T::*setter)(P), P (T::*getter)(),
|
||||||
godot_method_rpc_mode rpc_mode = GODOT_METHOD_RPC_MODE_DISABLED,
|
godot_method_rpc_mode rpc_mode = GODOT_METHOD_RPC_MODE_DISABLED,
|
||||||
godot_property_usage_flags usage = GODOT_PROPERTY_USAGE_DEFAULT,
|
godot_property_usage_flags usage = GODOT_PROPERTY_USAGE_DEFAULT,
|
||||||
godot_property_hint hint = GODOT_PROPERTY_HINT_NONE, String hint_string = "") {
|
godot_property_hint hint = GODOT_PROPERTY_HINT_NONE, String hint_string = "") {
|
||||||
|
|
||||||
static_assert(T::___CLASS_IS_SCRIPT, "This function must only be used on custom classes");
|
static_assert(T::___CLASS_IS_SCRIPT, "This function must only be used on custom classes");
|
||||||
|
|
||||||
Variant def_val = default_value;
|
Variant def_val = default_value;
|
||||||
|
@ -495,7 +492,6 @@ void register_property(const char *name, void (T::*setter)(P), P (T::*getter)()
|
||||||
godot_method_rpc_mode rpc_mode = GODOT_METHOD_RPC_MODE_DISABLED,
|
godot_method_rpc_mode rpc_mode = GODOT_METHOD_RPC_MODE_DISABLED,
|
||||||
godot_property_usage_flags usage = GODOT_PROPERTY_USAGE_DEFAULT,
|
godot_property_usage_flags usage = GODOT_PROPERTY_USAGE_DEFAULT,
|
||||||
godot_property_hint hint = GODOT_PROPERTY_HINT_NONE, String hint_string = "") {
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,6 @@ extern "C" const godot_gdnative_ext_net_3_2_api_struct *net_3_2_api;
|
||||||
extern "C" const void *gdnlib;
|
extern "C" const void *gdnlib;
|
||||||
|
|
||||||
class Godot {
|
class Godot {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static void print(const String &message);
|
static void print(const String &message);
|
||||||
static void print_warning(const String &description, const String &function, const String &file, int line);
|
static void print_warning(const String &description, const String &function, const String &file, int line);
|
||||||
|
|
|
@ -232,7 +232,6 @@ inline double stepify(double p_value, double p_step) {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline unsigned int next_power_of_2(unsigned int x) {
|
inline unsigned int next_power_of_2(unsigned int x) {
|
||||||
|
|
||||||
if (x == 0)
|
if (x == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,6 @@ class PoolByteArray {
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,6 @@ typedef Vector2 Point2;
|
||||||
struct Transform2D;
|
struct Transform2D;
|
||||||
|
|
||||||
struct Rect2 {
|
struct Rect2 {
|
||||||
|
|
||||||
Point2 position;
|
Point2 position;
|
||||||
Size2 size;
|
Size2 size;
|
||||||
|
|
||||||
|
@ -48,14 +47,12 @@ struct Rect2 {
|
||||||
bool intersects_segment(const Point2 &p_from, const Point2 &p_to, Point2 *r_position = 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.position.x >= position.x) && (p_rect.position.y >= position.y) &&
|
return (p_rect.position.x >= position.x) && (p_rect.position.y >= position.y) &&
|
||||||
((p_rect.position.x + p_rect.size.x) < (position.x + size.x)) &&
|
((p_rect.position.x + p_rect.size.x) < (position.x + size.x)) &&
|
||||||
((p_rect.position.y + p_rect.size.y) < (position.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;
|
||||||
|
@ -82,7 +79,6 @@ struct Rect2 {
|
||||||
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 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.position.x -= p_by;
|
g.position.x -= p_by;
|
||||||
g.position.y -= p_by;
|
g.position.y -= p_by;
|
||||||
|
@ -92,7 +88,6 @@ struct Rect2 {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Rect2 expand(const Vector2 &p_vector) const {
|
inline Rect2 expand(const Vector2 &p_vector) const {
|
||||||
|
|
||||||
Rect2 r = *this;
|
Rect2 r = *this;
|
||||||
r.expand_to(p_vector);
|
r.expand_to(p_vector);
|
||||||
return r;
|
return r;
|
||||||
|
|
|
@ -19,7 +19,6 @@ class Ref {
|
||||||
T *reference = nullptr;
|
T *reference = nullptr;
|
||||||
|
|
||||||
void ref(const Ref &p_from) {
|
void ref(const Ref &p_from) {
|
||||||
|
|
||||||
if (p_from.reference == reference)
|
if (p_from.reference == reference)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -31,7 +30,6 @@ class Ref {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ref_pointer(T *p_ref) {
|
void ref_pointer(T *p_ref) {
|
||||||
|
|
||||||
ERR_FAIL_COND(p_ref == nullptr);
|
ERR_FAIL_COND(p_ref == nullptr);
|
||||||
|
|
||||||
if (p_ref->init_ref())
|
if (p_ref->init_ref())
|
||||||
|
@ -40,44 +38,35 @@ class Ref {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
inline bool operator<(const Ref<T> &p_r) const {
|
inline bool operator<(const Ref<T> &p_r) const {
|
||||||
|
|
||||||
return reference < p_r.reference;
|
return reference < p_r.reference;
|
||||||
}
|
}
|
||||||
inline bool operator==(const Ref<T> &p_r) const {
|
inline bool operator==(const Ref<T> &p_r) const {
|
||||||
|
|
||||||
return reference == p_r.reference;
|
return reference == p_r.reference;
|
||||||
}
|
}
|
||||||
inline bool operator!=(const Ref<T> &p_r) const {
|
inline bool operator!=(const Ref<T> &p_r) const {
|
||||||
|
|
||||||
return reference != p_r.reference;
|
return reference != p_r.reference;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline T *operator->() {
|
inline T *operator->() {
|
||||||
|
|
||||||
return reference;
|
return reference;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline T *operator*() {
|
inline T *operator*() {
|
||||||
|
|
||||||
return reference;
|
return reference;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const T *operator->() const {
|
inline const T *operator->() const {
|
||||||
|
|
||||||
return reference;
|
return reference;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const T *ptr() const {
|
inline const T *ptr() const {
|
||||||
|
|
||||||
return reference;
|
return reference;
|
||||||
}
|
}
|
||||||
inline T *ptr() {
|
inline T *ptr() {
|
||||||
|
|
||||||
return reference;
|
return reference;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const T *operator*() const {
|
inline const T *operator*() const {
|
||||||
|
|
||||||
return reference;
|
return reference;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,7 +77,6 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void operator=(const Ref &p_from) {
|
void operator=(const Ref &p_from) {
|
||||||
|
|
||||||
ref(p_from);
|
ref(p_from);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,7 +106,6 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref(const Ref &p_from) {
|
Ref(const Ref &p_from) {
|
||||||
|
|
||||||
reference = nullptr;
|
reference = nullptr;
|
||||||
ref(p_from);
|
ref(p_from);
|
||||||
}
|
}
|
||||||
|
@ -138,7 +125,6 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref(T *p_reference) {
|
Ref(T *p_reference) {
|
||||||
|
|
||||||
if (p_reference)
|
if (p_reference)
|
||||||
ref_pointer(p_reference);
|
ref_pointer(p_reference);
|
||||||
else
|
else
|
||||||
|
@ -146,7 +132,6 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref(const Variant &p_variant) {
|
Ref(const Variant &p_variant) {
|
||||||
|
|
||||||
reference = nullptr;
|
reference = nullptr;
|
||||||
Object *refb = T::___get_from_variant(p_variant);
|
Object *refb = T::___get_from_variant(p_variant);
|
||||||
if (refb == nullptr) {
|
if (refb == nullptr) {
|
||||||
|
@ -168,7 +153,6 @@ public:
|
||||||
// mutexes will avoid more crashes?
|
// mutexes will avoid more crashes?
|
||||||
|
|
||||||
if (reference && reference->unreference()) {
|
if (reference && reference->unreference()) {
|
||||||
|
|
||||||
//memdelete(reference);
|
//memdelete(reference);
|
||||||
reference->free();
|
reference->free();
|
||||||
}
|
}
|
||||||
|
@ -181,12 +165,10 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref() {
|
Ref() {
|
||||||
|
|
||||||
reference = nullptr;
|
reference = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
~Ref() {
|
~Ref() {
|
||||||
|
|
||||||
unref();
|
unref();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,6 @@ class PoolStringArray;
|
||||||
class String;
|
class String;
|
||||||
|
|
||||||
class CharString {
|
class CharString {
|
||||||
|
|
||||||
friend class String;
|
friend class String;
|
||||||
|
|
||||||
godot_char_string _char_string;
|
godot_char_string _char_string;
|
||||||
|
|
|
@ -14,7 +14,6 @@ namespace godot {
|
||||||
class Basis;
|
class Basis;
|
||||||
|
|
||||||
struct Vector3 {
|
struct Vector3 {
|
||||||
|
|
||||||
enum Axis {
|
enum Axis {
|
||||||
AXIS_X,
|
AXIS_X,
|
||||||
AXIS_Y,
|
AXIS_Y,
|
||||||
|
@ -305,7 +304,6 @@ inline Vector3 operator*(real_t p_scalar, const Vector3 &p_vec) {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Vector3 vec3_cross(const Vector3 &p_a, const Vector3 &p_b) {
|
inline Vector3 vec3_cross(const Vector3 &p_a, const Vector3 &p_b) {
|
||||||
|
|
||||||
return p_a.cross(p_b);
|
return p_a.cross(p_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
deb http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
|
||||||
|
deb http://archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse
|
||||||
|
deb http://archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
|
||||||
|
deb http://archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiverse
|
|
@ -7,7 +7,6 @@
|
||||||
namespace godot {
|
namespace godot {
|
||||||
|
|
||||||
bool AABB::intersects(const AABB &p_aabb) const {
|
bool AABB::intersects(const AABB &p_aabb) const {
|
||||||
|
|
||||||
if (position.x >= (p_aabb.position.x + p_aabb.size.x))
|
if (position.x >= (p_aabb.position.x + p_aabb.size.x))
|
||||||
return false;
|
return false;
|
||||||
if ((position.x + size.x) <= p_aabb.position.x)
|
if ((position.x + size.x) <= p_aabb.position.x)
|
||||||
|
@ -25,7 +24,6 @@ bool AABB::intersects(const AABB &p_aabb) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AABB::intersects_inclusive(const AABB &p_aabb) const {
|
bool AABB::intersects_inclusive(const AABB &p_aabb) const {
|
||||||
|
|
||||||
if (position.x > (p_aabb.position.x + p_aabb.size.x))
|
if (position.x > (p_aabb.position.x + p_aabb.size.x))
|
||||||
return false;
|
return false;
|
||||||
if ((position.x + size.x) < p_aabb.position.x)
|
if ((position.x + size.x) < p_aabb.position.x)
|
||||||
|
@ -43,7 +41,6 @@ bool AABB::intersects_inclusive(const AABB &p_aabb) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AABB::encloses(const AABB &p_aabb) const {
|
bool AABB::encloses(const AABB &p_aabb) const {
|
||||||
|
|
||||||
Vector3 src_min = position;
|
Vector3 src_min = position;
|
||||||
Vector3 src_max = position + size;
|
Vector3 src_max = position + size;
|
||||||
Vector3 dst_min = p_aabb.position;
|
Vector3 dst_min = p_aabb.position;
|
||||||
|
@ -59,7 +56,6 @@ bool AABB::encloses(const AABB &p_aabb) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 AABB::get_support(const Vector3 &p_normal) const {
|
Vector3 AABB::get_support(const Vector3 &p_normal) const {
|
||||||
|
|
||||||
Vector3 half_extents = size * 0.5;
|
Vector3 half_extents = size * 0.5;
|
||||||
Vector3 ofs = position + half_extents;
|
Vector3 ofs = position + half_extents;
|
||||||
|
|
||||||
|
@ -71,23 +67,29 @@ Vector3 AABB::get_support(const Vector3 &p_normal) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 AABB::get_endpoint(int p_point) const {
|
Vector3 AABB::get_endpoint(int p_point) const {
|
||||||
|
|
||||||
switch (p_point) {
|
switch (p_point) {
|
||||||
case 0: return Vector3(position.x, position.y, position.z);
|
case 0:
|
||||||
case 1: return Vector3(position.x, position.y, position.z + size.z);
|
return Vector3(position.x, position.y, position.z);
|
||||||
case 2: return Vector3(position.x, position.y + size.y, position.z);
|
case 1:
|
||||||
case 3: return Vector3(position.x, position.y + size.y, position.z + size.z);
|
return Vector3(position.x, position.y, position.z + size.z);
|
||||||
case 4: return Vector3(position.x + size.x, position.y, position.z);
|
case 2:
|
||||||
case 5: return Vector3(position.x + size.x, position.y, position.z + size.z);
|
return Vector3(position.x, position.y + size.y, position.z);
|
||||||
case 6: return Vector3(position.x + size.x, position.y + size.y, position.z);
|
case 3:
|
||||||
case 7: return Vector3(position.x + size.x, position.y + size.y, position.z + size.z);
|
return Vector3(position.x, position.y + size.y, position.z + size.z);
|
||||||
|
case 4:
|
||||||
|
return Vector3(position.x + size.x, position.y, position.z);
|
||||||
|
case 5:
|
||||||
|
return Vector3(position.x + size.x, position.y, position.z + size.z);
|
||||||
|
case 6:
|
||||||
|
return Vector3(position.x + size.x, position.y + size.y, position.z);
|
||||||
|
case 7:
|
||||||
|
return Vector3(position.x + size.x, position.y + size.y, position.z + size.z);
|
||||||
};
|
};
|
||||||
|
|
||||||
ERR_FAIL_V(Vector3());
|
ERR_FAIL_V(Vector3());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AABB::intersects_convex_shape(const Plane *p_planes, int p_plane_count) const {
|
bool AABB::intersects_convex_shape(const Plane *p_planes, int p_plane_count) const {
|
||||||
|
|
||||||
Vector3 half_extents = size * 0.5;
|
Vector3 half_extents = size * 0.5;
|
||||||
Vector3 ofs = position + half_extents;
|
Vector3 ofs = position + half_extents;
|
||||||
|
|
||||||
|
@ -106,7 +108,6 @@ bool AABB::intersects_convex_shape(const Plane *p_planes, int p_plane_count) con
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AABB::has_point(const Vector3 &p_point) const {
|
bool AABB::has_point(const Vector3 &p_point) const {
|
||||||
|
|
||||||
if (p_point.x < position.x)
|
if (p_point.x < position.x)
|
||||||
return false;
|
return false;
|
||||||
if (p_point.y < position.y)
|
if (p_point.y < position.y)
|
||||||
|
@ -124,7 +125,6 @@ bool AABB::has_point(const Vector3 &p_point) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AABB::expand_to(const Vector3 &p_vector) {
|
void AABB::expand_to(const Vector3 &p_vector) {
|
||||||
|
|
||||||
Vector3 begin = position;
|
Vector3 begin = position;
|
||||||
Vector3 end = position + size;
|
Vector3 end = position + size;
|
||||||
|
|
||||||
|
@ -147,7 +147,6 @@ void AABB::expand_to(const Vector3 &p_vector) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AABB::project_range_in_plane(const Plane &p_plane, real_t &r_min, real_t &r_max) const {
|
void AABB::project_range_in_plane(const Plane &p_plane, real_t &r_min, real_t &r_max) const {
|
||||||
|
|
||||||
Vector3 half_extents(size.x * 0.5, size.y * 0.5, size.z * 0.5);
|
Vector3 half_extents(size.x * 0.5, size.y * 0.5, size.z * 0.5);
|
||||||
Vector3 center(position.x + half_extents.x, position.y + half_extents.y, position.z + half_extents.z);
|
Vector3 center(position.x + half_extents.x, position.y + half_extents.y, position.z + half_extents.z);
|
||||||
|
|
||||||
|
@ -158,7 +157,6 @@ void AABB::project_range_in_plane(const Plane &p_plane, real_t &r_min, real_t &r
|
||||||
}
|
}
|
||||||
|
|
||||||
real_t AABB::get_longest_axis_size() const {
|
real_t AABB::get_longest_axis_size() const {
|
||||||
|
|
||||||
real_t max_size = size.x;
|
real_t max_size = size.x;
|
||||||
|
|
||||||
if (size.y > max_size) {
|
if (size.y > max_size) {
|
||||||
|
@ -173,7 +171,6 @@ real_t AABB::get_longest_axis_size() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
real_t AABB::get_shortest_axis_size() const {
|
real_t AABB::get_shortest_axis_size() const {
|
||||||
|
|
||||||
real_t max_size = size.x;
|
real_t max_size = size.x;
|
||||||
|
|
||||||
if (size.y < max_size) {
|
if (size.y < max_size) {
|
||||||
|
@ -188,7 +185,6 @@ real_t AABB::get_shortest_axis_size() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AABB::smits_intersect_ray(const Vector3 &from, const Vector3 &dir, real_t t0, real_t t1) const {
|
bool AABB::smits_intersect_ray(const Vector3 &from, const Vector3 &dir, real_t t0, real_t t1) const {
|
||||||
|
|
||||||
real_t divx = 1.0 / dir.x;
|
real_t divx = 1.0 / dir.x;
|
||||||
real_t divy = 1.0 / dir.y;
|
real_t divy = 1.0 / dir.y;
|
||||||
real_t divz = 1.0 / dir.z;
|
real_t divz = 1.0 / dir.z;
|
||||||
|
@ -232,7 +228,6 @@ bool AABB::smits_intersect_ray(const Vector3 &from, const Vector3 &dir, real_t t
|
||||||
}
|
}
|
||||||
|
|
||||||
void AABB::grow_by(real_t p_amount) {
|
void AABB::grow_by(real_t p_amount) {
|
||||||
|
|
||||||
position.x -= p_amount;
|
position.x -= p_amount;
|
||||||
position.y -= p_amount;
|
position.y -= p_amount;
|
||||||
position.z -= p_amount;
|
position.z -= p_amount;
|
||||||
|
@ -242,21 +237,17 @@ void AABB::grow_by(real_t 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) {
|
||||||
|
|
||||||
Vector3 beg_1, beg_2;
|
Vector3 beg_1, beg_2;
|
||||||
Vector3 end_1, end_2;
|
Vector3 end_1, end_2;
|
||||||
Vector3 min, max;
|
Vector3 min, max;
|
||||||
|
@ -279,7 +270,6 @@ void AABB::merge_with(const AABB &p_aabb) {
|
||||||
}
|
}
|
||||||
|
|
||||||
AABB AABB::intersection(const AABB &p_aabb) const {
|
AABB AABB::intersection(const AABB &p_aabb) const {
|
||||||
|
|
||||||
Vector3 src_min = position;
|
Vector3 src_min = position;
|
||||||
Vector3 src_max = position + size;
|
Vector3 src_max = position + size;
|
||||||
Vector3 dst_min = p_aabb.position;
|
Vector3 dst_min = p_aabb.position;
|
||||||
|
@ -290,7 +280,6 @@ AABB AABB::intersection(const AABB &p_aabb) const {
|
||||||
if (src_min.x > dst_max.x || src_max.x < dst_min.x)
|
if (src_min.x > dst_max.x || src_max.x < dst_min.x)
|
||||||
return AABB();
|
return AABB();
|
||||||
else {
|
else {
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
@ -298,7 +287,6 @@ AABB AABB::intersection(const AABB &p_aabb) const {
|
||||||
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)
|
||||||
return AABB();
|
return AABB();
|
||||||
else {
|
else {
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
@ -306,7 +294,6 @@ AABB AABB::intersection(const AABB &p_aabb) const {
|
||||||
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)
|
||||||
return AABB();
|
return AABB();
|
||||||
else {
|
else {
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
@ -315,7 +302,6 @@ AABB AABB::intersection(const AABB &p_aabb) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AABB::intersects_ray(const Vector3 &p_from, const Vector3 &p_dir, Vector3 *r_clip, Vector3 *r_normal) const {
|
bool AABB::intersects_ray(const Vector3 &p_from, const Vector3 &p_dir, Vector3 *r_clip, Vector3 *r_normal) const {
|
||||||
|
|
||||||
Vector3 c1, c2;
|
Vector3 c1, c2;
|
||||||
Vector3 end = position + size;
|
Vector3 end = position + size;
|
||||||
real_t near = -1e20;
|
real_t near = -1e20;
|
||||||
|
@ -358,7 +344,6 @@ bool AABB::intersects_ray(const Vector3 &p_from, const Vector3 &p_dir, Vector3 *
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
int axis = 0;
|
int axis = 0;
|
||||||
real_t sign = 0;
|
real_t sign = 0;
|
||||||
|
@ -372,7 +357,6 @@ bool AABB::intersects_segment(const Vector3 &p_from, const Vector3 &p_to, Vector
|
||||||
real_t csign;
|
real_t csign;
|
||||||
|
|
||||||
if (seg_from < seg_to) {
|
if (seg_from < seg_to) {
|
||||||
|
|
||||||
if (seg_from > box_end || seg_to < box_begin)
|
if (seg_from > box_end || seg_to < box_begin)
|
||||||
return false;
|
return false;
|
||||||
real_t length = seg_to - seg_from;
|
real_t length = seg_to - seg_from;
|
||||||
|
@ -381,7 +365,6 @@ bool AABB::intersects_segment(const Vector3 &p_from, const Vector3 &p_to, Vector
|
||||||
csign = -1.0;
|
csign = -1.0;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (seg_to > box_end || seg_from < box_begin)
|
if (seg_to > box_end || seg_from < box_begin)
|
||||||
return false;
|
return false;
|
||||||
real_t length = seg_to - seg_from;
|
real_t length = seg_to - seg_from;
|
||||||
|
@ -416,7 +399,6 @@ bool AABB::intersects_segment(const Vector3 &p_from, const Vector3 &p_to, Vector
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AABB::intersects_plane(const Plane &p_plane) const {
|
bool AABB::intersects_plane(const Plane &p_plane) const {
|
||||||
|
|
||||||
Vector3 points[8] = {
|
Vector3 points[8] = {
|
||||||
Vector3(position.x, position.y, position.z),
|
Vector3(position.x, position.y, position.z),
|
||||||
Vector3(position.x, position.y, position.z + size.z),
|
Vector3(position.x, position.y, position.z + size.z),
|
||||||
|
@ -432,7 +414,6 @@ bool AABB::intersects_plane(const Plane &p_plane) const {
|
||||||
bool under = false;
|
bool under = false;
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
|
|
||||||
if (p_plane.distance_to(points[i]) > 0)
|
if (p_plane.distance_to(points[i]) > 0)
|
||||||
over = true;
|
over = true;
|
||||||
else
|
else
|
||||||
|
@ -443,7 +424,6 @@ bool AABB::intersects_plane(const Plane &p_plane) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 AABB::get_longest_axis() const {
|
Vector3 AABB::get_longest_axis() const {
|
||||||
|
|
||||||
Vector3 axis(1, 0, 0);
|
Vector3 axis(1, 0, 0);
|
||||||
real_t max_size = size.x;
|
real_t max_size = size.x;
|
||||||
|
|
||||||
|
@ -460,7 +440,6 @@ Vector3 AABB::get_longest_axis() const {
|
||||||
return axis;
|
return axis;
|
||||||
}
|
}
|
||||||
int AABB::get_longest_axis_index() const {
|
int AABB::get_longest_axis_index() const {
|
||||||
|
|
||||||
int axis = 0;
|
int axis = 0;
|
||||||
real_t max_size = size.x;
|
real_t max_size = size.x;
|
||||||
|
|
||||||
|
@ -478,7 +457,6 @@ int AABB::get_longest_axis_index() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 AABB::get_shortest_axis() const {
|
Vector3 AABB::get_shortest_axis() const {
|
||||||
|
|
||||||
Vector3 axis(1, 0, 0);
|
Vector3 axis(1, 0, 0);
|
||||||
real_t max_size = size.x;
|
real_t max_size = size.x;
|
||||||
|
|
||||||
|
@ -495,7 +473,6 @@ Vector3 AABB::get_shortest_axis() const {
|
||||||
return axis;
|
return axis;
|
||||||
}
|
}
|
||||||
int AABB::get_shortest_axis_index() const {
|
int AABB::get_shortest_axis_index() const {
|
||||||
|
|
||||||
int axis = 0;
|
int axis = 0;
|
||||||
real_t max_size = size.x;
|
real_t max_size = size.x;
|
||||||
|
|
||||||
|
@ -513,7 +490,6 @@ int AABB::get_shortest_axis_index() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
AABB AABB::merge(const AABB &p_with) const {
|
AABB AABB::merge(const AABB &p_with) const {
|
||||||
|
|
||||||
AABB aabb = *this;
|
AABB aabb = *this;
|
||||||
aabb.merge_with(p_with);
|
aabb.merge_with(p_with);
|
||||||
return aabb;
|
return aabb;
|
||||||
|
@ -524,24 +500,19 @@ AABB AABB::expand(const Vector3 &p_vector) const {
|
||||||
return aabb;
|
return aabb;
|
||||||
}
|
}
|
||||||
AABB AABB::grow(real_t p_by) const {
|
AABB AABB::grow(real_t p_by) const {
|
||||||
|
|
||||||
AABB aabb = *this;
|
AABB aabb = *this;
|
||||||
aabb.grow_by(p_by);
|
aabb.grow_by(p_by);
|
||||||
return aabb;
|
return aabb;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AABB::get_edge(int p_edge, Vector3 &r_from, Vector3 &r_to) const {
|
void AABB::get_edge(int p_edge, Vector3 &r_from, Vector3 &r_to) const {
|
||||||
|
|
||||||
ERR_FAIL_INDEX(p_edge, 12);
|
ERR_FAIL_INDEX(p_edge, 12);
|
||||||
switch (p_edge) {
|
switch (p_edge) {
|
||||||
|
|
||||||
case 0: {
|
case 0: {
|
||||||
|
|
||||||
r_from = Vector3(position.x + size.x, position.y, position.z);
|
r_from = Vector3(position.x + size.x, position.y, position.z);
|
||||||
r_to = Vector3(position.x, position.y, position.z);
|
r_to = Vector3(position.x, position.y, position.z);
|
||||||
} break;
|
} break;
|
||||||
case 1: {
|
case 1: {
|
||||||
|
|
||||||
r_from = Vector3(position.x + size.x, position.y, position.z + size.z);
|
r_from = Vector3(position.x + size.x, position.y, position.z + size.z);
|
||||||
r_to = Vector3(position.x + size.x, position.y, position.z);
|
r_to = Vector3(position.x + size.x, position.y, position.z);
|
||||||
} break;
|
} break;
|
||||||
|
@ -551,18 +522,15 @@ void AABB::get_edge(int p_edge, Vector3 &r_from, Vector3 &r_to) const {
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case 3: {
|
case 3: {
|
||||||
|
|
||||||
r_from = Vector3(position.x, position.y, position.z);
|
r_from = Vector3(position.x, position.y, position.z);
|
||||||
r_to = Vector3(position.x, position.y, position.z + size.z);
|
r_to = Vector3(position.x, position.y, position.z + size.z);
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case 4: {
|
case 4: {
|
||||||
|
|
||||||
r_from = Vector3(position.x, position.y + size.y, position.z);
|
r_from = Vector3(position.x, position.y + size.y, position.z);
|
||||||
r_to = Vector3(position.x + size.x, position.y + size.y, position.z);
|
r_to = Vector3(position.x + size.x, position.y + size.y, position.z);
|
||||||
} break;
|
} break;
|
||||||
case 5: {
|
case 5: {
|
||||||
|
|
||||||
r_from = Vector3(position.x + size.x, position.y + size.y, position.z);
|
r_from = Vector3(position.x + size.x, position.y + size.y, position.z);
|
||||||
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;
|
||||||
|
@ -572,31 +540,26 @@ void AABB::get_edge(int p_edge, Vector3 &r_from, Vector3 &r_to) const {
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case 7: {
|
case 7: {
|
||||||
|
|
||||||
r_from = Vector3(position.x, position.y + size.y, position.z + size.z);
|
r_from = Vector3(position.x, position.y + size.y, position.z + size.z);
|
||||||
r_to = Vector3(position.x, position.y + size.y, position.z);
|
r_to = Vector3(position.x, position.y + size.y, position.z);
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case 8: {
|
case 8: {
|
||||||
|
|
||||||
r_from = Vector3(position.x, position.y, position.z + size.z);
|
r_from = Vector3(position.x, position.y, position.z + size.z);
|
||||||
r_to = Vector3(position.x, position.y + size.y, position.z + size.z);
|
r_to = Vector3(position.x, position.y + size.y, position.z + size.z);
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case 9: {
|
case 9: {
|
||||||
|
|
||||||
r_from = Vector3(position.x, position.y, position.z);
|
r_from = Vector3(position.x, position.y, position.z);
|
||||||
r_to = Vector3(position.x, position.y + size.y, position.z);
|
r_to = Vector3(position.x, position.y + size.y, position.z);
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case 10: {
|
case 10: {
|
||||||
|
|
||||||
r_from = Vector3(position.x + size.x, position.y, position.z);
|
r_from = Vector3(position.x + size.x, position.y, position.z);
|
||||||
r_to = Vector3(position.x + size.x, position.y + size.y, position.z);
|
r_to = Vector3(position.x + size.x, position.y + size.y, position.z);
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case 11: {
|
case 11: {
|
||||||
|
|
||||||
r_from = Vector3(position.x + size.x, position.y, position.z + size.z);
|
r_from = Vector3(position.x + size.x, position.y, position.z + size.z);
|
||||||
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);
|
||||||
|
|
||||||
|
@ -605,7 +568,6 @@ void AABB::get_edge(int p_edge, Vector3 &r_from, Vector3 &r_to) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
AABB::operator String() const {
|
AABB::operator String() const {
|
||||||
|
|
||||||
return String() + position + " - " + size;
|
return String() + position + " - " + size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,12 +19,10 @@ Basis::Basis(const Vector3 &row0, const Vector3 &row1, const Vector3 &row2) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Basis::Basis(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) {
|
Basis::Basis(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) {
|
||||||
|
|
||||||
set(xx, xy, xz, yx, yy, yz, zx, zy, zz);
|
set(xx, xy, xz, yx, yy, yz, zx, zy, zz);
|
||||||
}
|
}
|
||||||
|
|
||||||
Basis::Basis() {
|
Basis::Basis() {
|
||||||
|
|
||||||
elements[0][0] = 1;
|
elements[0][0] = 1;
|
||||||
elements[0][1] = 0;
|
elements[0][1] = 0;
|
||||||
elements[0][2] = 0;
|
elements[0][2] = 0;
|
||||||
|
@ -58,7 +56,6 @@ void Basis::invert() {
|
||||||
#undef cofac
|
#undef cofac
|
||||||
|
|
||||||
bool Basis::isequal_approx(const Basis &a, const Basis &b) const {
|
bool Basis::isequal_approx(const Basis &a, const Basis &b) 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 ((::fabs(a.elements[i][j] - b.elements[i][j]) < CMP_EPSILON) == false)
|
if ((::fabs(a.elements[i][j] - b.elements[i][j]) < CMP_EPSILON) == false)
|
||||||
|
@ -174,7 +171,6 @@ Basis Basis::slerp(Basis b, float t) const {
|
||||||
// the angles in the decomposition R = X(a1).Y(a2).Z(a3) where Z(a) rotates
|
// the angles in the decomposition R = X(a1).Y(a2).Z(a3) where Z(a) rotates
|
||||||
// around the z-axis by a and so on.
|
// around the z-axis by a and so on.
|
||||||
Vector3 Basis::get_euler_xyz() const {
|
Vector3 Basis::get_euler_xyz() const {
|
||||||
|
|
||||||
// Euler angles in XYZ convention.
|
// Euler angles in XYZ convention.
|
||||||
// See https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix
|
// See https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix
|
||||||
//
|
//
|
||||||
|
@ -218,7 +214,6 @@ Vector3 Basis::get_euler_xyz() const {
|
||||||
// and similar for other axes.
|
// and similar for other axes.
|
||||||
// The current implementation uses XYZ convention (Z is the first rotation).
|
// The current implementation uses XYZ convention (Z is the first rotation).
|
||||||
void Basis::set_euler_xyz(const Vector3 &p_euler) {
|
void Basis::set_euler_xyz(const Vector3 &p_euler) {
|
||||||
|
|
||||||
real_t c, s;
|
real_t c, s;
|
||||||
|
|
||||||
c = ::cos(p_euler.x);
|
c = ::cos(p_euler.x);
|
||||||
|
@ -241,7 +236,6 @@ void Basis::set_euler_xyz(const Vector3 &p_euler) {
|
||||||
// as in first-Z, then-X, last-Y. The angles for X, Y, and Z rotations are returned
|
// as in first-Z, then-X, last-Y. The angles for X, Y, and Z rotations are returned
|
||||||
// as the x, y, and z components of a Vector3 respectively.
|
// as the x, y, and z components of a Vector3 respectively.
|
||||||
Vector3 Basis::get_euler_yxz() const {
|
Vector3 Basis::get_euler_yxz() const {
|
||||||
|
|
||||||
// Euler angles in YXZ convention.
|
// Euler angles in YXZ convention.
|
||||||
// See https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix
|
// See https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix
|
||||||
//
|
//
|
||||||
|
@ -287,7 +281,6 @@ Vector3 Basis::get_euler_yxz() const {
|
||||||
// and similar for other axes.
|
// and similar for other axes.
|
||||||
// The current implementation uses YXZ convention (Z is the first rotation).
|
// The current implementation uses YXZ convention (Z is the first rotation).
|
||||||
void Basis::set_euler_yxz(const Vector3 &p_euler) {
|
void Basis::set_euler_yxz(const Vector3 &p_euler) {
|
||||||
|
|
||||||
real_t c, s;
|
real_t c, s;
|
||||||
|
|
||||||
c = ::cos(p_euler.x);
|
c = ::cos(p_euler.x);
|
||||||
|
@ -333,7 +326,6 @@ bool Basis::operator!=(const Basis &p_matrix) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 Basis::xform(const Vector3 &p_vector) const {
|
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),
|
||||||
|
@ -341,7 +333,6 @@ Vector3 Basis::xform(const Vector3 &p_vector) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 Basis::xform_inv(const Vector3 &p_vector) const {
|
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),
|
||||||
|
@ -362,42 +353,36 @@ Basis Basis::operator*(const Basis &p_matrix) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
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];
|
||||||
elements[1] += p_matrix.elements[1];
|
elements[1] += p_matrix.elements[1];
|
||||||
elements[2] += p_matrix.elements[2];
|
elements[2] += p_matrix.elements[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
Basis Basis::operator+(const Basis &p_matrix) const {
|
Basis Basis::operator+(const Basis &p_matrix) const {
|
||||||
|
|
||||||
Basis ret(*this);
|
Basis ret(*this);
|
||||||
ret += p_matrix;
|
ret += p_matrix;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
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];
|
||||||
elements[1] -= p_matrix.elements[1];
|
elements[1] -= p_matrix.elements[1];
|
||||||
elements[2] -= p_matrix.elements[2];
|
elements[2] -= p_matrix.elements[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
Basis Basis::operator-(const Basis &p_matrix) const {
|
Basis Basis::operator-(const Basis &p_matrix) const {
|
||||||
|
|
||||||
Basis ret(*this);
|
Basis ret(*this);
|
||||||
ret -= p_matrix;
|
ret -= p_matrix;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Basis::operator*=(real_t p_val) {
|
void Basis::operator*=(real_t p_val) {
|
||||||
|
|
||||||
elements[0] *= p_val;
|
elements[0] *= p_val;
|
||||||
elements[1] *= p_val;
|
elements[1] *= p_val;
|
||||||
elements[2] *= p_val;
|
elements[2] *= p_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
Basis Basis::operator*(real_t p_val) const {
|
Basis Basis::operator*(real_t p_val) const {
|
||||||
|
|
||||||
Basis ret(*this);
|
Basis ret(*this);
|
||||||
ret *= p_val;
|
ret *= p_val;
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -406,9 +391,7 @@ Basis Basis::operator*(real_t p_val) const {
|
||||||
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++) {
|
||||||
|
|
||||||
for (int j = 0; j < 3; j++) {
|
for (int j = 0; j < 3; j++) {
|
||||||
|
|
||||||
if (i != 0 || j != 0)
|
if (i != 0 || j != 0)
|
||||||
s += ", ";
|
s += ", ";
|
||||||
|
|
||||||
|
@ -421,7 +404,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;
|
||||||
elements[0][1] = xy;
|
elements[0][1] = xy;
|
||||||
elements[0][2] = xz;
|
elements[0][2] = xz;
|
||||||
|
@ -433,12 +415,10 @@ void Basis::set(real_t xx, real_t xy, real_t xz, real_t yx, real_t yy, real_t yz
|
||||||
elements[2][2] = zz;
|
elements[2][2] = zz;
|
||||||
}
|
}
|
||||||
Vector3 Basis::get_column(int i) const {
|
Vector3 Basis::get_column(int i) const {
|
||||||
|
|
||||||
return Vector3(elements[0][i], elements[1][i], elements[2][i]);
|
return Vector3(elements[0][i], elements[1][i], elements[2][i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 Basis::get_row(int i) const {
|
Vector3 Basis::get_row(int i) const {
|
||||||
|
|
||||||
return Vector3(elements[i][0], elements[i][1], elements[i][2]);
|
return Vector3(elements[i][0], elements[i][1], elements[i][2]);
|
||||||
}
|
}
|
||||||
Vector3 Basis::get_main_diagonal() const {
|
Vector3 Basis::get_main_diagonal() const {
|
||||||
|
@ -593,7 +573,6 @@ int Basis::get_orthogonal_index() const {
|
||||||
Basis orth = *this;
|
Basis orth = *this;
|
||||||
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++) {
|
||||||
|
|
||||||
real_t v = orth[i][j];
|
real_t v = orth[i][j];
|
||||||
if (v > 0.5)
|
if (v > 0.5)
|
||||||
v = 1.0;
|
v = 1.0;
|
||||||
|
@ -607,7 +586,6 @@ int Basis::get_orthogonal_index() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 24; i++) {
|
for (int i = 0; i < 24; i++) {
|
||||||
|
|
||||||
if (_ortho_bases[i] == orth)
|
if (_ortho_bases[i] == orth)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
@ -616,7 +594,6 @@ int Basis::get_orthogonal_index() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
|
@ -624,7 +601,6 @@ void Basis::set_orthogonal_index(int p_index) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Basis::Basis(const Vector3 &p_euler) {
|
Basis::Basis(const Vector3 &p_euler) {
|
||||||
|
|
||||||
set_euler(p_euler);
|
set_euler(p_euler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -635,7 +611,6 @@ Basis::Basis(const Vector3 &p_euler) {
|
||||||
namespace godot {
|
namespace godot {
|
||||||
|
|
||||||
Basis::Basis(const Quat &p_quat) {
|
Basis::Basis(const Quat &p_quat) {
|
||||||
|
|
||||||
real_t d = p_quat.length_squared();
|
real_t d = p_quat.length_squared();
|
||||||
real_t s = 2.0 / d;
|
real_t s = 2.0 / d;
|
||||||
real_t xs = p_quat.x * s, ys = p_quat.y * s, zs = p_quat.z * s;
|
real_t xs = p_quat.x * s, ys = p_quat.y * s, zs = p_quat.z * s;
|
||||||
|
@ -685,8 +660,8 @@ Basis::operator Quat() const {
|
||||||
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);
|
||||||
int j = (i + 1) % 3;
|
int j = (i + 1) % 3;
|
||||||
int k = (i + 2) % 3;
|
int k = (i + 2) % 3;
|
||||||
|
|
||||||
|
|
|
@ -31,29 +31,22 @@
|
||||||
#include "CameraMatrix.hpp"
|
#include "CameraMatrix.hpp"
|
||||||
|
|
||||||
void CameraMatrix::set_identity() {
|
void CameraMatrix::set_identity() {
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
|
|
||||||
for (int j = 0; j < 4; j++) {
|
for (int j = 0; j < 4; j++) {
|
||||||
|
|
||||||
matrix[i][j] = (i == j) ? 1 : 0;
|
matrix[i][j] = (i == j) ? 1 : 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraMatrix::set_zero() {
|
void CameraMatrix::set_zero() {
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
|
|
||||||
for (int j = 0; j < 4; j++) {
|
for (int j = 0; j < 4; j++) {
|
||||||
|
|
||||||
matrix[i][j] = 0;
|
matrix[i][j] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Plane CameraMatrix::xform4(const Plane &p_vec4) const {
|
Plane CameraMatrix::xform4(const Plane &p_vec4) const {
|
||||||
|
|
||||||
Plane ret;
|
Plane ret;
|
||||||
|
|
||||||
ret.normal.x = matrix[0][0] * p_vec4.normal.x + matrix[1][0] * p_vec4.normal.y + matrix[2][0] * p_vec4.normal.z + matrix[3][0] * p_vec4.d;
|
ret.normal.x = matrix[0][0] * p_vec4.normal.x + matrix[1][0] * p_vec4.normal.y + matrix[2][0] * p_vec4.normal.z + matrix[3][0] * p_vec4.d;
|
||||||
|
@ -64,7 +57,6 @@ Plane CameraMatrix::xform4(const Plane &p_vec4) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraMatrix::set_perspective(real_t p_fovy_degrees, real_t p_aspect, real_t p_z_near, real_t p_z_far, bool p_flip_fov) {
|
void CameraMatrix::set_perspective(real_t p_fovy_degrees, real_t p_aspect, real_t p_z_near, real_t p_z_far, bool p_flip_fov) {
|
||||||
|
|
||||||
if (p_flip_fov) {
|
if (p_flip_fov) {
|
||||||
p_fovy_degrees = get_fovy(p_fovy_degrees, 1.0 / p_aspect);
|
p_fovy_degrees = get_fovy(p_fovy_degrees, 1.0 / p_aspect);
|
||||||
}
|
}
|
||||||
|
@ -157,7 +149,6 @@ void CameraMatrix::set_for_hmd(int p_eye, real_t p_aspect, real_t p_intraocular_
|
||||||
};
|
};
|
||||||
|
|
||||||
void CameraMatrix::set_orthogonal(real_t p_left, real_t p_right, real_t p_bottom, real_t p_top, real_t p_znear, real_t p_zfar) {
|
void CameraMatrix::set_orthogonal(real_t p_left, real_t p_right, real_t p_bottom, real_t p_top, real_t p_znear, real_t p_zfar) {
|
||||||
|
|
||||||
set_identity();
|
set_identity();
|
||||||
|
|
||||||
matrix[0][0] = 2.0 / (p_right - p_left);
|
matrix[0][0] = 2.0 / (p_right - p_left);
|
||||||
|
@ -170,7 +161,6 @@ void CameraMatrix::set_orthogonal(real_t p_left, real_t p_right, real_t p_bottom
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraMatrix::set_orthogonal(real_t p_size, real_t p_aspect, real_t p_znear, real_t p_zfar, bool p_flip_fov) {
|
void CameraMatrix::set_orthogonal(real_t p_size, real_t p_aspect, real_t p_znear, real_t p_zfar, bool p_flip_fov) {
|
||||||
|
|
||||||
if (!p_flip_fov) {
|
if (!p_flip_fov) {
|
||||||
p_size *= p_aspect;
|
p_size *= p_aspect;
|
||||||
}
|
}
|
||||||
|
@ -179,7 +169,6 @@ void CameraMatrix::set_orthogonal(real_t p_size, real_t p_aspect, real_t p_znear
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraMatrix::set_frustum(real_t p_left, real_t p_right, real_t p_bottom, real_t p_top, real_t p_near, real_t p_far) {
|
void CameraMatrix::set_frustum(real_t p_left, real_t p_right, real_t p_bottom, real_t p_top, real_t p_near, real_t p_far) {
|
||||||
|
|
||||||
ERR_FAIL_COND(p_right <= p_left);
|
ERR_FAIL_COND(p_right <= p_left);
|
||||||
ERR_FAIL_COND(p_top <= p_bottom);
|
ERR_FAIL_COND(p_top <= p_bottom);
|
||||||
ERR_FAIL_COND(p_far <= p_near);
|
ERR_FAIL_COND(p_far <= p_near);
|
||||||
|
@ -220,7 +209,6 @@ void CameraMatrix::set_frustum(real_t p_size, real_t p_aspect, Vector2 p_offset,
|
||||||
}
|
}
|
||||||
|
|
||||||
real_t CameraMatrix::get_z_far() const {
|
real_t CameraMatrix::get_z_far() const {
|
||||||
|
|
||||||
const real_t *matrix = (const real_t *)this->matrix;
|
const real_t *matrix = (const real_t *)this->matrix;
|
||||||
Plane new_plane = Plane(matrix[3] - matrix[2],
|
Plane new_plane = Plane(matrix[3] - matrix[2],
|
||||||
matrix[7] - matrix[6],
|
matrix[7] - matrix[6],
|
||||||
|
@ -233,7 +221,6 @@ real_t CameraMatrix::get_z_far() const {
|
||||||
return new_plane.d;
|
return new_plane.d;
|
||||||
}
|
}
|
||||||
real_t CameraMatrix::get_z_near() const {
|
real_t CameraMatrix::get_z_near() const {
|
||||||
|
|
||||||
const real_t *matrix = (const real_t *)this->matrix;
|
const real_t *matrix = (const real_t *)this->matrix;
|
||||||
Plane new_plane = Plane(matrix[3] + matrix[2],
|
Plane new_plane = Plane(matrix[3] + matrix[2],
|
||||||
matrix[7] + matrix[6],
|
matrix[7] + matrix[6],
|
||||||
|
@ -245,7 +232,6 @@ real_t CameraMatrix::get_z_near() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector2 CameraMatrix::get_viewport_half_extents() const {
|
Vector2 CameraMatrix::get_viewport_half_extents() const {
|
||||||
|
|
||||||
const real_t *matrix = (const real_t *)this->matrix;
|
const real_t *matrix = (const real_t *)this->matrix;
|
||||||
///////--- Near Plane ---///////
|
///////--- Near Plane ---///////
|
||||||
Plane near_plane = Plane(matrix[3] + matrix[2],
|
Plane near_plane = Plane(matrix[3] + matrix[2],
|
||||||
|
@ -274,7 +260,6 @@ Vector2 CameraMatrix::get_viewport_half_extents() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CameraMatrix::get_endpoints(const Transform &p_transform, Vector3 *p_8points) const {
|
bool CameraMatrix::get_endpoints(const Transform &p_transform, Vector3 *p_8points) const {
|
||||||
|
|
||||||
std::vector<Plane> planes = get_projection_planes(Transform());
|
std::vector<Plane> planes = get_projection_planes(Transform());
|
||||||
const Planes intersections[8][3] = {
|
const Planes intersections[8][3] = {
|
||||||
{ PLANE_FAR, PLANE_LEFT, PLANE_TOP },
|
{ PLANE_FAR, PLANE_LEFT, PLANE_TOP },
|
||||||
|
@ -288,7 +273,6 @@ bool CameraMatrix::get_endpoints(const Transform &p_transform, Vector3 *p_8point
|
||||||
};
|
};
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
|
|
||||||
Vector3 point;
|
Vector3 point;
|
||||||
bool res = planes[intersections[i][0]].intersect_3(planes[intersections[i][1]], planes[intersections[i][2]], &point);
|
bool res = planes[intersections[i][0]].intersect_3(planes[intersections[i][1]], planes[intersections[i][2]], &point);
|
||||||
ERR_FAIL_COND_V(!res, false);
|
ERR_FAIL_COND_V(!res, false);
|
||||||
|
@ -299,7 +283,6 @@ bool CameraMatrix::get_endpoints(const Transform &p_transform, Vector3 *p_8point
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Plane> CameraMatrix::get_projection_planes(const Transform &p_transform) const {
|
std::vector<Plane> CameraMatrix::get_projection_planes(const Transform &p_transform) const {
|
||||||
|
|
||||||
/** Fast Plane Extraction from combined modelview/projection matrices.
|
/** Fast Plane Extraction from combined modelview/projection matrices.
|
||||||
* References:
|
* References:
|
||||||
* https://web.archive.org/web/20011221205252/http://www.markmorley.com/opengl/frustumculling.html
|
* https://web.archive.org/web/20011221205252/http://www.markmorley.com/opengl/frustumculling.html
|
||||||
|
@ -382,14 +365,12 @@ std::vector<Plane> CameraMatrix::get_projection_planes(const Transform &p_transf
|
||||||
}
|
}
|
||||||
|
|
||||||
CameraMatrix CameraMatrix::inverse() const {
|
CameraMatrix CameraMatrix::inverse() const {
|
||||||
|
|
||||||
CameraMatrix cm = *this;
|
CameraMatrix cm = *this;
|
||||||
cm.invert();
|
cm.invert();
|
||||||
return cm;
|
return cm;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraMatrix::invert() {
|
void CameraMatrix::invert() {
|
||||||
|
|
||||||
int i, j, k;
|
int i, j, k;
|
||||||
int pvt_i[4], pvt_j[4]; /* Locations of pivot matrix */
|
int pvt_i[4], pvt_j[4]; /* Locations of pivot matrix */
|
||||||
real_t pvt_val; /* Value of current pivot element */
|
real_t pvt_val; /* Value of current pivot element */
|
||||||
|
@ -440,20 +421,23 @@ void CameraMatrix::invert() {
|
||||||
|
|
||||||
/** Divide column by minus pivot value **/
|
/** Divide column by minus pivot value **/
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
if (i != k) matrix[i][k] /= (-pvt_val);
|
if (i != k)
|
||||||
|
matrix[i][k] /= (-pvt_val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Reduce the matrix **/
|
/** Reduce the matrix **/
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
hold = matrix[i][k];
|
hold = matrix[i][k];
|
||||||
for (j = 0; j < 4; j++) {
|
for (j = 0; j < 4; j++) {
|
||||||
if (i != k && j != k) matrix[i][j] += hold * matrix[k][j];
|
if (i != k && j != k)
|
||||||
|
matrix[i][j] += hold * matrix[k][j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Divide row by pivot **/
|
/** Divide row by pivot **/
|
||||||
for (j = 0; j < 4; j++) {
|
for (j = 0; j < 4; j++) {
|
||||||
if (j != k) matrix[k][j] /= pvt_val;
|
if (j != k)
|
||||||
|
matrix[k][j] /= pvt_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Replace pivot by reciprocal (at last we can touch it). **/
|
/** Replace pivot by reciprocal (at last we can touch it). **/
|
||||||
|
@ -483,12 +467,10 @@ void CameraMatrix::invert() {
|
||||||
}
|
}
|
||||||
|
|
||||||
CameraMatrix::CameraMatrix() {
|
CameraMatrix::CameraMatrix() {
|
||||||
|
|
||||||
set_identity();
|
set_identity();
|
||||||
}
|
}
|
||||||
|
|
||||||
CameraMatrix CameraMatrix::operator*(const CameraMatrix &p_matrix) const {
|
CameraMatrix CameraMatrix::operator*(const CameraMatrix &p_matrix) const {
|
||||||
|
|
||||||
CameraMatrix new_matrix;
|
CameraMatrix new_matrix;
|
||||||
|
|
||||||
for (int j = 0; j < 4; j++) {
|
for (int j = 0; j < 4; j++) {
|
||||||
|
@ -504,7 +486,6 @@ CameraMatrix CameraMatrix::operator*(const CameraMatrix &p_matrix) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraMatrix::set_light_bias() {
|
void CameraMatrix::set_light_bias() {
|
||||||
|
|
||||||
real_t *m = &matrix[0][0];
|
real_t *m = &matrix[0][0];
|
||||||
|
|
||||||
m[0] = 0.5;
|
m[0] = 0.5;
|
||||||
|
@ -526,7 +507,6 @@ void CameraMatrix::set_light_bias() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraMatrix::set_light_atlas_rect(const Rect2 &p_rect) {
|
void CameraMatrix::set_light_atlas_rect(const Rect2 &p_rect) {
|
||||||
|
|
||||||
real_t *m = &matrix[0][0];
|
real_t *m = &matrix[0][0];
|
||||||
|
|
||||||
m[0] = p_rect.size.width;
|
m[0] = p_rect.size.width;
|
||||||
|
@ -548,7 +528,6 @@ void CameraMatrix::set_light_atlas_rect(const Rect2 &p_rect) {
|
||||||
}
|
}
|
||||||
|
|
||||||
CameraMatrix::operator String() const {
|
CameraMatrix::operator String() const {
|
||||||
|
|
||||||
String str;
|
String str;
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
for (int j = 0; j < 4; j++)
|
for (int j = 0; j < 4; j++)
|
||||||
|
@ -558,20 +537,17 @@ CameraMatrix::operator String() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
real_t CameraMatrix::get_aspect() const {
|
real_t CameraMatrix::get_aspect() const {
|
||||||
|
|
||||||
Vector2 vp_he = get_viewport_half_extents();
|
Vector2 vp_he = get_viewport_half_extents();
|
||||||
return vp_he.x / vp_he.y;
|
return vp_he.x / vp_he.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CameraMatrix::get_pixels_per_meter(int p_for_pixel_width) const {
|
int CameraMatrix::get_pixels_per_meter(int p_for_pixel_width) const {
|
||||||
|
|
||||||
Vector3 result = xform(Vector3(1, 0, -1));
|
Vector3 result = xform(Vector3(1, 0, -1));
|
||||||
|
|
||||||
return int((result.x * 0.5 + 0.5) * p_for_pixel_width);
|
return int((result.x * 0.5 + 0.5) * p_for_pixel_width);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CameraMatrix::is_orthogonal() const {
|
bool CameraMatrix::is_orthogonal() const {
|
||||||
|
|
||||||
return matrix[3][3] == 1.0;
|
return matrix[3][3] == 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -599,7 +575,6 @@ real_t CameraMatrix::get_fov() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraMatrix::make_scale(const Vector3 &p_scale) {
|
void CameraMatrix::make_scale(const Vector3 &p_scale) {
|
||||||
|
|
||||||
set_identity();
|
set_identity();
|
||||||
matrix[0][0] = p_scale.x;
|
matrix[0][0] = p_scale.x;
|
||||||
matrix[1][1] = p_scale.y;
|
matrix[1][1] = p_scale.y;
|
||||||
|
@ -607,7 +582,6 @@ void CameraMatrix::make_scale(const Vector3 &p_scale) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraMatrix::scale_translate_to_fit(const AABB &p_aabb) {
|
void CameraMatrix::scale_translate_to_fit(const AABB &p_aabb) {
|
||||||
|
|
||||||
Vector3 min = p_aabb.position;
|
Vector3 min = p_aabb.position;
|
||||||
Vector3 max = p_aabb.position + p_aabb.size;
|
Vector3 max = p_aabb.position + p_aabb.size;
|
||||||
|
|
||||||
|
@ -633,7 +607,6 @@ void CameraMatrix::scale_translate_to_fit(const AABB &p_aabb) {
|
||||||
}
|
}
|
||||||
|
|
||||||
CameraMatrix::operator Transform() const {
|
CameraMatrix::operator Transform() const {
|
||||||
|
|
||||||
Transform tr;
|
Transform tr;
|
||||||
const real_t *m = &matrix[0][0];
|
const real_t *m = &matrix[0][0];
|
||||||
|
|
||||||
|
@ -657,7 +630,6 @@ CameraMatrix::operator Transform() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
CameraMatrix::CameraMatrix(const Transform &p_transform) {
|
CameraMatrix::CameraMatrix(const Transform &p_transform) {
|
||||||
|
|
||||||
const Transform &tr = p_transform;
|
const Transform &tr = p_transform;
|
||||||
real_t *m = &matrix[0][0];
|
real_t *m = &matrix[0][0];
|
||||||
|
|
||||||
|
|
|
@ -13,11 +13,9 @@ namespace godot {
|
||||||
static String _to_hex(float p_val);
|
static String _to_hex(float p_val);
|
||||||
|
|
||||||
static float _parse_col(const String &p_str, int p_ofs) {
|
static float _parse_col(const String &p_str, int p_ofs) {
|
||||||
|
|
||||||
int ig = 0;
|
int ig = 0;
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
|
|
||||||
int c = (int)(wchar_t)p_str[i + p_ofs];
|
int c = (int)(wchar_t)p_str[i + p_ofs];
|
||||||
int v = 0;
|
int v = 0;
|
||||||
|
|
||||||
|
@ -43,7 +41,6 @@ static float _parse_col(const String &p_str, int p_ofs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
c |= (uint8_t)(r * 255);
|
c |= (uint8_t)(r * 255);
|
||||||
|
@ -148,7 +145,6 @@ uint8_t Color::get_a8() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
float max = MAX(r, g);
|
float max = MAX(r, g);
|
||||||
|
@ -334,7 +330,6 @@ Color Color::contrasted() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Color Color::linear_interpolate(const Color &p_b, float p_t) const {
|
Color Color::linear_interpolate(const Color &p_b, float p_t) const {
|
||||||
|
|
||||||
Color res = *this;
|
Color res = *this;
|
||||||
|
|
||||||
res.r += (p_t * (p_b.r - r));
|
res.r += (p_t * (p_b.r - r));
|
||||||
|
@ -346,7 +341,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;
|
||||||
|
@ -361,7 +355,6 @@ Color Color::blend(const Color &p_over) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Color Color::to_linear() const {
|
Color Color::to_linear() const {
|
||||||
|
|
||||||
return Color(
|
return Color(
|
||||||
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),
|
||||||
|
@ -477,13 +470,11 @@ bool Color::html_is_valid(const String &p_color) {
|
||||||
#define CLAMP(m_a, m_min, m_max) (((m_a) < (m_min)) ? (m_min) : (((m_a) > (m_max)) ? m_max : m_a))
|
#define CLAMP(m_a, m_min, m_max) (((m_a) < (m_min)) ? (m_min) : (((m_a) > (m_max)) ? m_max : m_a))
|
||||||
#endif
|
#endif
|
||||||
static String _to_hex(float p_val) {
|
static String _to_hex(float p_val) {
|
||||||
|
|
||||||
int v = p_val * 255;
|
int v = p_val * 255;
|
||||||
v = CLAMP(v, 0, 255);
|
v = CLAMP(v, 0, 255);
|
||||||
String ret;
|
String ret;
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
|
|
||||||
wchar_t c[2] = { 0, 0 };
|
wchar_t c[2] = { 0, 0 };
|
||||||
int lv = v & 0xF;
|
int lv = v & 0xF;
|
||||||
if (lv < 10)
|
if (lv < 10)
|
||||||
|
@ -514,7 +505,6 @@ Color::operator String() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
if (g == p_color.g) {
|
if (g == p_color.g) {
|
||||||
if (b == p_color.b) {
|
if (b == p_color.b) {
|
||||||
|
@ -528,7 +518,6 @@ bool Color::operator<(const Color &p_color) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Color Color::operator+(const Color &p_color) const {
|
Color Color::operator+(const Color &p_color) const {
|
||||||
|
|
||||||
return Color(
|
return Color(
|
||||||
r + p_color.r,
|
r + p_color.r,
|
||||||
g + p_color.g,
|
g + p_color.g,
|
||||||
|
@ -537,7 +526,6 @@ Color Color::operator+(const Color &p_color) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Color::operator+=(const Color &p_color) {
|
void Color::operator+=(const Color &p_color) {
|
||||||
|
|
||||||
r = r + p_color.r;
|
r = r + p_color.r;
|
||||||
g = g + p_color.g;
|
g = g + p_color.g;
|
||||||
b = b + p_color.b;
|
b = b + p_color.b;
|
||||||
|
@ -545,7 +533,6 @@ void Color::operator+=(const Color &p_color) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Color Color::operator-(const Color &p_color) const {
|
Color Color::operator-(const Color &p_color) const {
|
||||||
|
|
||||||
return Color(
|
return Color(
|
||||||
r - p_color.r,
|
r - p_color.r,
|
||||||
g - p_color.g,
|
g - p_color.g,
|
||||||
|
@ -554,7 +541,6 @@ Color Color::operator-(const Color &p_color) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Color::operator-=(const Color &p_color) {
|
void Color::operator-=(const Color &p_color) {
|
||||||
|
|
||||||
r = r - p_color.r;
|
r = r - p_color.r;
|
||||||
g = g - p_color.g;
|
g = g - p_color.g;
|
||||||
b = b - p_color.b;
|
b = b - p_color.b;
|
||||||
|
@ -562,7 +548,6 @@ void Color::operator-=(const Color &p_color) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Color Color::operator*(const Color &p_color) const {
|
Color Color::operator*(const Color &p_color) const {
|
||||||
|
|
||||||
return Color(
|
return Color(
|
||||||
r * p_color.r,
|
r * p_color.r,
|
||||||
g * p_color.g,
|
g * p_color.g,
|
||||||
|
@ -571,7 +556,6 @@ Color Color::operator*(const Color &p_color) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Color Color::operator*(const real_t &rvalue) const {
|
Color Color::operator*(const real_t &rvalue) const {
|
||||||
|
|
||||||
return Color(
|
return Color(
|
||||||
r * rvalue,
|
r * rvalue,
|
||||||
g * rvalue,
|
g * rvalue,
|
||||||
|
@ -580,7 +564,6 @@ Color Color::operator*(const real_t &rvalue) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Color::operator*=(const Color &p_color) {
|
void Color::operator*=(const Color &p_color) {
|
||||||
|
|
||||||
r = r * p_color.r;
|
r = r * p_color.r;
|
||||||
g = g * p_color.g;
|
g = g * p_color.g;
|
||||||
b = b * p_color.b;
|
b = b * p_color.b;
|
||||||
|
@ -588,7 +571,6 @@ void Color::operator*=(const Color &p_color) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Color::operator*=(const real_t &rvalue) {
|
void Color::operator*=(const real_t &rvalue) {
|
||||||
|
|
||||||
r = r * rvalue;
|
r = r * rvalue;
|
||||||
g = g * rvalue;
|
g = g * rvalue;
|
||||||
b = b * rvalue;
|
b = b * rvalue;
|
||||||
|
@ -596,7 +578,6 @@ void Color::operator*=(const real_t &rvalue) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Color Color::operator/(const Color &p_color) const {
|
Color Color::operator/(const Color &p_color) const {
|
||||||
|
|
||||||
return Color(
|
return Color(
|
||||||
r / p_color.r,
|
r / p_color.r,
|
||||||
g / p_color.g,
|
g / p_color.g,
|
||||||
|
@ -605,7 +586,6 @@ Color Color::operator/(const Color &p_color) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Color Color::operator/(const real_t &rvalue) const {
|
Color Color::operator/(const real_t &rvalue) const {
|
||||||
|
|
||||||
return Color(
|
return Color(
|
||||||
r / rvalue,
|
r / rvalue,
|
||||||
g / rvalue,
|
g / rvalue,
|
||||||
|
@ -614,7 +594,6 @@ Color Color::operator/(const real_t &rvalue) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Color::operator/=(const Color &p_color) {
|
void Color::operator/=(const Color &p_color) {
|
||||||
|
|
||||||
r = r / p_color.r;
|
r = r / p_color.r;
|
||||||
g = g / p_color.g;
|
g = g / p_color.g;
|
||||||
b = b / p_color.b;
|
b = b / p_color.b;
|
||||||
|
@ -622,7 +601,6 @@ void Color::operator/=(const Color &p_color) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Color::operator/=(const real_t &rvalue) {
|
void Color::operator/=(const real_t &rvalue) {
|
||||||
|
|
||||||
if (rvalue == 0) {
|
if (rvalue == 0) {
|
||||||
r = 1.0;
|
r = 1.0;
|
||||||
g = 1.0;
|
g = 1.0;
|
||||||
|
@ -637,7 +615,6 @@ void Color::operator/=(const real_t &rvalue) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Color Color::operator-() const {
|
Color Color::operator-() const {
|
||||||
|
|
||||||
return Color(
|
return Color(
|
||||||
1.0 - r,
|
1.0 - r,
|
||||||
1.0 - g,
|
1.0 - g,
|
||||||
|
|
|
@ -55,9 +55,12 @@ void Godot::print_warning(const String &description, const String &function, con
|
||||||
godot::api->godot_print_warning(c_desc, c_func, c_file, line);
|
godot::api->godot_print_warning(c_desc, c_func, c_file, line);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (c_desc != nullptr) godot::api->godot_free(c_desc);
|
if (c_desc != nullptr)
|
||||||
if (c_func != nullptr) godot::api->godot_free(c_func);
|
godot::api->godot_free(c_desc);
|
||||||
if (c_file != nullptr) godot::api->godot_free(c_file);
|
if (c_func != nullptr)
|
||||||
|
godot::api->godot_free(c_func);
|
||||||
|
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) {
|
||||||
|
@ -71,9 +74,12 @@ void Godot::print_error(const String &description, const String &function, const
|
||||||
godot::api->godot_print_error(c_desc, c_func, c_file, line);
|
godot::api->godot_print_error(c_desc, c_func, c_file, line);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (c_desc != nullptr) godot::api->godot_free(c_desc);
|
if (c_desc != nullptr)
|
||||||
if (c_func != nullptr) godot::api->godot_free(c_func);
|
godot::api->godot_free(c_desc);
|
||||||
if (c_file != nullptr) godot::api->godot_free(c_file);
|
if (c_func != nullptr)
|
||||||
|
godot::api->godot_free(c_func);
|
||||||
|
if (c_file != nullptr)
|
||||||
|
godot::api->godot_free(c_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ___register_types();
|
void ___register_types();
|
||||||
|
@ -136,7 +142,8 @@ void Godot::gdnative_init(godot_gdnative_init_options *options) {
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
default: break;
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,12 +10,10 @@ void Plane::set_normal(const Vector3 &p_normal) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 Plane::project(const Vector3 &p_point) const {
|
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();
|
||||||
if (l == 0) {
|
if (l == 0) {
|
||||||
*this = Plane(0, 0, 0, 0);
|
*this = Plane(0, 0, 0, 0);
|
||||||
|
@ -26,19 +24,16 @@ void Plane::normalize() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Plane Plane::normalized() const {
|
Plane Plane::normalized() const {
|
||||||
|
|
||||||
Plane p = *this;
|
Plane p = *this;
|
||||||
p.normalize();
|
p.normalize();
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 Plane::get_any_point() const {
|
Vector3 Plane::get_any_point() const {
|
||||||
|
|
||||||
return get_normal() * d;
|
return get_normal() * d;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 Plane::get_any_perpendicular_normal() const {
|
Vector3 Plane::get_any_perpendicular_normal() const {
|
||||||
|
|
||||||
static const Vector3 p1 = Vector3(1, 0, 0);
|
static const Vector3 p1 = Vector3(1, 0, 0);
|
||||||
static const Vector3 p2 = Vector3(0, 1, 0);
|
static const Vector3 p2 = Vector3(0, 1, 0);
|
||||||
Vector3 p;
|
Vector3 p;
|
||||||
|
@ -57,7 +52,6 @@ Vector3 Plane::get_any_perpendicular_normal() const {
|
||||||
/* 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 {
|
||||||
|
|
||||||
const Plane &p_plane0 = *this;
|
const Plane &p_plane0 = *this;
|
||||||
Vector3 normal0 = p_plane0.normal;
|
Vector3 normal0 = p_plane0.normal;
|
||||||
Vector3 normal1 = p_plane1.normal;
|
Vector3 normal1 = p_plane1.normal;
|
||||||
|
@ -79,13 +73,11 @@ bool Plane::intersect_3(const Plane &p_plane1, const Plane &p_plane2, Vector3 *r
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
real_t den = normal.dot(segment);
|
real_t den = normal.dot(segment);
|
||||||
|
|
||||||
//printf("den is %i\n",den);
|
//printf("den is %i\n",den);
|
||||||
if (::fabs(den) <= CMP_EPSILON) {
|
if (::fabs(den) <= CMP_EPSILON) {
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,13 +96,11 @@ bool Plane::intersects_ray(Vector3 p_from, Vector3 p_dir, Vector3 *p_intersectio
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Plane::intersects_segment(Vector3 p_begin, Vector3 p_end, Vector3 *p_intersection) const {
|
bool Plane::intersects_segment(Vector3 p_begin, Vector3 p_end, Vector3 *p_intersection) const {
|
||||||
|
|
||||||
Vector3 segment = p_begin - p_end;
|
Vector3 segment = p_begin - p_end;
|
||||||
real_t den = normal.dot(segment);
|
real_t den = normal.dot(segment);
|
||||||
|
|
||||||
//printf("den is %i\n",den);
|
//printf("den is %i\n",den);
|
||||||
if (::fabs(den) <= CMP_EPSILON) {
|
if (::fabs(den) <= CMP_EPSILON) {
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,7 +108,6 @@ bool Plane::intersects_segment(Vector3 p_begin, Vector3 p_end, Vector3 *p_inters
|
||||||
//printf("dist is %i\n",dist);
|
//printf("dist is %i\n",dist);
|
||||||
|
|
||||||
if (dist < -CMP_EPSILON || dist > (1.0 + CMP_EPSILON)) {
|
if (dist < -CMP_EPSILON || dist > (1.0 + CMP_EPSILON)) {
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,47 +120,39 @@ bool Plane::intersects_segment(Vector3 p_begin, Vector3 p_end, Vector3 *p_inters
|
||||||
/* misc */
|
/* misc */
|
||||||
|
|
||||||
bool Plane::is_almost_like(const Plane &p_plane) const {
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
real_t Plane::distance_to(const Vector3 &p_point) const {
|
real_t Plane::distance_to(const Vector3 &p_point) const {
|
||||||
|
|
||||||
return (normal.dot(p_point) - d);
|
return (normal.dot(p_point) - d);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Plane::has_point(const Vector3 &p_point, real_t _epsilon) const {
|
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) {
|
||||||
|
|
||||||
normal = p_normal;
|
normal = p_normal;
|
||||||
d = p_d;
|
d = p_d;
|
||||||
}
|
}
|
||||||
|
|
||||||
Plane::Plane(const Vector3 &p_point, const Vector3 &p_normal) {
|
Plane::Plane(const Vector3 &p_point, const Vector3 &p_normal) {
|
||||||
|
|
||||||
normal = p_normal;
|
normal = p_normal;
|
||||||
d = p_normal.dot(p_point);
|
d = p_normal.dot(p_point);
|
||||||
}
|
}
|
||||||
|
|
||||||
Plane::Plane(const Vector3 &p_point1, const Vector3 &p_point2, const Vector3 &p_point3, ClockDirection p_dir) {
|
Plane::Plane(const Vector3 &p_point1, const Vector3 &p_point2, const Vector3 &p_point3, ClockDirection p_dir) {
|
||||||
|
|
||||||
if (p_dir == CLOCKWISE)
|
if (p_dir == CLOCKWISE)
|
||||||
normal = (p_point1 - p_point3).cross(p_point1 - p_point2);
|
normal = (p_point1 - p_point3).cross(p_point1 - p_point2);
|
||||||
else
|
else
|
||||||
|
@ -182,12 +163,10 @@ Plane::Plane(const Vector3 &p_point1, const Vector3 &p_point2, const Vector3 &p_
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -100,7 +100,6 @@ Quat Quat::inverse() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Quat Quat::slerp(const Quat &q, const real_t &t) const {
|
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;
|
||||||
|
|
||||||
|
@ -144,12 +143,12 @@ Quat Quat::slerp(const Quat &q, const real_t &t) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Quat Quat::slerpni(const Quat &q, const real_t &t) const {
|
Quat Quat::slerpni(const Quat &q, const real_t &t) const {
|
||||||
|
|
||||||
const Quat &from = *this;
|
const Quat &from = *this;
|
||||||
|
|
||||||
real_t dot = from.dot(q);
|
real_t dot = from.dot(q);
|
||||||
|
|
||||||
if (::fabs(dot) > 0.9999) return from;
|
if (::fabs(dot) > 0.9999)
|
||||||
|
return from;
|
||||||
|
|
||||||
real_t theta = ::acos(dot),
|
real_t theta = ::acos(dot),
|
||||||
sinT = 1.0 / ::sin(theta),
|
sinT = 1.0 / ::sin(theta),
|
||||||
|
@ -200,7 +199,6 @@ Quat Quat::operator*(const Vector3 &v) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 Quat::xform(const Vector3 &v) const {
|
Vector3 Quat::xform(const Vector3 &v) const {
|
||||||
|
|
||||||
Quat q = *this * v;
|
Quat q = *this * v;
|
||||||
q *= this->inverse();
|
q *= this->inverse();
|
||||||
return Vector3(q.x, q.y, q.z);
|
return Vector3(q.x, q.y, q.z);
|
||||||
|
@ -234,7 +232,6 @@ Quat::Quat(const Vector3 &v0, const Vector3 &v1) // shortest arc
|
||||||
z = 0;
|
z = 0;
|
||||||
w = 0;
|
w = 0;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
real_t s = ::sqrt((1.0 + d) * 2.0);
|
real_t s = ::sqrt((1.0 + d) * 2.0);
|
||||||
real_t rs = 1.0 / s;
|
real_t rs = 1.0 / s;
|
||||||
|
|
||||||
|
@ -282,7 +279,6 @@ void Quat::operator*=(const real_t &s) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Quat::operator/=(const real_t &s) {
|
void Quat::operator/=(const real_t &s) {
|
||||||
|
|
||||||
*this *= 1.0 / s;
|
*this *= 1.0 / s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,6 @@ namespace godot {
|
||||||
#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 < position.x) {
|
if (p_point.x < position.x) {
|
||||||
|
@ -77,7 +76,6 @@ Rect2::operator String() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
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_position, Point2 *r_normal) const {
|
||||||
|
|
||||||
real_t min = 0, max = 1;
|
real_t min = 0, max = 1;
|
||||||
int axis = 0;
|
int axis = 0;
|
||||||
real_t sign = 0;
|
real_t sign = 0;
|
||||||
|
@ -91,7 +89,6 @@ bool Rect2::intersects_segment(const Point2 &p_from, const Point2 &p_to, Point2
|
||||||
real_t csign;
|
real_t csign;
|
||||||
|
|
||||||
if (seg_from < seg_to) {
|
if (seg_from < seg_to) {
|
||||||
|
|
||||||
if (seg_from > box_end || seg_to < box_begin)
|
if (seg_from > box_end || seg_to < box_begin)
|
||||||
return false;
|
return false;
|
||||||
real_t length = seg_to - seg_from;
|
real_t length = seg_to - seg_from;
|
||||||
|
@ -100,7 +97,6 @@ bool Rect2::intersects_segment(const Point2 &p_from, const Point2 &p_to, Point2
|
||||||
csign = -1.0;
|
csign = -1.0;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (seg_to > box_end || seg_from < box_begin)
|
if (seg_to > box_end || seg_from < box_begin)
|
||||||
return false;
|
return false;
|
||||||
real_t length = seg_to - seg_from;
|
real_t length = seg_to - seg_from;
|
||||||
|
@ -135,7 +131,6 @@ bool Rect2::intersects_segment(const Point2 &p_from, const Point2 &p_to, Point2
|
||||||
}
|
}
|
||||||
|
|
||||||
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] = {
|
||||||
|
|
|
@ -141,7 +141,6 @@ const wchar_t *String::unicode_str() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
char *String::alloc_c_string() const {
|
char *String::alloc_c_string() const {
|
||||||
|
|
||||||
godot_char_string contents = godot::api->godot_string_utf8(&_godot_string);
|
godot_char_string contents = godot::api->godot_string_utf8(&_godot_string);
|
||||||
|
|
||||||
int length = godot::api->godot_char_string_length(&contents);
|
int length = godot::api->godot_char_string_length(&contents);
|
||||||
|
@ -166,7 +165,6 @@ CharString String::utf8() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
CharString String::ascii(bool p_extended) const {
|
CharString String::ascii(bool p_extended) const {
|
||||||
|
|
||||||
CharString ret;
|
CharString ret;
|
||||||
|
|
||||||
if (p_extended)
|
if (p_extended)
|
||||||
|
|
|
@ -22,14 +22,12 @@ 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) {
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
|
|
|
@ -15,14 +15,12 @@ const Transform Transform::FLIP_Y = Transform(1, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0,
|
||||||
const Transform Transform::FLIP_Z = Transform(1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0);
|
const Transform Transform::FLIP_Z = Transform(1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0);
|
||||||
|
|
||||||
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;
|
||||||
return Transform(basis.transpose_xform(t.basis),
|
return Transform(basis.transpose_xform(t.basis),
|
||||||
basis.xform(v));
|
basis.xform(v));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Transform::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, real_t tx, real_t ty, real_t tz) {
|
void Transform::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, real_t tx, real_t ty, real_t tz) {
|
||||||
|
|
||||||
basis.elements[0][0] = xx;
|
basis.elements[0][0] = xx;
|
||||||
basis.elements[0][1] = xy;
|
basis.elements[0][1] = xy;
|
||||||
basis.elements[0][2] = xz;
|
basis.elements[0][2] = xz;
|
||||||
|
@ -38,14 +36,12 @@ void Transform::set(real_t xx, real_t xy, real_t xz, real_t yx, real_t yy, real_
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 Transform::xform(const Vector3 &p_vector) const {
|
Vector3 Transform::xform(const Vector3 &p_vector) const {
|
||||||
|
|
||||||
return Vector3(
|
return Vector3(
|
||||||
basis.elements[0].dot(p_vector) + origin.x,
|
basis.elements[0].dot(p_vector) + origin.x,
|
||||||
basis.elements[1].dot(p_vector) + origin.y,
|
basis.elements[1].dot(p_vector) + origin.y,
|
||||||
basis.elements[2].dot(p_vector) + origin.z);
|
basis.elements[2].dot(p_vector) + origin.z);
|
||||||
}
|
}
|
||||||
Vector3 Transform::xform_inv(const Vector3 &p_vector) const {
|
Vector3 Transform::xform_inv(const Vector3 &p_vector) const {
|
||||||
|
|
||||||
Vector3 v = p_vector - origin;
|
Vector3 v = p_vector - origin;
|
||||||
|
|
||||||
return Vector3(
|
return Vector3(
|
||||||
|
@ -55,7 +51,6 @@ Vector3 Transform::xform_inv(const Vector3 &p_vector) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
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,7 +63,6 @@ Plane Transform::xform(const Plane &p_plane) const {
|
||||||
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;
|
||||||
point = xform_inv(point);
|
point = xform_inv(point);
|
||||||
|
@ -100,7 +94,6 @@ AABB Transform::xform(const AABB &p_aabb) const {
|
||||||
return new_aabb;
|
return new_aabb;
|
||||||
}
|
}
|
||||||
AABB Transform::xform_inv(const AABB &p_aabb) const {
|
AABB Transform::xform_inv(const AABB &p_aabb) const {
|
||||||
|
|
||||||
/* define vertices */
|
/* define vertices */
|
||||||
Vector3 vertices[8] = {
|
Vector3 vertices[8] = {
|
||||||
Vector3(p_aabb.position.x + p_aabb.size.x, p_aabb.position.y + p_aabb.size.y, p_aabb.position.z + p_aabb.size.z),
|
Vector3(p_aabb.position.x + p_aabb.size.x, p_aabb.position.y + p_aabb.size.y, p_aabb.position.z + p_aabb.size.z),
|
||||||
|
@ -118,7 +111,6 @@ AABB Transform::xform_inv(const AABB &p_aabb) const {
|
||||||
ret.position = xform_inv(vertices[0]);
|
ret.position = xform_inv(vertices[0]);
|
||||||
|
|
||||||
for (int i = 1; i < 8; i++) {
|
for (int i = 1; i < 8; i++) {
|
||||||
|
|
||||||
ret.expand_to(xform_inv(vertices[i]));
|
ret.expand_to(xform_inv(vertices[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,20 +118,17 @@ AABB Transform::xform_inv(const AABB &p_aabb) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Transform::affine_invert() {
|
void Transform::affine_invert() {
|
||||||
|
|
||||||
basis.invert();
|
basis.invert();
|
||||||
origin = basis.xform(-origin);
|
origin = basis.xform(-origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform Transform::affine_inverse() const {
|
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();
|
||||||
origin = basis.xform(-origin);
|
origin = basis.xform(-origin);
|
||||||
}
|
}
|
||||||
|
@ -153,29 +142,24 @@ Transform Transform::inverse() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform Transform::rotated(const Vector3 &p_axis, real_t p_phi) const {
|
Transform Transform::rotated(const Vector3 &p_axis, real_t p_phi) const {
|
||||||
|
|
||||||
return Transform(Basis(p_axis, p_phi), Vector3()) * (*this);
|
return Transform(Basis(p_axis, p_phi), Vector3()) * (*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Transform::rotate_basis(const Vector3 &p_axis, real_t p_phi) {
|
void Transform::rotate_basis(const Vector3 &p_axis, real_t p_phi) {
|
||||||
|
|
||||||
basis.rotate(p_axis, p_phi);
|
basis.rotate(p_axis, p_phi);
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform Transform::looking_at(const Vector3 &p_target, const Vector3 &p_up) const {
|
Transform Transform::looking_at(const Vector3 &p_target, const Vector3 &p_up) const {
|
||||||
|
|
||||||
Transform t = *this;
|
Transform t = *this;
|
||||||
t.set_look_at(origin, p_target, p_up);
|
t.set_look_at(origin, p_target, p_up);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Transform::set_look_at(const Vector3 &p_eye, const Vector3 &p_target, const Vector3 &p_up) {
|
void Transform::set_look_at(const Vector3 &p_eye, const Vector3 &p_target, const Vector3 &p_up) {
|
||||||
|
|
||||||
// Reference: MESA source code
|
// Reference: MESA source code
|
||||||
Vector3 v_x, v_y, v_z;
|
Vector3 v_x, v_y, v_z;
|
||||||
|
|
||||||
|
@ -203,7 +187,6 @@ void Transform::set_look_at(const Vector3 &p_eye, const Vector3 &p_target, const
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
||||||
|
|
||||||
/* not sure if very "efficient" but good enough? */
|
/* not sure if very "efficient" but good enough? */
|
||||||
|
|
||||||
Vector3 src_scale = basis.get_scale();
|
Vector3 src_scale = basis.get_scale();
|
||||||
|
@ -223,20 +206,17 @@ Transform Transform::interpolate_with(const Transform &p_transform, real_t p_c)
|
||||||
}
|
}
|
||||||
|
|
||||||
void Transform::scale(const Vector3 &p_scale) {
|
void Transform::scale(const Vector3 &p_scale) {
|
||||||
|
|
||||||
basis.scale(p_scale);
|
basis.scale(p_scale);
|
||||||
origin *= p_scale;
|
origin *= p_scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform Transform::scaled(const Vector3 &p_scale) const {
|
Transform Transform::scaled(const Vector3 &p_scale) const {
|
||||||
|
|
||||||
Transform t = *this;
|
Transform t = *this;
|
||||||
t.scale(p_scale);
|
t.scale(p_scale);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Transform::scale_basis(const Vector3 &p_scale) {
|
void Transform::scale_basis(const Vector3 &p_scale) {
|
||||||
|
|
||||||
basis.scale(p_scale);
|
basis.scale(p_scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -244,60 +224,50 @@ 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) {
|
||||||
|
|
||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
origin[i] += basis.elements[i].dot(p_translation);
|
origin[i] += basis.elements[i].dot(p_translation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform Transform::translated(const Vector3 &p_translation) const {
|
Transform Transform::translated(const Vector3 &p_translation) const {
|
||||||
|
|
||||||
Transform t = *this;
|
Transform t = *this;
|
||||||
t.translate(p_translation);
|
t.translate(p_translation);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Transform::orthonormalize() {
|
void Transform::orthonormalize() {
|
||||||
|
|
||||||
basis.orthonormalize();
|
basis.orthonormalize();
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform Transform::orthonormalized() const {
|
Transform Transform::orthonormalized() const {
|
||||||
|
|
||||||
Transform _copy = *this;
|
Transform _copy = *this;
|
||||||
_copy.orthonormalize();
|
_copy.orthonormalize();
|
||||||
return _copy;
|
return _copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Transform::operator==(const Transform &p_transform) const {
|
bool Transform::operator==(const Transform &p_transform) const {
|
||||||
|
|
||||||
return (basis == p_transform.basis && origin == p_transform.origin);
|
return (basis == p_transform.basis && origin == p_transform.origin);
|
||||||
}
|
}
|
||||||
bool Transform::operator!=(const Transform &p_transform) const {
|
bool Transform::operator!=(const Transform &p_transform) const {
|
||||||
|
|
||||||
return (basis != p_transform.basis || origin != p_transform.origin);
|
return (basis != p_transform.basis || origin != p_transform.origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Transform::operator*=(const Transform &p_transform) {
|
void Transform::operator*=(const Transform &p_transform) {
|
||||||
|
|
||||||
origin = xform(p_transform.origin);
|
origin = xform(p_transform.origin);
|
||||||
basis *= p_transform.basis;
|
basis *= p_transform.basis;
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform Transform::operator*(const Transform &p_transform) const {
|
Transform Transform::operator*(const Transform &p_transform) const {
|
||||||
|
|
||||||
Transform t = *this;
|
Transform t = *this;
|
||||||
t *= p_transform;
|
t *= p_transform;
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform::operator String() const {
|
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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@ const Transform2D Transform2D::FLIP_X = Transform2D(-1, 0, 0, 1, 0, 0);
|
||||||
const Transform2D Transform2D::FLIP_Y = Transform2D(1, 0, 0, -1, 0, 0);
|
const Transform2D Transform2D::FLIP_Y = Transform2D(1, 0, 0, -1, 0, 0);
|
||||||
|
|
||||||
Transform2D::Transform2D(real_t xx, real_t xy, real_t yx, real_t yy, real_t ox, real_t oy) {
|
Transform2D::Transform2D(real_t xx, real_t xy, real_t yx, real_t yy, real_t ox, real_t oy) {
|
||||||
|
|
||||||
elements[0][0] = xx;
|
elements[0][0] = xx;
|
||||||
elements[0][1] = xy;
|
elements[0][1] = xy;
|
||||||
elements[1][0] = yx;
|
elements[1][0] = yx;
|
||||||
|
@ -22,28 +21,24 @@ Transform2D::Transform2D(real_t xx, real_t xy, real_t yx, real_t yy, real_t ox,
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
||||||
|
|
||||||
Vector2 v = p_vec - elements[2];
|
Vector2 v = p_vec - elements[2];
|
||||||
|
|
||||||
return Vector2(
|
return Vector2(
|
||||||
|
@ -51,7 +46,6 @@ Vector2 Transform2D::xform_inv(const Vector2 &p_vec) const {
|
||||||
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 position = xform(p_rect.position);
|
Vector2 position = xform(p_rect.position);
|
||||||
|
@ -65,7 +59,6 @@ Rect2 Transform2D::xform(const Rect2 &p_rect) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Transform2D::set_rotation_and_scale(real_t p_rot, const Size2 &p_scale) {
|
void Transform2D::set_rotation_and_scale(real_t p_rot, const Size2 &p_scale) {
|
||||||
|
|
||||||
elements[0][0] = ::cos(p_rot) * p_scale.x;
|
elements[0][0] = ::cos(p_rot) * p_scale.x;
|
||||||
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;
|
||||||
|
@ -73,7 +66,6 @@ void Transform2D::set_rotation_and_scale(real_t p_rot, const Size2 &p_scale) {
|
||||||
}
|
}
|
||||||
|
|
||||||
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.position),
|
xform_inv(p_rect.position),
|
||||||
xform_inv(Vector2(p_rect.position.x, p_rect.position.y + p_rect.size.y)),
|
xform_inv(Vector2(p_rect.position.x, p_rect.position.y + p_rect.size.y)),
|
||||||
|
@ -98,14 +90,12 @@ void Transform2D::invert() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform2D Transform2D::inverse() const {
|
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() {
|
||||||
|
|
||||||
real_t det = basis_determinant();
|
real_t det = basis_determinant();
|
||||||
ERR_FAIL_COND(det == 0);
|
ERR_FAIL_COND(det == 0);
|
||||||
real_t idet = 1.0 / det;
|
real_t idet = 1.0 / det;
|
||||||
|
@ -118,7 +108,6 @@ void Transform2D::affine_invert() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform2D Transform2D::affine_inverse() const {
|
Transform2D Transform2D::affine_inverse() const {
|
||||||
|
|
||||||
Transform2D inv = *this;
|
Transform2D inv = *this;
|
||||||
inv.affine_invert();
|
inv.affine_invert();
|
||||||
return inv;
|
return inv;
|
||||||
|
@ -138,7 +127,6 @@ real_t Transform2D::get_rotation() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Transform2D::set_rotation(real_t p_rot) {
|
void Transform2D::set_rotation(real_t p_rot) {
|
||||||
|
|
||||||
real_t cr = ::cos(p_rot);
|
real_t cr = ::cos(p_rot);
|
||||||
real_t sr = ::sin(p_rot);
|
real_t sr = ::sin(p_rot);
|
||||||
elements[0][0] = cr;
|
elements[0][0] = cr;
|
||||||
|
@ -148,7 +136,6 @@ void Transform2D::set_rotation(real_t p_rot) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform2D::Transform2D(real_t p_rot, const Vector2 &p_position) {
|
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);
|
||||||
elements[0][0] = cr;
|
elements[0][0] = cr;
|
||||||
|
@ -168,23 +155,19 @@ void Transform2D::scale(const Size2 &p_scale) {
|
||||||
elements[2] *= p_scale;
|
elements[2] *= p_scale;
|
||||||
}
|
}
|
||||||
void Transform2D::scale_basis(const Size2 &p_scale) {
|
void Transform2D::scale_basis(const Size2 &p_scale) {
|
||||||
|
|
||||||
elements[0][0] *= p_scale.x;
|
elements[0][0] *= p_scale.x;
|
||||||
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) {
|
||||||
|
|
||||||
translate(Vector2(p_tx, p_ty));
|
translate(Vector2(p_tx, p_ty));
|
||||||
}
|
}
|
||||||
void Transform2D::translate(const Vector2 &p_translation) {
|
void Transform2D::translate(const Vector2 &p_translation) {
|
||||||
|
|
||||||
elements[2] += basis_xform(p_translation);
|
elements[2] += basis_xform(p_translation);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Transform2D::orthonormalize() {
|
void Transform2D::orthonormalize() {
|
||||||
|
|
||||||
// Gram-Schmidt Process
|
// Gram-Schmidt Process
|
||||||
|
|
||||||
Vector2 x = elements[0];
|
Vector2 x = elements[0];
|
||||||
|
@ -198,14 +181,12 @@ void Transform2D::orthonormalize() {
|
||||||
elements[1] = y;
|
elements[1] = y;
|
||||||
}
|
}
|
||||||
Transform2D Transform2D::orthonormalized() const {
|
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 {
|
||||||
|
|
||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
if (elements[i] != p_transform.elements[i])
|
if (elements[i] != p_transform.elements[i])
|
||||||
return false;
|
return false;
|
||||||
|
@ -215,7 +196,6 @@ bool Transform2D::operator==(const Transform2D &p_transform) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Transform2D::operator!=(const Transform2D &p_transform) const {
|
bool Transform2D::operator!=(const Transform2D &p_transform) const {
|
||||||
|
|
||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
if (elements[i] != p_transform.elements[i])
|
if (elements[i] != p_transform.elements[i])
|
||||||
return true;
|
return true;
|
||||||
|
@ -225,7 +205,6 @@ bool Transform2D::operator!=(const Transform2D &p_transform) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Transform2D::operator*=(const Transform2D &p_transform) {
|
void Transform2D::operator*=(const Transform2D &p_transform) {
|
||||||
|
|
||||||
elements[2] = xform(p_transform.elements[2]);
|
elements[2] = xform(p_transform.elements[2]);
|
||||||
|
|
||||||
real_t x0, x1, y0, y1;
|
real_t x0, x1, y0, y1;
|
||||||
|
@ -242,54 +221,46 @@ void Transform2D::operator*=(const Transform2D &p_transform) {
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
||||||
|
|
||||||
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 {
|
||||||
|
|
||||||
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 {
|
||||||
|
|
||||||
Transform2D copy = *this;
|
Transform2D copy = *this;
|
||||||
copy.elements[2] = Vector2();
|
copy.elements[2] = Vector2();
|
||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform2D Transform2D::translated(const Vector2 &p_offset) const {
|
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 {
|
||||||
|
|
||||||
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 {
|
||||||
|
|
||||||
return elements[0].x * elements[1].y - elements[0].y * elements[1].x;
|
return elements[0].x * elements[1].y - elements[0].y * elements[1].x;
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform2D Transform2D::interpolate_with(const Transform2D &p_transform, real_t p_c) const {
|
Transform2D Transform2D::interpolate_with(const Transform2D &p_transform, real_t p_c) const {
|
||||||
|
|
||||||
//extract parameters
|
//extract parameters
|
||||||
Vector2 p1 = get_origin();
|
Vector2 p1 = get_origin();
|
||||||
Vector2 p2 = p_transform.get_origin();
|
Vector2 p2 = p_transform.get_origin();
|
||||||
|
@ -325,7 +296,6 @@ Transform2D Transform2D::interpolate_with(const Transform2D &p_transform, real_t
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform2D::operator String() const {
|
Transform2D::operator String() const {
|
||||||
|
|
||||||
return String(String() + elements[0] + ", " + elements[1] + ", " + elements[2]);
|
return String(String() + elements[0] + ", " + elements[1] + ", " + elements[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue