Merge pull request #2 from flashshare/Relintai-master

Update Relintai master
This commit is contained in:
Nguyen Truong An 2024-11-15 16:31:31 +01:00 committed by GitHub
commit d07c962a50
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
56 changed files with 567 additions and 120 deletions

View File

@ -0,0 +1,56 @@
name: 📊 Static Checks
on: [push, pull_request]
concurrency:
group: ci-${{github.actor}}-${{github.head_ref || github.run_number}}-${{github.ref}}-static
cancel-in-progress: true
jobs:
static-checks:
name: Static Checks (clang-format, black format, file format, documentation checks)
runs-on: "ubuntu-24.04"
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install dependencies
run: |
# Azure repositories are flaky, remove them.
sudo rm -f /etc/apt/sources.list.d/{azure,microsoft}*
sudo apt-get update
sudo apt-get install -qq dos2unix libxml2-utils python3-pip moreutils
sudo update-alternatives --remove-all clang-format || true
sudo update-alternatives --install /usr/bin/clang-format clang-format /usr/bin/clang-format-16 100
sudo pip3 install black==24.10.0 pygments
# This needs to happen before Python and npm execution; it must happen before any extra files are written.
- name: .gitignore checks (gitignore_check.sh)
run: |
bash ./misc/scripts/gitignore_check.sh
- name: File formatting checks (file_format.sh)
run: |
bash ./misc/scripts/file_format.sh
- name: Style checks via clang-format (clang_format.sh)
run: |
bash ./misc/scripts/clang_format.sh
- name: Python style checks via black (black_format.sh)
run: |
bash ./misc/scripts/black_format.sh
- name: JavaScript style and documentation checks via ESLint and JSDoc
run: |
cd platform/javascript
npm ci
npm run lint
npm run docs -- -d dry-run
- name: Documentation checks
run: |
doc/tools/make_rst.py --dry-run doc/classes modules
- name: Style checks via clang-format (clang_format.sh)
run: |
bash ./misc/scripts/clang_format.sh

View File

@ -13,21 +13,12 @@ concurrency:
jobs: jobs:
android-template: android-template:
runs-on: "ubuntu-20.04" runs-on: "ubuntu-24.04"
name: Template (target=release, tools=no) name: Template (target=release, tools=no)
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
# Azure repositories are not reliable, we need to prevent azure giving us packages.
- 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
sudo apt-get install gcc-multilib
- name: Set up Java 17 - name: Set up Java 17
uses: actions/setup-java@v4 uses: actions/setup-java@v4
with: with:

View File

@ -15,7 +15,7 @@ concurrency:
jobs: jobs:
javascript-template: javascript-template:
runs-on: "ubuntu-22.04" runs-on: "ubuntu-24.04"
name: Template (target=release, tools=no) name: Template (target=release, tools=no)
steps: steps:

View File

@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file.
## [Master] ## [Master]
Nothing yet. - Backported everything up to and including https://github.com/godotengine/godot/commit/12e9b22777c5e8de47b6731e7b5367cf1276af21
## [4.5.0] ## [4.5.0]

View File

@ -44,7 +44,7 @@ static void *pandemonium_open(void *data, const char *p_fname, int mode) {
return nullptr; return nullptr;
} }
FileAccess *f = FileAccess::open(p_fname, FileAccess::READ); FileAccess *f = FileAccess::open(String::utf8(p_fname), FileAccess::READ);
ERR_FAIL_COND_V(!f, nullptr); ERR_FAIL_COND_V(!f, nullptr);
return f; return f;

View File

@ -714,13 +714,14 @@ PoolByteArray HTTPClient::read_response_body_chunk() {
chunk_left -= rec; chunk_left -= rec;
if (chunk_left == 0) { if (chunk_left == 0) {
if (chunk[chunk.size() - 2] != '\r' || chunk[chunk.size() - 1] != '\n') { const int chunk_size = chunk.size();
if (chunk[chunk_size - 2] != '\r' || chunk[chunk_size - 1] != '\n') {
ERR_PRINT("HTTP Invalid chunk terminator (not \\r\\n)"); ERR_PRINT("HTTP Invalid chunk terminator (not \\r\\n)");
status = STATUS_CONNECTION_ERROR; status = STATUS_CONNECTION_ERROR;
break; break;
} }
ret.resize(chunk.size() - 2); ret.resize(chunk_size - 2);
PoolByteArray::Write w = ret.write(); PoolByteArray::Write w = ret.write();
memcpy(w.ptr(), chunk.ptr(), ret.size()); memcpy(w.ptr(), chunk.ptr(), ret.size());
chunk.clear(); chunk.clear();

View File

@ -106,8 +106,21 @@ Error PacketPeerUDP::get_packet(const uint8_t **r_buffer, int &r_buffer_size) {
return ERR_UNAVAILABLE; return ERR_UNAVAILABLE;
} }
/* Bogus GCC warning here:
* In member function 'int RingBuffer<T>::read(T*, int, bool) [with T = unsigned char]',
* inlined from 'virtual Error PacketPeerUDP::get_packet(const uint8_t**, int&)' at core/io/packet_peer_udp.cpp:112:9,
* inlined from 'virtual Error PacketPeerUDP::get_packet(const uint8_t**, int&)' at core/io/packet_peer_udp.cpp:99:7:
* Error: ./core/ring_buffer.h:68:46: error: writing 1 byte into a region of size 0 [-Werror=stringop-overflow=]
* 68 | p_buf[dst++] = read[pos + i];
* | ~~~~~~~~~~~~~^~~~~~~
*/
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic push
#pragma GCC diagnostic warning "-Wstringop-overflow=0"
#endif
uint32_t size = 0; uint32_t size = 0;
uint8_t ipv6[16]; uint8_t ipv6[16] = {};
rb.read(ipv6, 16, true); rb.read(ipv6, 16, true);
packet_ip.set_ipv6(ipv6); packet_ip.set_ipv6(ipv6);
rb.read((uint8_t *)&packet_port, 4, true); rb.read((uint8_t *)&packet_port, 4, true);
@ -116,6 +129,11 @@ Error PacketPeerUDP::get_packet(const uint8_t **r_buffer, int &r_buffer_size) {
--queue_count; --queue_count;
*r_buffer = packet_buffer; *r_buffer = packet_buffer;
r_buffer_size = size; r_buffer_size = size;
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic pop
#endif
return OK; return OK;
} }

View File

@ -214,12 +214,12 @@ void StreamPeer::put_var(const Variant &p_variant, bool p_full_objects) {
} }
uint8_t StreamPeer::get_u8() { uint8_t StreamPeer::get_u8() {
uint8_t buf[1]; uint8_t buf[1] = {};
get_data(buf, 1); get_data(buf, 1);
return buf[0]; return buf[0];
} }
int8_t StreamPeer::get_8() { int8_t StreamPeer::get_8() {
uint8_t buf[1]; uint8_t buf[1] = {};
get_data(buf, 1); get_data(buf, 1);
return buf[0]; return buf[0];
} }

View File

