Merge branch 'blender-v4.2-release'
This commit is contained in:
commit
addf1fa84b
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user