|
@@ -1015,7 +1015,7 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con
|
|
|
}
|
|
|
}
|
|
|
if (p_pass_mode == PASS_MODE_DEPTH_NORMAL_ROUGHNESS || p_pass_mode == PASS_MODE_DEPTH_NORMAL_ROUGHNESS_VOXEL_GI || p_pass_mode == PASS_MODE_COLOR) {
|
|
|
- bool transform_changed = inst->prev_transform_change_frame == frame;
|
|
|
+ bool transform_changed = inst->transform_status == GeometryInstanceForwardClustered::TransformStatus::MOVED;
|
|
|
bool has_mesh_instance = inst->mesh_instance.is_valid();
|
|
|
bool uses_particles = inst->base_flags & INSTANCE_DATA_FLAG_PARTICLES;
|
|
|
bool is_multimesh_with_motion = !uses_particles && (inst->base_flags & INSTANCE_DATA_FLAG_MULTIMESH) && mesh_storage->_multimesh_uses_motion_vectors_offsets(inst->data->base);
|
|
@@ -1044,9 +1044,9 @@ void RenderForwardClustered::_fill_render_list(RenderListType p_render_list, con
|
|
|
lod_distance = surface_distance.length();
|
|
|
}
|
|
|
|
|
|
- if (unlikely(inst->prev_transform_dirty && frame > inst->prev_transform_change_frame + 1 && inst->prev_transform_change_frame)) {
|
|
|
+ if (unlikely(inst->transform_status != GeometryInstanceForwardClustered::TransformStatus::NONE && frame > inst->prev_transform_change_frame + 1 && inst->prev_transform_change_frame)) {
|
|
|
inst->prev_transform = inst->transform;
|
|
|
- inst->prev_transform_dirty = false;
|
|
|
+ inst->transform_status = GeometryInstanceForwardClustered::TransformStatus::NONE;
|
|
|
}
|
|
|
|
|
|
while (surf) {
|
|
@@ -4694,12 +4694,19 @@ void RenderForwardClustered::GeometryInstanceForwardClustered::set_transform(con
|
|
|
if (frame != prev_transform_change_frame) {
|
|
|
prev_transform = transform;
|
|
|
prev_transform_change_frame = frame;
|
|
|
- prev_transform_dirty = true;
|
|
|
+ transform_status = TransformStatus::MOVED;
|
|
|
+ } else if (unlikely(transform_status == TransformStatus::TELEPORTED)) {
|
|
|
+ prev_transform = transform;
|
|
|
}
|
|
|
|
|
|
RenderGeometryInstanceBase::set_transform(p_transform, p_aabb, p_transformed_aabb);
|
|
|
}
|
|
|
|
|
|
+void RenderForwardClustered::GeometryInstanceForwardClustered::reset_motion_vectors() {
|
|
|
+ prev_transform = transform;
|
|
|
+ transform_status = TransformStatus::TELEPORTED;
|
|
|
+}
|
|
|
+
|
|
|
void RenderForwardClustered::GeometryInstanceForwardClustered::set_use_lightmap(RID p_lightmap_instance, const Rect2 &p_lightmap_uv_scale, int p_lightmap_slice_index) {
|
|
|
lightmap_instance = p_lightmap_instance;
|
|
|
lightmap_uv_scale = p_lightmap_uv_scale;
|