You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-07 12:30:27 +00:00
Addition of FogVolumes, FogShaders, FogMaterial, and overhaul of VolumetricFog
Co-authored-by: Brian Semrau <brian.semrau@gmail.com>
This commit is contained in:
@@ -1399,6 +1399,8 @@ void RendererStorageRD::shader_set_code(RID p_shader, const String &p_code) {
|
||||
new_type = SHADER_TYPE_3D;
|
||||
} else if (mode_string == "sky") {
|
||||
new_type = SHADER_TYPE_SKY;
|
||||
} else if (mode_string == "fog") {
|
||||
new_type = SHADER_TYPE_FOG;
|
||||
} else {
|
||||
new_type = SHADER_TYPE_MAX;
|
||||
}
|
||||
@@ -2692,20 +2694,56 @@ void RendererStorageRD::MaterialData::update_textures(const Map<StringName, Vari
|
||||
|
||||
if (textures.is_empty()) {
|
||||
//check default usage
|
||||
switch (p_texture_uniforms[i].hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_BLACK:
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_BLACK_ALBEDO: {
|
||||
rd_texture = singleton->texture_rd_get_default(DEFAULT_RD_TEXTURE_BLACK);
|
||||
switch (p_texture_uniforms[i].type) {
|
||||
case ShaderLanguage::TYPE_ISAMPLER2D:
|
||||
case ShaderLanguage::TYPE_USAMPLER2D:
|
||||
case ShaderLanguage::TYPE_SAMPLER2D: {
|
||||
switch (p_texture_uniforms[i].hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_BLACK:
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_BLACK_ALBEDO: {
|
||||
rd_texture = singleton->texture_rd_get_default(DEFAULT_RD_TEXTURE_BLACK);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_NONE: {
|
||||
rd_texture = singleton->texture_rd_get_default(DEFAULT_RD_TEXTURE_NORMAL);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_ANISO: {
|
||||
rd_texture = singleton->texture_rd_get_default(DEFAULT_RD_TEXTURE_ANISO);
|
||||
} break;
|
||||
default: {
|
||||
rd_texture = singleton->texture_rd_get_default(DEFAULT_RD_TEXTURE_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_NONE: {
|
||||
rd_texture = singleton->texture_rd_get_default(DEFAULT_RD_TEXTURE_NORMAL);
|
||||
|
||||
case ShaderLanguage::TYPE_SAMPLERCUBE: {
|
||||
switch (p_texture_uniforms[i].hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_BLACK:
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_BLACK_ALBEDO: {
|
||||
rd_texture = singleton->texture_rd_get_default(DEFAULT_RD_TEXTURE_CUBEMAP_BLACK);
|
||||
} break;
|
||||
default: {
|
||||
rd_texture = singleton->texture_rd_get_default(DEFAULT_RD_TEXTURE_CUBEMAP_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_ANISO: {
|
||||
rd_texture = singleton->texture_rd_get_default(DEFAULT_RD_TEXTURE_ANISO);
|
||||
case ShaderLanguage::TYPE_SAMPLERCUBEARRAY: {
|
||||
rd_texture = singleton->texture_rd_get_default(DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_BLACK);
|
||||
} break;
|
||||
|
||||
case ShaderLanguage::TYPE_ISAMPLER3D:
|
||||
case ShaderLanguage::TYPE_USAMPLER3D:
|
||||
case ShaderLanguage::TYPE_SAMPLER3D: {
|
||||
rd_texture = singleton->texture_rd_get_default(DEFAULT_RD_TEXTURE_3D_WHITE);
|
||||
} break;
|
||||
|
||||
case ShaderLanguage::TYPE_ISAMPLER2DARRAY:
|
||||
case ShaderLanguage::TYPE_USAMPLER2DARRAY:
|
||||
case ShaderLanguage::TYPE_SAMPLER2DARRAY: {
|
||||
rd_texture = singleton->texture_rd_get_default(DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE);
|
||||
} break;
|
||||
|
||||
default: {
|
||||
rd_texture = singleton->texture_rd_get_default(DEFAULT_RD_TEXTURE_WHITE);
|
||||
} break;
|
||||
}
|
||||
}
|
||||
#ifdef TOOLS_ENABLED
|
||||
if (roughness_detect_texture && normal_detect_texture && normal_detect_texture->path != String()) {
|
||||
@@ -6002,6 +6040,82 @@ void RendererStorageRD::particles_collision_instance_set_active(RID p_collision_
|
||||
pci->active = p_active;
|
||||
}
|
||||
|
||||
/* FOG VOLUMES */
|
||||
|
||||
RID RendererStorageRD::fog_volume_allocate() {
|
||||
return fog_volume_owner.allocate_rid();
|
||||
}
|
||||
void RendererStorageRD::fog_volume_initialize(RID p_rid) {
|
||||
fog_volume_owner.initialize_rid(p_rid, FogVolume());
|
||||
}
|
||||
|
||||
void RendererStorageRD::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_CHANGED_AABB);
|
||||
}
|
||||
|
||||
void RendererStorageRD::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_CHANGED_AABB);
|
||||
}
|
||||
|
||||
void RendererStorageRD::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 RendererStorageRD::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 RendererStorageRD::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 RendererStorageRD::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_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 RendererStorageRD::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;
|
||||
}
|
||||
|
||||
/* VISIBILITY NOTIFIER */
|
||||
|
||||
RID RendererStorageRD::visibility_notifier_allocate() {
|
||||
@@ -8083,6 +8197,9 @@ void RendererStorageRD::base_update_dependency(RID p_base, DependencyTracker *p_
|
||||
} else if (particles_collision_owner.owns(p_base)) {
|
||||
ParticlesCollision *pc = particles_collision_owner.get_or_null(p_base);
|
||||
p_instance->update_dependency(&pc->dependency);
|
||||
} else if (fog_volume_owner.owns(p_base)) {
|
||||
FogVolume *fv = fog_volume_owner.get_or_null(p_base);
|
||||
p_instance->update_dependency(&fv->dependency);
|
||||
} else if (visibility_notifier_owner.owns(p_base)) {
|
||||
VisibilityNotifier *vn = visibility_notifier_owner.get_or_null(p_base);
|
||||
p_instance->update_dependency(&vn->dependency);
|
||||
@@ -8124,6 +8241,9 @@ RS::InstanceType RendererStorageRD::get_base_type(RID p_rid) const {
|
||||
if (particles_collision_owner.owns(p_rid)) {
|
||||
return RS::INSTANCE_PARTICLES_COLLISION;
|
||||
}
|
||||
if (fog_volume_owner.owns(p_rid)) {
|
||||
return RS::INSTANCE_FOG_VOLUME;
|
||||
}
|
||||
if (visibility_notifier_owner.owns(p_rid)) {
|
||||
return RS::INSTANCE_VISIBLITY_NOTIFIER;
|
||||
}
|
||||
@@ -9206,6 +9326,10 @@ bool RendererStorageRD::free(RID p_rid) {
|
||||
visibility_notifier_owner.free(p_rid);
|
||||
} else if (particles_collision_instance_owner.owns(p_rid)) {
|
||||
particles_collision_instance_owner.free(p_rid);
|
||||
} else if (fog_volume_owner.owns(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);
|
||||
} else if (render_target_owner.owns(p_rid)) {
|
||||
RenderTarget *rt = render_target_owner.get_or_null(p_rid);
|
||||
|
||||
@@ -9499,6 +9623,18 @@ RendererStorageRD::RendererStorageRD() {
|
||||
pv.set(i * 4 + 3, 0);
|
||||
}
|
||||
|
||||
{
|
||||
Vector<Vector<uint8_t>> vpv;
|
||||
vpv.push_back(pv);
|
||||
default_rd_textures[DEFAULT_RD_TEXTURE_3D_BLACK] = RD::get_singleton()->texture_create(tformat, RD::TextureView(), vpv);
|
||||
}
|
||||
for (int i = 0; i < 64; i++) {
|
||||
pv.set(i * 4 + 0, 255);
|
||||
pv.set(i * 4 + 1, 255);
|
||||
pv.set(i * 4 + 2, 255);
|
||||
pv.set(i * 4 + 3, 255);
|
||||
}
|
||||
|
||||
{
|
||||
Vector<Vector<uint8_t>> vpv;
|
||||
vpv.push_back(pv);
|
||||
|
||||
Reference in New Issue
Block a user