@ -254,6 +254,10 @@ void TranslationServer::init_locale_info() {
} }
String TranslationServer::standardize_locale(const String &p_locale) const { String TranslationServer::standardize_locale(const String &p_locale) const {
return _standardize_locale(p_locale, false);
}
String TranslationServer::_standardize_locale(const String &p_locale, bool p_add_defaults) const {
// Replaces '-' with '_' for macOS style locales. // Replaces '-' with '_' for macOS style locales.
String univ_locale = p_locale.replace("-", "_"); String univ_locale = p_locale.replace("-", "_");
@ -315,6 +319,7 @@ String TranslationServer::standardize_locale(const String &p_locale) const {
} }
// Add script code base on language and country codes for some ambiguous cases. // Add script code base on language and country codes for some ambiguous cases.
if (p_add_defaults) {
if (script.empty()) { if (script.empty()) {
for (int i = 0; i < locale_script_info.size(); i++) { for (int i = 0; i < locale_script_info.size(); i++) {
const LocaleScriptInfo &info = locale_script_info[i]; const LocaleScriptInfo &info = locale_script_info[i];
@ -336,6 +341,7 @@ String TranslationServer::standardize_locale(const String &p_locale) const {
} }
} }
} }
}
// Combine results. // Combine results.
String locale = lang; String locale = lang;
@ -352,17 +358,34 @@ String TranslationServer::standardize_locale(const String &p_locale) const {
} }
int TranslationServer::compare_locales(const String &p_locale_a, const String &p_locale_b) const { int TranslationServer::compare_locales(const String &p_locale_a, const String &p_locale_b) const {
String locale_a = standardize_locale(p_locale_a); if (p_locale_a == p_locale_b) {
String locale_b = standardize_locale(p_locale_b); // Exact match.
return 10;
}
const String cache_key = p_locale_a + "|" + p_locale_b;
const int *cached_result = locale_compare_cache.getptr(cache_key);
if (cached_result) {
return *cached_result;
}
String locale_a = _standardize_locale(p_locale_a, true);
String locale_b = _standardize_locale(p_locale_b, true);
if (locale_a == locale_b) { if (locale_a == locale_b) {
// Exact match. // Exact match.
locale_compare_cache.set(cache_key, 10);
return 10; return 10;
} }
Vector<String> locale_a_elements = locale_a.split("_"); Vector<String> locale_a_elements = locale_a.split("_");
Vector<String> locale_b_elements = locale_b.split("_"); Vector<String> locale_b_elements = locale_b.split("_");
if (locale_a_elements[0] == locale_b_elements[0]) { if (locale_a_elements[0] != locale_b_elements[0]) {
// No match.
locale_compare_cache.set(cache_key, 0);
return 0;
}
// Matching language, both locales have extra parts. // Matching language, both locales have extra parts.
// Return number of matching elements. // Return number of matching elements.
int matching_elements = 1; int matching_elements = 1;
@ -373,11 +396,8 @@ int TranslationServer::compare_locales(const String &p_locale_a, const String &p
} }
} }
} }
locale_compare_cache.set(cache_key, matching_elements);
return matching_elements; return matching_elements;
} else {
// No match.
return 0;
}
} }
String TranslationServer::get_locale_name(const String &p_locale) const { String TranslationServer::get_locale_name(const String &p_locale) const {

View File

@ -88,6 +88,8 @@ class TranslationServer : public Object {
Ref<Translation> tool_translation; Ref<Translation> tool_translation;
Ref<Translation> doc_translation; Ref<Translation> doc_translation;
mutable HashMap<String, int> locale_compare_cache;
bool enabled; bool enabled;
static TranslationServer *singleton; static TranslationServer *singleton;
@ -123,6 +125,7 @@ public:
int compare_locales(const String &p_locale_a, const String &p_locale_b) const; int compare_locales(const String &p_locale_a, const String &p_locale_b) const;
String standardize_locale(const String &p_locale) const; String standardize_locale(const String &p_locale) const;
String _standardize_locale(const String &p_locale, bool p_add_defaults) const;
Vector<String> get_all_languages() const; Vector<String> get_all_languages() const;
String get_language_name(const String &p_language) const; String get_language_name(const String &p_language) const;

View File

@ -331,6 +331,10 @@ void String::copy_from(const wchar_t *p_cstr, const int p_clip_to) {
#endif #endif
} }
void String::copy_from(const Char16String &p_str) {
parse_utf16(p_str.ptr());
}
void String::copy_from(const CharType &p_char) { void String::copy_from(const CharType &p_char) {
if (p_char == 0) { if (p_char == 0) {
#if PRINT_UNICODE_ERRORS #if PRINT_UNICODE_ERRORS
@ -2731,13 +2735,16 @@ Vector<float> String::split_floats(const String &p_splitter, bool p_allow_empty)
int from = 0; int from = 0;
int len = length(); int len = length();
String buffer = *this;
while (true) { while (true) {
int end = find(p_splitter, from); int end = find(p_splitter, from);
if (end < 0) { if (end < 0) {
end = len; end = len;
} }
if (p_allow_empty || (end > from)) { if (p_allow_empty || (end > from)) {
ret.push_back(String::to_double(&get_data()[from])); buffer[end] = 0;
ret.push_back(String::to_double(&buffer.get_data()[from]));
buffer[end] = _cowdata.get(end);
} }
if (end == len) { if (end == len) {
@ -2755,6 +2762,7 @@ Vector<float> String::split_floats_mk(const Vector<String> &p_splitters, bool p_
int from = 0; int from = 0;
int len = length(); int len = length();
String buffer = *this;
while (true) { while (true) {
int idx; int idx;
int end = findmk(p_splitters, from, &idx); int end = findmk(p_splitters, from, &idx);
@ -2766,7 +2774,9 @@ Vector<float> String::split_floats_mk(const Vector<String> &p_splitters, bool p_
} }
if (p_allow_empty || (end > from)) { if (p_allow_empty || (end > from)) {
ret.push_back(String::to_double(&get_data()[from])); buffer[end] = 0;
ret.push_back(String::to_double(&buffer.get_data()[from]));
buffer[end] = _cowdata.get(end);
} }
if (end == len) { if (end == len) {
@ -5155,6 +5165,10 @@ String::String(const CharType *p_str) {
copy_from(p_str); copy_from(p_str);
} }
String::String(const Char16String &p_str) {
copy_from(p_str);
}
String::String(const char *p_str, int p_clip_to_len) { String::String(const char *p_str, int p_clip_to_len) {
copy_from(p_str, p_clip_to_len); copy_from(p_str, p_clip_to_len);
} }

View File

@ -569,6 +569,7 @@ public:
String(const char *p_str); String(const char *p_str);
String(const wchar_t *p_str); String(const wchar_t *p_str);
String(const CharType *p_str); String(const CharType *p_str);
String(const Char16String &p_str);
String(const char *p_str, int p_clip_to_len); String(const char *p_str, int p_clip_to_len);
String(const wchar_t *p_str, int p_clip_to_len); String(const wchar_t *p_str, int p_clip_to_len);
String(const CharType *p_str, int p_clip_to_len); String(const CharType *p_str, int p_clip_to_len);
@ -582,6 +583,7 @@ private:
void copy_from(const char *p_cstr, const int p_clip_to); void copy_from(const char *p_cstr, const int p_clip_to);
void copy_from(const wchar_t *p_cstr); void copy_from(const wchar_t *p_cstr);
void copy_from(const wchar_t *p_cstr, const int p_clip_to); void copy_from(const wchar_t *p_cstr, const int p_clip_to);
void copy_from(const Char16String &p_str);
void copy_from(const CharType *p_cstr); void copy_from(const CharType *p_cstr);
void copy_from(const CharType *p_cstr, const int p_clip_to); void copy_from(const CharType *p_cstr, const int p_clip_to);

View File

@ -113,6 +113,9 @@
<theme_item name="hover" data_type="style" type="StyleBox"> <theme_item name="hover" data_type="style" type="StyleBox">
[StyleBox] used when the [Button] is being hovered. [StyleBox] used when the [Button] is being hovered.
</theme_item> </theme_item>
<theme_item name="hover_pressed" data_type="style" type="StyleBox">
[StyleBox] used when the [Button] is being hovered and pressed.
</theme_item>
<theme_item name="normal" data_type="style" type="StyleBox"> <theme_item name="normal" data_type="style" type="StyleBox">
Default [StyleBox] for the [Button]. Default [StyleBox] for the [Button].
</theme_item> </theme_item>

View File

@ -230,6 +230,15 @@
<member name="glow_levels/7" type="bool" setter="set_glow_level" getter="is_glow_level_enabled" default="false"> <member name="glow_levels/7" type="bool" setter="set_glow_level" getter="is_glow_level_enabled" default="false">
If [code]true[/code], the 7th level of glow is enabled. This is the most "global" level (blurriest). If [code]true[/code], the 7th level of glow is enabled. This is the most "global" level (blurriest).
</member> </member>
<member name="glow_map" type="Texture" setter="set_glow_map" getter="get_glow_map">
The texture that should be used as a glow map to [i]multiply[/i] the resulting glow color according to [member glow_map_strength]. This can be used to create a "lens dirt" effect. The texture's RGB color channels are used for modulation, but the alpha channel is ignored.
[b]Note:[/b] The texture will be stretched to fit the screen. Therefore, it's recommended to use a texture with an aspect ratio that matches your project's base aspect ratio (typically 16:9).
[b]Note:[/b] [member glow_map] has no effect when using the GLES2 rendering method, due to this rendering method using a simpler glow implementation optimized for low-end devices.
</member>
<member name="glow_map_strength" type="float" setter="set_glow_map_strength" getter="get_glow_map_strength" default="0.8">
How strong of an impact the [member glow_map] should have on the overall glow effect. A strength of [code]0.0[/code] means the glow map has no effect on the overall glow effect. A strength of [code]1.0[/code] means the glow has a full effect on the overall glow effect (and can turn off glow entirely in specific areas of the screen if the glow map has black areas).
[b]Note:[/b] [member glow_map_strength] has no effect when using the GLES2 rendering method, due to this rendering method using a simpler glow implementation optimized for low-end devices.
</member>
<member name="glow_strength" type="float" setter="set_glow_strength" getter="get_glow_strength" default="1.0"> <member name="glow_strength" type="float" setter="set_glow_strength" getter="get_glow_strength" default="1.0">
The glow strength. When using the GLES2 renderer, this should be increased to 1.3 to compensate for the lack of HDR rendering. The glow strength. When using the GLES2 renderer, this should be increased to 1.3 to compensate for the lack of HDR rendering.
</member> </member>

View File

@ -211,6 +211,7 @@
If [code]exact[/code] is [code]false[/code], it ignores additional input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events. If [code]exact[/code] is [code]false[/code], it ignores additional input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
[b]Note:[/b] Returning [code]true[/code] does not imply that the action is [i]still[/i] pressed. An action can be pressed and released again rapidly, and [code]true[/code] will still be returned so as not to miss input. [b]Note:[/b] Returning [code]true[/code] does not imply that the action is [i]still[/i] pressed. An action can be pressed and released again rapidly, and [code]true[/code] will still be returned so as not to miss input.
[b]Note:[/b] Due to keyboard ghosting, [method is_action_just_pressed] may return [code]false[/code] even if one of the action's keys is pressed. See [url=$DOCS_URL/tutorials/inputs/input_examples.html#keyboard-events]Input examples[/url] in the documentation for more information. [b]Note:[/b] Due to keyboard ghosting, [method is_action_just_pressed] may return [code]false[/code] even if one of the action's keys is pressed. See [url=$DOCS_URL/tutorials/inputs/input_examples.html#keyboard-events]Input examples[/url] in the documentation for more information.
[b]Note:[/b] During input handling (e.g. [method Node._input]), use [method InputEvent.is_action_pressed] instead to query the action state of the current event.
</description> </description>
</method> </method>
<method name="is_action_just_released" qualifiers="const"> <method name="is_action_just_released" qualifiers="const">
@ -221,6 +222,7 @@
Returns [code]true[/code] when the user [i]stops[/i] pressing the action event in the current frame or physics tick. It will only return [code]true[/code] on the frame or tick that the user releases the button. Returns [code]true[/code] when the user [i]stops[/i] pressing the action event in the current frame or physics tick. It will only return [code]true[/code] on the frame or tick that the user releases the button.
If [code]exact[/code] is [code]false[/code], it ignores additional input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events. If [code]exact[/code] is [code]false[/code], it ignores additional input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
[b]Note:[/b] Returning [code]true[/code] does not imply that the action is [i]still[/i] not pressed. An action can be released and pressed again rapidly, and [code]true[/code] will still be returned so as not to miss input. [b]Note:[/b] Returning [code]true[/code] does not imply that the action is [i]still[/i] not pressed. An action can be released and pressed again rapidly, and [code]true[/code] will still be returned so as not to miss input.
[b]Note:[/b] During input handling (e.g. [method Node._input]), use [method InputEvent.is_action_released] instead to query the action state of the current event.
</description> </description>
</method> </method>
<method name="is_action_pressed" qualifiers="const"> <method name="is_action_pressed" qualifiers="const">

View File

@ -985,6 +985,15 @@
Sets the variables to be used with the "glow" post-process effect. See [Environment3D] for more details. Sets the variables to be used with the "glow" post-process effect. See [Environment3D] for more details.
</description> </description>
</method> </method>
<method name="environment_set_glow_map">
<return type="void" />
<argument index="0" name="env" type="RID" />
<argument index="1" name="glow_map_strength" type="float" />
<argument index="2" name="glow_map" type="RID" />
<description>
Sets the variables to be used with the glow map post-process effect. See [Environment] for more details.
</description>
</method>
<method name="environment_set_sky"> <method name="environment_set_sky">
<return type="void" /> <return type="void" />
<argument index="0" name="env" type="RID" /> <argument index="0" name="env" type="RID" />

View File

@ -59,6 +59,7 @@ import sys
sys.modules["_elementtree"] = None sys.modules["_elementtree"] = None
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
## override the parser to get the line number ## override the parser to get the line number
class LineNumberingParser(ET.XMLParser): class LineNumberingParser(ET.XMLParser):
def _start(self, *args, **kwargs): def _start(self, *args, **kwargs):

View File

@ -66,6 +66,7 @@ public:
void environment_set_dof_blur_near(RID p_env, bool p_enable, float p_distance, float p_transition, float p_far_amount, RS::Environment3DDOFBlurQuality p_quality) {} void environment_set_dof_blur_near(RID p_env, bool p_enable, float p_distance, float p_transition, float p_far_amount, RS::Environment3DDOFBlurQuality p_quality) {}
void environment_set_dof_blur_far(RID p_env, bool p_enable, float p_distance, float p_transition, float p_far_amount, RS::Environment3DDOFBlurQuality p_quality) {} void environment_set_dof_blur_far(RID p_env, bool p_enable, float p_distance, float p_transition, float p_far_amount, RS::Environment3DDOFBlurQuality p_quality) {}
void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, RS::Environment3DGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale, bool p_high_quality) {} void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, RS::Environment3DGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale, bool p_high_quality) {}
void environment_set_glow_map(RID p_env, float p_glow_map_strength, RID p_glow_map) {}
void environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture) {} void environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture) {}

View File

@ -841,6 +841,11 @@ void RasterizerSceneGLES2::environment_set_glow(RID p_env, bool p_enable, int p_
env->glow_high_quality = p_high_quality; env->glow_high_quality = p_high_quality;
} }
void RasterizerSceneGLES2::environment_set_glow_map(RID p_env, float p_glow_map_strength, RID p_glow_map) {
Environment3D *env = environment_owner.getornull(p_env);
ERR_FAIL_COND(!env);
}
void RasterizerSceneGLES2::environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture) { void RasterizerSceneGLES2::environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture) {
Environment3D *env = environment_owner.getornull(p_env); Environment3D *env = environment_owner.getornull(p_env);
ERR_FAIL_COND(!env); ERR_FAIL_COND(!env);

View File

@ -484,6 +484,8 @@ public:
virtual void environment_set_dof_blur_far(RID p_env, bool p_enable, float p_distance, float p_transition, float p_amount, RS::Environment3DDOFBlurQuality p_quality); virtual void environment_set_dof_blur_far(RID p_env, bool p_enable, float p_distance, float p_transition, float p_amount, RS::Environment3DDOFBlurQuality p_quality);
virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, RS::Environment3DGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale, bool p_high_quality); virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, RS::Environment3DGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale, bool p_high_quality);
virtual void environment_set_glow_map(RID p_env, float p_glow_map_strength, RID p_glow_map);
virtual void environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture); virtual void environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture);
virtual void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_in, float p_fade_out, float p_depth_tolerance, bool p_roughness); virtual void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_in, float p_fade_out, float p_depth_tolerance, bool p_roughness);

View File

@ -884,6 +884,15 @@ void RasterizerSceneGLES3::environment_set_glow(RID p_env, bool p_enable, int p_
env->glow_bicubic_upscale = p_bicubic_upscale; env->glow_bicubic_upscale = p_bicubic_upscale;
env->glow_high_quality = p_high_quality; env->glow_high_quality = p_high_quality;
} }
void RasterizerSceneGLES3::environment_set_glow_map(RID p_env, float p_glow_map_strength, RID p_glow_map) {
Environment3D *env = environment_owner.getornull(p_env);
ERR_FAIL_COND(!env);
env->glow_map_strength = p_glow_map_strength;
env->glow_map = p_glow_map;
}
void RasterizerSceneGLES3::environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture) { void RasterizerSceneGLES3::environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture) {
} }
@ -4022,7 +4031,7 @@ void RasterizerSceneGLES3::_post_process(Environment3D *env, const Projection &p
RasterizerStorageGLES3::Texture *tex = storage->texture_owner.getornull(env->color_correction); RasterizerStorageGLES3::Texture *tex = storage->texture_owner.getornull(env->color_correction);
if (tex) { if (tex) {
state.tonemap_shader.set_conditional(TonemapShaderGLES3::USE_COLOR_CORRECTION, true); state.tonemap_shader.set_conditional(TonemapShaderGLES3::USE_COLOR_CORRECTION, true);
WRAPPED_GL_ACTIVE_TEXTURE(GL_TEXTURE3); WRAPPED_GL_ACTIVE_TEXTURE(GL_TEXTURE4);
glBindTexture(tex->target, tex->tex_id); glBindTexture(tex->target, tex->tex_id);
} }
} }
@ -4037,6 +4046,14 @@ void RasterizerSceneGLES3::_post_process(Environment3D *env, const Projection &p
if (max_glow_level >= 0) { if (max_glow_level >= 0) {
state.tonemap_shader.set_uniform(TonemapShaderGLES3::GLOW_INTENSITY, env->glow_intensity); state.tonemap_shader.set_uniform(TonemapShaderGLES3::GLOW_INTENSITY, env->glow_intensity);
state.tonemap_shader.set_uniform(TonemapShaderGLES3::GLOW_MAP_STRENGTH, env->glow_map_strength);
RasterizerStorageGLES3::Texture *tex = storage->texture_owner.getornull(env->glow_map);
if (tex) {
WRAPPED_GL_ACTIVE_TEXTURE(GL_TEXTURE3);
glBindTexture(tex->target, tex->tex_id);
}
int ss[2] = { int ss[2] = {
storage->frame.current_rt->width, storage->frame.current_rt->width,
storage->frame.current_rt->height, storage->frame.current_rt->height,

View File

@ -413,6 +413,8 @@ public:
float glow_hdr_luminance_cap; float glow_hdr_luminance_cap;
bool glow_bicubic_upscale; bool glow_bicubic_upscale;
bool glow_high_quality; bool glow_high_quality;
float glow_map_strength;
RID glow_map;
RS::Environment3DToneMapper tone_mapper; RS::Environment3DToneMapper tone_mapper;
float tone_mapper_exposure; float tone_mapper_exposure;
@ -551,6 +553,8 @@ public:
virtual void environment_set_dof_blur_far(RID p_env, bool p_enable, float p_distance, float p_transition, float p_amount, RS::Environment3DDOFBlurQuality p_quality); virtual void environment_set_dof_blur_far(RID p_env, bool p_enable, float p_distance, float p_transition, float p_amount, RS::Environment3DDOFBlurQuality p_quality);
virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, RS::Environment3DGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale, bool p_high_quality); virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, RS::Environment3DGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale, bool p_high_quality);
virtual void environment_set_glow_map(RID p_env, float p_glow_map_strength, RID p_glow_map);
virtual void environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture); virtual void environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture);
virtual void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_in, float p_fade_out, float p_depth_tolerance, bool p_roughness); virtual void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_in, float p_fade_out, float p_depth_tolerance, bool p_roughness);

