Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Factory:RISCV
audaspace
audaspace-animated-sequence.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File audaspace-animated-sequence.patch of Package audaspace
From db2ff5807765ddc6bd0e5e9345ba23444018a36a Mon Sep 17 00:00:00 2001 From: Richard Antalik <richardantalik@gmail.com> Date: Thu, 6 Apr 2023 22:47:47 +0200 Subject: [PATCH 1/4] Improve seeking for animated sequences --- bindings/C/AUD_Sequence.cpp | 6 +++++ bindings/C/AUD_Sequence.h | 10 +++++++ include/sequence/AnimateableProperty.h | 8 ++++++ include/sequence/SequenceData.h | 3 ++- include/sequence/SequenceEntry.h | 7 ++++- src/sequence/AnimateableProperty.cpp | 13 ++++++++++ src/sequence/Sequence.cpp | 2 +- src/sequence/SequenceData.cpp | 4 +-- src/sequence/SequenceEntry.cpp | 3 ++- src/sequence/SequenceHandle.cpp | 36 +++++++++++++++++++++++--- 10 files changed, 82 insertions(+), 10 deletions(-) diff --git a/bindings/C/AUD_Sequence.cpp b/bindings/C/AUD_Sequence.cpp index e3f8862..4e60a29 100644 --- a/bindings/C/AUD_Sequence.cpp +++ b/bindings/C/AUD_Sequence.cpp @@ -165,6 +165,12 @@ AUD_API void AUD_SequenceEntry_move(AUD_SequenceEntry* entry, double begin, doub (*entry)->move(begin, end, skip); } +AUD_API void AUD_SequenceEntry_setConstantRangeAnimationData(AUD_SequenceEntry* entry, AUD_AnimateablePropertyType type, int frame_start, int frame_end, float* data) +{ + AnimateableProperty* prop = (*entry)->getAnimProperty(static_cast<AnimateablePropertyType>(type)); + prop->writeConstantRange(data, frame_start, frame_end); +} + AUD_API void AUD_SequenceEntry_setAnimationData(AUD_SequenceEntry* entry, AUD_AnimateablePropertyType type, int frame, float* data, char animated) { AnimateableProperty* prop = (*entry)->getAnimProperty(static_cast<AnimateablePropertyType>(type)); diff --git a/bindings/C/AUD_Sequence.h b/bindings/C/AUD_Sequence.h index bdf1a61..57075f3 100644 --- a/bindings/C/AUD_Sequence.h +++ b/bindings/C/AUD_Sequence.h @@ -68,6 +68,16 @@ extern AUD_API void AUD_Sequence_remove(AUD_Sound* sequence, AUD_SequenceEntry* * Writes animation data to a sequence. * \param sequence The sound scene. * \param type The type of animation data. + * \param frame_start Start of the frame range. + * \param frame_end End of the frame range. + * \param data The data to write. + */ +AUD_API void AUD_SequenceEntry_setConstantRangeAnimationData(AUD_SequenceEntry* entry, AUD_AnimateablePropertyType type, int frame_start, int frame_end, float* data); + +/** + * Writes animation data to a sequenced entry. + * \param entry The sequenced entry. + * \param type The type of animation data. * \param frame The frame this data is for. * \param data The data to write. * \param animated Whether the attribute is animated. diff --git a/include/sequence/AnimateableProperty.h b/include/sequence/AnimateableProperty.h index 2c3fcf2..d14990b 100644 --- a/include/sequence/AnimateableProperty.h +++ b/include/sequence/AnimateableProperty.h @@ -112,6 +112,14 @@ public: */ void write(const float* data, int position, int count); + /** + * Fills the properties frame range with constant value and marks it animated. + * \param data The new value. + * \param position_start The start position in the animation in frames. + * \param position_end The end position in the animation in frames. + */ + void writeConstantRange(const float* data, int position_start, int position_end); + /** * Reads the properties value. * \param position The position in the animation in frames. diff --git a/include/sequence/SequenceData.h b/include/sequence/SequenceData.h index c3380e6..c19c82c 100644 --- a/include/sequence/SequenceData.h +++ b/include/sequence/SequenceData.h @@ -198,12 +198,13 @@ public: /** * Adds a new entry to the scene. * \param sound The sound this entry should play. + * \param sequence_data Reference to sequence_data. Mainly needed to get the FPS of the scene. * \param begin The start time. * \param end The end time or a negative value if determined by the sound. * \param skip How much seconds should be skipped at the beginning. * \return The entry added. */ - std::shared_ptr<SequenceEntry> add(std::shared_ptr<ISound> sound, double begin, double end, double skip); + std::shared_ptr<SequenceEntry> add(std::shared_ptr<ISound> sound, std::shared_ptr<SequenceData> sequence_data, double begin, double end, double skip); /** * Removes an entry from the scene. diff --git a/include/sequence/SequenceEntry.h b/include/sequence/SequenceEntry.h index b8e9f11..47b9004 100644 --- a/include/sequence/SequenceEntry.h +++ b/include/sequence/SequenceEntry.h @@ -23,6 +23,7 @@ */ #include "sequence/AnimateableProperty.h" +#include "sequence/SequenceData.h" #include "util/ILockable.h" #include <mutex> @@ -63,6 +64,9 @@ private: /// How many seconds are skipped at the beginning. double m_skip; + /// reference to sequence_data. Mainly needed to get the FPS of the scene. + std::shared_ptr<SequenceData> m_sequence_data; + /// Whether the entry is muted. bool m_muted; @@ -122,9 +126,10 @@ public: * \param begin The start time. * \param end The end time or a negative value if determined by the sound. * \param skip How much seconds should be skipped at the beginning. + * \param sequence_data Reference to sequence_data. Mainly needed to get the FPS of the scene. * \param id The ID of the entry. */ - SequenceEntry(std::shared_ptr<ISound> sound, double begin, double end, double skip, int id); + SequenceEntry(std::shared_ptr<ISound> sound, double begin, double end, double skip, std::shared_ptr<SequenceData> sequence_data, int id); virtual ~SequenceEntry(); /** diff --git a/src/sequence/AnimateableProperty.cpp b/src/sequence/AnimateableProperty.cpp index 306ba8e..c9c2a35 100644 --- a/src/sequence/AnimateableProperty.cpp +++ b/src/sequence/AnimateableProperty.cpp @@ -65,6 +65,19 @@ void AnimateableProperty::write(const float* data) std::memcpy(getBuffer(), data, m_count * sizeof(float)); } +void AnimateableProperty::writeConstantRange(const float* data, int position_start, int position_end) +{ + assureSize(position_end * m_count * sizeof(float), true); + float* buffer = getBuffer(); + + for(int i = position_start; i < position_end; i++) + { + std::memcpy(buffer + i * m_count, data, m_count * sizeof(float)); + } + + m_isAnimated = true; +} + void AnimateableProperty::write(const float* data, int position, int count) { std::lock_guard<std::recursive_mutex> lock(m_mutex); diff --git a/src/sequence/Sequence.cpp b/src/sequence/Sequence.cpp index ab7e6e7..3beb225 100644 --- a/src/sequence/Sequence.cpp +++ b/src/sequence/Sequence.cpp @@ -92,7 +92,7 @@ AnimateableProperty* Sequence::getAnimProperty(AnimateablePropertyType type) std::shared_ptr<SequenceEntry> Sequence::add(std::shared_ptr<ISound> sound, double begin, double end, double skip) { - return m_sequence->add(sound, begin, end, skip); + return m_sequence->add(sound, m_sequence, begin, end, skip); } void Sequence::remove(std::shared_ptr<SequenceEntry> entry) diff --git a/src/sequence/SequenceData.cpp b/src/sequence/SequenceData.cpp index 288f0bd..47d57da 100644 --- a/src/sequence/SequenceData.cpp +++ b/src/sequence/SequenceData.cpp @@ -149,11 +149,11 @@ AnimateableProperty* SequenceData::getAnimProperty(AnimateablePropertyType type) } } -std::shared_ptr<SequenceEntry> SequenceData::add(std::shared_ptr<ISound> sound, double begin, double end, double skip) +std::shared_ptr<SequenceEntry> SequenceData::add(std::shared_ptr<ISound> sound, std::shared_ptr<SequenceData> sequence_data, double begin, double end, double skip) { std::lock_guard<std::recursive_mutex> lock(m_mutex); - std::shared_ptr<SequenceEntry> entry = std::shared_ptr<SequenceEntry>(new SequenceEntry(sound, begin, end, skip, m_id++)); + std::shared_ptr<SequenceEntry> entry = std::shared_ptr<SequenceEntry>(new SequenceEntry(sound, begin, end, skip, sequence_data, m_id++)); m_entries.push_back(entry); m_entry_status++; diff --git a/src/sequence/SequenceEntry.cpp b/src/sequence/SequenceEntry.cpp index b63bdd2..0fbab21 100644 --- a/src/sequence/SequenceEntry.cpp +++ b/src/sequence/SequenceEntry.cpp @@ -22,7 +22,7 @@ AUD_NAMESPACE_BEGIN -SequenceEntry::SequenceEntry(std::shared_ptr<ISound> sound, double begin, double end, double skip, int id) : +SequenceEntry::SequenceEntry(std::shared_ptr<ISound> sound, double begin, double end, double skip, std::shared_ptr<SequenceData> sequence_data, int id) : m_status(0), m_pos_status(1), m_sound_status(0), @@ -31,6 +31,7 @@ SequenceEntry::SequenceEntry(std::shared_ptr<ISound> sound, double begin, double m_begin(begin), m_end(end), m_skip(skip), + m_sequence_data(sequence_data), m_muted(false), m_relative(true), m_volume_max(1.0f), diff --git a/src/sequence/SequenceHandle.cpp b/src/sequence/SequenceHandle.cpp index fca4e80..55384ba 100644 --- a/src/sequence/SequenceHandle.cpp +++ b/src/sequence/SequenceHandle.cpp @@ -241,10 +241,38 @@ bool SequenceHandle::seek(double position) return false; std::lock_guard<ILockable> lock(*m_entry); - double seekpos = position - m_entry->m_begin; - if(seekpos < 0) - seekpos = 0; - seekpos += m_entry->m_skip; + + double seek_frame = (position - m_entry->m_begin) * m_entry->m_sequence_data->getFPS(); + + if(seek_frame < 0) + seek_frame = 0; + + seek_frame += m_entry->m_skip * m_entry->m_sequence_data->getFPS(); + + AnimateableProperty* pitch_property = m_entry->getAnimProperty(AP_PITCH); + + double target_frame = 0; + + if(pitch_property != nullptr) + { + int frame_start = (m_entry->m_begin - m_entry->m_skip) * m_entry->m_sequence_data->getFPS(); + + for(int i = 0; seek_frame > 0; i++) + { + float pitch; + pitch_property->read(frame_start + i, &pitch); + const double factor = seek_frame > 1.0 ? 1.0 : seek_frame; + target_frame += pitch * factor; + seek_frame--; + } + } + else + { + target_frame = seek_frame; + } + + double seekpos = target_frame / m_entry->m_sequence_data->getFPS(); + m_handle->setPitch(1.0f); m_handle->seek(seekpos); -- 2.42.1 -- From 5f745ff3707552b090ea19c3839c70ca68b5429d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20M=C3=BCller?= <nexyon@gmail.com> Date: Mon, 24 Jul 2023 16:18:02 +0200 Subject: [PATCH 4/4] Bugfix for reading an animated property with a negative time value. This can now happen in SequenceHandle::seek. --- src/sequence/AnimateableProperty.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/sequence/AnimateableProperty.cpp b/src/sequence/AnimateableProperty.cpp index c9c2a35..b38827f 100644 --- a/src/sequence/AnimateableProperty.cpp +++ b/src/sequence/AnimateableProperty.cpp @@ -184,6 +184,12 @@ void AnimateableProperty::read(float position, float* out) t = 0; } + if(position < 0) + { + position = 0; + t = 0; + } + if(t == 0) { std::memcpy(out, getBuffer() + int(std::floor(position)) * m_count, m_count * sizeof(float)); -- 2.42.1
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor