|
@@ -1855,10 +1855,7 @@ void RenderForwardMobile::_fill_instance_data(RenderListType p_render_list, uint
|
|
instance_data.gi_offset = inst->gi_offset_cache;
|
|
instance_data.gi_offset = inst->gi_offset_cache;
|
|
instance_data.layer_mask = inst->layer_mask;
|
|
instance_data.layer_mask = inst->layer_mask;
|
|
instance_data.instance_uniforms_ofs = uint32_t(inst->shader_uniforms_offset);
|
|
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));
|
|
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);
|
|
uint64_t format = RendererRD::MeshStorage::get_singleton()->mesh_surface_get_format(surface->surface);
|
|
@@ -1871,23 +1868,13 @@ void RenderForwardMobile::_fill_instance_data(RenderListType p_render_list, uint
|
|
|
|
|
|
fill_push_constant_instance_indices(&instance_data, inst);
|
|
fill_push_constant_instance_indices(&instance_data, inst);
|
|
|
|
|
|
- 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);
|
|
|
|
|
|
RenderElementInfo &element_info = rl->element_info[p_offset + i];
|
|
RenderElementInfo &element_info = rl->element_info[p_offset + i];
|
|
|
|
|
|
- element_info.lod_index = surface->lod_index;
|
|
|
|
- element_info.uses_lightmap = surface->sort.uses_lightmap;
|
|
|
|
|
|
+ // Sets lod_index and uses_lightmap at once.
|
|
|
|
+ element_info.value = uint32_t(surface->sort.sort_key1 & 0x1FF);
|
|
}
|
|
}
|
|
|
|
|
|
if (p_update_buffer) {
|
|
if (p_update_buffer) {
|
|
@@ -2019,7 +2006,7 @@ void RenderForwardMobile::_fill_render_list(RenderListType p_render_list, const
|
|
|
|
|
|
if (p_render_data->scene_data->screen_mesh_lod_threshold > 0.0 && mesh_storage->mesh_surface_has_lod(surf->surface)) {
|
|
if (p_render_data->scene_data->screen_mesh_lod_threshold > 0.0 && mesh_storage->mesh_surface_has_lod(surf->surface)) {
|
|
uint32_t indices = 0;
|
|
uint32_t indices = 0;
|
|
- surf->lod_index = mesh_storage->mesh_surface_get_lod(surf->surface, inst->lod_model_scale * inst->lod_bias, lod_distance * p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, indices);
|
|
|
|
|
|
+ surf->sort.lod_index = mesh_storage->mesh_surface_get_lod(surf->surface, inst->lod_model_scale * inst->lod_bias, lod_distance * p_render_data->scene_data->lod_distance_multiplier, p_render_data->scene_data->screen_mesh_lod_threshold, indices);
|
|
if (p_render_data->render_info) {
|
|
if (p_render_data->render_info) {
|
|
indices = _indices_to_primitives(surf->primitive, indices);
|
|
indices = _indices_to_primitives(surf->primitive, indices);
|
|
if (p_render_list == RENDER_LIST_OPAQUE) { //opaque
|
|
if (p_render_list == RENDER_LIST_OPAQUE) { //opaque
|
|
@@ -2029,7 +2016,7 @@ void RenderForwardMobile::_fill_render_list(RenderListType p_render_list, const
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
- surf->lod_index = 0;
|
|
|
|
|
|
+ surf->sort.lod_index = 0;
|
|
if (p_render_data->render_info) {
|
|
if (p_render_data->render_info) {
|
|
uint32_t to_draw = mesh_storage->mesh_surface_get_vertices_drawn_count(surf->surface);
|
|
uint32_t to_draw = mesh_storage->mesh_surface_get_vertices_drawn_count(surf->surface);
|
|
to_draw = _indices_to_primitives(surf->primitive, to_draw);
|
|
to_draw = _indices_to_primitives(surf->primitive, to_draw);
|
|
@@ -2305,7 +2292,6 @@ void RenderForwardMobile::_render_list_template(RenderingDevice::DrawListID p_dr
|
|
mesh_storage->mesh_surface_get_vertex_arrays_and_format(mesh_surface, input_mask, false, vertex_array_rd, vertex_format);
|
|
mesh_storage->mesh_surface_get_vertex_arrays_and_format(mesh_surface, input_mask, false, vertex_array_rd, vertex_format);
|
|
}
|
|
}
|
|
|
|
|
|
- index_array_rd = mesh_storage->mesh_surface_get_index_array(mesh_surface, element_info.lod_index);
|
|
|
|
pipeline_key.vertex_format_id = vertex_format;
|
|
pipeline_key.vertex_format_id = vertex_format;
|
|
|
|
|
|
if (pipeline_key.ubershader) {
|
|
if (pipeline_key.ubershader) {
|
|
@@ -2633,11 +2619,9 @@ void RenderForwardMobile::_geometry_instance_add_surface_with_material(GeometryI
|
|
sdcache->sort.sort_key2 = 0;
|
|
sdcache->sort.sort_key2 = 0;
|
|
|
|
|
|
sdcache->sort.surface_index = p_surface;
|
|
sdcache->sort.surface_index = p_surface;
|
|
- sdcache->sort.material_id_low = p_material_id & 0x0000FFFF;
|
|
|
|
- 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.shader_id = p_shader_id;
|
|
sdcache->sort.geometry_id = p_mesh.get_local_index();
|
|
sdcache->sort.geometry_id = p_mesh.get_local_index();
|
|
- // sdcache->sort.uses_forward_gi = ginstance->can_sdfgi;
|
|
|
|
sdcache->sort.priority = p_material->priority;
|
|
sdcache->sort.priority = p_material->priority;
|
|
|
|
|
|
uint64_t format = RendererRD::MeshStorage::get_singleton()->mesh_surface_get_format(sdcache->surface);
|
|
uint64_t format = RendererRD::MeshStorage::get_singleton()->mesh_surface_get_format(sdcache->surface);
|