diff options
Diffstat (limited to 'drivers/gles3/storage')
| -rw-r--r-- | drivers/gles3/storage/light_storage.cpp | 6 | ||||
| -rw-r--r-- | drivers/gles3/storage/material_storage.cpp | 5 | ||||
| -rw-r--r-- | drivers/gles3/storage/particles_storage.cpp | 31 | ||||
| -rw-r--r-- | drivers/gles3/storage/particles_storage.h | 10 | ||||
| -rw-r--r-- | drivers/gles3/storage/utilities.cpp | 2 |
5 files changed, 48 insertions, 6 deletions
diff --git a/drivers/gles3/storage/light_storage.cpp b/drivers/gles3/storage/light_storage.cpp index ff06fbfa41..6d4d23bd10 100644 --- a/drivers/gles3/storage/light_storage.cpp +++ b/drivers/gles3/storage/light_storage.cpp @@ -34,6 +34,7 @@ #include "../rasterizer_gles3.h" #include "../rasterizer_scene_gles3.h" #include "config.h" +#include "core/config/project_settings.h" #include "texture_storage.h" using namespace GLES3; @@ -46,6 +47,11 @@ LightStorage *LightStorage::get_singleton() { LightStorage::LightStorage() { singleton = this; + + directional_shadow.size = GLOBAL_GET("rendering/lights_and_shadows/directional_shadow/size"); + directional_shadow.use_16_bits = GLOBAL_GET("rendering/lights_and_shadows/directional_shadow/16_bits"); + + // lightmap_probe_capture_update_speed = GLOBAL_GET("rendering/lightmapping/probe_capture/update_speed"); } LightStorage::~LightStorage() { diff --git a/drivers/gles3/storage/material_storage.cpp b/drivers/gles3/storage/material_storage.cpp index 016f554368..b3a3506d40 100644 --- a/drivers/gles3/storage/material_storage.cpp +++ b/drivers/gles3/storage/material_storage.cpp @@ -1395,6 +1395,7 @@ MaterialStorage::MaterialStorage() { actions.renames["DELTA"] = "local_delta"; actions.renames["NUMBER"] = "particle_number"; actions.renames["INDEX"] = "index"; + actions.renames["AMOUNT_RATIO"] = "amount_ratio"; //actions.renames["GRAVITY"] = "current_gravity"; actions.renames["EMISSION_TRANSFORM"] = "emission_transform"; actions.renames["RANDOM_SEED"] = "random_seed"; @@ -1407,6 +1408,8 @@ MaterialStorage::MaterialStorage() { actions.renames["COLLISION_NORMAL"] = "collision_normal"; actions.renames["COLLISION_DEPTH"] = "collision_depth"; actions.renames["ATTRACTOR_FORCE"] = "attractor_force"; + actions.renames["EMITTER_VELOCITY"] = "emitter_velocity"; + actions.renames["INTERPOLATE_TO_END"] = "interp_to_end"; // These are unsupported, but may be used by users. To avoid compile time overhead, we add the stub only when used. actions.renames["FLAG_EMIT_POSITION"] = "uint(1)"; @@ -2396,7 +2399,7 @@ void MaterialStorage::material_set_shader(RID p_material, RID p_shader) { return; } - ERR_FAIL_COND(shader->data == nullptr); + ERR_FAIL_NULL(shader->data); material->data = material_data_request_func[shader->mode](shader->data); material->data->self = p_material; diff --git a/drivers/gles3/storage/particles_storage.cpp b/drivers/gles3/storage/particles_storage.cpp index 0a6f02511c..296d721cd1 100644 --- a/drivers/gles3/storage/particles_storage.cpp +++ b/drivers/gles3/storage/particles_storage.cpp @@ -190,6 +190,13 @@ void ParticlesStorage::particles_set_amount(RID p_particles, int p_amount) { particles->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_PARTICLES); } +void ParticlesStorage::particles_set_amount_ratio(RID p_particles, float p_amount_ratio) { + Particles *particles = particles_owner.get_or_null(p_particles); + ERR_FAIL_NULL(particles); + + particles->amount_ratio = p_amount_ratio; +} + void ParticlesStorage::particles_set_lifetime(RID p_particles, double p_lifetime) { Particles *particles = particles_owner.get_or_null(p_particles); ERR_FAIL_NULL(particles); @@ -431,6 +438,20 @@ void ParticlesStorage::particles_set_emission_transform(RID p_particles, const T particles->emission_transform = p_transform; } +void ParticlesStorage::particles_set_emitter_velocity(RID p_particles, const Vector3 &p_velocity) { + Particles *particles = particles_owner.get_or_null(p_particles); + ERR_FAIL_NULL(particles); + + particles->emitter_velocity = p_velocity; +} + +void ParticlesStorage::particles_set_interp_to_end(RID p_particles, float p_interp) { + Particles *particles = particles_owner.get_or_null(p_particles); + ERR_FAIL_NULL(particles); + + particles->interp_to_end = p_interp; +} + int ParticlesStorage::particles_get_draw_passes(RID p_particles) const { const Particles *particles = particles_owner.get_or_null(p_particles); ERR_FAIL_NULL_V(particles, 0); @@ -507,9 +528,13 @@ void ParticlesStorage::_particles_process(Particles *p_particles, double p_delta frame_params.cycle = p_particles->cycle_number; frame_params.frame = p_particles->frame_counter++; - frame_params.pad0 = 0; + frame_params.amount_ratio = p_particles->amount_ratio; frame_params.pad1 = 0; frame_params.pad2 = 0; + frame_params.interp_to_end = p_particles->interp_to_end; + frame_params.emitter_velocity[0] = p_particles->emitter_velocity.x; + frame_params.emitter_velocity[1] = p_particles->emitter_velocity.y; + frame_params.emitter_velocity[2] = p_particles->emitter_velocity.z; { //collision and attractors @@ -775,7 +800,7 @@ void ParticlesStorage::particles_set_view_axis(RID p_particles, const Vector3 &p LocalVector<ParticleInstanceData3D> particle_vector; particle_vector.resize(particles->amount); particle_array = particle_vector.ptr(); - glGetBufferSubData(GL_ARRAY_BUFFER, 0, particles->amount * sizeof(ParticleInstanceData3D), particle_array); + godot_webgl2_glGetBufferSubData(GL_ARRAY_BUFFER, 0, particles->amount * sizeof(ParticleInstanceData3D), particle_array); #endif SortArray<ParticleInstanceData3D, ParticlesViewSort> sorter; sorter.compare.z_dir = axis; @@ -1133,7 +1158,7 @@ void ParticlesStorage::_particles_reverse_lifetime_sort(Particles *particles) { LocalVector<ParticleInstanceData> particle_vector; particle_vector.resize(particles->amount); particle_array = particle_vector.ptr(); - glGetBufferSubData(GL_ARRAY_BUFFER, 0, buffer_size, particle_array); + godot_webgl2_glGetBufferSubData(GL_ARRAY_BUFFER, 0, buffer_size, particle_array); #endif uint32_t lifetime_split = (MIN(int(particles->amount * particles->sort_buffer_phase), particles->amount - 1) + 1) % particles->amount; diff --git a/drivers/gles3/storage/particles_storage.h b/drivers/gles3/storage/particles_storage.h index 5146dc5329..d4c4b497ff 100644 --- a/drivers/gles3/storage/particles_storage.h +++ b/drivers/gles3/storage/particles_storage.h @@ -128,7 +128,7 @@ private: float delta; float particle_size; - float pad0; + float amount_ratio; float pad1; float pad2; @@ -138,6 +138,8 @@ private: uint32_t frame; float emission_transform[16]; + float emitter_velocity[3]; + float interp_to_end; Attractor attractors[MAX_ATTRACTORS]; Collider colliders[MAX_COLLIDERS]; @@ -149,6 +151,7 @@ private: double inactive_time = 0.0; bool emitting = false; bool one_shot = false; + float amount_ratio = 1.0; int amount = 0; double lifetime = 1.0; double pre_process_time = 0.0; @@ -229,6 +232,8 @@ private: bool clear = true; Transform3D emission_transform; + Vector3 emitter_velocity; + float interp_to_end; HashSet<RID> collisions; @@ -313,6 +318,7 @@ public: virtual void particles_emit(RID p_particles, const Transform3D &p_transform, const Vector3 &p_velocity, const Color &p_color, const Color &p_custom, uint32_t p_emit_flags) override; virtual void particles_set_emitting(RID p_particles, bool p_emitting) override; virtual void particles_set_amount(RID p_particles, int p_amount) override; + virtual void particles_set_amount_ratio(RID p_particles, float p_amount_ratio) override; virtual void particles_set_lifetime(RID p_particles, double p_lifetime) override; virtual void particles_set_one_shot(RID p_particles, bool p_one_shot) override; virtual void particles_set_pre_process_time(RID p_particles, double p_time) override; @@ -347,6 +353,8 @@ public: virtual AABB particles_get_aabb(RID p_particles) const override; virtual void particles_set_emission_transform(RID p_particles, const Transform3D &p_transform) override; + virtual void particles_set_emitter_velocity(RID p_particles, const Vector3 &p_velocity) override; + virtual void particles_set_interp_to_end(RID p_particles, float p_interp) override; virtual bool particles_get_emitting(RID p_particles) override; virtual int particles_get_draw_passes(RID p_particles) const override; diff --git a/drivers/gles3/storage/utilities.cpp b/drivers/gles3/storage/utilities.cpp index 07df445018..7deeefc37d 100644 --- a/drivers/gles3/storage/utilities.cpp +++ b/drivers/gles3/storage/utilities.cpp @@ -115,7 +115,7 @@ Vector<uint8_t> Utilities::buffer_get_data(GLenum p_target, GLuint p_buffer, uin #if defined(__EMSCRIPTEN__) { uint8_t *w = ret.ptrw(); - glGetBufferSubData(p_target, 0, p_buffer_size, w); + godot_webgl2_glGetBufferSubData(p_target, 0, p_buffer_size, w); } #else void *data = glMapBufferRange(p_target, 0, p_buffer_size, GL_MAP_READ_BIT); |
