mirror of
https://github.com/Redot-Engine/redot-engine.git
synced 2025-12-06 15:21:56 -05:00
Merge commit godotengine/godot@b9437c3938
This commit is contained in:
@@ -361,7 +361,7 @@ void RendererSceneCull::_instance_unpair(Instance *p_A, Instance *p_B) {
|
||||
|
||||
if (geom->lightmap_captures.is_empty() && A->scenario && A->array_index >= 0) {
|
||||
InstanceData &idata = A->scenario->instance_data[A->array_index];
|
||||
idata.flags &= ~uint32_t(InstanceData::FLAG_LIGHTMAP_CAPTURE);
|
||||
idata.flags &= ~InstanceData::FLAG_LIGHTMAP_CAPTURE;
|
||||
}
|
||||
|
||||
lightmap_data->geometries.erase(A);
|
||||
@@ -534,7 +534,7 @@ void RendererSceneCull::_instance_update_mesh_instance(Instance *p_instance) con
|
||||
if (p_instance->mesh_instance.is_valid()) {
|
||||
idata.flags |= InstanceData::FLAG_USES_MESH_INSTANCE;
|
||||
} else {
|
||||
idata.flags &= ~uint32_t(InstanceData::FLAG_USES_MESH_INSTANCE);
|
||||
idata.flags &= ~InstanceData::FLAG_USES_MESH_INSTANCE;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1234,7 +1234,7 @@ void RendererSceneCull::instance_set_ignore_culling(RID p_instance, bool p_enabl
|
||||
if (instance->ignore_all_culling) {
|
||||
idata.flags |= InstanceData::FLAG_IGNORE_ALL_CULLING;
|
||||
} else {
|
||||
idata.flags &= ~uint32_t(InstanceData::FLAG_IGNORE_ALL_CULLING);
|
||||
idata.flags &= ~InstanceData::FLAG_IGNORE_ALL_CULLING;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1326,7 +1326,7 @@ void RendererSceneCull::instance_geometry_set_flag(RID p_instance, RS::InstanceF
|
||||
if (instance->baked_light) {
|
||||
idata.flags |= InstanceData::FLAG_USES_BAKED_LIGHT;
|
||||
} else {
|
||||
idata.flags &= ~uint32_t(InstanceData::FLAG_USES_BAKED_LIGHT);
|
||||
idata.flags &= ~InstanceData::FLAG_USES_BAKED_LIGHT;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1366,7 +1366,7 @@ void RendererSceneCull::instance_geometry_set_flag(RID p_instance, RS::InstanceF
|
||||
if (instance->redraw_if_visible) {
|
||||
idata.flags |= InstanceData::FLAG_REDRAW_IF_VISIBLE;
|
||||
} else {
|
||||
idata.flags &= ~uint32_t(InstanceData::FLAG_REDRAW_IF_VISIBLE);
|
||||
idata.flags &= ~InstanceData::FLAG_REDRAW_IF_VISIBLE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1379,7 +1379,7 @@ void RendererSceneCull::instance_geometry_set_flag(RID p_instance, RS::InstanceF
|
||||
if (instance->ignore_occlusion_culling) {
|
||||
idata.flags |= InstanceData::FLAG_IGNORE_OCCLUSION_CULLING;
|
||||
} else {
|
||||
idata.flags &= ~uint32_t(InstanceData::FLAG_IGNORE_OCCLUSION_CULLING);
|
||||
idata.flags &= ~InstanceData::FLAG_IGNORE_OCCLUSION_CULLING;
|
||||
}
|
||||
}
|
||||
} break;
|
||||
@@ -1400,13 +1400,13 @@ void RendererSceneCull::instance_geometry_set_cast_shadows_setting(RID p_instanc
|
||||
if (instance->cast_shadows != RS::SHADOW_CASTING_SETTING_OFF) {
|
||||
idata.flags |= InstanceData::FLAG_CAST_SHADOWS;
|
||||
} else {
|
||||
idata.flags &= ~uint32_t(InstanceData::FLAG_CAST_SHADOWS);
|
||||
idata.flags &= ~InstanceData::FLAG_CAST_SHADOWS;
|
||||
}
|
||||
|
||||
if (instance->cast_shadows == RS::SHADOW_CASTING_SETTING_SHADOWS_ONLY) {
|
||||
idata.flags |= InstanceData::FLAG_CAST_SHADOWS_ONLY;
|
||||
} else {
|
||||
idata.flags &= ~uint32_t(InstanceData::FLAG_CAST_SHADOWS_ONLY);
|
||||
idata.flags &= ~InstanceData::FLAG_CAST_SHADOWS_ONLY;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2560,8 +2560,9 @@ bool RendererSceneCull::_light_instance_update_shadow(Instance *p_instance, cons
|
||||
}
|
||||
|
||||
real_t radius = RSG::light_storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_RANGE);
|
||||
real_t z_near = 0.005f;
|
||||
Projection cm;
|
||||
cm.set_perspective(90, 1, radius * 0.005f, radius);
|
||||
cm.set_perspective(90, 1, z_near, radius);
|
||||
|
||||
for (int i = 0; i < 6; i++) {
|
||||
RENDER_TIMESTAMP("Cull OmniLight3D Shadow Cube, Side " + itos(i));
|
||||
@@ -2649,9 +2650,10 @@ bool RendererSceneCull::_light_instance_update_shadow(Instance *p_instance, cons
|
||||
|
||||
real_t radius = RSG::light_storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_RANGE);
|
||||
real_t angle = RSG::light_storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_SPOT_ANGLE);
|
||||
real_t z_near = 0.005f;
|
||||
|
||||
Projection cm;
|
||||
cm.set_perspective(angle * 2.0, 1.0, 0.005f * radius, radius);
|
||||
cm.set_perspective(angle * 2.0, 1.0, z_near, radius);
|
||||
|
||||
Vector<Plane> planes = cm.get_projection_planes(light_transform);
|
||||
|
||||
@@ -2775,6 +2777,8 @@ void RendererSceneCull::render_camera(const Ref<RenderSceneBuffers> &p_render_bu
|
||||
|
||||
camera_data.set_camera(transform, projection, is_orthogonal, is_frustum, vaspect, jitter, taa_frame_count, camera->visible_layers);
|
||||
} else {
|
||||
XRServer *xr_server = XRServer::get_singleton();
|
||||
|
||||
// Setup our camera for our XR interface.
|
||||
// We can support multiple views here each with their own camera
|
||||
Transform3D transforms[RendererSceneRender::MAX_RENDER_VIEWS];
|
||||
@@ -2785,7 +2789,7 @@ void RendererSceneCull::render_camera(const Ref<RenderSceneBuffers> &p_render_bu
|
||||
|
||||
float aspect = p_viewport_size.width / (float)p_viewport_size.height;
|
||||
|
||||
Transform3D world_origin = XRServer::get_singleton()->get_world_origin();
|
||||
Transform3D world_origin = xr_server->get_world_origin();
|
||||
|
||||
// We ignore our camera position, it will have been positioned with a slightly old tracking position.
|
||||
// Instead we take our origin point and have our XR interface add fresh tracking data! Whoohoo!
|
||||
@@ -2794,6 +2798,14 @@ void RendererSceneCull::render_camera(const Ref<RenderSceneBuffers> &p_render_bu
|
||||
projections[v] = p_xr_interface->get_projection_for_view(v, aspect, camera->znear, camera->zfar);
|
||||
}
|
||||
|
||||
// If requested, we move the views to be rendered as if the HMD is at the XROrigin.
|
||||
if (unlikely(xr_server->is_camera_locked_to_origin())) {
|
||||
Transform3D camera_reset = p_xr_interface->get_camera_transform().affine_inverse() * xr_server->get_reference_frame().affine_inverse();
|
||||
for (uint32_t v = 0; v < view_count; v++) {
|
||||
transforms[v] *= camera_reset;
|
||||
}
|
||||
}
|
||||
|
||||
if (view_count == 1) {
|
||||
camera_data.set_camera(transforms[0], projections[0], false, false, camera->vaspect, jitter, p_jitter_phase_count, camera->visible_layers);
|
||||
} else if (view_count == 2) {
|
||||
@@ -2969,7 +2981,7 @@ void RendererSceneCull::_scene_cull(CullData &cull_data, InstanceCullResult &cul
|
||||
}
|
||||
cull_data.cull->lock.unlock();
|
||||
|
||||
idata.flags &= ~uint32_t(InstanceData::FLAG_REFLECTION_PROBE_DIRTY);
|
||||
idata.flags &= ~InstanceData::FLAG_REFLECTION_PROBE_DIRTY;
|
||||
}
|
||||
|
||||
if (RSG::light_storage->reflection_probe_instance_has_reflection(RID::from_uint64(idata.instance_data_rid))) {
|
||||
@@ -3046,6 +3058,10 @@ void RendererSceneCull::_scene_cull(CullData &cull_data, InstanceCullResult &cul
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((RSG::light_storage->light_get_bake_mode(E->base) == RS::LIGHT_BAKE_STATIC) && idata.instance->lightmap) {
|
||||
continue;
|
||||
}
|
||||
|
||||
instance_pair_buffer[idx++] = light->instance;
|
||||
if (idx == MAX_INSTANCE_PAIRS) {
|
||||
break;
|
||||
@@ -3054,7 +3070,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);
|
||||
idata.flags &= ~InstanceData::FLAG_GEOM_LIGHTING_DIRTY;
|
||||
}
|
||||
|
||||
if (idata.flags & InstanceData::FLAG_GEOM_PROJECTOR_SOFTSHADOW_DIRTY) {
|
||||
@@ -3064,7 +3080,7 @@ void RendererSceneCull::_scene_cull(CullData &cull_data, InstanceCullResult &cul
|
||||
cull_data.cull->lock.lock();
|
||||
geom->geometry_instance->set_softshadow_projector_pairing(geom->softshadow_count > 0, geom->projector_count > 0);
|
||||
cull_data.cull->lock.unlock();
|
||||
idata.flags &= ~uint32_t(InstanceData::FLAG_GEOM_PROJECTOR_SOFTSHADOW_DIRTY);
|
||||
idata.flags &= ~InstanceData::FLAG_GEOM_PROJECTOR_SOFTSHADOW_DIRTY;
|
||||
}
|
||||
|
||||
if (geometry_instance_pair_mask & (1 << RS::INSTANCE_REFLECTION_PROBE) && (idata.flags & InstanceData::FLAG_GEOM_REFLECTION_DIRTY)) {
|
||||
@@ -3082,7 +3098,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);
|
||||
idata.flags &= ~InstanceData::FLAG_GEOM_REFLECTION_DIRTY;
|
||||
}
|
||||
|
||||
if (geometry_instance_pair_mask & (1 << RS::INSTANCE_DECAL) && (idata.flags & InstanceData::FLAG_GEOM_DECAL_DIRTY)) {
|
||||
@@ -3101,7 +3117,7 @@ void RendererSceneCull::_scene_cull(CullData &cull_data, InstanceCullResult &cul
|
||||
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);
|
||||
idata.flags &= ~InstanceData::FLAG_GEOM_DECAL_DIRTY;
|
||||
}
|
||||
|
||||
if (idata.flags & InstanceData::FLAG_GEOM_VOXEL_GI_DIRTY) {
|
||||
@@ -3119,7 +3135,7 @@ 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);
|
||||
idata.flags &= ~InstanceData::FLAG_GEOM_VOXEL_GI_DIRTY;
|
||||
}
|
||||
|
||||
if ((idata.flags & InstanceData::FLAG_LIGHTMAP_CAPTURE) && idata.instance->last_frame_pass != frame_number && !idata.instance->lightmap_target_sh.is_empty() && !idata.instance->lightmap_sh.is_empty()) {
|
||||
@@ -3979,7 +3995,7 @@ 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);
|
||||
ins->scenario->instance_data[ins->array_index].flags &= ~InstanceData::FLAG_GEOM_VOXEL_GI_DIRTY;
|
||||
}
|
||||
|
||||
ERR_FAIL_NULL(geom->geometry_instance);
|
||||
|
||||
Reference in New Issue
Block a user