diff options
Diffstat (limited to 'servers')
| -rw-r--r-- | servers/audio/effects/audio_stream_generator.cpp | 11 | ||||
| -rw-r--r-- | servers/audio_server.cpp | 11 | ||||
| -rw-r--r-- | servers/physics_3d/godot_soft_body_3d.cpp | 6 | ||||
| -rw-r--r-- | servers/physics_server_2d.cpp | 2 | ||||
| -rw-r--r-- | servers/physics_server_3d.cpp | 18 | ||||
| -rw-r--r-- | servers/physics_server_3d.h | 8 | ||||
| -rw-r--r-- | servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp | 1 | ||||
| -rw-r--r-- | servers/rendering/renderer_rd/shaders/canvas.glsl | 6 | ||||
| -rw-r--r-- | servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl | 11 | ||||
| -rw-r--r-- | servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl | 11 | ||||
| -rw-r--r-- | servers/rendering/renderer_viewport.cpp | 4 | ||||
| -rw-r--r-- | servers/rendering/rendering_server_default.cpp | 2 | ||||
| -rw-r--r-- | servers/rendering/shader_types.cpp | 1 |
13 files changed, 54 insertions, 38 deletions
diff --git a/servers/audio/effects/audio_stream_generator.cpp b/servers/audio/effects/audio_stream_generator.cpp index 5cfe51465d..f4727e72ec 100644 --- a/servers/audio/effects/audio_stream_generator.cpp +++ b/servers/audio/effects/audio_stream_generator.cpp @@ -143,6 +143,10 @@ void AudioStreamGeneratorPlayback::clear_buffer() { } int AudioStreamGeneratorPlayback::_mix_internal(AudioFrame *p_buffer, int p_frames) { + if (!active) { + return 0; + } + int read_amount = buffer.data_left(); if (p_frames < read_amount) { read_amount = p_frames; @@ -151,16 +155,15 @@ int AudioStreamGeneratorPlayback::_mix_internal(AudioFrame *p_buffer, int p_fram buffer.read(p_buffer, read_amount); if (read_amount < p_frames) { - //skipped, not ideal + // Fill with zeros as fallback in case of buffer underrun. for (int i = read_amount; i < p_frames; i++) { p_buffer[i] = AudioFrame(0, 0); } - skips++; } mixed += p_frames / generator->get_mix_rate(); - return read_amount < p_frames ? read_amount : p_frames; + return p_frames; } float AudioStreamGeneratorPlayback::get_stream_sampling_rate() { @@ -181,7 +184,7 @@ void AudioStreamGeneratorPlayback::stop() { } bool AudioStreamGeneratorPlayback::is_playing() const { - return active; //always playing, can't be stopped + return active; } int AudioStreamGeneratorPlayback::get_loop_count() const { diff --git a/servers/audio_server.cpp b/servers/audio_server.cpp index 6a03a67fcd..ce7f6ee6f0 100644 --- a/servers/audio_server.cpp +++ b/servers/audio_server.cpp @@ -857,14 +857,16 @@ int AudioServer::get_bus_count() const { void AudioServer::set_bus_name(int p_bus, const String &p_name) { ERR_FAIL_INDEX(p_bus, buses.size()); if (p_bus == 0 && p_name != "Master") { - return; //bus 0 is always master + return; // Bus 0 is always "Master". } MARK_EDITED lock(); - if (buses[p_bus]->name == p_name) { + StringName old_name = buses[p_bus]->name; + + if (old_name == p_name) { unlock(); return; } @@ -888,12 +890,12 @@ void AudioServer::set_bus_name(int p_bus, const String &p_name) { attempts++; attempt = p_name + " " + itos(attempts); } - bus_map.erase(buses[p_bus]->name); + bus_map.erase(old_name); buses[p_bus]->name = attempt; bus_map[attempt] = buses[p_bus]; unlock(); - emit_signal(SNAME("bus_layout_changed")); + emit_signal(SNAME("bus_renamed"), p_bus, old_name, attempt); } String AudioServer::get_bus_name(int p_bus) const { @@ -1751,6 +1753,7 @@ void AudioServer::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "playback_speed_scale"), "set_playback_speed_scale", "get_playback_speed_scale"); ADD_SIGNAL(MethodInfo("bus_layout_changed")); + ADD_SIGNAL(MethodInfo("bus_renamed", PropertyInfo(Variant::INT, "bus_index"), PropertyInfo(Variant::STRING_NAME, "old_name"), PropertyInfo(Variant::STRING_NAME, "new_name"))); BIND_ENUM_CONSTANT(SPEAKER_MODE_STEREO); BIND_ENUM_CONSTANT(SPEAKER_SURROUND_31); diff --git a/servers/physics_3d/godot_soft_body_3d.cpp b/servers/physics_3d/godot_soft_body_3d.cpp index 4b35dd1500..2081c132af 100644 --- a/servers/physics_3d/godot_soft_body_3d.cpp +++ b/servers/physics_3d/godot_soft_body_3d.cpp @@ -155,11 +155,9 @@ void GodotSoftBody3D::update_rendering_server(PhysicsServer3DRenderingServerHand for (uint32_t i = 0; i < vertex_count; ++i) { const uint32_t node_index = map_visual_to_physics[i]; const Node &node = nodes[node_index]; - const Vector3 &vertex_position = node.x; - const Vector3 &vertex_normal = node.n; - p_rendering_server_handler->set_vertex(i, &vertex_position); - p_rendering_server_handler->set_normal(i, &vertex_normal); + p_rendering_server_handler->set_vertex(i, node.x); + p_rendering_server_handler->set_normal(i, node.n); } p_rendering_server_handler->set_aabb(bounds); diff --git a/servers/physics_server_2d.cpp b/servers/physics_server_2d.cpp index 79a8ebe3d1..a5fa5291c0 100644 --- a/servers/physics_server_2d.cpp +++ b/servers/physics_server_2d.cpp @@ -476,6 +476,7 @@ TypedArray<RID> PhysicsTestMotionParameters2D::get_exclude_bodies() const { } void PhysicsTestMotionParameters2D::set_exclude_bodies(const TypedArray<RID> &p_exclude) { + parameters.exclude_bodies.clear(); for (int i = 0; i < p_exclude.size(); i++) { parameters.exclude_bodies.insert(p_exclude[i]); } @@ -494,6 +495,7 @@ TypedArray<uint64_t> PhysicsTestMotionParameters2D::get_exclude_objects() const } void PhysicsTestMotionParameters2D::set_exclude_objects(const TypedArray<uint64_t> &p_exclude) { + parameters.exclude_objects.clear(); for (int i = 0; i < p_exclude.size(); ++i) { ObjectID object_id = p_exclude[i]; ERR_CONTINUE(object_id.is_null()); diff --git a/servers/physics_server_3d.cpp b/servers/physics_server_3d.cpp index 8497bc78e2..d523f4b1ec 100644 --- a/servers/physics_server_3d.cpp +++ b/servers/physics_server_3d.cpp @@ -34,20 +34,24 @@ #include "core/string/print_string.h" #include "core/variant/typed_array.h" -void PhysicsServer3DRenderingServerHandler::set_vertex(int p_vertex_id, const void *p_vector3) { - GDVIRTUAL_REQUIRED_CALL(_set_vertex, p_vertex_id, p_vector3); +void PhysicsServer3DRenderingServerHandler::set_vertex(int p_vertex_id, const Vector3 &p_vertex) { + GDVIRTUAL_REQUIRED_CALL(_set_vertex, p_vertex_id, p_vertex); } -void PhysicsServer3DRenderingServerHandler::set_normal(int p_vertex_id, const void *p_vector3) { - GDVIRTUAL_REQUIRED_CALL(_set_normal, p_vertex_id, p_vector3); +void PhysicsServer3DRenderingServerHandler::set_normal(int p_vertex_id, const Vector3 &p_normal) { + GDVIRTUAL_REQUIRED_CALL(_set_normal, p_vertex_id, p_normal); } void PhysicsServer3DRenderingServerHandler::set_aabb(const AABB &p_aabb) { GDVIRTUAL_REQUIRED_CALL(_set_aabb, p_aabb); } void PhysicsServer3DRenderingServerHandler::_bind_methods() { - GDVIRTUAL_BIND(_set_vertex, "vertex_id", "vertices"); - GDVIRTUAL_BIND(_set_normal, "vertex_id", "normals"); + GDVIRTUAL_BIND(_set_vertex, "vertex_id", "vertex"); + GDVIRTUAL_BIND(_set_normal, "vertex_id", "normal"); GDVIRTUAL_BIND(_set_aabb, "aabb"); + + ClassDB::bind_method(D_METHOD("set_vertex", "vertex_id", "vertex"), &PhysicsServer3DRenderingServerHandler::set_vertex); + ClassDB::bind_method(D_METHOD("set_normal", "vertex_id", "normal"), &PhysicsServer3DRenderingServerHandler::set_normal); + ClassDB::bind_method(D_METHOD("set_aabb", "aabb"), &PhysicsServer3DRenderingServerHandler::set_aabb); } PhysicsServer3D *PhysicsServer3D::singleton = nullptr; @@ -497,6 +501,7 @@ TypedArray<RID> PhysicsTestMotionParameters3D::get_exclude_bodies() const { } void PhysicsTestMotionParameters3D::set_exclude_bodies(const TypedArray<RID> &p_exclude) { + parameters.exclude_bodies.clear(); for (int i = 0; i < p_exclude.size(); i++) { parameters.exclude_bodies.insert(p_exclude[i]); } @@ -515,6 +520,7 @@ TypedArray<uint64_t> PhysicsTestMotionParameters3D::get_exclude_objects() const } void PhysicsTestMotionParameters3D::set_exclude_objects(const TypedArray<uint64_t> &p_exclude) { + parameters.exclude_objects.clear(); for (int i = 0; i < p_exclude.size(); ++i) { ObjectID object_id = p_exclude[i]; ERR_CONTINUE(object_id.is_null()); diff --git a/servers/physics_server_3d.h b/servers/physics_server_3d.h index 553d73b549..68dda8b84d 100644 --- a/servers/physics_server_3d.h +++ b/servers/physics_server_3d.h @@ -211,15 +211,15 @@ public: class PhysicsServer3DRenderingServerHandler : public Object { GDCLASS(PhysicsServer3DRenderingServerHandler, Object) protected: - GDVIRTUAL2(_set_vertex, int, GDExtensionConstPtr<void>) - GDVIRTUAL2(_set_normal, int, GDExtensionConstPtr<void>) + GDVIRTUAL2(_set_vertex, int, const Vector3 &) + GDVIRTUAL2(_set_normal, int, const Vector3 &) GDVIRTUAL1(_set_aabb, const AABB &) static void _bind_methods(); public: - virtual void set_vertex(int p_vertex_id, const void *p_vector3); - virtual void set_normal(int p_vertex_id, const void *p_vector3); + virtual void set_vertex(int p_vertex_id, const Vector3 &p_vertex); + virtual void set_normal(int p_vertex_id, const Vector3 &p_normal); virtual void set_aabb(const AABB &p_aabb); virtual ~PhysicsServer3DRenderingServerHandler() {} diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp index b1ad7e16ed..4fede0defc 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp @@ -2480,6 +2480,7 @@ RendererCanvasRenderRD::RendererCanvasRenderRD() { actions.render_mode_defines["skip_vertex_transform"] = "#define SKIP_TRANSFORM_USED\n"; actions.render_mode_defines["unshaded"] = "#define MODE_UNSHADED\n"; actions.render_mode_defines["light_only"] = "#define MODE_LIGHT_ONLY\n"; + actions.render_mode_defines["world_vertex_coords"] = "#define USE_WORLD_VERTEX_COORDS\n"; actions.custom_samplers["TEXTURE"] = "texture_sampler"; actions.custom_samplers["NORMAL_TEXTURE"] = "texture_sampler"; diff --git a/servers/rendering/renderer_rd/shaders/canvas.glsl b/servers/rendering/renderer_rd/shaders/canvas.glsl index 31c5aadc88..7a13ac7207 100644 --- a/servers/rendering/renderer_rd/shaders/canvas.glsl +++ b/servers/rendering/renderer_rd/shaders/canvas.glsl @@ -180,6 +180,10 @@ void main() { #ifdef USE_POINT_SIZE float point_size = 1.0; #endif + +#ifdef USE_WORLD_VERTEX_COORDS + vertex = (model_matrix * vec4(vertex, 0.0, 1.0)).xy; +#endif { #CODE : VERTEX } @@ -188,7 +192,7 @@ void main() { pixel_size_interp = abs(draw_data.dst_rect.zw) * vertex_base; #endif -#if !defined(SKIP_TRANSFORM_USED) +#if !defined(SKIP_TRANSFORM_USED) && !defined(USE_WORLD_VERTEX_COORDS) vertex = (model_matrix * vec4(vertex, 0.0, 1.0)).xy; #endif diff --git a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl index cfba408fe1..2b8b8fa9d2 100644 --- a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl @@ -1277,9 +1277,10 @@ void fragment_shader(in SceneData scene_data) { } else if (bool(instances.data[instance_index].flags & INSTANCE_FLAGS_USE_LIGHTMAP)) { // has actual lightmap bool uses_sh = bool(instances.data[instance_index].flags & INSTANCE_FLAGS_USE_SH_LIGHTMAP); uint ofs = instances.data[instance_index].gi_offset & 0xFFFF; + uint slice = instances.data[instance_index].gi_offset >> 16; vec3 uvw; uvw.xy = uv2 * instances.data[instance_index].lightmap_uv_scale.zw + instances.data[instance_index].lightmap_uv_scale.xy; - uvw.z = float((instances.data[instance_index].gi_offset >> 16) & 0xFFFF); + uvw.z = float(slice); if (uses_sh) { uvw.z *= 4.0; //SH textures use 4 times more data @@ -1288,9 +1289,8 @@ void fragment_shader(in SceneData scene_data) { vec3 lm_light_l1_0 = textureLod(sampler2DArray(lightmap_textures[ofs], SAMPLER_LINEAR_CLAMP), uvw + vec3(0.0, 0.0, 2.0), 0.0).rgb; vec3 lm_light_l1p1 = textureLod(sampler2DArray(lightmap_textures[ofs], SAMPLER_LINEAR_CLAMP), uvw + vec3(0.0, 0.0, 3.0), 0.0).rgb; - uint idx = instances.data[instance_index].gi_offset >> 20; - vec3 n = normalize(lightmaps.data[idx].normal_xform * normal); - float en = lightmaps.data[idx].exposure_normalization; + vec3 n = normalize(lightmaps.data[ofs].normal_xform * normal); + float en = lightmaps.data[ofs].exposure_normalization; ambient_light += lm_light_l0 * 0.282095f * en; ambient_light += lm_light_l1n1 * 0.32573 * n.y * en; @@ -1304,8 +1304,7 @@ void fragment_shader(in SceneData scene_data) { } } else { - uint idx = instances.data[instance_index].gi_offset >> 20; - ambient_light += textureLod(sampler2DArray(lightmap_textures[ofs], SAMPLER_LINEAR_CLAMP), uvw, 0.0).rgb * lightmaps.data[idx].exposure_normalization; + ambient_light += textureLod(sampler2DArray(lightmap_textures[ofs], SAMPLER_LINEAR_CLAMP), uvw, 0.0).rgb * lightmaps.data[ofs].exposure_normalization; } } #else diff --git a/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl index cdf81bb6ec..7f6a9a50e5 100644 --- a/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl @@ -1121,11 +1121,10 @@ void main() { } else if (bool(draw_call.flags & INSTANCE_FLAGS_USE_LIGHTMAP)) { // has actual lightmap bool uses_sh = bool(draw_call.flags & INSTANCE_FLAGS_USE_SH_LIGHTMAP); uint ofs = draw_call.gi_offset & 0xFFFF; + uint slice = draw_call.gi_offset >> 16; vec3 uvw; uvw.xy = uv2 * draw_call.lightmap_uv_scale.zw + draw_call.lightmap_uv_scale.xy; - uvw.z = float((draw_call.gi_offset >> 16) & 0xFFFF); - - uint idx = draw_call.gi_offset >> 20; + uvw.z = float(slice); if (uses_sh) { uvw.z *= 4.0; //SH textures use 4 times more data @@ -1134,8 +1133,8 @@ void main() { vec3 lm_light_l1_0 = textureLod(sampler2DArray(lightmap_textures[ofs], SAMPLER_LINEAR_CLAMP), uvw + vec3(0.0, 0.0, 2.0), 0.0).rgb; vec3 lm_light_l1p1 = textureLod(sampler2DArray(lightmap_textures[ofs], SAMPLER_LINEAR_CLAMP), uvw + vec3(0.0, 0.0, 3.0), 0.0).rgb; - vec3 n = normalize(lightmaps.data[idx].normal_xform * normal); - float exposure_normalization = lightmaps.data[idx].exposure_normalization; + vec3 n = normalize(lightmaps.data[ofs].normal_xform * normal); + float exposure_normalization = lightmaps.data[ofs].exposure_normalization; ambient_light += lm_light_l0 * 0.282095f; ambient_light += lm_light_l1n1 * 0.32573 * n.y * exposure_normalization; @@ -1149,7 +1148,7 @@ void main() { } } else { - ambient_light += textureLod(sampler2DArray(lightmap_textures[ofs], SAMPLER_LINEAR_CLAMP), uvw, 0.0).rgb * lightmaps.data[idx].exposure_normalization; + ambient_light += textureLod(sampler2DArray(lightmap_textures[ofs], SAMPLER_LINEAR_CLAMP), uvw, 0.0).rgb * lightmaps.data[ofs].exposure_normalization; } } diff --git a/servers/rendering/renderer_viewport.cpp b/servers/rendering/renderer_viewport.cpp index 5880bf3951..8dd591a28e 100644 --- a/servers/rendering/renderer_viewport.cpp +++ b/servers/rendering/renderer_viewport.cpp @@ -714,7 +714,7 @@ void RendererViewport::draw_viewports() { // commit our eyes Vector<BlitToScreen> blits = xr_interface->post_draw_viewport(vp->render_target, vp->viewport_to_screen_rect); if (vp->viewport_to_screen != DisplayServer::INVALID_WINDOW_ID) { - if (OS::get_singleton()->get_current_rendering_driver_name() == "opengl3") { + if (OS::get_singleton()->get_current_rendering_driver_name() == "opengl3" || OS::get_singleton()->get_current_rendering_driver_name() == "opengl3_angle") { if (blits.size() > 0) { RSG::rasterizer->blit_render_targets_to_screen(vp->viewport_to_screen, blits.ptr(), blits.size()); } @@ -753,7 +753,7 @@ void RendererViewport::draw_viewports() { blit_to_screen_list[vp->viewport_to_screen] = Vector<BlitToScreen>(); } - if (OS::get_singleton()->get_current_rendering_driver_name() == "opengl3") { + if (OS::get_singleton()->get_current_rendering_driver_name() == "opengl3" || OS::get_singleton()->get_current_rendering_driver_name() == "opengl3_angle") { Vector<BlitToScreen> blit_to_screen_vec; blit_to_screen_vec.push_back(blit); RSG::rasterizer->blit_render_targets_to_screen(vp->viewport_to_screen, blit_to_screen_vec.ptr(), 1); diff --git a/servers/rendering/rendering_server_default.cpp b/servers/rendering/rendering_server_default.cpp index c4464cb180..b13d33de9e 100644 --- a/servers/rendering/rendering_server_default.cpp +++ b/servers/rendering/rendering_server_default.cpp @@ -91,7 +91,7 @@ void RenderingServerDefault::_draw(bool p_swap_buffers, double frame_step) { RSG::viewport->draw_viewports(); RSG::canvas_render->update(); - if (OS::get_singleton()->get_current_rendering_driver_name() != "opengl3") { + if (OS::get_singleton()->get_current_rendering_driver_name() != "opengl3" && OS::get_singleton()->get_current_rendering_driver_name() != "opengl3_angle") { // Already called for gl_compatibility renderer. RSG::rasterizer->end_frame(p_swap_buffers); } diff --git a/servers/rendering/shader_types.cpp b/servers/rendering/shader_types.cpp index 728089f516..38574b0597 100644 --- a/servers/rendering/shader_types.cpp +++ b/servers/rendering/shader_types.cpp @@ -321,6 +321,7 @@ ShaderTypes::ShaderTypes() { shader_modes[RS::SHADER_CANVAS_ITEM].modes.push_back({ PNAME("blend"), "mix", "add", "sub", "mul", "premul_alpha", "disabled" }); shader_modes[RS::SHADER_CANVAS_ITEM].modes.push_back({ PNAME("unshaded") }); shader_modes[RS::SHADER_CANVAS_ITEM].modes.push_back({ PNAME("light_only") }); + shader_modes[RS::SHADER_CANVAS_ITEM].modes.push_back({ PNAME("world_vertex_coords") }); } /************ PARTICLES **************************/ |
