|
@@ -786,7 +786,7 @@ void RenderForwardClustered::_fill_instance_data(RenderListType p_render_list, i
|
|
|
if (p_render_info) {
|
|
|
p_render_info[RS::VIEWPORT_RENDER_INFO_OBJECTS_IN_FRAME] += element_total;
|
|
|
}
|
|
|
- uint64_t frame = RSG::rasterizer->get_frame_number();
|
|
|
+
|
|
|
uint32_t repeats = 0;
|
|
|
GeometryInstanceSurfaceDataCache *prev_surface = nullptr;
|
|
|
for (uint32_t i = 0; i < element_total; i++) {
|
|
@@ -795,12 +795,7 @@ void RenderForwardClustered::_fill_instance_data(RenderListType p_render_list, i
|
|
|
|
|
|
SceneState::InstanceData &instance_data = scene_state.instance_data[p_render_list][i + p_offset];
|
|
|
|
|
|
- if (inst->prev_transform_dirty && frame > inst->prev_transform_change_frame + 1 && inst->prev_transform_change_frame) {
|
|
|
- inst->prev_transform = inst->transform;
|
|
|
- inst->prev_transform_dirty = false;
|
|
|
- }
|
|
|
-
|
|
|
- if (inst->store_transform_cache) {
|
|
|
+ if (likely(inst->store_transform_cache)) {
|
|
|
RendererRD::MaterialStorage::store_transform(inst->transform, instance_data.transform);
|
|
|
RendererRD::MaterialStorage::store_transform(inst->prev_transform, instance_data.prev_transform);
|
|
|
|
|
@@ -820,10 +815,7 @@ void RenderForwardClustered::_fill_instance_data(RenderListType p_render_list, i
|
|
|
instance_data.gi_offset = inst->gi_offset_cache;
|
|
|
instance_data.layer_mask = inst->layer_mask;
|
|
|
instance_data.instance_uniforms_ofs = uint32_t(inst->shader_uniforms_offset);
|
|
|
- instance_data.lightmap_uv_scale[0] = inst->lightmap_uv_scale.position.x;
|
|
|
- instance_data.lightmap_uv_scale[1] = inst->lightmap_uv_scale.position.y;
|
|
|
- instance_data.lightmap_uv_scale[2] = inst->lightmap_uv_scale.size.x;
|
|
|
- instance_data.lightmap_uv_scale[3] = inst->lightmap_uv_scale.size.y;
|
|
|
+ instance_data.set_lightmap_uv_scale(inst->lightmap_uv_scale);
|
|
|
|
|
|
AABB surface_aabb = AABB(Vector3(0.0, 0.0, 0.0), Vector3(1.0, 1.0, 1.0));
|
|
|
uint64_t format = RendererRD::MeshStorage::get_singleton()->mesh_surface_get_format(surface->surface);
|
|
@@ -834,18 +826,8 @@ void RenderForwardClustered::_fill_instance_data(RenderListType p_render_list, i
|
|
|
uv_scale = RendererRD::MeshStorage::get_singleton()->mesh_surface_get_uv_scale(surface->surface);
|
|
|
}
|
|
|
|
|
|
- instance_data.compressed_aabb_position[0] = surface_aabb.position.x;
|
|
|
- instance_data.compressed_aabb_position[1] = surface_aabb.position.y;
|
|
|
- instance_data.compressed_aabb_position[2] = surface_aabb.position.z;
|
|
|
-
|
|
|
- instance_data.compressed_aabb_size[0] = surface_aabb.size.x;
|
|
|
- instance_data.compressed_aabb_size[1] = surface_aabb.size.y;
|
|
|
- instance_data.compressed_aabb_size[2] = surface_aabb.size.z;
|
|
|
-
|
|
|
- instance_data.uv_scale[0] = uv_scale.x;
|
|
|
- instance_data.uv_scale[1] = uv_scale.y;
|
|
|
- instance_data.uv_scale[2] = uv_scale.z;
|
|
|
- instance_data.uv_scale[3] = uv_scale.w;
|
|
|
+ instance_data.set_compressed_aabb(surface_aabb);
|
|
|
+ instance_data.set_uv_scale(uv_scale);
|
|
|
|
|
|
bool cant_repeat = instance_data.flags & INSTANCE_DATA_FLAG_MULTIMESH || inst->mesh_instance.is_valid();
|
|
|
|
|
@@ -866,11 +848,7 @@ void RenderForwardClustered::_fill_instance_data(RenderListType p_render_list, i
|
|
|
|
|
|
RenderElementInfo &element_info = rl->element_info[p_offset + i];
|
|
|
|
|
|
- element_info.lod_index = surface->sort.lod_index;
|
|
|
- element_info.uses_forward_gi = surface->sort.uses_forward_gi;
|
|
|
- element_info.uses_lightmap = surface->sort.uses_lightmap;
|
|
|
- element_info.uses_softshadow = surface->sort.uses_softshadow;
|
|
|
- element_info.uses_projector = surface->sort.uses_projector;
|
|
|
+ element_info.value = uint32_t(surface->sort.sort_key1 & 0xFFF);
|
|
|
|
|
|
if (cant_repeat) {
|
|
|
prev_surface = nullptr;
|
|
@@ -1068,6 +1046,11 @@ 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)) {
|
|
|
+ inst->prev_transform = inst->transform;
|
|
|
+ inst->prev_transform_dirty = false;
|
|
|
+ }
|
|
|
+
|
|
|
while (surf) {
|
|
|
surf->sort.uses_forward_gi = 0;
|
|
|
surf->sort.uses_lightmap = 0;
|
|
@@ -4039,8 +4022,7 @@ void RenderForwardClustered::_geometry_instance_add_surface_with_material(Geomet
|
|
|
sdcache->sort.sort_key2 = 0;
|
|
|
|
|
|
sdcache->sort.surface_index = p_surface;
|
|
|
- sdcache->sort.material_id_low = p_material_id & 0xFFFF;
|
|
|
- sdcache->sort.material_id_hi = p_material_id >> 16;
|
|
|
+ sdcache->sort.material_id = p_material_id;
|
|
|
sdcache->sort.shader_id = p_shader_id;
|
|
|
sdcache->sort.geometry_id = p_mesh.get_local_index(); //only meshes can repeat anyway
|
|
|
sdcache->sort.uses_forward_gi = ginstance->can_sdfgi;
|