View File

@ -42,6 +42,8 @@ uniform highp float auto_exposure_grey;
uniform highp sampler2D source_glow; //texunit:2 uniform highp sampler2D source_glow; //texunit:2
uniform highp float glow_intensity; uniform highp float glow_intensity;
uniform highp float glow_map_strength;
uniform highp sampler2D glow_map; //texunit:3
#endif #endif
#ifdef USE_BCS #ifdef USE_BCS
@ -57,7 +59,7 @@ uniform float sharpen_intensity;
#endif #endif
#ifdef USE_COLOR_CORRECTION #ifdef USE_COLOR_CORRECTION
uniform sampler2D color_correction; //texunit:3 uniform sampler2D color_correction; //texunit:4
#endif #endif
layout(location = 0) out vec4 frag_color; layout(location = 0) out vec4 frag_color;
@ -482,6 +484,9 @@ void main() {
#ifdef USING_GLOW #ifdef USING_GLOW
vec3 glow = gather_glow(source_glow, uv_interp) * glow_intensity; vec3 glow = gather_glow(source_glow, uv_interp) * glow_intensity;
if (glow_map_strength > 0.001) {
glow = mix(glow, texture(glow_map, vec2(uv_interp.x, 1.0 - uv_interp.y)).rgb * glow, glow_map_strength);
}
// high dynamic range -> SRGB // high dynamic range -> SRGB
glow = apply_tonemapping(glow, white); glow = apply_tonemapping(glow, white);

View File

@ -3,6 +3,7 @@
All such functions are invoked in a subprocess on Windows to prevent build flakiness. All such functions are invoked in a subprocess on Windows to prevent build flakiness.
""" """
import os import os
import os.path import os.path
import shutil import shutil

View File

@ -3,6 +3,7 @@
All such functions are invoked in a subprocess on Windows to prevent build flakiness. All such functions are invoked in a subprocess on Windows to prevent build flakiness.
""" """
import os import os
from platform_methods import subprocess_main from platform_methods import subprocess_main
from compat import StringIO from compat import StringIO

View File

@ -19,6 +19,7 @@
import os import os
from array import array from array import array
# Generates a C++ file from the specified binary resource file # Generates a C++ file from the specified binary resource file
def generate(in_path, out_path): def generate(in_path, out_path):

View File

@ -3,6 +3,7 @@
All such functions are invoked in a subprocess on Windows to prevent build flakiness. All such functions are invoked in a subprocess on Windows to prevent build flakiness.
""" """
from platform_methods import subprocess_main from platform_methods import subprocess_main
import re import re

View File

@ -3,6 +3,7 @@
All such functions are invoked in a subprocess on Windows to prevent build flakiness. All such functions are invoked in a subprocess on Windows to prevent build flakiness.
""" """
from platform_methods import subprocess_main from platform_methods import subprocess_main
from compat import byte_to_str from compat import byte_to_str
from collections import OrderedDict from collections import OrderedDict

View File

@ -1254,6 +1254,67 @@ bool test_37() {
return true; return true;
} }
bool test_38() {
#define CHECK_ARR_LEN(arr, len) \
if (arr.size() != len) { \
OS::get_singleton()->print("\tFAIL: Length of %s should be %d, got %d\n", #arr, len, arr.size()); \
return false; \
} else { \
OS::get_singleton()->print("\tPASS\n"); \
}
#define CHECK_ARR_ELEMENT(arr, i, expect) \
if (ABS(arr[i] - expect) > 0.00001) { \
OS::get_singleton()->print("\tFAIL: %s[%d] %f != %f\n", #arr, i, arr[i], expect); \
return false; \
} else { \
OS::get_singleton()->print("\tPASS\n"); \
}
OS::get_singleton()->print("\n\nTest 38: split_floats\n");
{
const String s = "1.2;2.3 4.5";
const float slices[3] = { 1.2, 2.3, 4.5 };
const Vector<float> d_arr = s.split_floats(";");
CHECK_ARR_LEN(d_arr, 2);
for (int i = 0; i < 2; i++) {
CHECK_ARR_ELEMENT(d_arr, i, slices[i]);
}
Vector<String> keys;
keys.push_back(";");
keys.push_back(" ");
const Vector<float> f_arr = s.split_floats_mk(keys);
CHECK_ARR_LEN(f_arr, 3);
for (int i = 0; i < 3; i++) {
CHECK_ARR_ELEMENT(f_arr, i, slices[i]);
}
}
{
const String s = " -2.0 5";
const float slices[10] = { 0, -2, 0, 0, 0, 0, 0, 0, 0, 5 };
const Vector<float> d_arr = s.split_floats(" ");
CHECK_ARR_LEN(d_arr, 10);
for (int i = 0; i < 10; i++) {
CHECK_ARR_ELEMENT(d_arr, i, slices[i]);
}
Vector<String> keys;
keys.push_back(";");
keys.push_back(" ");
const Vector<float> f_arr = s.split_floats_mk(keys);
CHECK_ARR_LEN(f_arr, 10);
for (int i = 0; i < 10; i++) {
CHECK_ARR_ELEMENT(f_arr, i, slices[i]);
}
}
return true;
}
typedef bool (*TestFunc)(); typedef bool (*TestFunc)();
TestFunc test_funcs[] = { TestFunc test_funcs[] = {
@ -1295,6 +1356,7 @@ TestFunc test_funcs[] = {
test_35, test_35,
test_36, test_36,
test_37, test_37,
test_38,
nullptr nullptr
}; };

View File

@ -1,4 +0,0 @@
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

View File

@ -0,0 +1 @@
3.47.0

View File

@ -0,0 +1,26 @@
From ad572cdfdb2cac970aa1dd291583b72b7f89f9fb Mon Sep 17 00:00:00 2001
From: Relintai <relintai@protonmail.com>
Date: Thu, 14 Nov 2024 20:07:24 +0100
Subject: [PATCH] Reapply SQLITE_NO_FCHOWN Pandemonium sqlite patch.
---
modules/database_sqlite/sqlite/sqlite3.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/modules/database_sqlite/sqlite/sqlite3.c b/modules/database_sqlite/sqlite/sqlite3.c
index 2886d04ae..9918449b9 100644
--- a/modules/database_sqlite/sqlite/sqlite3.c
+++ b/modules/database_sqlite/sqlite/sqlite3.c
@@ -168,7 +168,9 @@
#else
/* This is not VxWorks. */
#define OS_VXWORKS 0
+#ifndef SQLITE_NO_FCHOWN
#define HAVE_FCHOWN 1
+#endif
#define HAVE_READLINK 1
#define HAVE_LSTAT 1
#endif /* defined(_WRS_KERNEL) */
--
2.47.0

View File

@ -3,6 +3,7 @@
All such functions are invoked in a subprocess on Windows to prevent build flakiness. All such functions are invoked in a subprocess on Windows to prevent build flakiness.
""" """
import json import json
from platform_methods import subprocess_main from platform_methods import subprocess_main

View File

@ -84,7 +84,12 @@ void GDScript::_clear_pending_func_states() {
// Order matters since clearing the stack may already cause // Order matters since clearing the stack may already cause
// the GDSCriptFunctionState to be destroyed and thus removed from the list. // the GDSCriptFunctionState to be destroyed and thus removed from the list.
pending_func_states.remove(E); pending_func_states.remove(E);
E->self()->_clear_stack(); GDScriptFunctionState *state = E->self();
ObjectID state_id = state->get_instance_id();
state->_clear_connections();
if (ObjectDB::get_instance(state_id)) {
state->_clear_stack();
}
} }
GDScriptLanguage::get_singleton()->lock.unlock(); GDScriptLanguage::get_singleton()->lock.unlock();
} }
@ -1339,7 +1344,12 @@ GDScriptInstance::~GDScriptInstance() {
// Order matters since clearing the stack may already cause // Order matters since clearing the stack may already cause
// the GDSCriptFunctionState to be destroyed and thus removed from the list. // the GDSCriptFunctionState to be destroyed and thus removed from the list.
pending_func_states.remove(E); pending_func_states.remove(E);
E->self()->_clear_stack(); GDScriptFunctionState *state = E->self();
ObjectID state_id = state->get_instance_id();
state->_clear_connections();
if (ObjectDB::get_instance(state_id)) {
state->_clear_stack();
}
} }
if (script.is_valid() && owner) { if (script.is_valid() && owner) {

View File

@ -1859,6 +1859,15 @@ void GDScriptFunctionState::_clear_stack() {
} }
} }
void GDScriptFunctionState::_clear_connections() {
List<Object::Connection> conns;
get_signals_connected_to_this(&conns);
for (List<Object::Connection>::Element *E = conns.front(); E; E = E->next()) {
Object::Connection &c = E->get();
c.source->disconnect(c.signal, c.target, c.method);
}
}
void GDScriptFunctionState::_bind_methods() { void GDScriptFunctionState::_bind_methods() {
ClassDB::bind_method(D_METHOD("resume", "arg"), &GDScriptFunctionState::resume, DEFVAL(Variant())); ClassDB::bind_method(D_METHOD("resume", "arg"), &GDScriptFunctionState::resume, DEFVAL(Variant()));
ClassDB::bind_method(D_METHOD("is_valid", "extended_check"), &GDScriptFunctionState::is_valid, DEFVAL(false)); ClassDB::bind_method(D_METHOD("is_valid", "extended_check"), &GDScriptFunctionState::is_valid, DEFVAL(false));

View File

@ -374,6 +374,7 @@ public:
Variant resume(const Variant &p_arg = Variant()); Variant resume(const Variant &p_arg = Variant());
void _clear_stack(); void _clear_stack();
void _clear_connections();
GDScriptFunctionState(); GDScriptFunctionState();
~GDScriptFunctionState(); ~GDScriptFunctionState();

View File

@ -1329,7 +1329,8 @@ void TileMap::_set_tile_data(const PoolVector<int> &p_data) {
for (int i = 0; i < c; i += offset) { for (int i = 0; i < c; i += offset) {
const uint8_t *ptr = (const uint8_t *)&r[i]; const uint8_t *ptr = (const uint8_t *)&r[i];
uint8_t local[12]; uint8_t local[12];
for (int j = 0; j < ((format == FORMAT_2) ? 12 : 8); j++) { const int buffer_size = (format == FORMAT_2) ? 12 : 8;
for (int j = 0; j < buffer_size; j++) {
local[j] = ptr[j]; local[j] = ptr[j];
} }

View File

@ -3,6 +3,7 @@
All such functions are invoked in a subprocess on Windows to prevent build flakiness. All such functions are invoked in a subprocess on Windows to prevent build flakiness.
""" """
import os import os
from platform_methods import subprocess_main from platform_methods import subprocess_main

View File

@ -2982,7 +2982,8 @@ Error OS_Windows::execute(const String &p_path, const List<String> &p_arguments,
CloseHandle(pipe[0]); // Cleanup pipe handles. CloseHandle(pipe[0]); // Cleanup pipe handles.
CloseHandle(pipe[1]); CloseHandle(pipe[1]);
} }
ERR_FAIL_COND_V(ret == 0, ERR_CANT_FORK);
ERR_FAIL_COND_V_MSG(ret == 0, ERR_CANT_FORK, "Could not create child process: " + String(modstr));
if (p_blocking) { if (p_blocking) {
if (r_pipe) { if (r_pipe) {

View File

@ -3,6 +3,7 @@
All such functions are invoked in a subprocess on Windows to prevent build flakiness. All such functions are invoked in a subprocess on Windows to prevent build flakiness.
""" """
import os import os
from platform_methods import subprocess_main from platform_methods import subprocess_main

View File

@ -3,6 +3,7 @@
All such functions are invoked in a subprocess on Windows to prevent build flakiness. All such functions are invoked in a subprocess on Windows to prevent build flakiness.
""" """
import os import os
from platform_methods import subprocess_main from platform_methods import subprocess_main

View File

@ -1085,7 +1085,12 @@ Vector3 KinematicBody::_move_and_slide_internal(const Vector3 &p_linear_velocity
// We need to check the on_floor_body still exists before accessing. // We need to check the on_floor_body still exists before accessing.
// A valid RID is no guarantee that the object has not been deleted. // A valid RID is no guarantee that the object has not been deleted.
if (ObjectDB::get_instance(on_floor_body_id)) {
// We can only perform the ObjectDB lifetime check on Object derived objects.
// Note that physics also creates RIDs for non-Object derived objects, these cannot
// be lifetime checked through ObjectDB, and therefore there is a still a vulnerability
// to dangling RIDs (access after free) in this scenario.
if (!on_floor_body_id || ObjectDB::get_instance(on_floor_body_id)) {
// This approach makes sure there is less delay between the actual body velocity and the one we saved. // This approach makes sure there is less delay between the actual body velocity and the one we saved.
bs = PhysicsServer::get_singleton()->body_get_direct_state(on_floor_body_rid); bs = PhysicsServer::get_singleton()->body_get_direct_state(on_floor_body_rid);
} }

View File

@ -35,8 +35,6 @@
#include "core/input/shortcut.h" #include "core/input/shortcut.h"
#include "core/os/keyboard.h" #include "core/os/keyboard.h"
#include "core/os/os.h" #include "core/os/os.h"
#include "core/string/print_string.h"
#include "core/string/translation.h"
#include "scene/gui/margin_container.h" #include "scene/gui/margin_container.h"
#include "scene/gui/scroll_bar.h" #include "scene/gui/scroll_bar.h"
#include "scene/gui/scroll_container.h" #include "scene/gui/scroll_container.h"
@ -144,8 +142,7 @@ int PopupMenu::_get_items_total_height() const {
items_total_height += MAX(items[i].get_icon_size().height, font_height) + vsep; items_total_height += MAX(items[i].get_icon_size().height, font_height) + vsep;
} }
// Subtract a separator which is not needed for the last item. return items_total_height;
return items_total_height - vsep;
} }
void PopupMenu::_scroll_to_item(int p_item) { void PopupMenu::_scroll_to_item(int p_item) {
@ -174,16 +171,12 @@ int PopupMenu::_get_mouse_over(const Point2 &p_over) const {
int vseparation = get_theme_constant("vseparation"); int vseparation = get_theme_constant("vseparation");
float font_h = get_theme_font("font")->get_height(); float font_h = get_theme_font("font")->get_height();
Point2 ofs = style->get_offset() + Point2(0, vseparation / 2); real_t ofs = style->get_margin(MARGIN_TOP) + control->get_position().y;
for (int i = 0; i < items.size(); i++) { for (int i = 0; i < items.size(); i++) {
if (i > 0) { ofs += MAX(items[i].get_icon_size().height, font_h) + vseparation;
ofs.y += vseparation;
}
ofs.y += MAX(items[i].get_icon_size().height, font_h); if (p_over.y < ofs) {
if (p_over.y - control->get_position().y < ofs.y) {
return i; return i;
} }
} }
@ -354,7 +347,7 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) {
// Make an area which does not include v scrollbar, so that items are not activated when dragging scrollbar. // Make an area which does not include v scrollbar, so that items are not activated when dragging scrollbar.
Transform2D xform = get_global_transform_with_canvas(); Transform2D xform = get_global_transform_with_canvas();
Point2 item_origin = xform.get_origin(); Point2 item_origin = scroll_container->get_global_position();
float scroll_width = scroll_container->get_v_scrollbar()->is_visible_in_tree() ? scroll_container->get_v_scrollbar()->get_size().width : 0; float scroll_width = scroll_container->get_v_scrollbar()->is_visible_in_tree() ? scroll_container->get_v_scrollbar()->get_size().width : 0;
Size2 item_size = (control->get_global_rect().get_size() - Vector2(scroll_width, 0)) * xform.get_scale(); Size2 item_size = (control->get_global_rect().get_size() - Vector2(scroll_width, 0)) * xform.get_scale();
Rect2 item_clickable_area = Rect2(item_origin, item_size); Rect2 item_clickable_area = Rect2(item_origin, item_size);
@ -493,9 +486,9 @@ void PopupMenu::_draw_items() {
margin_size.width = margin_container->get_theme_constant("margin_right") + margin_container->get_theme_constant("margin_left"); margin_size.width = margin_container->get_theme_constant("margin_right") + margin_container->get_theme_constant("margin_left");
margin_size.height = margin_container->get_theme_constant("margin_top") + margin_container->get_theme_constant("margin_bottom"); margin_size.height = margin_container->get_theme_constant("margin_top") + margin_container->get_theme_constant("margin_bottom");
Ref<StyleBox> style = get_theme_stylebox("panel");
Ref<StyleBox> hover = get_theme_stylebox("hover"); Ref<StyleBox> hover = get_theme_stylebox("hover");
Ref<Font> font = get_theme_font("font"); Ref<Font> font = get_theme_font("font");
select_font(font); select_font(font);
// In Item::checkable_type enum order (less the non-checkable member) // In Item::checkable_type enum order (less the non-checkable member)
@ -536,7 +529,7 @@ void PopupMenu::_draw_items() {
check_ofs = MAX(get_theme_icon("checked")->get_width(), get_theme_icon("radio_checked")->get_width()) + hseparation; check_ofs = MAX(get_theme_icon("checked")->get_width(), get_theme_icon("radio_checked")->get_width()) + hseparation;
} }
Point2 ofs = Point2(); Point2 ofs = Point2(0, vseparation / 2);
// Loop through all items and draw each. // Loop through all items and draw each.
for (int i = 0; i < items.size(); i++) { for (int i = 0; i < items.size(); i++) {

View File

@ -1729,7 +1729,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool
cache.click_id = c.buttons[j].id; cache.click_id = c.buttons[j].id;
cache.click_item = p_item; cache.click_item = p_item;
cache.click_column = col; cache.click_column = col;
cache.click_pos = get_global_mouse_position() - get_global_position(); cache.click_pos = get_local_mouse_position();
update(); update();
//emit_signal("button_pressed"); //emit_signal("button_pressed");
return -1; return -1;

View File

@ -231,6 +231,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
theme->set_stylebox("normal", "Button", sb_button_normal); theme->set_stylebox("normal", "Button", sb_button_normal);
theme->set_stylebox("pressed", "Button", sb_button_pressed); theme->set_stylebox("pressed", "Button", sb_button_pressed);
theme->set_stylebox("hover", "Button", sb_button_hover); theme->set_stylebox("hover", "Button", sb_button_hover);
theme->set_stylebox("hover_pressed", "Button", sb_button_hover);
theme->set_stylebox("disabled", "Button", sb_button_disabled); theme->set_stylebox("disabled", "Button", sb_button_disabled);
theme->set_stylebox("focus", "Button", sb_button_focus); theme->set_stylebox("focus", "Button", sb_button_focus);

View File

@ -487,7 +487,7 @@ float Environment3D::get_ssao_edge_sharpness() const {
void Environment3D::set_glow_enabled(bool p_enabled) { void Environment3D::set_glow_enabled(bool p_enabled) {
glow_enabled = p_enabled; glow_enabled = p_enabled;
RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, RS::Environment3DGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_scale, glow_hdr_luminance_cap, glow_bicubic_upscale, glow_high_quality); _update_glow();
_change_notify(); _change_notify();
} }
@ -504,7 +504,7 @@ void Environment3D::set_glow_level(int p_level, bool p_enabled) {
glow_levels &= ~(1 << p_level); glow_levels &= ~(1 << p_level);
} }
RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, RS::Environment3DGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_scale, glow_hdr_luminance_cap, glow_bicubic_upscale, glow_high_quality); _update_glow();
} }
bool Environment3D::is_glow_level_enabled(int p_level) const { bool Environment3D::is_glow_level_enabled(int p_level) const {
ERR_FAIL_INDEX_V(p_level, RS::MAX_GLOW_LEVELS, false); ERR_FAIL_INDEX_V(p_level, RS::MAX_GLOW_LEVELS, false);
@ -515,7 +515,7 @@ bool Environment3D::is_glow_level_enabled(int p_level) const {
void Environment3D::set_glow_intensity(float p_intensity) { void Environment3D::set_glow_intensity(float p_intensity) {
glow_intensity = p_intensity; glow_intensity = p_intensity;
RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, RS::Environment3DGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_scale, glow_hdr_luminance_cap, glow_bicubic_upscale, glow_high_quality); _update_glow();
} }
float Environment3D::get_glow_intensity() const { float Environment3D::get_glow_intensity() const {
return glow_intensity; return glow_intensity;
@ -523,7 +523,8 @@ float Environment3D::get_glow_intensity() const {
void Environment3D::set_glow_strength(float p_strength) { void Environment3D::set_glow_strength(float p_strength) {
glow_strength = p_strength; glow_strength = p_strength;
RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, RS::Environment3DGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_scale, glow_hdr_luminance_cap, glow_bicubic_upscale, glow_high_quality);
_update_glow();
} }
float Environment3D::get_glow_strength() const { float Environment3D::get_glow_strength() const {
return glow_strength; return glow_strength;
@ -532,7 +533,7 @@ float Environment3D::get_glow_strength() const {
void Environment3D::set_glow_bloom(float p_threshold) { void Environment3D::set_glow_bloom(float p_threshold) {
glow_bloom = p_threshold; glow_bloom = p_threshold;
RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, RS::Environment3DGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_scale, glow_hdr_luminance_cap, glow_bicubic_upscale, glow_high_quality); _update_glow();
} }
float Environment3D::get_glow_bloom() const { float Environment3D::get_glow_bloom() const {
return glow_bloom; return glow_bloom;
@ -541,7 +542,7 @@ float Environment3D::get_glow_bloom() const {
void Environment3D::set_glow_blend_mode(GlowBlendMode p_mode) { void Environment3D::set_glow_blend_mode(GlowBlendMode p_mode) {
glow_blend_mode = p_mode; glow_blend_mode = p_mode;
RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, RS::Environment3DGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_scale, glow_hdr_luminance_cap, glow_bicubic_upscale, glow_high_quality); _update_glow();
} }
Environment3D::GlowBlendMode Environment3D::get_glow_blend_mode() const { Environment3D::GlowBlendMode Environment3D::get_glow_blend_mode() const {
return glow_blend_mode; return glow_blend_mode;
@ -550,7 +551,7 @@ Environment3D::GlowBlendMode Environment3D::get_glow_blend_mode() const {
void Environment3D::set_glow_hdr_bleed_threshold(float p_threshold) { void Environment3D::set_glow_hdr_bleed_threshold(float p_threshold) {
glow_hdr_bleed_threshold = p_threshold; glow_hdr_bleed_threshold = p_threshold;
RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, RS::Environment3DGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_scale, glow_hdr_luminance_cap, glow_bicubic_upscale, glow_high_quality); _update_glow();
} }
float Environment3D::get_glow_hdr_bleed_threshold() const { float Environment3D::get_glow_hdr_bleed_threshold() const {
return glow_hdr_bleed_threshold; return glow_hdr_bleed_threshold;
@ -559,7 +560,7 @@ float Environment3D::get_glow_hdr_bleed_threshold() const {
void Environment3D::set_glow_hdr_luminance_cap(float p_amount) { void Environment3D::set_glow_hdr_luminance_cap(float p_amount) {
glow_hdr_luminance_cap = p_amount; glow_hdr_luminance_cap = p_amount;
RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, RS::Environment3DGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_scale, glow_hdr_luminance_cap, glow_bicubic_upscale, glow_high_quality); _update_glow();
} }
float Environment3D::get_glow_hdr_luminance_cap() const { float Environment3D::get_glow_hdr_luminance_cap() const {
return glow_hdr_luminance_cap; return glow_hdr_luminance_cap;
@ -568,7 +569,7 @@ float Environment3D::get_glow_hdr_luminance_cap() const {
void Environment3D::set_glow_hdr_bleed_scale(float p_scale) { void Environment3D::set_glow_hdr_bleed_scale(float p_scale) {
glow_hdr_bleed_scale = p_scale; glow_hdr_bleed_scale = p_scale;
RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, RS::Environment3DGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_scale, glow_hdr_luminance_cap, glow_bicubic_upscale, glow_high_quality); _update_glow();
} }
float Environment3D::get_glow_hdr_bleed_scale() const { float Environment3D::get_glow_hdr_bleed_scale() const {
return glow_hdr_bleed_scale; return glow_hdr_bleed_scale;
@ -576,7 +577,8 @@ float Environment3D::get_glow_hdr_bleed_scale() const {
void Environment3D::set_glow_bicubic_upscale(bool p_enable) { void Environment3D::set_glow_bicubic_upscale(bool p_enable) {
glow_bicubic_upscale = p_enable; glow_bicubic_upscale = p_enable;
RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, RS::Environment3DGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_scale, glow_hdr_luminance_cap, glow_bicubic_upscale, glow_high_quality);
_update_glow();
} }
bool Environment3D::is_glow_bicubic_upscale_enabled() const { bool Environment3D::is_glow_bicubic_upscale_enabled() const {
@ -585,13 +587,59 @@ bool Environment3D::is_glow_bicubic_upscale_enabled() const {
void Environment3D::set_glow_high_quality(bool p_enable) { void Environment3D::set_glow_high_quality(bool p_enable) {
glow_high_quality = p_enable; glow_high_quality = p_enable;
RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, RS::Environment3DGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_scale, glow_hdr_luminance_cap, glow_bicubic_upscale, glow_high_quality);
_update_glow();
} }
bool Environment3D::is_glow_high_quality_enabled() const { bool Environment3D::is_glow_high_quality_enabled() const {
return glow_high_quality; return glow_high_quality;
} }
void Environment3D::set_glow_map_strength(float p_glow_map_strength) {
glow_map_strength = p_glow_map_strength;
_update_glow_map();
}
float Environment3D::get_glow_map_strength() const {
return glow_map_strength;
}
void Environment3D::set_glow_map(Ref<Texture> p_glow_map) {
glow_map = p_glow_map;
_update_glow_map();
}
Ref<Texture> Environment3D::get_glow_map() const {
return glow_map;
}
void Environment3D::_update_glow() {
RS::get_singleton()->environment_set_glow(
environment,
glow_enabled,
glow_levels,
glow_intensity,
glow_strength,
glow_bloom,
RS::Environment3DGlowBlendMode(glow_blend_mode),
glow_hdr_bleed_threshold,
glow_hdr_bleed_scale,
glow_hdr_luminance_cap,
glow_bicubic_upscale,
glow_high_quality);
}
void Environment3D::_update_glow_map() {
float _glow_map_strength = 0.0f;
RID glow_map_rid;
if (glow_map.is_valid()) {
glow_map_rid = glow_map->get_rid();
_glow_map_strength = glow_map_strength;
}
RS::get_singleton()->environment_set_glow_map(environment, _glow_map_strength, glow_map_rid);
}
void Environment3D::set_dof_blur_far_enabled(bool p_enable) { void Environment3D::set_dof_blur_far_enabled(bool p_enable) {
dof_blur_far_enabled = p_enable; dof_blur_far_enabled = p_enable;
RS::get_singleton()->environment_set_dof_blur_far(environment, dof_blur_far_enabled, dof_blur_far_distance, dof_blur_far_transition, dof_blur_far_amount, RS::Environment3DDOFBlurQuality(dof_blur_far_quality)); RS::get_singleton()->environment_set_dof_blur_far(environment, dof_blur_far_enabled, dof_blur_far_distance, dof_blur_far_transition, dof_blur_far_amount, RS::Environment3DDOFBlurQuality(dof_blur_far_quality));
@ -1086,6 +1134,12 @@ void Environment3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_glow_high_quality", "enabled"), &Environment3D::set_glow_high_quality); ClassDB::bind_method(D_METHOD("set_glow_high_quality", "enabled"), &Environment3D::set_glow_high_quality);
ClassDB::bind_method(D_METHOD("is_glow_high_quality_enabled"), &Environment3D::is_glow_high_quality_enabled); ClassDB::bind_method(D_METHOD("is_glow_high_quality_enabled"), &Environment3D::is_glow_high_quality_enabled);
ClassDB::bind_method(D_METHOD("set_glow_map_strength", "strength"), &Environment3D::set_glow_map_strength);
ClassDB::bind_method(D_METHOD("get_glow_map_strength"), &Environment3D::get_glow_map_strength);
ClassDB::bind_method(D_METHOD("set_glow_map", "mode"), &Environment3D::set_glow_map);
ClassDB::bind_method(D_METHOD("get_glow_map"), &Environment3D::get_glow_map);
ADD_GROUP("Glow", "glow_"); ADD_GROUP("Glow", "glow_");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "glow_enabled"), "set_glow_enabled", "is_glow_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "glow_enabled"), "set_glow_enabled", "is_glow_enabled");
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "glow_levels/1"), "set_glow_level", "is_glow_level_enabled", 0); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "glow_levels/1"), "set_glow_level", "is_glow_level_enabled", 0);
@ -1105,6 +1159,8 @@ void Environment3D::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::REAL, "glow_hdr_scale", PROPERTY_HINT_RANGE, "0.0,4.0,0.01"), "set_glow_hdr_bleed_scale", "get_glow_hdr_bleed_scale"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "glow_hdr_scale", PROPERTY_HINT_RANGE, "0.0,4.0,0.01"), "set_glow_hdr_bleed_scale", "get_glow_hdr_bleed_scale");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "glow_bicubic_upscale"), "set_glow_bicubic_upscale", "is_glow_bicubic_upscale_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "glow_bicubic_upscale"), "set_glow_bicubic_upscale", "is_glow_bicubic_upscale_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "glow_high_quality"), "set_glow_high_quality", "is_glow_high_quality_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "glow_high_quality"), "set_glow_high_quality", "is_glow_high_quality_enabled");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "glow_map_strength", PROPERTY_HINT_RANGE, "0.0,1.0,0.01"), "set_glow_map_strength", "get_glow_map_strength");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "glow_map", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_glow_map", "get_glow_map");
ClassDB::bind_method(D_METHOD("set_adjustment_enable", "enabled"), &Environment3D::set_adjustment_enable); ClassDB::bind_method(D_METHOD("set_adjustment_enable", "enabled"), &Environment3D::set_adjustment_enable);
ClassDB::bind_method(D_METHOD("is_adjustment_enabled"), &Environment3D::is_adjustment_enabled); ClassDB::bind_method(D_METHOD("is_adjustment_enabled"), &Environment3D::is_adjustment_enabled);
@ -1229,6 +1285,7 @@ Environment3D::Environment3D() :
glow_hdr_bleed_scale = 2.0; glow_hdr_bleed_scale = 2.0;
glow_bicubic_upscale = false; glow_bicubic_upscale = false;
glow_high_quality = false; glow_high_quality = false;
glow_map_strength = 0.8f;
dof_blur_far_enabled = false; dof_blur_far_enabled = false;
dof_blur_far_distance = 10; dof_blur_far_distance = 10;
@ -1268,3 +1325,4 @@ Environment3D::Environment3D() :
Environment3D::~Environment3D() { Environment3D::~Environment3D() {
RS::get_singleton()->free(environment); RS::get_singleton()->free(environment);
} }

View File

@ -147,6 +147,11 @@ private:
float glow_hdr_luminance_cap; float glow_hdr_luminance_cap;
bool glow_bicubic_upscale; bool glow_bicubic_upscale;
bool glow_high_quality; bool glow_high_quality;
float glow_map_strength;
Ref<Texture> glow_map;
void _update_glow();
void _update_glow_map();
bool dof_blur_far_enabled; bool dof_blur_far_enabled;
float dof_blur_far_distance; float dof_blur_far_distance;
@ -335,6 +340,12 @@ public:
void set_glow_high_quality(bool p_enable); void set_glow_high_quality(bool p_enable);
bool is_glow_high_quality_enabled() const; bool is_glow_high_quality_enabled() const;
void set_glow_map_strength(float p_glow_map_strength);
float get_glow_map_strength() const;
void set_glow_map(Ref<Texture> p_glow_map);
Ref<Texture> get_glow_map() const;
void set_dof_blur_far_enabled(bool p_enable); void set_dof_blur_far_enabled(bool p_enable);
bool is_dof_blur_far_enabled() const; bool is_dof_blur_far_enabled() const;

View File

@ -1,5 +1,6 @@
"""Functions used to generate scu build source files during build time """Functions used to generate scu build source files during build time
""" """
import glob, os import glob, os
import math import math
from pathlib import Path from pathlib import Path
@ -158,6 +159,7 @@ def find_section_name(sub_folder):
# which is slow like a normal build, but prevents the naming conflicts. # which is slow like a normal build, but prevents the naming conflicts.
# Ideally in these situations, the source code should be changed to prevent naming conflicts. # Ideally in these situations, the source code should be changed to prevent naming conflicts.
# "extension" will usually be cpp, but can also be set to c (for e.g. third party libraries that use c) # "extension" will usually be cpp, but can also be set to c (for e.g. third party libraries that use c)
def process_folder(folders, sought_exceptions=[], includes_per_scu=0, extension="cpp"): def process_folder(folders, sought_exceptions=[], includes_per_scu=0, extension="cpp"):
if len(folders) == 0: if len(folders) == 0:

View File

@ -232,12 +232,14 @@ AudioStreamPlaybackMicrophone::AudioStreamPlaybackMicrophone() {
//////////////////////////////// ////////////////////////////////
void AudioStreamRandomPitch::set_audio_stream(const Ref<AudioStream> &p_audio_stream) { void AudioStreamRandomPitch::set_audio_stream(const Ref<AudioStream> &p_audio_stream) {
AudioServer::get_singleton()->lock();
audio_stream = p_audio_stream; audio_stream = p_audio_stream;
if (audio_stream.is_valid()) { if (audio_stream.is_valid()) {
for (RBSet<AudioStreamPlaybackRandomPitch *>::Element *E = playbacks.front(); E; E = E->next()) { for (RBSet<AudioStreamPlaybackRandomPitch *>::Element *E = playbacks.front(); E; E = E->next()) {
E->get()->playback = audio_stream->instance_playback(); E->get()->playback = audio_stream->instance_playback();
} }
} }
AudioServer::get_singleton()->unlock();
} }
Ref<AudioStream> AudioStreamRandomPitch::get_audio_stream() const { Ref<AudioStream> AudioStreamRandomPitch::get_audio_stream() const {

View File

@ -66,6 +66,7 @@ public:
virtual void environment_set_dof_blur_near(RID p_env, bool p_enable, float p_distance, float p_transition, float p_far_amount, RS::Environment3DDOFBlurQuality p_quality) = 0; virtual void environment_set_dof_blur_near(RID p_env, bool p_enable, float p_distance, float p_transition, float p_far_amount, RS::Environment3DDOFBlurQuality p_quality) = 0;
virtual void environment_set_dof_blur_far(RID p_env, bool p_enable, float p_distance, float p_transition, float p_far_amount, RS::Environment3DDOFBlurQuality p_quality) = 0; virtual void environment_set_dof_blur_far(RID p_env, bool p_enable, float p_distance, float p_transition, float p_far_amount, RS::Environment3DDOFBlurQuality p_quality) = 0;
virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, RS::Environment3DGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale, bool p_high_quality) = 0; virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, RS::Environment3DGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale, bool p_high_quality) = 0;
virtual void environment_set_glow_map(RID p_env, float p_glow_map_strength, RID p_glow_map) = 0;
virtual void environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture) = 0; virtual void environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture) = 0;
virtual void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance, bool p_roughness) = 0; virtual void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance, bool p_roughness) = 0;

View File

@ -538,6 +538,7 @@ public:
BIND6(environment_set_dof_blur_near, RID, bool, float, float, float, Environment3DDOFBlurQuality) BIND6(environment_set_dof_blur_near, RID, bool, float, float, float, Environment3DDOFBlurQuality)
BIND6(environment_set_dof_blur_far, RID, bool, float, float, float, Environment3DDOFBlurQuality) BIND6(environment_set_dof_blur_far, RID, bool, float, float, float, Environment3DDOFBlurQuality)
BIND12(environment_set_glow, RID, bool, int, float, float, float, Environment3DGlowBlendMode, float, float, float, bool, bool) BIND12(environment_set_glow, RID, bool, int, float, float, float, Environment3DGlowBlendMode, float, float, float, bool, bool)
BIND3(environment_set_glow_map, RID, float, RID)
BIND9(environment_set_tonemap, RID, Environment3DToneMapper, float, float, bool, float, float, float, float) BIND9(environment_set_tonemap, RID, Environment3DToneMapper, float, float, bool, float, float, float, float)

View File

@ -451,6 +451,7 @@ public:
FUNC6(environment_set_dof_blur_near, RID, bool, float, float, float, Environment3DDOFBlurQuality) FUNC6(environment_set_dof_blur_near, RID, bool, float, float, float, Environment3DDOFBlurQuality)
FUNC6(environment_set_dof_blur_far, RID, bool, float, float, float, Environment3DDOFBlurQuality) FUNC6(environment_set_dof_blur_far, RID, bool, float, float, float, Environment3DDOFBlurQuality)
FUNC12(environment_set_glow, RID, bool, int, float, float, float, Environment3DGlowBlendMode, float, float, float, bool, bool) FUNC12(environment_set_glow, RID, bool, int, float, float, float, Environment3DGlowBlendMode, float, float, float, bool, bool)
FUNC3(environment_set_glow_map, RID, float, RID)
FUNC9(environment_set_tonemap, RID, Environment3DToneMapper, float, float, bool, float, float, float, float) FUNC9(environment_set_tonemap, RID, Environment3DToneMapper, float, float, bool, float, float, float, float)

View File

@ -2143,6 +2143,7 @@ void RenderingServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("environment_set_dof_blur_near", "env", "enable", "distance", "transition", "far_amount", "quality"), &RenderingServer::environment_set_dof_blur_near); ClassDB::bind_method(D_METHOD("environment_set_dof_blur_near", "env", "enable", "distance", "transition", "far_amount", "quality"), &RenderingServer::environment_set_dof_blur_near);
ClassDB::bind_method(D_METHOD("environment_set_dof_blur_far", "env", "enable", "distance", "transition", "far_amount", "quality"), &RenderingServer::environment_set_dof_blur_far); ClassDB::bind_method(D_METHOD("environment_set_dof_blur_far", "env", "enable", "distance", "transition", "far_amount", "quality"), &RenderingServer::environment_set_dof_blur_far);
ClassDB::bind_method(D_METHOD("environment_set_glow", "env", "enable", "level_flags", "intensity", "strength", "bloom_threshold", "blend_mode", "hdr_bleed_threshold", "hdr_bleed_scale", "hdr_luminance_cap", "bicubic_upscale", "high_quality"), &RenderingServer::environment_set_glow); ClassDB::bind_method(D_METHOD("environment_set_glow", "env", "enable", "level_flags", "intensity", "strength", "bloom_threshold", "blend_mode", "hdr_bleed_threshold", "hdr_bleed_scale", "hdr_luminance_cap", "bicubic_upscale", "high_quality"), &RenderingServer::environment_set_glow);
ClassDB::bind_method(D_METHOD("environment_set_glow_map", "env", "glow_map_strength", "glow_map"), &RenderingServer::environment_set_glow_map);
ClassDB::bind_method(D_METHOD("environment_set_tonemap", "env", "tone_mapper", "exposure", "white", "auto_exposure", "min_luminance", "max_luminance", "auto_exp_speed", "auto_exp_grey"), &RenderingServer::environment_set_tonemap); ClassDB::bind_method(D_METHOD("environment_set_tonemap", "env", "tone_mapper", "exposure", "white", "auto_exposure", "min_luminance", "max_luminance", "auto_exp_speed", "auto_exp_grey"), &RenderingServer::environment_set_tonemap);
ClassDB::bind_method(D_METHOD("environment_set_adjustment", "env", "enable", "brightness", "contrast", "saturation", "ramp"), &RenderingServer::environment_set_adjustment); ClassDB::bind_method(D_METHOD("environment_set_adjustment", "env", "enable", "brightness", "contrast", "saturation", "ramp"), &RenderingServer::environment_set_adjustment);
ClassDB::bind_method(D_METHOD("environment_set_ssr", "env", "enable", "max_steps", "fade_in", "fade_out", "depth_tolerance", "roughness"), &RenderingServer::environment_set_ssr); ClassDB::bind_method(D_METHOD("environment_set_ssr", "env", "enable", "max_steps", "fade_in", "fade_out", "depth_tolerance", "roughness"), &RenderingServer::environment_set_ssr);

View File

@ -792,7 +792,9 @@ public:
GLOW_BLEND_MODE_SOFTLIGHT, GLOW_BLEND_MODE_SOFTLIGHT,
GLOW_BLEND_MODE_REPLACE, GLOW_BLEND_MODE_REPLACE,
}; };
virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, Environment3DGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale, bool p_high_quality) = 0; virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, Environment3DGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale, bool p_high_quality) = 0;
virtual void environment_set_glow_map(RID p_env, float p_glow_map_strength, RID p_glow_map) = 0;
enum Environment3DToneMapper { enum Environment3DToneMapper {
ENV_TONE_MAPPER_LINEAR, ENV_TONE_MAPPER_LINEAR,

View File

@ -19,9 +19,14 @@ Files extracted from upstream source:
## certs ## certs
- Upstream: Mozilla, via https://github.com/bagder/ca-bundle - Upstream: Mozilla, via https://github.com/bagder/ca-bundle
- Version: git (c5a419971b1bec220368c619aaafd0b818aa119f, 2024) - Version: git (4d3fe6683f651d96be1bbef316b201e9b33b274d, 2024),
generated from mozilla-release changeset b8ea2342548b8571e58f9176d9555ccdb5ec199f
- License: MPL 2.0 - License: MPL 2.0
Files extracted from upstream source:
- `ca-bundle.crt` renamed to `ca-certificates.crt`
## cvtt ## cvtt

View File

@ -1,7 +1,9 @@
## ##
## Bundle of CA Root Certificates ## Bundle of CA Root Certificates
## ##
## Certificate data from Mozilla as of: Mon Mar 11 15:15:21 2024 GMT ## Certificate data from Mozilla as of: Sat Oct 19 21:26:09 2024 GMT
##
## Find updated versions here: https://curl.se/docs/caextract.html
## ##
## This is a bundle of X.509 certificates of public Certificate Authorities ## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates ## (CA). These were automatically extracted from Mozilla's root certificates
@ -14,7 +16,7 @@
## Just configure this file as the SSLCACertificateFile. ## Just configure this file as the SSLCACertificateFile.
## ##
## Conversion done with mk-ca-bundle.pl version 1.29. ## Conversion done with mk-ca-bundle.pl version 1.29.
## SHA256: 4d96bd539f4719e9ace493757afbe4a23ee8579de1c97fbebc50bba3c12e8c1e ## SHA256: 36105b01631f9fc03b1eca779b44a30a1a5890b9bf8dc07ccb001a07301e01cf
## ##
@ -2600,36 +2602,6 @@ vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+
CAezNIm8BZ/3Hobui3A= CAezNIm8BZ/3Hobui3A=
-----END CERTIFICATE----- -----END CERTIFICATE-----
GLOBALTRUST 2020
================
-----BEGIN CERTIFICATE-----
MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx
IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT
VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh
BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy
MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi
D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO
VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM
CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm
fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA
A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR
JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG
DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU
clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ
mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud
IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA
VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw
4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9
iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS
8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2
HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS
vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918
oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF
YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl
gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg==
-----END CERTIFICATE-----
ANF Secure Server Root CA ANF Secure Server Root CA
========================= =========================
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
@ -3579,3 +3551,116 @@ wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+ljX273CXE2whJdV/LItM3z7gLfEdxquVeE
HVlNjM7IDiPCtyaaEBRx/pOyiriA8A4QntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0 HVlNjM7IDiPCtyaaEBRx/pOyiriA8A4QntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0
o82bNSQ3+pCTE4FCxpgmdTdmQRCsu/WU48IxK63nI1bMNSWSs1A= o82bNSQ3+pCTE4FCxpgmdTdmQRCsu/WU48IxK63nI1bMNSWSs1A=
-----END CERTIFICATE----- -----END CERTIFICATE-----
FIRMAPROFESIONAL CA ROOT-A WEB
==============================
-----BEGIN CERTIFICATE-----
MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQswCQYDVQQGEwJF
UzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4
MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENBIFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2
WhcNNDcwMzMxMDkwMTM2WjBuMQswCQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25h
bCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFM
IENBIFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zfe9MEkVz6
iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6CcyvHZpsKjECcfIr28jlg
st7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FD
Y1w8ndYn81LsF7Kpryz3dvgwHQYDVR0OBBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB
/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgL
cFBTApFwhVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dGXSaQ
pYXFuXqUPoeovQA=
-----END CERTIFICATE-----
TWCA CYBER Root CA
==================
-----BEGIN CERTIFICATE-----
MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQMQswCQYDVQQG
EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
IENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQG
EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
IENZQkVSIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1s
Ts6P40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxFavcokPFh
V8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/34bKS1PE2Y2yHer43CdT
o0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684iJkXXYJndzk834H/nY62wuFm40AZoNWDT
Nq5xQwTxaWV4fPMf88oon1oglWa0zbfuj3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK
/c/WMw+f+5eesRycnupfXtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkH
IuNZW0CP2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDAS9TM
fAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDAoS/xUgXJP+92ZuJF
2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzCkHDXShi8fgGwsOsVHkQGzaRP6AzR
wyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83
QOGt4A1WNzAdBgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB
AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0ttGlTITVX1olN
c79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn68xDiBaiA9a5F/gZbG0jAn/x
X9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNnTKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDR
IG4kqIQnoVesqlVYL9zZyvpoBJ7tRCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq
/p1hvIbZv97Tujqxf36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0R
FxbIQh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz8ppy6rBe
Pm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4NxKfKjLji7gh7MMrZQzv
It6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzXxeSDwWrruoBa3lwtcHb4yOWHh8qgnaHl
IhInD0Q9HWzq1MKLL295q39QpsQZp6F6t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X
-----END CERTIFICATE-----
SecureSign Root CA12
====================
-----BEGIN CERTIFICATE-----
MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQELBQAwUTELMAkG
A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
ZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgwNTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJ
BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
U2VjdXJlU2lnbiBSb290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3
emhFKxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mtp7JIKwcc
J/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zdJ1M3s6oYwlkm7Fsf0uZl
fO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gurFzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBF
EaCeVESE99g2zvVQR9wsMJvuwPWW0v4JhscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1Uef
NzFJM3IFTQy2VYzxV4+Kh9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
AQH/BAQDAgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsFAAOC
AQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6LdmmQOmFxv3Y67ilQi
LUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJmBClnW8Zt7vPemVV2zfrPIpyMpce
mik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPS
vWKErI4cqc1avTc7bgoitPQV55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhga
aaI5gdka9at/yOPiZwud9AzqVN/Ssq+xIvEg37xEHA==
-----END CERTIFICATE-----
SecureSign Root CA14
====================
-----BEGIN CERTIFICATE-----
MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEMBQAwUTELMAkG
A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
ZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgwNzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJ
BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
U2VjdXJlU2lnbiBSb290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh
1oq/FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOgvlIfX8xn
bacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy6pJxaeQp8E+BgQQ8sqVb
1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa
/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9JkdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOE
kJTRX45zGRBdAuVwpcAQ0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSx
jVIHvXiby8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac18iz
ju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs0Wq2XSqypWa9a4X0
dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIABSMbHdPTGrMNASRZhdCyvjG817XsY
AFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVLApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQAB
o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeq
YR3r6/wtbyPk86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E
rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ibed87hwriZLoA
ymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopTzfFP7ELyk+OZpDc8h7hi2/Ds
Hzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHSDCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPG
FrojutzdfhrGe0K22VoF3Jpf1d+42kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6q
nsb58Nn4DSEC5MUoFlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/
OfVyK4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6dB7h7sxa
OgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtlLor6CZpO2oYofaphNdgO
pygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB365jJ6UeTo3cKXhZ+PmhIIynJkBugnLN
eLLIjzwec+fBH7/PzqUqm9tEZDKgu39cJRNItX+S
-----END CERTIFICATE-----
SecureSign Root CA15
====================
-----BEGIN CERTIFICATE-----
MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMwUTELMAkGA1UE
BhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRTZWN1
cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMyNTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNV
BAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2Vj
dXJlU2lnbiBSb290IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5G
dCx4wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSRZHX+AezB
2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
AgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT9DAKBggqhkjOPQQDAwNoADBlAjEA2S6J
fl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJ
SwdLZrWeqrqgHkHZAXQ6bkU6iYAZezKYVWOr62Nuk22rGwlgMU4=
-----END CERTIFICATE-----