Merge branch 'blender-v4.2-release'

This commit is contained in:
Richard Antalik 2024-07-05 00:43:55 +02:00
commit addf1fa84b
6 changed files with 49 additions and 47 deletions

@ -676,25 +676,6 @@ static bool seq_speed_factor_set(Sequence *seq, void *user_data)
return true;
}
static bool do_versions_sequencer_init_retiming_tool_data(Sequence *seq, void *user_data)
{
const Scene *scene = static_cast<const Scene *>(user_data);
if (seq->speed_factor == 1 || !SEQ_retiming_is_allowed(seq)) {
return true;
}
const int content_length = SEQ_time_strip_length_get(scene, seq);
SEQ_retiming_data_ensure(seq);
SeqRetimingKey *key = &seq->retiming_keys[seq->retiming_keys_num - 1];
key->strip_frame_index = round_fl_to_int(content_length / seq->speed_factor);
seq->speed_factor = 1.0f;
return true;
}
static void version_geometry_nodes_replace_transfer_attribute_node(bNodeTree *ntree)
{
using namespace blender;
@ -1380,18 +1361,6 @@ void do_versions_after_linking_300(FileData * /*fd*/, Main *bmain)
FOREACH_NODETREE_END;
}
if (!MAIN_VERSION_FILE_ATLEAST(bmain, 306, 6)) {
LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
Editing *ed = SEQ_editing_get(scene);
if (ed == nullptr) {
continue;
}
SEQ_for_each_callback(
&scene->ed->seqbase, do_versions_sequencer_init_retiming_tool_data, scene);
}
}
if (!MAIN_VERSION_FILE_ATLEAST(bmain, 306, 13)) {
version_nla_action_strip_hold(bmain);
}

@ -67,7 +67,9 @@
#include "IMB_imbuf_enums.h"
#include "SEQ_iterator.hh"
#include "SEQ_retiming.hh"
#include "SEQ_sequencer.hh"
#include "SEQ_time.hh"
#include "ANIM_armature_iter.hh"
#include "ANIM_bone_collections.hh"
@ -777,6 +779,29 @@ static void version_nla_tweakmode_incomplete(Main *bmain)
}
}
static bool versioning_convert_strip_speed_factor(Sequence *seq, void *user_data)
{
const Scene *scene = static_cast<Scene *>(user_data);
const float speed_factor = seq->speed_factor;
if (speed_factor == 1.0f || !SEQ_retiming_is_allowed(seq) || SEQ_retiming_keys_count(seq) > 0) {
return true;
}
SEQ_retiming_data_ensure(seq);
SeqRetimingKey *last_key = &SEQ_retiming_keys_get(seq)[1];
last_key->strip_frame_index = (seq->len) / speed_factor;
if (seq->type == SEQ_TYPE_SOUND_RAM) {
const int prev_length = seq->len - seq->startofs - seq->endofs;
const float left_handle = SEQ_time_left_handle_frame_get(scene, seq);
SEQ_time_right_handle_frame_set(scene, seq, left_handle + prev_length);
}
return true;
}
void do_versions_after_linking_400(FileData *fd, Main *bmain)
{
if (!MAIN_VERSION_FILE_ATLEAST(bmain, 400, 9)) {
@ -857,6 +882,15 @@ void do_versions_after_linking_400(FileData *fd, Main *bmain)
FOREACH_NODETREE_END;
}
if (!MAIN_VERSION_FILE_ATLEAST(bmain, 400, 27)) {
LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
Editing *ed = SEQ_editing_get(scene);
if (ed != nullptr) {
SEQ_for_each_callback(&ed->seqbase, versioning_convert_strip_speed_factor, scene);
}
}
}
if (!MAIN_VERSION_FILE_ATLEAST(bmain, 400, 34)) {
BKE_mesh_legacy_face_map_to_generic(bmain);
}

