|
@@ -637,6 +637,8 @@ void RendererSceneCull::instance_set_base(RID p_instance, RID p_base) {
|
|
|
instance->base_data = geom;
|
|
|
geom->geometry_instance = scene_render->geometry_instance_create(p_base);
|
|
|
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
+
|
|
|
geom->geometry_instance->set_skeleton(instance->skeleton);
|
|
|
geom->geometry_instance->set_material_override(instance->material_override);
|
|
|
geom->geometry_instance->set_material_overlay(instance->material_overlay);
|
|
@@ -836,6 +838,7 @@ void RendererSceneCull::instance_set_layer_mask(RID p_instance, uint32_t p_mask)
|
|
|
|
|
|
if ((1 << instance->base_type) & RS::INSTANCE_GEOMETRY_MASK && instance->base_data) {
|
|
|
InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(instance->base_data);
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->set_layer_mask(p_mask);
|
|
|
}
|
|
|
}
|
|
@@ -848,6 +851,7 @@ void RendererSceneCull::instance_geometry_set_transparency(RID p_instance, float
|
|
|
|
|
|
if ((1 << instance->base_type) & RS::INSTANCE_GEOMETRY_MASK && instance->base_data) {
|
|
|
InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(instance->base_data);
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->set_transparency(p_transparency);
|
|
|
}
|
|
|
}
|
|
@@ -1009,6 +1013,7 @@ void RendererSceneCull::instance_attach_skeleton(RID p_instance, RID p_skeleton)
|
|
|
_instance_update_mesh_instance(instance);
|
|
|
|
|
|
InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(instance->base_data);
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->set_skeleton(p_skeleton);
|
|
|
}
|
|
|
}
|
|
@@ -1129,6 +1134,7 @@ void RendererSceneCull::instance_geometry_set_flag(RID p_instance, RS::InstanceF
|
|
|
|
|
|
if ((1 << instance->base_type) & RS::INSTANCE_GEOMETRY_MASK && instance->base_data) {
|
|
|
InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(instance->base_data);
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->set_use_baked_light(p_enabled);
|
|
|
}
|
|
|
|
|
@@ -1149,6 +1155,7 @@ void RendererSceneCull::instance_geometry_set_flag(RID p_instance, RS::InstanceF
|
|
|
|
|
|
if ((1 << instance->base_type) & RS::INSTANCE_GEOMETRY_MASK && instance->base_data) {
|
|
|
InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(instance->base_data);
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->set_use_dynamic_gi(p_enabled);
|
|
|
}
|
|
|
|
|
@@ -1207,6 +1214,8 @@ void RendererSceneCull::instance_geometry_set_cast_shadows_setting(RID p_instanc
|
|
|
|
|
|
if ((1 << instance->base_type) & RS::INSTANCE_GEOMETRY_MASK && instance->base_data) {
|
|
|
InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(instance->base_data);
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
+
|
|
|
geom->geometry_instance->set_cast_double_sided_shadows(instance->cast_shadows == RS::SHADOW_CASTING_SETTING_DOUBLE_SIDED);
|
|
|
}
|
|
|
|
|
@@ -1222,6 +1231,7 @@ void RendererSceneCull::instance_geometry_set_material_override(RID p_instance,
|
|
|
|
|
|
if ((1 << instance->base_type) & RS::INSTANCE_GEOMETRY_MASK && instance->base_data) {
|
|
|
InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(instance->base_data);
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->set_material_override(p_material);
|
|
|
}
|
|
|
}
|
|
@@ -1235,6 +1245,7 @@ void RendererSceneCull::instance_geometry_set_material_overlay(RID p_instance, R
|
|
|
|
|
|
if ((1 << instance->base_type) & RS::INSTANCE_GEOMETRY_MASK && instance->base_data) {
|
|
|
InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(instance->base_data);
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->set_material_overlay(p_material);
|
|
|
}
|
|
|
}
|
|
@@ -1407,6 +1418,7 @@ void RendererSceneCull::instance_geometry_set_lightmap(RID p_instance, RID p_lig
|
|
|
|
|
|
if ((1 << instance->base_type) & RS::INSTANCE_GEOMETRY_MASK && instance->base_data) {
|
|
|
InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(instance->base_data);
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->set_use_lightmap(lightmap_instance_rid, p_lightmap_uv_scale, p_slice_index);
|
|
|
}
|
|
|
}
|
|
@@ -1419,6 +1431,7 @@ void RendererSceneCull::instance_geometry_set_lod_bias(RID p_instance, float p_l
|
|
|
|
|
|
if ((1 << instance->base_type) & RS::INSTANCE_GEOMETRY_MASK && instance->base_data) {
|
|
|
InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(instance->base_data);
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->set_lod_bias(p_lod_bias);
|
|
|
}
|
|
|
}
|
|
@@ -1587,10 +1600,12 @@ void RendererSceneCull::_update_instance(Instance *p_instance) {
|
|
|
if (!p_instance->lightmap_sh.is_empty()) {
|
|
|
p_instance->lightmap_sh.clear(); //don't need SH
|
|
|
p_instance->lightmap_target_sh.clear(); //don't need SH
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->set_lightmap_capture(nullptr);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->set_transform(p_instance->transform, p_instance->aabb, p_instance->transformed_aabb);
|
|
|
}
|
|
|
|
|
@@ -1817,6 +1832,7 @@ void RendererSceneCull::_unpair_instance(Instance *p_instance) {
|
|
|
if ((1 << p_instance->base_type) & RS::INSTANCE_GEOMETRY_MASK) {
|
|
|
// Clear these now because the InstanceData containing the dirty flags is gone
|
|
|
InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(p_instance->base_data);
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
|
|
|
geom->geometry_instance->pair_light_instances(nullptr, 0);
|
|
|
geom->geometry_instance->pair_reflection_probe_instances(nullptr, 0);
|
|
@@ -1990,6 +2006,7 @@ void RendererSceneCull::_update_instance_lightmap_captures(Instance *p_instance)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->set_lightmap_capture(p_instance->lightmap_sh.ptr());
|
|
|
}
|
|
|
|
|
@@ -2757,6 +2774,7 @@ void RendererSceneCull::_scene_cull(CullData &cull_data, InstanceCullResult &cul
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->pair_light_instances(instance_pair_buffer, idx);
|
|
|
idata.flags &= ~uint32_t(InstanceData::FLAG_GEOM_LIGHTING_DIRTY);
|
|
|
}
|
|
@@ -2764,6 +2782,7 @@ void RendererSceneCull::_scene_cull(CullData &cull_data, InstanceCullResult &cul
|
|
|
if (idata.flags & InstanceData::FLAG_GEOM_PROJECTOR_SOFTSHADOW_DIRTY) {
|
|
|
InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(idata.instance->base_data);
|
|
|
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->set_softshadow_projector_pairing(geom->softshadow_count > 0, geom->projector_count > 0);
|
|
|
idata.flags &= ~uint32_t(InstanceData::FLAG_GEOM_PROJECTOR_SOFTSHADOW_DIRTY);
|
|
|
}
|
|
@@ -2781,6 +2800,7 @@ void RendererSceneCull::_scene_cull(CullData &cull_data, InstanceCullResult &cul
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->pair_reflection_probe_instances(instance_pair_buffer, idx);
|
|
|
idata.flags &= ~uint32_t(InstanceData::FLAG_GEOM_REFLECTION_DIRTY);
|
|
|
}
|
|
@@ -2797,7 +2817,10 @@ void RendererSceneCull::_scene_cull(CullData &cull_data, InstanceCullResult &cul
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->pair_decal_instances(instance_pair_buffer, idx);
|
|
|
+
|
|
|
idata.flags &= ~uint32_t(InstanceData::FLAG_GEOM_DECAL_DIRTY);
|
|
|
}
|
|
|
|
|
@@ -2813,7 +2836,9 @@ void RendererSceneCull::_scene_cull(CullData &cull_data, InstanceCullResult &cul
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->pair_voxel_gi_instances(instance_pair_buffer, idx);
|
|
|
+
|
|
|
idata.flags &= ~uint32_t(InstanceData::FLAG_GEOM_VOXEL_GI_DIRTY);
|
|
|
}
|
|
|
|
|
@@ -2824,6 +2849,7 @@ void RendererSceneCull::_scene_cull(CullData &cull_data, InstanceCullResult &cul
|
|
|
for (uint32_t j = 0; j < 9; j++) {
|
|
|
sh[j] = sh[j].lerp(target_sh[j], MIN(1.0, lightmap_probe_update_speed));
|
|
|
}
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->set_lightmap_capture(sh);
|
|
|
idata.instance->last_frame_pass = frame_number;
|
|
|
}
|
|
@@ -3588,11 +3614,13 @@ void RendererSceneCull::render_probes() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->pair_voxel_gi_instances(instance_pair_buffer, idx);
|
|
|
|
|
|
ins->scenario->instance_data[ins->array_index].flags &= ~uint32_t(InstanceData::FLAG_GEOM_VOXEL_GI_DIRTY);
|
|
|
}
|
|
|
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
scene_cull_result.geometry_instances.push_back(geom->geometry_instance);
|
|
|
}
|
|
|
|
|
@@ -3633,6 +3661,7 @@ void RendererSceneCull::render_particle_colliders() {
|
|
|
continue;
|
|
|
}
|
|
|
InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(instance->base_data);
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
scene_cull_result.geometry_instances.push_back(geom->geometry_instance);
|
|
|
}
|
|
|
|
|
@@ -3851,6 +3880,7 @@ void RendererSceneCull::_update_dirty_instance(Instance *p_instance) {
|
|
|
p_instance->instance_allocated_shader_uniforms = (p_instance->instance_shader_uniforms.size() > 0);
|
|
|
if (p_instance->instance_allocated_shader_uniforms) {
|
|
|
p_instance->instance_allocated_shader_uniforms_offset = RSG::material_storage->global_shader_uniforms_instance_allocate(p_instance->self);
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->set_instance_shader_uniforms_offset(p_instance->instance_allocated_shader_uniforms_offset);
|
|
|
|
|
|
for (const KeyValue<StringName, Instance::InstanceShaderParameter> &E : p_instance->instance_shader_uniforms) {
|
|
@@ -3861,6 +3891,7 @@ void RendererSceneCull::_update_dirty_instance(Instance *p_instance) {
|
|
|
} else {
|
|
|
RSG::material_storage->global_shader_uniforms_instance_free(p_instance->self);
|
|
|
p_instance->instance_allocated_shader_uniforms_offset = -1;
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->set_instance_shader_uniforms_offset(-1);
|
|
|
}
|
|
|
}
|
|
@@ -3874,6 +3905,7 @@ void RendererSceneCull::_update_dirty_instance(Instance *p_instance) {
|
|
|
|
|
|
if ((1 << p_instance->base_type) & RS::INSTANCE_GEOMETRY_MASK) {
|
|
|
InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(p_instance->base_data);
|
|
|
+ ERR_FAIL_NULL(geom->geometry_instance);
|
|
|
geom->geometry_instance->set_surface_materials(p_instance->materials);
|
|
|
}
|
|
|
}
|