You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-19 14:31:59 +00:00
Split dependency logic
Split FOG Split visibility notifier Final cleanup of storage classes
This commit is contained in:
128
servers/rendering/renderer_rd/environment/fog.cpp
Normal file
128
servers/rendering/renderer_rd/environment/fog.cpp
Normal file
@@ -0,0 +1,128 @@
|
||||
/*************************************************************************/
|
||||
/* fog.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "fog.h"
|
||||
|
||||
using namespace RendererRD;
|
||||
|
||||
Fog *Fog::singleton = nullptr;
|
||||
|
||||
Fog::Fog() {
|
||||
singleton = this;
|
||||
}
|
||||
|
||||
Fog::~Fog() {
|
||||
singleton = nullptr;
|
||||
}
|
||||
|
||||
/* FOG VOLUMES */
|
||||
|
||||
RID Fog::fog_volume_allocate() {
|
||||
return fog_volume_owner.allocate_rid();
|
||||
}
|
||||
|
||||
void Fog::fog_volume_initialize(RID p_rid) {
|
||||
fog_volume_owner.initialize_rid(p_rid, FogVolume());
|
||||
}
|
||||
|
||||
void Fog::fog_free(RID p_rid) {
|
||||
FogVolume *fog_volume = fog_volume_owner.get_or_null(p_rid);
|
||||
fog_volume->dependency.deleted_notify(p_rid);
|
||||
fog_volume_owner.free(p_rid);
|
||||
}
|
||||
|
||||
void Fog::fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) {
|
||||
FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
|
||||
ERR_FAIL_COND(!fog_volume);
|
||||
|
||||
if (p_shape == fog_volume->shape) {
|
||||
return;
|
||||
}
|
||||
|
||||
fog_volume->shape = p_shape;
|
||||
fog_volume->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
|
||||
}
|
||||
|
||||
void Fog::fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents) {
|
||||
FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
|
||||
ERR_FAIL_COND(!fog_volume);
|
||||
|
||||
fog_volume->extents = p_extents;
|
||||
fog_volume->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
|
||||
}
|
||||
|
||||
void Fog::fog_volume_set_material(RID p_fog_volume, RID p_material) {
|
||||
FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
|
||||
ERR_FAIL_COND(!fog_volume);
|
||||
fog_volume->material = p_material;
|
||||
}
|
||||
|
||||
RID Fog::fog_volume_get_material(RID p_fog_volume) const {
|
||||
FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
|
||||
ERR_FAIL_COND_V(!fog_volume, RID());
|
||||
|
||||
return fog_volume->material;
|
||||
}
|
||||
|
||||
RS::FogVolumeShape Fog::fog_volume_get_shape(RID p_fog_volume) const {
|
||||
FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
|
||||
ERR_FAIL_COND_V(!fog_volume, RS::FOG_VOLUME_SHAPE_BOX);
|
||||
|
||||
return fog_volume->shape;
|
||||
}
|
||||
|
||||
AABB Fog::fog_volume_get_aabb(RID p_fog_volume) const {
|
||||
FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
|
||||
ERR_FAIL_COND_V(!fog_volume, AABB());
|
||||
|
||||
switch (fog_volume->shape) {
|
||||
case RS::FOG_VOLUME_SHAPE_ELLIPSOID:
|
||||
case RS::FOG_VOLUME_SHAPE_CONE:
|
||||
case RS::FOG_VOLUME_SHAPE_CYLINDER:
|
||||
case RS::FOG_VOLUME_SHAPE_BOX: {
|
||||
AABB aabb;
|
||||
aabb.position = -fog_volume->extents;
|
||||
aabb.size = fog_volume->extents * 2;
|
||||
return aabb;
|
||||
}
|
||||
default: {
|
||||
// Need some size otherwise will get culled
|
||||
return AABB(Vector3(-1, -1, -1), Vector3(2, 2, 2));
|
||||
}
|
||||
}
|
||||
|
||||
return AABB();
|
||||
}
|
||||
|
||||
Vector3 Fog::fog_volume_get_extents(RID p_fog_volume) const {
|
||||
const FogVolume *fog_volume = fog_volume_owner.get_or_null(p_fog_volume);
|
||||
ERR_FAIL_COND_V(!fog_volume, Vector3());
|
||||
return fog_volume->extents;
|
||||
}
|
||||
83
servers/rendering/renderer_rd/environment/fog.h
Normal file
83
servers/rendering/renderer_rd/environment/fog.h
Normal file
@@ -0,0 +1,83 @@
|
||||
/*************************************************************************/
|
||||
/* fog.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#ifndef FOG_RD_H
|
||||
#define FOG_RD_H
|
||||
|
||||
#include "core/templates/local_vector.h"
|
||||
#include "core/templates/rid_owner.h"
|
||||
#include "servers/rendering/environment/renderer_fog.h"
|
||||
#include "servers/rendering/storage/utilities.h"
|
||||
|
||||
namespace RendererRD {
|
||||
|
||||
class Fog : public RendererFog {
|
||||
public:
|
||||
struct FogVolume {
|
||||
RID material;
|
||||
Vector3 extents = Vector3(1, 1, 1);
|
||||
|
||||
RS::FogVolumeShape shape = RS::FOG_VOLUME_SHAPE_BOX;
|
||||
|
||||
Dependency dependency;
|
||||
};
|
||||
|
||||
private:
|
||||
static Fog *singleton;
|
||||
|
||||
mutable RID_Owner<FogVolume, true> fog_volume_owner;
|
||||
|
||||
public:
|
||||
static Fog *get_singleton() { return singleton; }
|
||||
|
||||
Fog();
|
||||
~Fog();
|
||||
|
||||
/* FOG VOLUMES */
|
||||
|
||||
FogVolume *get_fog_volume(RID p_rid) { return fog_volume_owner.get_or_null(p_rid); };
|
||||
bool owns_fog_volume(RID p_rid) { return fog_volume_owner.owns(p_rid); };
|
||||
|
||||
virtual RID fog_volume_allocate() override;
|
||||
virtual void fog_volume_initialize(RID p_rid) override;
|
||||
virtual void fog_free(RID p_rid) override;
|
||||
|
||||
virtual void fog_volume_set_shape(RID p_fog_volume, RS::FogVolumeShape p_shape) override;
|
||||
virtual void fog_volume_set_extents(RID p_fog_volume, const Vector3 &p_extents) override;
|
||||
virtual void fog_volume_set_material(RID p_fog_volume, RID p_material) override;
|
||||
virtual RS::FogVolumeShape fog_volume_get_shape(RID p_fog_volume) const override;
|
||||
RID fog_volume_get_material(RID p_fog_volume) const;
|
||||
virtual AABB fog_volume_get_aabb(RID p_fog_volume) const override;
|
||||
Vector3 fog_volume_get_extents(RID p_fog_volume) const;
|
||||
};
|
||||
|
||||
} // namespace RendererRD
|
||||
|
||||
#endif // !FOG_RD_H
|
||||
@@ -33,7 +33,6 @@
|
||||
#include "core/config/project_settings.h"
|
||||
#include "servers/rendering/renderer_rd/renderer_compositor_rd.h"
|
||||
#include "servers/rendering/renderer_rd/renderer_scene_render_rd.h"
|
||||
#include "servers/rendering/renderer_rd/renderer_storage_rd.h"
|
||||
#include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
|
||||
#include "servers/rendering/renderer_rd/storage_rd/texture_storage.h"
|
||||
#include "servers/rendering/rendering_server_default.h"
|
||||
@@ -184,7 +183,7 @@ void GI::voxel_gi_allocate_data(RID p_voxel_gi, const Transform3D &p_to_cell_xfo
|
||||
voxel_gi->version++;
|
||||
voxel_gi->data_version++;
|
||||
|
||||
voxel_gi->dependency.changed_notify(RendererStorage::DEPENDENCY_CHANGED_AABB);
|
||||
voxel_gi->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_AABB);
|
||||
}
|
||||
|
||||
AABB GI::voxel_gi_get_bounds(RID p_voxel_gi) const {
|
||||
@@ -390,7 +389,6 @@ void GI::SDFGI::create(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world
|
||||
RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
|
||||
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
|
||||
|
||||
storage = p_gi->storage;
|
||||
gi = p_gi;
|
||||
num_cascades = p_env->sdfgi_cascades;
|
||||
min_cell_size = p_env->sdfgi_min_cell_size;
|
||||
@@ -1287,7 +1285,7 @@ void GI::SDFGI::update_probes(RendererSceneEnvironmentRD *p_env, RendererSceneSk
|
||||
|
||||
if (p_env->background == RS::ENV_BG_CLEAR_COLOR) {
|
||||
push_constant.sky_mode = SDFGIShader::IntegratePushConstant::SKY_MODE_COLOR;
|
||||
Color c = storage->get_default_clear_color().srgb_to_linear();
|
||||
Color c = RSG::texture_storage->get_default_clear_color().srgb_to_linear();
|
||||
push_constant.sky_color[0] = c.r;
|
||||
push_constant.sky_color[1] = c.g;
|
||||
push_constant.sky_color[2] = c.b;
|
||||
@@ -1636,7 +1634,7 @@ void GI::SDFGI::debug_probes(RID p_framebuffer, const uint32_t p_view_count, con
|
||||
}
|
||||
|
||||
for (uint32_t v = 0; v < p_view_count; v++) {
|
||||
RendererStorageRD::store_camera(p_camera_with_transforms[v], scene_data.projection[v]);
|
||||
RendererRD::MaterialStorage::store_camera(p_camera_with_transforms[v], scene_data.projection[v]);
|
||||
}
|
||||
|
||||
RD::get_singleton()->buffer_update(debug_probes_scene_data_ubo, 0, sizeof(SDFGIShader::DebugProbesSceneData), &scene_data, RD::BARRIER_MASK_RASTER);
|
||||
@@ -3218,12 +3216,10 @@ GI::~GI() {
|
||||
singleton = nullptr;
|
||||
}
|
||||
|
||||
void GI::init(RendererStorageRD *p_storage, RendererSceneSkyRD *p_sky) {
|
||||
void GI::init(RendererSceneSkyRD *p_sky) {
|
||||
RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
|
||||
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
|
||||
|
||||
storage = p_storage;
|
||||
|
||||
/* GI */
|
||||
|
||||
{
|
||||
@@ -3681,7 +3677,7 @@ void GI::process_gi(RID p_render_buffers, RID *p_normal_roughness_views, RID p_v
|
||||
}
|
||||
|
||||
for (uint32_t v = 0; v < p_view_count; v++) {
|
||||
RendererStorageRD::store_camera(p_projections[v].inverse(), scene_data.inv_projection[v]);
|
||||
RendererRD::MaterialStorage::store_camera(p_projections[v].inverse(), scene_data.inv_projection[v]);
|
||||
scene_data.eye_offset[v][0] = p_eye_offsets[v].x;
|
||||
scene_data.eye_offset[v][1] = p_eye_offsets[v].y;
|
||||
scene_data.eye_offset[v][2] = p_eye_offsets[v].z;
|
||||
@@ -3689,7 +3685,7 @@ void GI::process_gi(RID p_render_buffers, RID *p_normal_roughness_views, RID p_v
|
||||
}
|
||||
|
||||
// Note that we will be ignoring the origin of this transform.
|
||||
RendererStorageRD::store_transform(p_cam_transform, scene_data.cam_transform);
|
||||
RendererRD::MaterialStorage::store_transform(p_cam_transform, scene_data.cam_transform);
|
||||
|
||||
scene_data.screen_size[0] = rb->internal_width;
|
||||
scene_data.screen_size[1] = rb->internal_height;
|
||||
@@ -3923,7 +3919,6 @@ void GI::process_gi(RID p_render_buffers, RID *p_normal_roughness_views, RID p_v
|
||||
RID GI::voxel_gi_instance_create(RID p_base) {
|
||||
VoxelGIInstance voxel_gi;
|
||||
voxel_gi.gi = this;
|
||||
voxel_gi.storage = storage;
|
||||
voxel_gi.probe = p_base;
|
||||
RID rid = voxel_gi_instance_owner.make_rid(voxel_gi);
|
||||
return rid;
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
#include "servers/rendering/renderer_compositor.h"
|
||||
#include "servers/rendering/renderer_rd/renderer_scene_environment_rd.h"
|
||||
#include "servers/rendering/renderer_rd/renderer_scene_sky_rd.h"
|
||||
#include "servers/rendering/renderer_rd/renderer_storage_rd.h"
|
||||
#include "servers/rendering/renderer_rd/shaders/environment/gi.glsl.gen.h"
|
||||
#include "servers/rendering/renderer_rd/shaders/environment/sdfgi_debug.glsl.gen.h"
|
||||
#include "servers/rendering/renderer_rd/shaders/environment/sdfgi_debug_probes.glsl.gen.h"
|
||||
@@ -47,8 +46,8 @@
|
||||
#include "servers/rendering/renderer_rd/shaders/environment/voxel_gi.glsl.gen.h"
|
||||
#include "servers/rendering/renderer_rd/shaders/environment/voxel_gi_debug.glsl.gen.h"
|
||||
#include "servers/rendering/renderer_scene_render.h"
|
||||
#include "servers/rendering/renderer_storage.h"
|
||||
#include "servers/rendering/rendering_device.h"
|
||||
#include "servers/rendering/storage/utilities.h"
|
||||
|
||||
// Forward declare RenderDataRD and RendererSceneRenderRD so we can pass it into some of our methods, these classes are pretty tightly bound
|
||||
struct RenderDataRD;
|
||||
@@ -89,11 +88,10 @@ public:
|
||||
uint32_t version = 1;
|
||||
uint32_t data_version = 1;
|
||||
|
||||
RendererStorage::Dependency dependency;
|
||||
Dependency dependency;
|
||||
};
|
||||
|
||||
private:
|
||||
RendererStorageRD *storage = nullptr;
|
||||
static GI *singleton;
|
||||
|
||||
/* VOXEL GI STORAGE */
|
||||
@@ -435,7 +433,6 @@ public:
|
||||
|
||||
struct VoxelGIInstance {
|
||||
// access to our containers
|
||||
RendererStorageRD *storage = nullptr;
|
||||
GI *gi = nullptr;
|
||||
|
||||
RID probe;
|
||||
@@ -559,7 +556,6 @@ public:
|
||||
};
|
||||
|
||||
// access to our containers
|
||||
RendererStorageRD *storage = nullptr;
|
||||
GI *gi = nullptr;
|
||||
|
||||
// used for rendering (voxelization)
|
||||
@@ -780,7 +776,7 @@ public:
|
||||
GI();
|
||||
~GI();
|
||||
|
||||
void init(RendererStorageRD *p_storage, RendererSceneSkyRD *p_sky);
|
||||
void init(RendererSceneSkyRD *p_sky);
|
||||
void free();
|
||||
|
||||
SDFGI *create_sdfgi(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world_position, uint32_t p_requested_history_size);
|
||||
|
||||
Reference in New Issue
Block a user