@ -1099,7 +1099,6 @@ void VolumeLayer::render(View &view, Texture &occupancy_tx)
void VolumePipeline::sync()
{
object_integration_range_ = std::nullopt;
enabled_ = false;
has_scatter_ = false;
has_absorption_ = false;
for (auto &layer : layers_) {
@ -1109,8 +1108,6 @@ void VolumePipeline::sync()
void VolumePipeline::render(View &view, Texture &occupancy_tx)
{
BLI_assert_msg(enabled_, "Trying to run the volume object pipeline with no actual volume calls");
for (auto &layer : layers_) {
layer->render(view, occupancy_tx);
}
@ -1156,7 +1153,6 @@ VolumeLayer *VolumePipeline::register_and_get_layer(Object *ob)
VolumeObjectBounds object_bounds(inst_.camera, ob);
object_integration_range_ = bounds::merge(object_integration_range_, object_bounds.z_range);
enabled_ = true;
/* Do linear search in all layers in order. This can be optimized. */
for (auto &layer : layers_) {
if (!layer->bounds_overlaps(object_bounds)) {

@ -447,8 +447,6 @@ class VolumePipeline {
/* Combined bounds in Z. Allow tighter integration bounds. */
std::optional<Bounds<float>> object_integration_range_;
/* True if any volume (any object type) creates a volume draw-call. Enables the volume module. */
bool enabled_ = false;
/* Aggregated properties of all volume objects. */
bool has_scatter_ = false;
bool has_absorption_ = false;
@ -467,10 +465,6 @@ class VolumePipeline {
std::optional<Bounds<float>> object_integration_range() const;
bool is_enabled() const
{
return enabled_;
}
bool has_scatter() const
{
for (auto &layer : layers_) {

@ -372,19 +372,27 @@ void SyncModule::sync_volume(Object *ob,
auto drawcall_add = [&](MaterialPass &matpass, gpu::Batch *geom, ResourceHandle res_handle) {
if (matpass.sub_pass == nullptr) {
return;
return false;
}
PassMain::Sub *object_pass = volume_sub_pass(
*matpass.sub_pass, inst_.scene, ob, matpass.gpumat);
if (object_pass != nullptr) {
object_pass->draw(geom, res_handle);
return true;
}
return false;
};
/* Use bounding box tag empty spaces. */
gpu::Batch *geom = DRW_cache_cube_get();
drawcall_add(material.volume_occupancy, geom, res_handle);
drawcall_add(material.volume_material, geom, res_handle);
bool is_rendered = false;
is_rendered |= drawcall_add(material.volume_occupancy, geom, res_handle);
is_rendered |= drawcall_add(material.volume_material, geom, res_handle);
if (!is_rendered) {
return;
}
inst_.manager->extract_object_attributes(res_handle, ob_ref, material.volume_material.gpumat);

@ -77,6 +77,8 @@ void VolumeModule::world_sync(const WorldHandle &world_handle)
void VolumeModule::object_sync(const ObjectHandle &ob_handle)
{
current_objects_.add(ob_handle.object_key);
if (!use_reprojection_) {
return;
}
@ -84,12 +86,11 @@ void VolumeModule::object_sync(const ObjectHandle &ob_handle)
if (ob_handle.recalc && !inst_.is_playback()) {
valid_history_ = false;
}
current_objects_.add(ob_handle.object_key);
}
void VolumeModule::end_sync()
{
enabled_ = inst_.world.has_volume() || inst_.pipelines.volume.is_enabled();
enabled_ = inst_.world.has_volume() || !current_objects_.is_empty();
const Scene *scene_eval = inst_.scene;
@ -405,7 +406,7 @@ void VolumeModule::draw_prepass(View &main_view)
* We need custom culling for these but that's not implemented yet. */
volume_view.visibility_test(false);
if (inst_.pipelines.volume.is_enabled()) {
if (!current_objects_.is_empty()) {
inst_.pipelines.volume.render(volume_view, occupancy_tx_);
}
DRW_stats_group_end();