Merge pull request #58234 from akien-mga/3.4-cherrypicks
This commit is contained in:
commit
0ea54d07f2
@ -66,8 +66,10 @@ understand that:
|
||||
|
||||
To speed up our work, **please upload a minimal project** that isolates
|
||||
and reproduces the issue. This is always the **best way for us to fix it**.
|
||||
You can attach a ZIP file with the minimal project directly to the bug report,
|
||||
by drag and dropping the file in the GitHub edition field.
|
||||
We recommend attaching a ZIP file with the minimal project directly to the bug report,
|
||||
by drag and dropping the file in the GitHub edition field. This ensures the file
|
||||
can remain available for a long period of time. Only use third-party file hosts
|
||||
if your ZIP file isn't accepted by GitHub because it's too large.
|
||||
|
||||
We recommend always attaching a minimal reproduction project, even if the issue
|
||||
may seem simple to reproduce manually.
|
||||
@ -79,7 +81,7 @@ it'll be considered too difficult to diagnose.
|
||||
Now that you've read the guidelines, click the link below to create a
|
||||
bug report:
|
||||
|
||||
- **[Report a bug](https://github.com/godotengine/godot/issues/new?assignees=&labels=&template=bug_report.md&title=)**
|
||||
- **[Report a bug](https://github.com/godotengine/godot/issues/new?assignees=&labels=&template=bug_report.yml)**
|
||||
|
||||
## Proposing features or improvements
|
||||
|
||||
|
14
SConstruct
14
SConstruct
@ -132,8 +132,9 @@ opts.Add(BoolVariable("custom_modules_recursive", "Detect custom modules recursi
|
||||
|
||||
# Advanced options
|
||||
opts.Add(BoolVariable("dev", "If yes, alias for verbose=yes warnings=extra werror=yes", False))
|
||||
opts.Add(BoolVariable("progress", "Show a progress indicator during compilation", True))
|
||||
opts.Add(BoolVariable("fast_unsafe", "Enable unsafe options for faster rebuilds", False))
|
||||
opts.Add(BoolVariable("verbose", "Enable verbose output for the compilation", False))
|
||||
opts.Add(BoolVariable("progress", "Show a progress indicator during compilation", True))
|
||||
opts.Add(EnumVariable("warnings", "Level of compilation warnings", "all", ("extra", "all", "moderate", "no")))
|
||||
opts.Add(BoolVariable("werror", "Treat compiler warnings as errors", False))
|
||||
opts.Add("extra_suffix", "Custom extra suffix added to the base filename of all generated binary files", "")
|
||||
@ -308,6 +309,17 @@ if env_base["target"] == "debug":
|
||||
# working on the engine itself.
|
||||
env_base.Append(CPPDEFINES=["DEV_ENABLED"])
|
||||
|
||||
# SCons speed optimization controlled by the `fast_unsafe` option, which provide
|
||||
# more than 10 s speed up for incremental rebuilds.
|
||||
# Unsafe as they reduce the certainty of rebuilding all changed files, so it's
|
||||
# enabled by default for `debug` builds, and can be overridden from command line.
|
||||
# Ref: https://github.com/SCons/scons/wiki/GoFastButton
|
||||
if methods.get_cmdline_bool("fast_unsafe", env_base["target"] == "debug"):
|
||||
# Renamed to `content-timestamp` in SCons >= 4.2, keeping MD5 for compat.
|
||||
env_base.Decider("MD5-timestamp")
|
||||
env_base.SetOption("implicit_cache", 1)
|
||||
env_base.SetOption("max_drift", 60)
|
||||
|
||||
if env_base["use_precise_math_checks"]:
|
||||
env_base.Append(CPPDEFINES=["PRECISE_MATH_CHECKS"])
|
||||
|
||||
|
@ -107,3 +107,7 @@ void _err_print_index_error(const char *p_function, const char *p_file, int p_li
|
||||
void _err_print_index_error(const char *p_function, const char *p_file, int p_line, int64_t p_index, int64_t p_size, const char *p_index_str, const char *p_size_str, const String &p_message, bool fatal) {
|
||||
_err_print_index_error(p_function, p_file, p_line, p_index, p_size, p_index_str, p_size_str, p_message.utf8().get_data(), fatal);
|
||||
}
|
||||
|
||||
void _err_flush_stdout() {
|
||||
fflush(stdout);
|
||||
}
|
||||
|
@ -84,6 +84,7 @@ void _err_print_error(const char *p_function, const char *p_file, int p_line, co
|
||||
void _err_print_error(const char *p_function, const char *p_file, int p_line, const String &p_error, const String &p_message, ErrorHandlerType p_type = ERR_HANDLER_ERROR);
|
||||
void _err_print_index_error(const char *p_function, const char *p_file, int p_line, int64_t p_index, int64_t p_size, const char *p_index_str, const char *p_size_str, const char *p_message = "", bool fatal = false);
|
||||
void _err_print_index_error(const char *p_function, const char *p_file, int p_line, int64_t p_index, int64_t p_size, const char *p_index_str, const char *p_size_str, const String &p_message, bool fatal = false);
|
||||
void _err_flush_stdout();
|
||||
|
||||
#ifndef _STR
|
||||
#define _STR(m_x) #m_x
|
||||
@ -426,6 +427,7 @@ void _err_print_index_error(const char *p_function, const char *p_file, int p_li
|
||||
#define CRASH_NOW() \
|
||||
if (true) { \
|
||||
_err_print_error(FUNCTION_STR, __FILE__, __LINE__, "FATAL: Method failed."); \
|
||||
void _err_flush_stdout(); \
|
||||
GENERATE_TRAP \
|
||||
} else \
|
||||
((void)0)
|
||||
@ -437,6 +439,7 @@ void _err_print_index_error(const char *p_function, const char *p_file, int p_li
|
||||
#define CRASH_NOW_MSG(m_msg) \
|
||||
if (true) { \
|
||||
_err_print_error(FUNCTION_STR, __FILE__, __LINE__, "FATAL: Method failed.", m_msg); \
|
||||
void _err_flush_stdout(); \
|
||||
GENERATE_TRAP \
|
||||
} else \
|
||||
((void)0)
|
||||
@ -520,6 +523,7 @@ void _err_print_index_error(const char *p_function, const char *p_file, int p_li
|
||||
#define DEV_ASSERT(m_cond) \
|
||||
if (unlikely(!(m_cond))) { \
|
||||
_err_print_error(FUNCTION_STR, __FILE__, __LINE__, "FATAL: DEV_ASSERT failed \"" _STR(m_cond) "\" is false."); \
|
||||
void _err_flush_stdout(); \
|
||||
GENERATE_TRAP \
|
||||
} else \
|
||||
((void)0)
|
||||
|
@ -99,7 +99,8 @@ static Error _decode_string(const uint8_t *&buf, int &len, int *r_len, String &r
|
||||
return OK;
|
||||
}
|
||||
|
||||
Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int *r_len, bool p_allow_objects) {
|
||||
Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int *r_len, bool p_allow_objects, int p_depth) {
|
||||
ERR_FAIL_COND_V_MSG(p_depth > Variant::MAX_RECURSION_DEPTH, ERR_OUT_OF_MEMORY, "Variant is too deep. Bailing.");
|
||||
const uint8_t *buf = p_buffer;
|
||||
int len = p_len;
|
||||
|
||||
@ -430,7 +431,7 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int
|
||||
|
||||
Variant value;
|
||||
int used;
|
||||
err = decode_variant(value, buf, len, &used, p_allow_objects);
|
||||
err = decode_variant(value, buf, len, &used, p_allow_objects, p_depth + 1);
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
@ -473,7 +474,7 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int
|
||||
Variant key, value;
|
||||
|
||||
int used;
|
||||
Error err = decode_variant(key, buf, len, &used, p_allow_objects);
|
||||
Error err = decode_variant(key, buf, len, &used, p_allow_objects, p_depth + 1);
|
||||
ERR_FAIL_COND_V_MSG(err != OK, err, "Error when trying to decode Variant.");
|
||||
|
||||
buf += used;
|
||||
@ -482,7 +483,7 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int
|
||||
(*r_len) += used;
|
||||
}
|
||||
|
||||
err = decode_variant(value, buf, len, &used, p_allow_objects);
|
||||
err = decode_variant(value, buf, len, &used, p_allow_objects, p_depth + 1);
|
||||
ERR_FAIL_COND_V_MSG(err != OK, err, "Error when trying to decode Variant.");
|
||||
|
||||
buf += used;
|
||||
@ -515,7 +516,7 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int
|
||||
for (int i = 0; i < count; i++) {
|
||||
int used = 0;
|
||||
Variant v;
|
||||
Error err = decode_variant(v, buf, len, &used, p_allow_objects);
|
||||
Error err = decode_variant(v, buf, len, &used, p_allow_objects, p_depth + 1);
|
||||
ERR_FAIL_COND_V_MSG(err != OK, err, "Error when trying to decode Variant.");
|
||||
buf += used;
|
||||
len -= used;
|
||||
|
@ -180,7 +180,7 @@ public:
|
||||
EncodedObjectAsID();
|
||||
};
|
||||
|
||||
Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int *r_len = nullptr, bool p_allow_objects = false);
|
||||
Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int *r_len = nullptr, bool p_allow_objects = false, int p_depth = 0);
|
||||
Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bool p_full_objects = false, int p_depth = 0);
|
||||
|
||||
#endif
|
||||
|
@ -244,7 +244,7 @@ private:
|
||||
change_root_node(sibling_id, p_tree_id);
|
||||
|
||||
// delete the old root node as no longer needed
|
||||
_nodes.free(p_parent_id);
|
||||
node_free_node_and_leaf(p_parent_id);
|
||||
}
|
||||
|
||||
return;
|
||||
@ -257,7 +257,19 @@ private:
|
||||
}
|
||||
|
||||
// put the node on the free list to recycle
|
||||
_nodes.free(p_parent_id);
|
||||
node_free_node_and_leaf(p_parent_id);
|
||||
}
|
||||
|
||||
// A node can either be a node, or a node AND a leaf combo.
|
||||
// Both must be deleted to prevent a leak.
|
||||
void node_free_node_and_leaf(uint32_t p_node_id) {
|
||||
TNode &node = _nodes[p_node_id];
|
||||
if (node.is_leaf()) {
|
||||
int leaf_id = node.get_leaf_id();
|
||||
_leaves.free(leaf_id);
|
||||
}
|
||||
|
||||
_nodes.free(p_node_id);
|
||||
}
|
||||
|
||||
void change_root_node(uint32_t p_new_root_id, uint32_t p_tree_id) {
|
||||
@ -349,7 +361,7 @@ private:
|
||||
refit_upward(parent_id);
|
||||
|
||||
// put the node on the free list to recycle
|
||||
_nodes.free(owner_node_id);
|
||||
node_free_node_and_leaf(owner_node_id);
|
||||
}
|
||||
|
||||
// else if no parent, it is the root node. Do not delete
|
||||
|
@ -749,6 +749,14 @@ static bool _is_number(CharType c) {
|
||||
return (c >= '0' && c <= '9');
|
||||
}
|
||||
|
||||
static bool _is_hex_digit(char32_t c) {
|
||||
return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
|
||||
}
|
||||
|
||||
static bool _is_binary_digit(char32_t c) {
|
||||
return (c == '0' || c == '1');
|
||||
}
|
||||
|
||||
Error Expression::_get_token(Token &r_token) {
|
||||
while (true) {
|
||||
#define GET_CHAR() (str_ofs >= expression.length() ? 0 : expression[str_ofs++])
|
||||
@ -1011,30 +1019,58 @@ Error Expression::_get_token(Token &r_token) {
|
||||
String num;
|
||||
#define READING_SIGN 0
|
||||
#define READING_INT 1
|
||||
#define READING_DEC 2
|
||||
#define READING_EXP 3
|
||||
#define READING_DONE 4
|
||||
#define READING_HEX 2
|
||||
#define READING_BIN 3
|
||||
#define READING_DEC 4
|
||||
#define READING_EXP 5
|
||||
#define READING_DONE 6
|
||||
int reading = READING_INT;
|
||||
|
||||
CharType c = cchar;
|
||||
bool exp_sign = false;
|
||||
bool exp_beg = false;
|
||||
bool bin_beg = false;
|
||||
bool hex_beg = false;
|
||||
bool is_float = false;
|
||||
bool is_first_char = true;
|
||||
|
||||
while (true) {
|
||||
switch (reading) {
|
||||
case READING_INT: {
|
||||
if (_is_number(c)) {
|
||||
//pass
|
||||
if (is_first_char && c == '0') {
|
||||
if (next_char == 'b') {
|
||||
reading = READING_BIN;
|
||||
} else if (next_char == 'x') {
|
||||
reading = READING_HEX;
|
||||
}
|
||||
}
|
||||
} else if (c == '.') {
|
||||
reading = READING_DEC;
|
||||
is_float = true;
|
||||
} else if (c == 'e') {
|
||||
reading = READING_EXP;
|
||||
is_float = true;
|
||||
} else {
|
||||
reading = READING_DONE;
|
||||
}
|
||||
|
||||
} break;
|
||||
case READING_BIN: {
|
||||
if (bin_beg && !_is_binary_digit(c)) {
|
||||
reading = READING_DONE;
|
||||
} else if (c == 'b') {
|
||||
bin_beg = true;
|
||||
}
|
||||
|
||||
} break;
|
||||
case READING_HEX: {
|
||||
if (hex_beg && !_is_hex_digit(c)) {
|
||||
reading = READING_DONE;
|
||||
} else if (c == 'x') {
|
||||
hex_beg = true;
|
||||
}
|
||||
|
||||
} break;
|
||||
case READING_DEC: {
|
||||
if (_is_number(c)) {
|
||||
@ -1051,9 +1087,6 @@ Error Expression::_get_token(Token &r_token) {
|
||||
exp_beg = true;
|
||||
|
||||
} else if ((c == '-' || c == '+') && !exp_sign && !exp_beg) {
|
||||
if (c == '-') {
|
||||
is_float = true;
|
||||
}
|
||||
exp_sign = true;
|
||||
|
||||
} else {
|
||||
@ -1067,6 +1100,7 @@ Error Expression::_get_token(Token &r_token) {
|
||||
}
|
||||
num += String::chr(c);
|
||||
c = GET_CHAR();
|
||||
is_first_char = false;
|
||||
}
|
||||
|
||||
str_ofs--;
|
||||
@ -1075,6 +1109,10 @@ Error Expression::_get_token(Token &r_token) {
|
||||
|
||||
if (is_float) {
|
||||
r_token.value = num.to_double();
|
||||
} else if (bin_beg) {
|
||||
r_token.value = num.bin_to_int64();
|
||||
} else if (hex_beg) {
|
||||
r_token.value = num.hex_to_int64();
|
||||
} else {
|
||||
r_token.value = num.to_int64();
|
||||
}
|
||||
|
@ -509,7 +509,11 @@ Error ProjectSettings::setup(const String &p_path, const String &p_main_pack, bo
|
||||
bool ProjectSettings::has_setting(String p_var) const {
|
||||
_THREAD_SAFE_METHOD_
|
||||
|
||||
return props.has(p_var);
|
||||
StringName name = p_var;
|
||||
if (!disable_feature_overrides && feature_overrides.has(name)) {
|
||||
name = feature_overrides[name];
|
||||
}
|
||||
return props.has(name);
|
||||
}
|
||||
|
||||
void ProjectSettings::set_registering_order(bool p_enable) {
|
||||
|
@ -652,17 +652,17 @@ struct _VariantCall {
|
||||
|
||||
static void _call_PoolByteArray_decompress_dynamic(Variant &r_ret, Variant &p_self, const Variant **p_args) {
|
||||
PoolByteArray *ba = reinterpret_cast<PoolByteArray *>(p_self._data._mem);
|
||||
PoolByteArray *decompressed = memnew(PoolByteArray);
|
||||
PoolByteArray decompressed;
|
||||
int max_output_size = (int)(*p_args[0]);
|
||||
Compression::Mode mode = (Compression::Mode)(int)(*p_args[1]);
|
||||
|
||||
decompressed->resize(1024);
|
||||
int result = Compression::decompress_dynamic(decompressed, max_output_size, ba->read().ptr(), ba->size(), mode);
|
||||
decompressed.resize(1024);
|
||||
int result = Compression::decompress_dynamic(&decompressed, max_output_size, ba->read().ptr(), ba->size(), mode);
|
||||
|
||||
if (result == OK) {
|
||||
r_ret = decompressed;
|
||||
} else {
|
||||
decompressed->resize(0);
|
||||
decompressed.resize(0);
|
||||
r_ret = decompressed;
|
||||
ERR_FAIL_MSG("Decompression failed.");
|
||||
}
|
||||
|
@ -221,8 +221,8 @@
|
||||
<method name="hash">
|
||||
<return type="int" />
|
||||
<description>
|
||||
Returns a hashed integer value representing the array and its contents.
|
||||
[b]Note:[/b] Arrays with equal contents can still produce different hashes. Only the exact same arrays will produce the same hashed integer value.
|
||||
Returns a hashed 32-bit integer value representing the array and its contents.
|
||||
[b]Note:[/b] [Array]s with equal content will always produce identical hash values. However, the reverse is not true. Returning identical hash values does [i]not[/i] imply the arrays are equal, because different arrays can have identical hash values due to hash collisions.
|
||||
</description>
|
||||
</method>
|
||||
<method name="insert">
|
||||
|
@ -32,7 +32,7 @@
|
||||
<method name="capture_get_device">
|
||||
<return type="String" />
|
||||
<description>
|
||||
Name of the current device for audio input (see [method capture_get_device_list]).
|
||||
Name of the current device for audio input (see [method capture_get_device_list]). The value [code]"Default"[/code] means that the system-wide default audio input is currently used.
|
||||
</description>
|
||||
</method>
|
||||
<method name="capture_get_device_list">
|
||||
@ -45,7 +45,7 @@
|
||||
<return type="void" />
|
||||
<argument index="0" name="name" type="String" />
|
||||
<description>
|
||||
Sets which audio input device is used for audio capture.
|
||||
Sets which audio input device is used for audio capture. On systems with multiple audio inputs (such as analog and USB), this can be used to select the audio input device. Setting the value [code]"Default"[/code] will record audio from the system-wide default audio input. If an invalid device name is set, the value will be reverted back to [code]"Default"[/code].
|
||||
</description>
|
||||
</method>
|
||||
<method name="generate_bus_layout" qualifiers="const">
|
||||
@ -309,7 +309,7 @@
|
||||
Number of available audio buses.
|
||||
</member>
|
||||
<member name="device" type="String" setter="set_device" getter="get_device" default=""Default"">
|
||||
Name of the current device for audio output (see [method get_device_list]).
|
||||
Name of the current device for audio output (see [method get_device_list]). On systems with multiple audio outputs (such as analog, USB and HDMI audio), this can be used to select the audio output device. The value [code]"Default"[/code] will play audio on the system-wide default audio output. If an invalid device name is set, the value will be reverted back to [code]"Default"[/code].
|
||||
</member>
|
||||
<member name="global_rate_scale" type="float" setter="set_global_rate_scale" getter="get_global_rate_scale" default="1.0">
|
||||
Scales the rate at which audio is played (i.e. setting it to [code]0.5[/code] will make the audio be played twice as fast).
|
||||
|
@ -47,7 +47,7 @@
|
||||
</methods>
|
||||
<members>
|
||||
<member name="area_mask" type="int" setter="set_area_mask" getter="get_area_mask" default="1">
|
||||
Areas in which this sound plays.
|
||||
Determines which [Area2D] layers affect the sound for reverb and audio bus effects. Areas can be used to redirect [AudioStream]s so that they play in a certain audio bus. An example of how you might use this is making a "water" area so that sounds played in the water are redirected through an audio bus to make them sound like they are being played underwater.
|
||||
</member>
|
||||
<member name="attenuation" type="float" setter="set_attenuation" getter="get_attenuation" default="1.0">
|
||||
Dampens audio over distance with this as an exponent.
|
||||
|
@ -48,7 +48,7 @@
|
||||
</methods>
|
||||
<members>
|
||||
<member name="area_mask" type="int" setter="set_area_mask" getter="get_area_mask" default="1">
|
||||
Areas in which this sound plays.
|
||||
Determines which [Area] layers affect the sound for reverb and audio bus effects. Areas can be used to redirect [AudioStream]s so that they play in a certain audio bus. An example of how you might use this is making a "water" area so that sounds played in the water are redirected through an audio bus to make them sound like they are being played underwater.
|
||||
</member>
|
||||
<member name="attenuation_filter_cutoff_hz" type="float" setter="set_attenuation_filter_cutoff_hz" getter="get_attenuation_filter_cutoff_hz" default="5000.0">
|
||||
Dampens audio using a low-pass filter above this frequency, in Hz. To disable the dampening effect entirely, set this to [code]20500[/code] as this frequency is above the human hearing limit.
|
||||
|
@ -147,7 +147,7 @@
|
||||
<method name="hash">
|
||||
<return type="int" />
|
||||
<description>
|
||||
Returns a hashed integer value representing the dictionary contents. This can be used to compare dictionaries by value:
|
||||
Returns a hashed 32-bit integer value representing the dictionary contents. This can be used to compare dictionaries by value:
|
||||
[codeblock]
|
||||
var dict1 = {0: 10}
|
||||
var dict2 = {0: 10}
|
||||
@ -155,6 +155,7 @@
|
||||
print(dict1.hash() == dict2.hash())
|
||||
[/codeblock]
|
||||
[b]Note:[/b] Dictionaries with the same keys/values but in a different order will have a different hash.
|
||||
[b]Note:[/b] Dictionaries with equal content will always produce identical hash values. However, the reverse is not true. Returning identical hash values does [i]not[/i] imply the dictionaries are equal, because different dictionaries can have identical hash values due to hash collisions.
|
||||
</description>
|
||||
</method>
|
||||
<method name="keys">
|
||||
|
@ -62,7 +62,8 @@
|
||||
The ambient light's energy. The higher the value, the stronger the light.
|
||||
</member>
|
||||
<member name="ambient_light_sky_contribution" type="float" setter="set_ambient_light_sky_contribution" getter="get_ambient_light_sky_contribution" default="1.0">
|
||||
Defines the amount of light that the sky brings on the scene. A value of 0 means that the sky's light emission has no effect on the scene illumination, thus all ambient illumination is provided by the ambient light. On the contrary, a value of 1 means that all the light that affects the scene is provided by the sky, thus the ambient light parameter has no effect on the scene.
|
||||
Defines the amount of light that the sky brings on the scene. A value of [code]0.0[/code] means that the sky's light emission has no effect on the scene illumination, thus all ambient illumination is provided by the ambient light. On the contrary, a value of [code]1.0[/code] means that [i]all[/i] the light that affects the scene is provided by the sky, thus the ambient light parameter has no effect on the scene.
|
||||
[b]Note:[/b] [member ambient_light_sky_contribution] is internally clamped between [code]0.0[/code] and [code]1.0[/code] (inclusive).
|
||||
</member>
|
||||
<member name="auto_exposure_enabled" type="bool" setter="set_tonemap_auto_exposure" getter="get_tonemap_auto_exposure" default="false">
|
||||
If [code]true[/code], enables the tonemapping auto exposure mode of the scene renderer. If [code]true[/code], the renderer will automatically determine the exposure setting to adapt to the scene's illumination and the observed light.
|
||||
|
@ -408,7 +408,8 @@
|
||||
<return type="void" />
|
||||
<argument index="0" name="to" type="Vector2" />
|
||||
<description>
|
||||
Sets the mouse position to the specified vector.
|
||||
Sets the mouse position to the specified vector, provided in pixels and relative to an origin at the upper left corner of the game window.
|
||||
Mouse position is clipped to the limits of the screen resolution, or to the limits of the game window if [enum MouseMode] is set to [constant MOUSE_MODE_CONFINED].
|
||||
</description>
|
||||
</method>
|
||||
</methods>
|
||||
|
@ -62,7 +62,8 @@
|
||||
The color of shadows cast by this light.
|
||||
</member>
|
||||
<member name="shadow_contact" type="float" setter="set_param" getter="get_param" default="0.0">
|
||||
Attempts to reduce [member shadow_bias] gap.
|
||||
Attempts to reduce [member shadow_bias] gap by rendering screen-space contact shadows. This has a performance impact, especially at higher values.
|
||||
[b]Note:[/b] Contact shadows can look broken, so leaving this property to [code]0.0[/code] is recommended.
|
||||
</member>
|
||||
<member name="shadow_enabled" type="bool" setter="set_shadow" getter="has_shadow" default="false">
|
||||
If [code]true[/code], the light will cast shadows.
|
||||
|
@ -340,7 +340,7 @@
|
||||
<argument index="0" name="property" type="String" />
|
||||
<argument index="1" name="value" type="Variant" />
|
||||
<description>
|
||||
Assigns a new value to the given property. If the [code]property[/code] does not exist, nothing will happen.
|
||||
Assigns a new value to the given property. If the [code]property[/code] does not exist or the given value's type doesn't match, nothing will happen.
|
||||
[b]Note:[/b] In C#, the property name must be specified as snake_case if it is defined by a built-in Godot node. This doesn't apply to user-defined properties where you should use the same convention as in the C# source (typically PascalCase).
|
||||
</description>
|
||||
</method>
|
||||
|
@ -338,7 +338,8 @@
|
||||
<method name="hash">
|
||||
<return type="int" />
|
||||
<description>
|
||||
Hashes the string and returns a 32-bit integer.
|
||||
Returns the 32-bit hash value representing the string's contents.
|
||||
[b]Note:[/b] [String]s with equal content will always produce identical hash values. However, the reverse is not true. Returning identical hash values does [i]not[/i] imply the strings are equal, because different strings can have identical hash values due to hash collisions.
|
||||
</description>
|
||||
</method>
|
||||
<method name="hex_to_int">
|
||||
|
@ -18,7 +18,7 @@
|
||||
<argument index="3" name="disabled" type="bool" default="false" />
|
||||
<argument index="4" name="tooltip" type="String" default="""" />
|
||||
<description>
|
||||
Adds a button with [Texture] [code]button[/code] at column [code]column[/code]. The [code]button_idx[/code] index is used to identify the button when calling other methods. If not specified, the next available index is used, which may be retrieved by calling [method get_button_count] immediately after this method. Optionally, the button can be [code]disabled[/code] and have a [code]tooltip[/code].
|
||||
Adds a button with [Texture] [code]button[/code] at column [code]column[/code]. The [code]button_idx[/code] is used to identify the button. If not specified, the next available index is used, which may be retrieved by calling [method get_button_count] immediately after this method. Optionally, the button can be [code]disabled[/code] and have a [code]tooltip[/code].
|
||||
</description>
|
||||
</method>
|
||||
<method name="call_recursive" qualifiers="vararg">
|
||||
@ -69,7 +69,7 @@
|
||||
<return type="int" />
|
||||
<argument index="0" name="column" type="int" />
|
||||
<description>
|
||||
Returns the number of buttons in column [code]column[/code]. May be used to get the most recently added button's index, if no index was specified.
|
||||
Returns the number of buttons in column [code]column[/code].
|
||||
</description>
|
||||
</method>
|
||||
<method name="get_button_tooltip" qualifiers="const">
|
||||
|
@ -2287,6 +2287,7 @@ void RasterizerStorageGLES2::mesh_add_surface(RID p_mesh, uint32_t p_format, VS:
|
||||
if (p_format & VS::ARRAY_COMPRESS_VERTEX) {
|
||||
attribs[i].type = _GL_HALF_FLOAT_OES;
|
||||
positions_stride += attribs[i].size * 2;
|
||||
uses_half_float = true;
|
||||
} else {
|
||||
attribs[i].type = GL_FLOAT;
|
||||
positions_stride += attribs[i].size * 4;
|
||||
@ -3969,7 +3970,7 @@ void RasterizerStorageGLES2::update_dirty_blend_shapes() {
|
||||
s->blend_shape_buffer_size = buffer_size;
|
||||
glBufferData(GL_ARRAY_BUFFER, buffer_size * sizeof(float), transform_buffer.read().ptr(), GL_DYNAMIC_DRAW);
|
||||
} else {
|
||||
buffer_orphan_and_upload(s->blend_shape_buffer_size, 0, buffer_size * sizeof(float), transform_buffer.read().ptr(), GL_ARRAY_BUFFER, true);
|
||||
buffer_orphan_and_upload(s->blend_shape_buffer_size * sizeof(float), 0, buffer_size * sizeof(float), transform_buffer.read().ptr(), GL_ARRAY_BUFFER, true);
|
||||
}
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
}
|
||||
@ -3991,7 +3992,7 @@ void RasterizerStorageGLES2::_update_skeleton_transform_buffer(const PoolVector<
|
||||
glBufferData(GL_ARRAY_BUFFER, buffer_size, p_data.read().ptr(), GL_DYNAMIC_DRAW);
|
||||
} else {
|
||||
// this may not be best, it could be better to use glBufferData in both cases.
|
||||
buffer_orphan_and_upload(resources.skeleton_transform_buffer_size, 0, buffer_size, p_data.read().ptr(), GL_ARRAY_BUFFER, true);
|
||||
buffer_orphan_and_upload(resources.skeleton_transform_buffer_size * sizeof(float), 0, buffer_size, p_data.read().ptr(), GL_ARRAY_BUFFER, true);
|
||||
}
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
@ -6179,6 +6180,13 @@ void RasterizerStorageGLES2::initialize() {
|
||||
config.pvrtc_supported = config.extensions.has("GL_IMG_texture_compression_pvrtc") || config.extensions.has("WEBGL_compressed_texture_pvrtc");
|
||||
config.support_npot_repeat_mipmap = config.extensions.has("GL_OES_texture_npot");
|
||||
|
||||
// If the desktop build is using S3TC, and you export / run from the IDE for android, if the device supports
|
||||
// S3TC it will crash trying to load these textures, as they are not exported in the APK. This is a simple way
|
||||
// to prevent Android devices trying to load S3TC, by faking lack of hardware support.
|
||||
#if defined(ANDROID_ENABLED) || defined(IPHONE_ENABLED)
|
||||
config.s3tc_supported = false;
|
||||
#endif
|
||||
|
||||
#ifdef JAVASCRIPT_ENABLED
|
||||
// RenderBuffer internal format must be 16 bits in WebGL,
|
||||
// but depth_texture should default to 32 always
|
||||
|
@ -1353,7 +1353,8 @@ public:
|
||||
virtual String get_video_adapter_name() const;
|
||||
virtual String get_video_adapter_vendor() const;
|
||||
|
||||
void buffer_orphan_and_upload(unsigned int p_buffer_size, unsigned int p_offset, unsigned int p_data_size, const void *p_data, GLenum p_target = GL_ARRAY_BUFFER, GLenum p_usage = GL_DYNAMIC_DRAW, bool p_optional_orphan = false) const;
|
||||
// NOTE : THESE SIZES ARE IN BYTES. BUFFER SIZES MAY NOT BE SPECIFIED IN BYTES SO REMEMBER TO CONVERT THEM WHEN CALLING.
|
||||
void buffer_orphan_and_upload(unsigned int p_buffer_size_bytes, unsigned int p_offset_bytes, unsigned int p_data_size_bytes, const void *p_data, GLenum p_target = GL_ARRAY_BUFFER, GLenum p_usage = GL_DYNAMIC_DRAW, bool p_optional_orphan = false) const;
|
||||
bool safe_buffer_sub_data(unsigned int p_total_buffer_size, GLenum p_target, unsigned int p_offset, unsigned int p_data_size, const void *p_data, unsigned int &r_offset_after) const;
|
||||
|
||||
RasterizerStorageGLES2();
|
||||
@ -1373,17 +1374,18 @@ inline bool RasterizerStorageGLES2::safe_buffer_sub_data(unsigned int p_total_bu
|
||||
|
||||
// standardize the orphan / upload in one place so it can be changed per platform as necessary, and avoid future
|
||||
// bugs causing pipeline stalls
|
||||
inline void RasterizerStorageGLES2::buffer_orphan_and_upload(unsigned int p_buffer_size, unsigned int p_offset, unsigned int p_data_size, const void *p_data, GLenum p_target, GLenum p_usage, bool p_optional_orphan) const {
|
||||
// NOTE : THESE SIZES ARE IN BYTES. BUFFER SIZES MAY NOT BE SPECIFIED IN BYTES SO REMEMBER TO CONVERT THEM WHEN CALLING.
|
||||
inline void RasterizerStorageGLES2::buffer_orphan_and_upload(unsigned int p_buffer_size_bytes, unsigned int p_offset_bytes, unsigned int p_data_size_bytes, const void *p_data, GLenum p_target, GLenum p_usage, bool p_optional_orphan) const {
|
||||
// Orphan the buffer to avoid CPU/GPU sync points caused by glBufferSubData
|
||||
// Was previously #ifndef GLES_OVER_GL however this causes stalls on desktop mac also (and possibly other)
|
||||
if (!p_optional_orphan || (config.should_orphan)) {
|
||||
glBufferData(p_target, p_buffer_size, nullptr, p_usage);
|
||||
glBufferData(p_target, p_buffer_size_bytes, nullptr, p_usage);
|
||||
#ifdef RASTERIZER_EXTRA_CHECKS
|
||||
// fill with garbage off the end of the array
|
||||
if (p_buffer_size) {
|
||||
unsigned int start = p_offset + p_data_size;
|
||||
if (p_buffer_size_bytes) {
|
||||
unsigned int start = p_offset_bytes + p_data_size_bytes;
|
||||
unsigned int end = start + 1024;
|
||||
if (end < p_buffer_size) {
|
||||
if (end < p_buffer_size_bytes) {
|
||||
uint8_t *garbage = (uint8_t *)alloca(1024);
|
||||
for (int n = 0; n < 1024; n++) {
|
||||
garbage[n] = Math::random(0, 255);
|
||||
@ -1393,8 +1395,8 @@ inline void RasterizerStorageGLES2::buffer_orphan_and_upload(unsigned int p_buff
|
||||
}
|
||||
#endif
|
||||
}
|
||||
DEV_ASSERT((p_offset + p_data_size) <= p_buffer_size);
|
||||
glBufferSubData(p_target, p_offset, p_data_size, p_data);
|
||||
ERR_FAIL_COND((p_offset_bytes + p_data_size_bytes) > p_buffer_size_bytes);
|
||||
glBufferSubData(p_target, p_offset_bytes, p_data_size_bytes, p_data);
|
||||
}
|
||||
|
||||
#endif // RASTERIZERSTORAGEGLES2_H
|
||||
|
@ -1491,35 +1491,37 @@ public:
|
||||
virtual String get_video_adapter_name() const;
|
||||
virtual String get_video_adapter_vendor() const;
|
||||
|
||||
void buffer_orphan_and_upload(unsigned int p_buffer_size, unsigned int p_offset, unsigned int p_data_size, const void *p_data, GLenum p_target = GL_ARRAY_BUFFER, GLenum p_usage = GL_DYNAMIC_DRAW, bool p_optional_orphan = false) const;
|
||||
bool safe_buffer_sub_data(unsigned int p_total_buffer_size, GLenum p_target, unsigned int p_offset, unsigned int p_data_size, const void *p_data, unsigned int &r_offset_after) const;
|
||||
// NOTE : THESE SIZES ARE IN BYTES. BUFFER SIZES MAY NOT BE SPECIFIED IN BYTES SO REMEMBER TO CONVERT THEM WHEN CALLING.
|
||||
void buffer_orphan_and_upload(unsigned int p_buffer_size_bytes, unsigned int p_offset_bytes, unsigned int p_data_size_bytes, const void *p_data, GLenum p_target = GL_ARRAY_BUFFER, GLenum p_usage = GL_DYNAMIC_DRAW, bool p_optional_orphan = false) const;
|
||||
bool safe_buffer_sub_data(unsigned int p_total_buffer_size_bytes, GLenum p_target, unsigned int p_offset_bytes, unsigned int p_data_size_bytes, const void *p_data, unsigned int &r_offset_after_bytes) const;
|
||||
|
||||
RasterizerStorageGLES3();
|
||||
};
|
||||
|
||||
inline bool RasterizerStorageGLES3::safe_buffer_sub_data(unsigned int p_total_buffer_size, GLenum p_target, unsigned int p_offset, unsigned int p_data_size, const void *p_data, unsigned int &r_offset_after) const {
|
||||
r_offset_after = p_offset + p_data_size;
|
||||
inline bool RasterizerStorageGLES3::safe_buffer_sub_data(unsigned int p_total_buffer_size_bytes, GLenum p_target, unsigned int p_offset_bytes, unsigned int p_data_size_bytes, const void *p_data, unsigned int &r_offset_after_bytes) const {
|
||||
r_offset_after_bytes = p_offset_bytes + p_data_size_bytes;
|
||||
#ifdef DEBUG_ENABLED
|
||||
// we are trying to write across the edge of the buffer
|
||||
if (r_offset_after > p_total_buffer_size) {
|
||||
if (r_offset_after_bytes > p_total_buffer_size_bytes) {
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
glBufferSubData(p_target, p_offset, p_data_size, p_data);
|
||||
glBufferSubData(p_target, p_offset_bytes, p_data_size_bytes, p_data);
|
||||
return true;
|
||||
}
|
||||
|
||||
// standardize the orphan / upload in one place so it can be changed per platform as necessary, and avoid future
|
||||
// bugs causing pipeline stalls
|
||||
inline void RasterizerStorageGLES3::buffer_orphan_and_upload(unsigned int p_buffer_size, unsigned int p_offset, unsigned int p_data_size, const void *p_data, GLenum p_target, GLenum p_usage, bool p_optional_orphan) const {
|
||||
// NOTE : THESE SIZES ARE IN BYTES. BUFFER SIZES MAY NOT BE SPECIFIED IN BYTES SO REMEMBER TO CONVERT THEM WHEN CALLING.
|
||||
inline void RasterizerStorageGLES3::buffer_orphan_and_upload(unsigned int p_buffer_size_bytes, unsigned int p_offset_bytes, unsigned int p_data_size_bytes, const void *p_data, GLenum p_target, GLenum p_usage, bool p_optional_orphan) const {
|
||||
// Orphan the buffer to avoid CPU/GPU sync points caused by glBufferSubData
|
||||
// Was previously #ifndef GLES_OVER_GL however this causes stalls on desktop mac also (and possibly other)
|
||||
if (!p_optional_orphan || (config.should_orphan)) {
|
||||
glBufferData(p_target, p_buffer_size, nullptr, p_usage);
|
||||
glBufferData(p_target, p_buffer_size_bytes, nullptr, p_usage);
|
||||
#ifdef RASTERIZER_EXTRA_CHECKS
|
||||
// fill with garbage off the end of the array
|
||||
if (p_buffer_size) {
|
||||
unsigned int start = p_offset + p_data_size;
|
||||
if (p_buffer_size_bytes) {
|
||||
unsigned int start = p_offset_bytes + p_data_size_bytes;
|
||||
unsigned int end = start + 1024;
|
||||
if (end < p_buffer_size) {
|
||||
uint8_t *garbage = (uint8_t *)alloca(1024);
|
||||
@ -1531,8 +1533,8 @@ inline void RasterizerStorageGLES3::buffer_orphan_and_upload(unsigned int p_buff
|
||||
}
|
||||
#endif
|
||||
}
|
||||
DEV_ASSERT((p_offset + p_data_size) <= p_buffer_size);
|
||||
glBufferSubData(p_target, p_offset, p_data_size, p_data);
|
||||
ERR_FAIL_COND((p_offset_bytes + p_data_size_bytes) > p_buffer_size_bytes);
|
||||
glBufferSubData(p_target, p_offset_bytes, p_data_size_bytes, p_data);
|
||||
}
|
||||
|
||||
#endif // RASTERIZERSTORAGEGLES3_H
|
||||
|
@ -870,21 +870,12 @@ bool EditorData::script_class_is_parent(const String &p_class, const String &p_i
|
||||
return false;
|
||||
}
|
||||
|
||||
Ref<Script> script = script_class_load_script(p_class);
|
||||
if (script.is_null()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
String base = script_class_get_base(p_class);
|
||||
Ref<Script> base_script = script->get_base_script();
|
||||
|
||||
while (p_inherits != base) {
|
||||
String base = p_class;
|
||||
while (base != p_inherits) {
|
||||
if (ClassDB::class_exists(base)) {
|
||||
return ClassDB::is_parent_class(base, p_inherits);
|
||||
} else if (ScriptServer::is_global_class(base)) {
|
||||
base = script_class_get_base(base);
|
||||
} else if (base_script.is_valid()) {
|
||||
return ClassDB::is_parent_class(base_script->get_instance_base_type(), p_inherits);
|
||||
base = ScriptServer::get_global_class_base(base);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
@ -2616,18 +2616,20 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
|
||||
int min = 0, max = 65535, step = 1;
|
||||
bool greater = true, lesser = true;
|
||||
|
||||
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
|
||||
greater = false; //if using ranged, assume false by default
|
||||
Vector<String> slices = p_hint_text.split(",");
|
||||
if (p_hint == PROPERTY_HINT_RANGE && slices.size() >= 2) {
|
||||
greater = false; // If using ranged, assume false by default.
|
||||
lesser = false;
|
||||
min = p_hint_text.get_slice(",", 0).to_int();
|
||||
max = p_hint_text.get_slice(",", 1).to_int();
|
||||
min = slices[0].to_int();
|
||||
max = slices[1].to_int();
|
||||
|
||||
if (p_hint_text.get_slice_count(",") >= 3) {
|
||||
step = p_hint_text.get_slice(",", 2).to_int();
|
||||
if (slices.size() >= 3 && slices[2].is_valid_integer()) {
|
||||
// Step is optional, could be something else if not a number.
|
||||
step = slices[2].to_int();
|
||||
}
|
||||
|
||||
for (int i = 2; i < p_hint_text.get_slice_count(","); i++) {
|
||||
String slice = p_hint_text.get_slice(",", i).strip_edges();
|
||||
for (int i = 2; i < slices.size(); i++) {
|
||||
String slice = slices[i].strip_edges();
|
||||
if (slice == "or_greater") {
|
||||
greater = true;
|
||||
}
|
||||
@ -2668,18 +2670,23 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
|
||||
bool exp_range = false;
|
||||
bool greater = true, lesser = true;
|
||||
|
||||
if ((p_hint == PROPERTY_HINT_RANGE || p_hint == PROPERTY_HINT_EXP_RANGE) && p_hint_text.get_slice_count(",") >= 2) {
|
||||
greater = false; //if using ranged, assume false by default
|
||||
Vector<String> slices = p_hint_text.split(",");
|
||||
if ((p_hint == PROPERTY_HINT_RANGE || p_hint == PROPERTY_HINT_EXP_RANGE) && slices.size() >= 2) {
|
||||
greater = false; // If using ranged, assume false by default.
|
||||
lesser = false;
|
||||
min = p_hint_text.get_slice(",", 0).to_double();
|
||||
max = p_hint_text.get_slice(",", 1).to_double();
|
||||
if (p_hint_text.get_slice_count(",") >= 3) {
|
||||
step = p_hint_text.get_slice(",", 2).to_double();
|
||||
min = slices[0].to_double();
|
||||
max = slices[1].to_double();
|
||||
|
||||
if (slices.size() >= 3 && slices[2].is_valid_float()) {
|
||||
// Step is optional, could be something else if not a number.
|
||||
step = slices[2].to_double();
|
||||
}
|
||||
|
||||
hide_slider = false;
|
||||
exp_range = p_hint == PROPERTY_HINT_EXP_RANGE;
|
||||
for (int i = 2; i < p_hint_text.get_slice_count(","); i++) {
|
||||
String slice = p_hint_text.get_slice(",", i).strip_edges();
|
||||
|
||||
for (int i = 2; i < slices.size(); i++) {
|
||||
String slice = slices[i].strip_edges();
|
||||
if (slice == "or_greater") {
|
||||
greater = true;
|
||||
}
|
||||
|
@ -273,6 +273,10 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!_get_node()->is_visible_in_tree()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Ref<InputEventMouseButton> mb = p_event;
|
||||
|
||||
if (!_has_resource()) {
|
||||
@ -506,6 +510,10 @@ void AbstractPolygon2DEditor::forward_canvas_draw_over_viewport(Control *p_overl
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_get_node()->is_visible_in_tree()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Transform2D xform = canvas_item_editor->get_canvas_transform() * _get_node()->get_global_transform();
|
||||
// All polygon points are sharp, so use the sharp handle icon
|
||||
const Ref<Texture> handle = get_icon("EditorPathSharpHandle", "EditorIcons");
|
||||
|
@ -326,6 +326,10 @@ bool CollisionShape2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_e
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!node->is_visible_in_tree()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (shape_type == -1) {
|
||||
return false;
|
||||
}
|
||||
@ -448,6 +452,10 @@ void CollisionShape2DEditor::forward_canvas_draw_over_viewport(Control *p_overla
|
||||
return;
|
||||
}
|
||||
|
||||
if (!node->is_visible_in_tree()) {
|
||||
return;
|
||||
}
|
||||
|
||||
_get_current_shape_type();
|
||||
|
||||
if (shape_type == -1) {
|
||||
|
@ -299,7 +299,7 @@ void SpriteFramesEditor::_sheet_spin_changed(double) {
|
||||
}
|
||||
|
||||
void SpriteFramesEditor::_prepare_sprite_sheet(const String &p_file) {
|
||||
Ref<Resource> texture = ResourceLoader::load(p_file);
|
||||
Ref<Texture> texture = ResourceLoader::load(p_file);
|
||||
if (!texture.is_valid()) {
|
||||
EditorNode::get_singleton()->show_warning(TTR("Unable to load images"));
|
||||
ERR_FAIL_COND(!texture.is_valid());
|
||||
|
@ -38,8 +38,6 @@ void EditorInspectorPluginViewportPreview::parse_begin(Object *p_object) {
|
||||
Viewport *viewport = Object::cast_to<Viewport>(p_object);
|
||||
|
||||
TexturePreview *viewport_preview = memnew(TexturePreview(viewport->get_texture(), false));
|
||||
viewport_preview->get_texture_display()->set_flip_v(true); // flip as ViewportTexture in 3.x is upside-down.
|
||||
|
||||
// Otherwise `viewport_preview`'s `texture_display` doesn't update properly when `viewport`'s size changes.
|
||||
viewport->connect("size_changed", viewport_preview->get_texture_display(), "update");
|
||||
add_custom_control(viewport_preview);
|
||||
|
@ -1044,17 +1044,17 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
|
||||
GLOBAL_DEF("rendering/2d/options/use_nvidia_rect_flicker_workaround", false);
|
||||
|
||||
GLOBAL_DEF("display/window/size/width", 1024);
|
||||
ProjectSettings::get_singleton()->set_custom_property_info("display/window/size/width", PropertyInfo(Variant::INT, "display/window/size/width", PROPERTY_HINT_RANGE, "0,7680,or_greater")); // 8K resolution
|
||||
ProjectSettings::get_singleton()->set_custom_property_info("display/window/size/width", PropertyInfo(Variant::INT, "display/window/size/width", PROPERTY_HINT_RANGE, "0,7680,1,or_greater")); // 8K resolution
|
||||
GLOBAL_DEF("display/window/size/height", 600);
|
||||
ProjectSettings::get_singleton()->set_custom_property_info("display/window/size/height", PropertyInfo(Variant::INT, "display/window/size/height", PROPERTY_HINT_RANGE, "0,4320,or_greater")); // 8K resolution
|
||||
ProjectSettings::get_singleton()->set_custom_property_info("display/window/size/height", PropertyInfo(Variant::INT, "display/window/size/height", PROPERTY_HINT_RANGE, "0,4320,1,or_greater")); // 8K resolution
|
||||
GLOBAL_DEF("display/window/size/resizable", true);
|
||||
GLOBAL_DEF("display/window/size/borderless", false);
|
||||
GLOBAL_DEF("display/window/size/fullscreen", false);
|
||||
GLOBAL_DEF("display/window/size/always_on_top", false);
|
||||
GLOBAL_DEF("display/window/size/test_width", 0);
|
||||
ProjectSettings::get_singleton()->set_custom_property_info("display/window/size/test_width", PropertyInfo(Variant::INT, "display/window/size/test_width", PROPERTY_HINT_RANGE, "0,7680,or_greater")); // 8K resolution
|
||||
ProjectSettings::get_singleton()->set_custom_property_info("display/window/size/test_width", PropertyInfo(Variant::INT, "display/window/size/test_width", PROPERTY_HINT_RANGE, "0,7680,1,or_greater")); // 8K resolution
|
||||
GLOBAL_DEF("display/window/size/test_height", 0);
|
||||
ProjectSettings::get_singleton()->set_custom_property_info("display/window/size/test_height", PropertyInfo(Variant::INT, "display/window/size/test_height", PROPERTY_HINT_RANGE, "0,4320,or_greater")); // 8K resolution
|
||||
ProjectSettings::get_singleton()->set_custom_property_info("display/window/size/test_height", PropertyInfo(Variant::INT, "display/window/size/test_height", PROPERTY_HINT_RANGE, "0,4320,1,or_greater")); // 8K resolution
|
||||
|
||||
if (use_custom_res) {
|
||||
if (!force_res) {
|
||||
|
6
misc/dist/html/editor.html
vendored
6
misc/dist/html/editor.html
vendored
@ -9,8 +9,8 @@
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="application-name" content="Godot" />
|
||||
<meta name="apple-mobile-web-app-title" content="Godot" />
|
||||
<meta name="theme-color" content="#478cbf" />
|
||||
<meta name="msapplication-navbutton-color" content="#478cbf" />
|
||||
<meta name="theme-color" content="#202531" />
|
||||
<meta name="msapplication-navbutton-color" content="#202531" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<meta name="msapplication-starturl" content="/latest" />
|
||||
<meta property="og:site_name" content="Godot Engine Web Editor" />
|
||||
@ -270,7 +270,7 @@
|
||||
<div id="tab-loader">
|
||||
<div style="color: #e0e0e0;" id="persistence">
|
||||
<br />
|
||||
<img src="logo.svg" alt="Godot Engine logo" width="1024" height="414" style="width: auto; height: auto; max-width: 85%; max-height: 250px" />
|
||||
<img src="logo.svg" alt="Godot Engine logo" width="1024" height="414" style="width: auto; height: auto; max-width: min(85%, 50vh); max-height: 250px" />
|
||||
<br />
|
||||
@GODOT_VERSION@
|
||||
<br />
|
||||
|
3
misc/dist/html/manifest.json
vendored
3
misc/dist/html/manifest.json
vendored
@ -5,8 +5,7 @@
|
||||
"lang": "en",
|
||||
"start_url": "./godot.tools.html",
|
||||
"display": "standalone",
|
||||
"orientation": "landscape",
|
||||
"theme_color": "#478cbf",
|
||||
"theme_color": "#202531",
|
||||
"icons": [
|
||||
{
|
||||
"src": "favicon.png",
|
||||
|
2
misc/dist/html/offline.html
vendored
2
misc/dist/html/offline.html
vendored
@ -4,6 +4,8 @@
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="theme-color" content="#202531" />
|
||||
<meta name="msapplication-navbutton-color" content="#202531" />
|
||||
<title>You are offline</title>
|
||||
<style>
|
||||
html {
|
||||
|
0
misc/dist/osx_tools.app/Contents/Resources/af.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/af.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ar.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ar.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/az.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/az.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/bg.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/bg.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/bn.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/bn.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/br.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/br.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ca.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ca.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/cs.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/cs.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/da.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/da.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/de.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/de.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/el.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/el.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/en.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/en.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/eo.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/eo.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/es.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/es.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/es_AR.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/es_AR.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/et.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/et.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/eu.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/eu.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/fa.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/fa.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/fi.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/fi.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/fil.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/fil.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/fr.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/fr.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ga.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ga.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/gl.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/gl.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/he.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/he.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/hi.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/hi.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/hr.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/hr.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/hu.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/hu.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/id.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/id.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/is.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/is.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/it.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/it.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ja.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ja.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ka.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ka.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/km.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/km.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ko.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ko.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/lt.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/lt.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/lv.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/lv.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/mi.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/mi.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/mk.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/mk.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ml.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ml.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/mr.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/mr.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ms.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ms.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/nb.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/nb.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/nl.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/nl.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/or.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/or.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/pl.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/pl.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/pt.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/pt.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/pt_BR.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ro.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ro.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ru.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ru.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/si.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/si.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/sk.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/sk.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/sl.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/sl.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/sq.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/sq.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/sr-Cyrl.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/sr-Cyrl.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/sr-Latn.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/sr-Latn.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/sv.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/sv.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ta.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ta.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/te.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/te.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/th.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/th.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/tr.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/tr.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/tt.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/tt.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/tzm.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/tzm.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/uk.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/uk.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ur_PK.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/ur_PK.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/vi.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/vi.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings
vendored
Normal file
0
misc/dist/osx_tools.app/Contents/Resources/zh_CN.lproj/InfoPlist.strings
vendored
Normal file
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user