diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/alsamidi/midi_driver_alsamidi.cpp | 14 | ||||
-rw-r--r-- | drivers/alsamidi/midi_driver_alsamidi.h | 4 | ||||
-rw-r--r-- | drivers/coremidi/midi_driver_coremidi.cpp | 5 | ||||
-rw-r--r-- | drivers/gles3/rasterizer_scene_gles3.cpp | 8 | ||||
-rw-r--r-- | drivers/gles3/rasterizer_scene_gles3.h | 8 | ||||
-rw-r--r-- | drivers/gles3/shaders/scene.glsl | 26 | ||||
-rw-r--r-- | drivers/gles3/storage/mesh_storage.cpp | 4 | ||||
-rw-r--r-- | drivers/winmidi/midi_driver_winmidi.cpp | 4 |
8 files changed, 54 insertions, 19 deletions
diff --git a/drivers/alsamidi/midi_driver_alsamidi.cpp b/drivers/alsamidi/midi_driver_alsamidi.cpp index 6b35987f70..b87be69cc5 100644 --- a/drivers/alsamidi/midi_driver_alsamidi.cpp +++ b/drivers/alsamidi/midi_driver_alsamidi.cpp @@ -82,13 +82,13 @@ size_t MIDIDriverALSAMidi::msg_expected_data(uint8_t status_byte) { } void MIDIDriverALSAMidi::InputConnection::parse_byte(uint8_t byte, MIDIDriverALSAMidi &driver, - uint64_t timestamp) { + uint64_t timestamp, int device_index) { switch (msg_category(byte)) { case MessageCategory::RealTime: // Real-Time messages are single byte messages that can // occur at any point. // We pass them straight through. - driver.receive_input_packet(timestamp, &byte, 1); + driver.receive_input_packet(device_index, timestamp, &byte, 1); break; case MessageCategory::Data: @@ -100,7 +100,7 @@ void MIDIDriverALSAMidi::InputConnection::parse_byte(uint8_t byte, MIDIDriverALS // Forward a complete message and reset relevant state. if (received_data == expected_data) { - driver.receive_input_packet(timestamp, buffer, received_data + 1); + driver.receive_input_packet(device_index, timestamp, buffer, received_data + 1); received_data = 0; if (msg_category(buffer[0]) != MessageCategory::Voice) { @@ -130,13 +130,13 @@ void MIDIDriverALSAMidi::InputConnection::parse_byte(uint8_t byte, MIDIDriverALS expected_data = msg_expected_data(byte); skipping_sys_ex = false; if (expected_data == 0) { - driver.receive_input_packet(timestamp, &byte, 1); + driver.receive_input_packet(device_index, timestamp, &byte, 1); } break; } } -int MIDIDriverALSAMidi::InputConnection::read_in(MIDIDriverALSAMidi &driver, uint64_t timestamp) { +int MIDIDriverALSAMidi::InputConnection::read_in(MIDIDriverALSAMidi &driver, uint64_t timestamp, int device_index) { int ret; do { uint8_t byte = 0; @@ -147,7 +147,7 @@ int MIDIDriverALSAMidi::InputConnection::read_in(MIDIDriverALSAMidi &driver, uin ERR_PRINT("snd_rawmidi_read error: " + String(snd_strerror(ret))); } } else { - parse_byte(byte, driver, timestamp); + parse_byte(byte, driver, timestamp, device_index); } } while (ret > 0); @@ -165,7 +165,7 @@ void MIDIDriverALSAMidi::thread_func(void *p_udata) { size_t connection_count = md->connected_inputs.size(); for (size_t i = 0; i < connection_count; i++) { - connections[i].read_in(*md, timestamp); + connections[i].read_in(*md, timestamp, (int)i); } md->unlock(); diff --git a/drivers/alsamidi/midi_driver_alsamidi.h b/drivers/alsamidi/midi_driver_alsamidi.h index 80cc96310f..95ded3b1c9 100644 --- a/drivers/alsamidi/midi_driver_alsamidi.h +++ b/drivers/alsamidi/midi_driver_alsamidi.h @@ -58,7 +58,7 @@ class MIDIDriverALSAMidi : public MIDIDriver { rawmidi_ptr{ midi_in } {} // Read in and parse available data, forwarding any complete messages through the driver. - int read_in(MIDIDriverALSAMidi &driver, uint64_t timestamp); + int read_in(MIDIDriverALSAMidi &driver, uint64_t timestamp, int device_index); snd_rawmidi_t *rawmidi_ptr = nullptr; @@ -68,7 +68,7 @@ class MIDIDriverALSAMidi : public MIDIDriver { size_t expected_data = 0; size_t received_data = 0; bool skipping_sys_ex = false; - void parse_byte(uint8_t byte, MIDIDriverALSAMidi &driver, uint64_t timestamp); + void parse_byte(uint8_t byte, MIDIDriverALSAMidi &driver, uint64_t timestamp, int device_index); }; Vector<InputConnection> connected_inputs; diff --git a/drivers/coremidi/midi_driver_coremidi.cpp b/drivers/coremidi/midi_driver_coremidi.cpp index ed991b3d9d..87fc7612f7 100644 --- a/drivers/coremidi/midi_driver_coremidi.cpp +++ b/drivers/coremidi/midi_driver_coremidi.cpp @@ -39,8 +39,9 @@ void MIDIDriverCoreMidi::read(const MIDIPacketList *packet_list, void *read_proc_ref_con, void *src_conn_ref_con) { MIDIPacket *packet = const_cast<MIDIPacket *>(packet_list->packet); + int *device_index = static_cast<int *>(src_conn_ref_con); for (UInt32 i = 0; i < packet_list->numPackets; i++) { - receive_input_packet(packet->timeStamp, packet->data, packet->length); + receive_input_packet(*device_index, packet->timeStamp, packet->data, packet->length); packet = MIDIPacketNext(packet); } } @@ -64,7 +65,7 @@ Error MIDIDriverCoreMidi::open() { for (int i = 0; i < sources; i++) { MIDIEndpointRef source = MIDIGetSource(i); if (source) { - MIDIPortConnectSource(port_in, source, (void *)this); + MIDIPortConnectSource(port_in, source, static_cast<void *>(&i)); connected_sources.insert(i, source); } } diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index 6cca1fef7e..efd554eac9 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -1642,8 +1642,12 @@ void RasterizerSceneGLES3::_setup_environment(const RenderDataGLES3 *p_render_da } scene_state.ubo.fog_enabled = environment_get_fog_enabled(p_render_data->environment); + scene_state.ubo.fog_mode = environment_get_fog_mode(p_render_data->environment); scene_state.ubo.fog_density = environment_get_fog_density(p_render_data->environment); scene_state.ubo.fog_height = environment_get_fog_height(p_render_data->environment); + scene_state.ubo.fog_depth_curve = environment_get_fog_depth_curve(p_render_data->environment); + scene_state.ubo.fog_depth_end = environment_get_fog_depth_end(p_render_data->environment) > 0.0 ? environment_get_fog_depth_end(p_render_data->environment) : scene_state.ubo.z_far; + scene_state.ubo.fog_depth_begin = MIN(environment_get_fog_depth_begin(p_render_data->environment), scene_state.ubo.fog_depth_end - 0.001); scene_state.ubo.fog_height_density = environment_get_fog_height_density(p_render_data->environment); scene_state.ubo.fog_aerial_perspective = environment_get_fog_aerial_perspective(p_render_data->environment); @@ -2598,6 +2602,10 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_ if (render_data.environment.is_null() || (render_data.environment.is_valid() && !environment_get_fog_enabled(render_data.environment))) { spec_constant_base_flags |= SceneShaderGLES3::DISABLE_FOG; } + + if (render_data.environment.is_valid() && environment_get_fog_mode(render_data.environment) == RS::EnvironmentFogMode::ENV_FOG_MODE_DEPTH) { + spec_constant_base_flags |= SceneShaderGLES3::USE_DEPTH_FOG; + } } // Render Opaque Objects. RenderListParameters render_list_params(render_list[RENDER_LIST_OPAQUE].elements.ptr(), render_list[RENDER_LIST_OPAQUE].elements.size(), reverse_cull, spec_constant_base_flags, use_wireframe); diff --git a/drivers/gles3/rasterizer_scene_gles3.h b/drivers/gles3/rasterizer_scene_gles3.h index 7880591dcb..ed59aba266 100644 --- a/drivers/gles3/rasterizer_scene_gles3.h +++ b/drivers/gles3/rasterizer_scene_gles3.h @@ -398,15 +398,21 @@ private: float IBL_exposure_normalization; uint32_t fog_enabled; + uint32_t fog_mode; float fog_density; float fog_height; + float fog_height_density; + float fog_depth_curve; + float pad; + float fog_depth_begin; float fog_light_color[3]; + float fog_depth_end; + float fog_sun_scatter; float shadow_bias; - float pad; uint32_t camera_visible_layers; bool pancake_shadows; }; diff --git a/drivers/gles3/shaders/scene.glsl b/drivers/gles3/shaders/scene.glsl index ffdac85c1e..667cbb3d90 100644 --- a/drivers/gles3/shaders/scene.glsl +++ b/drivers/gles3/shaders/scene.glsl @@ -13,6 +13,7 @@ DISABLE_LIGHT_DIRECTIONAL = false DISABLE_LIGHT_OMNI = false DISABLE_LIGHT_SPOT = false DISABLE_FOG = false +USE_DEPTH_FOG = false USE_RADIANCE_MAP = true USE_LIGHTMAP = false USE_SH_LIGHTMAP = false @@ -181,15 +182,21 @@ layout(std140) uniform SceneData { // ubo:2 float IBL_exposure_normalization; bool fog_enabled; + uint fog_mode; float fog_density; float fog_height; float fog_height_density; + float fog_depth_curve; + float pad; + float fog_depth_begin; + vec3 fog_light_color; + float fog_depth_end; + float fog_sun_scatter; float shadow_bias; - float pad; uint camera_visible_layers; bool pancake_shadows; } @@ -666,15 +673,21 @@ layout(std140) uniform SceneData { // ubo:2 float IBL_exposure_normalization; bool fog_enabled; + uint fog_mode; float fog_density; float fog_height; float fog_height_density; + float fog_depth_curve; + float pad; + float fog_depth_begin; + vec3 fog_light_color; + float fog_depth_end; + float fog_sun_scatter; float shadow_bias; - float pad; uint camera_visible_layers; bool pancake_shadows; } @@ -1250,7 +1263,14 @@ vec4 fog_process(vec3 vertex) { } #endif // !DISABLE_LIGHT_DIRECTIONAL - float fog_amount = 1.0 - exp(min(0.0, -length(vertex) * scene_data.fog_density)); + float fog_amount = 0.0; + +#ifdef USE_DEPTH_FOG + float fog_z = smoothstep(scene_data.fog_depth_begin, scene_data.fog_depth_end, length(vertex)); + fog_amount = pow(fog_z, scene_data.fog_depth_curve) * scene_data.fog_density; +#else + fog_amount = 1 - exp(min(0.0, -length(vertex) * scene_data.fog_density)); +#endif // USE_DEPTH_FOG if (abs(scene_data.fog_height_density) >= 0.0001) { float y = (scene_data.inv_view_matrix * vec4(vertex, 1.0)).y; diff --git a/drivers/gles3/storage/mesh_storage.cpp b/drivers/gles3/storage/mesh_storage.cpp index 6c4bef10d5..8ab66e2bc6 100644 --- a/drivers/gles3/storage/mesh_storage.cpp +++ b/drivers/gles3/storage/mesh_storage.cpp @@ -1962,7 +1962,7 @@ void MeshStorage::multimesh_set_buffer(RID p_multimesh, const Vector<float> &p_b //if we have a mesh set, we need to re-generate the AABB from the new data const float *data = p_buffer.ptr(); - if (multimesh->custom_aabb != AABB()) { + if (multimesh->custom_aabb == AABB()) { _multimesh_re_create_aabb(multimesh, data, multimesh->instances); multimesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB); } @@ -2113,7 +2113,7 @@ void MeshStorage::_update_dirty_multimeshes() { if (multimesh->aabb_dirty && multimesh->mesh.is_valid()) { multimesh->aabb_dirty = false; - if (multimesh->custom_aabb != AABB()) { + if (multimesh->custom_aabb == AABB()) { _multimesh_re_create_aabb(multimesh, data, visible_instances); multimesh->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB); } diff --git a/drivers/winmidi/midi_driver_winmidi.cpp b/drivers/winmidi/midi_driver_winmidi.cpp index cdbab489c4..07f0226c5d 100644 --- a/drivers/winmidi/midi_driver_winmidi.cpp +++ b/drivers/winmidi/midi_driver_winmidi.cpp @@ -36,7 +36,7 @@ void MIDIDriverWinMidi::read(HMIDIIN hMidiIn, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { if (wMsg == MIM_DATA) { - receive_input_packet((uint64_t)dwParam2, (uint8_t *)&dwParam1, 3); + receive_input_packet((int)dwInstance, (uint64_t)dwParam2, (uint8_t *)&dwParam1, 3); } } @@ -44,7 +44,7 @@ Error MIDIDriverWinMidi::open() { for (UINT i = 0; i < midiInGetNumDevs(); i++) { HMIDIIN midi_in; - MMRESULT res = midiInOpen(&midi_in, i, (DWORD_PTR)read, (DWORD_PTR)this, CALLBACK_FUNCTION); + MMRESULT res = midiInOpen(&midi_in, i, (DWORD_PTR)read, (DWORD_PTR)i, CALLBACK_FUNCTION); if (res == MMSYSERR_NOERROR) { midiInStart(midi_in); connected_sources.insert(i, midi_in); |