mirror of
https://github.com/godotengine/godot.git
synced 2024-11-12 23:24:26 +00:00
Fix crash in visibility range system.
This commit is contained in:
parent
d587ea6020
commit
2c0819992c
@ -2578,7 +2578,7 @@ void RendererSceneCull::_scene_cull(CullData &cull_data, InstanceCullResult &cul
|
||||
#define HIDDEN_BY_VISIBILITY_CHECKS (visibility_flags == InstanceData::FLAG_VISIBILITY_DEPENDENCY_HIDDEN_CLOSE_RANGE || visibility_flags == InstanceData::FLAG_VISIBILITY_DEPENDENCY_HIDDEN)
|
||||
#define LAYER_CHECK (cull_data.visible_layers & idata.layer_mask)
|
||||
#define IN_FRUSTUM(f) (cull_data.scenario->instance_aabbs[i].in_frustum(f))
|
||||
#define VIS_RANGE_CHECK ((idata.visibility_index == -1) || _visibility_range_check(cull_data.scenario->instance_visibility[idata.visibility_index], cull_data.cam_transform.origin, cull_data.visibility_cull_data->viewport_mask) == 0)
|
||||
#define VIS_RANGE_CHECK ((idata.visibility_index == -1) || _visibility_range_check(cull_data.scenario->instance_visibility[idata.visibility_index], cull_data.cam_transform.origin, cull_data.visibility_viewport_mask) == 0)
|
||||
#define VIS_PARENT_CHECK ((idata.parent_array_index == -1) || ((cull_data.scenario->instance_data[idata.parent_array_index].flags & InstanceData::FLAG_VISIBILITY_DEPENDENCY_NEEDS_CHECK) == InstanceData::FLAG_VISIBILITY_DEPENDENCY_HIDDEN_CLOSE_RANGE))
|
||||
#define VIS_CHECK (visibility_check < 0 ? (visibility_check = (visibility_flags != InstanceData::FLAG_VISIBILITY_DEPENDENCY_NEEDS_CHECK || (VIS_RANGE_CHECK && VIS_PARENT_CHECK))) : visibility_check)
|
||||
#define OCCLUSION_CULLED (cull_data.occlusion_buffer != nullptr && (cull_data.scenario->instance_data[i].flags & InstanceData::FLAG_IGNORE_OCCLUSION_CULLING) == 0 && cull_data.occlusion_buffer->is_occluded(cull_data.scenario->instance_aabbs[i].bounds, cull_data.cam_transform.origin, inv_cam_transform, *cull_data.camera_matrix, z_near))
|
||||
@ -2808,12 +2808,12 @@ void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_c
|
||||
|
||||
RENDER_TIMESTAMP("Visibility Dependencies");
|
||||
|
||||
VisibilityCullData visibility_cull_data;
|
||||
if (scenario->instance_visibility.get_bin_count() > 0) {
|
||||
if (!scenario->viewport_visibility_masks.has(p_viewport)) {
|
||||
scenario_add_viewport_visibility_mask(scenario->self, p_viewport);
|
||||
}
|
||||
|
||||
VisibilityCullData visibility_cull_data;
|
||||
visibility_cull_data.scenario = scenario;
|
||||
visibility_cull_data.viewport_mask = scenario->viewport_visibility_masks[p_viewport];
|
||||
visibility_cull_data.camera_position = p_camera_data->main_transform.origin;
|
||||
@ -2924,6 +2924,7 @@ void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_c
|
||||
cull_data.render_reflection_probe = render_reflection_probe;
|
||||
cull_data.occlusion_buffer = RendererSceneOcclusionCull::get_singleton()->buffer_get_ptr(p_viewport);
|
||||
cull_data.camera_matrix = &p_camera_data->main_projection;
|
||||
cull_data.visibility_viewport_mask = scenario->viewport_visibility_masks.has(p_viewport) ? scenario->viewport_visibility_masks[p_viewport] : 0;
|
||||
//#define DEBUG_CULL_TIME
|
||||
#ifdef DEBUG_CULL_TIME
|
||||
uint64_t time_from = OS::get_singleton()->get_ticks_usec();
|
||||
|
@ -1016,7 +1016,7 @@ public:
|
||||
Instance *render_reflection_probe;
|
||||
const RendererSceneOcclusionCull::HZBuffer *occlusion_buffer;
|
||||
const CameraMatrix *camera_matrix;
|
||||
const VisibilityCullData *visibility_cull_data;
|
||||
uint64_t visibility_viewport_mask;
|
||||
};
|
||||
|
||||
void _scene_cull_threaded(uint32_t p_thread, CullData *cull_data);
|
||||
|
Loading…
Reference in New Issue
Block a user