diff options
author | Christian Strømme <christian.stromme@qt.io> | 2018-11-23 13:38:48 +0100 |
---|---|---|
committer | Christian Stromme <christian.stromme@qt.io> | 2018-11-26 11:35:08 +0000 |
commit | f21784303bc4da85396bd87be0936911aa76331c (patch) | |
tree | df1a91a325d79ce4002a103b43be743f05a1d160 | |
parent | 5f8f448e0304e5637fe7f2b64c05c93b3aa48410 (diff) |
Fix dynamic keyframes
Don't generate dynamic kf on first entry to a slide, since there are
no "from" values yet.
Task-number: QT3DS-2209
Change-Id: Ib4e59968d9099b77ea6d11f1b627b77cad194a23
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
-rw-r--r-- | src/runtime/q3dsanimationmanager.cpp | 9 | ||||
-rw-r--r-- | src/runtime/q3dsanimationmanager_p.h | 4 | ||||
-rw-r--r-- | src/runtime/q3dsslideplayer.cpp | 2 | ||||
-rw-r--r-- | tests/scenes/slideplayer/dynamickeyframes/DynamicKeyframe3.uip | 165 |
4 files changed, 173 insertions, 7 deletions
diff --git a/src/runtime/q3dsanimationmanager.cpp b/src/runtime/q3dsanimationmanager.cpp index 51a6c73..cdb6e5e 100644 --- a/src/runtime/q3dsanimationmanager.cpp +++ b/src/runtime/q3dsanimationmanager.cpp @@ -121,7 +121,8 @@ static int componentSuffixToIndex(const QString &s) void Q3DSAnimationManager::updateAnimationHelper(const AnimationTrackListMap &targets, Q3DSSlide *slide, - bool editorMode) + bool editorMode, + bool updateDkf) { // QT3DS-2183: We'll use this to set dummy kf at the start and end of the clip. // See code further down. @@ -339,7 +340,7 @@ void Q3DSAnimationManager::updateAnimationHelper(const AnimationTrackListMap &ta const bool isDynamic = animationTrack->isDynamic() && !editorMode; // If track is marked as dynamic, update the first keyframe so it interpolates from // the current position to the next. - if (isDynamic) + if (isDynamic && updateDkf) updateDynamicKeyFrame(keyFrames[0], target, prop); // QT3DS-2183 - We add keyframes at the start and at the end of the clip @@ -509,7 +510,7 @@ static void insertTrack(Q3DSAnimationManager::AnimationTrackList &trackList, } } -void Q3DSAnimationManager::updateAnimations(Q3DSSlide *slide, bool editorMode) +void Q3DSAnimationManager::updateAnimations(Q3DSSlide *slide, bool editorMode, bool updateDynamicKfs) { Q_ASSERT(slide); @@ -544,7 +545,7 @@ void Q3DSAnimationManager::updateAnimations(Q3DSSlide *slide, bool editorMode) buildTrackListMap(masterSlide, false); buildTrackListMap(slide, true); - updateAnimationHelper(trackListMap, slide, editorMode); + updateAnimationHelper(trackListMap, slide, editorMode, updateDynamicKfs); } void Q3DSAnimationManager::applyChanges() diff --git a/src/runtime/q3dsanimationmanager_p.h b/src/runtime/q3dsanimationmanager_p.h index 7c22489..ab6363b 100644 --- a/src/runtime/q3dsanimationmanager_p.h +++ b/src/runtime/q3dsanimationmanager_p.h @@ -56,7 +56,7 @@ public: using AnimationTrackList = QVector<const Q3DSAnimationTrack *>; using AnimationTrackListMap = QHash<Q3DSGraphObject *, AnimationTrackList>; - void updateAnimations(Q3DSSlide *slide, bool editorMode = false); + void updateAnimations(Q3DSSlide *slide, bool editorMode = false, bool updateDynamicKfs = true); void clearAnimations(Q3DSSlide *slide); void applyChanges(); void clearPendingChanges(); @@ -69,7 +69,7 @@ public: private: void updateAnimationHelper(const AnimationTrackListMap &targets, Q3DSSlide *slide, - bool editorMode); + bool editorMode, bool updateDkf); void buildClipAnimator(Q3DSSlide *slide); diff --git a/src/runtime/q3dsslideplayer.cpp b/src/runtime/q3dsslideplayer.cpp index 3dfd2d0..2b4819c 100644 --- a/src/runtime/q3dsslideplayer.cpp +++ b/src/runtime/q3dsslideplayer.cpp @@ -767,7 +767,7 @@ void Q3DSSlidePlayer::handleCurrentSlideChanged(Q3DSSlide *slide, setSlideTime(slide, 0.0f, true); processPropertyChanges(slide, previousSlide); attatchPositionCallback(slide); - m_animationManager->updateAnimations(slide, (m_mode == PlayerMode::Editor)); + m_animationManager->updateAnimations(slide, (m_mode == PlayerMode::Editor), !forceUpdate); Q3DSGraphObject *eventTarget = m_sceneManager->m_scene; if (m_type != PlayerType::Scene) diff --git a/tests/scenes/slideplayer/dynamickeyframes/DynamicKeyframe3.uip b/tests/scenes/slideplayer/dynamickeyframes/DynamicKeyframe3.uip new file mode 100644 index 0000000..34056f2 --- /dev/null +++ b/tests/scenes/slideplayer/dynamickeyframes/DynamicKeyframe3.uip @@ -0,0 +1,165 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<UIP version="4" > + <Project > + <ProjectSettings author="" company="" presentationWidth="2400" presentationHeight="900" maintainAspect="False" > + <CustomColors count="16" >#7391ff #ffffff #ff0055 #ffffff #606060 #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff</CustomColors> + </ProjectSettings> + <Graph > + <Scene id="Scene" > + <Layer id="Layer" > + <Camera id="Camera" /> + <Model id="Rectangle" > + <Material id="Default" name="Default" /> + </Model> + <Model id="Rectangle2" > + <Material id="Default_001" name="Default" /> + </Model> + <Group id="Group" > + <Text id="State1" /> + <Text id="State2" /> + <Text id="State3" /> + <Text id="State4" /> + </Group> + <Group id="CTRLs" > + <Text id="BtnState1" /> + <Text id="BtnState2" /> + <Text id="BtnState3" /> + <Text id="BtnState4" /> + </Group> + </Layer> + </Scene> + </Graph> + <Logic > + <State name="Master Slide" component="#Scene" > + <Add ref="#Layer" /> + <Add ref="#Camera" orthographic="True" /> + <Add ref="#Rectangle" name="Rectangle1" opacity="50" position="-110 0 0" scale="2 2 1" sourcepath="#Rectangle" /> + <Add ref="#Default" diffuse="1 0 0" shaderlighting="None" /> + <Add ref="#Rectangle2" name="Rectangle2" opacity="50" position="110 0 0" scale="2 2 1" sourcepath="#Rectangle" /> + <Add ref="#Default_001" diffuse="0 0.333333 1" shaderlighting="None" /> + <Add ref="#Group" name="Labels" position="0 0 -2" /> + <Add ref="#State1" name="State1" font="TitilliumWeb-Regular" position="-900 300 0" textstring="State 1" /> + <Add ref="#State2" name="State2" font="TitilliumWeb-Regular" position="900 300 0" textstring="State 2" /> + <Add ref="#State3" name="State3" font="TitilliumWeb-Regular" position="-900 -300 0" textstring="State 3" /> + <Add ref="#State4" name="State4" font="TitilliumWeb-Regular" position="900 -300 0" textstring="State 4" /> + <Add ref="#CTRLs" name="CTRLs" /> + <Add ref="#BtnState1" name="BtnState1" font="TitilliumWeb-Regular" position="-300 -400 0" textstring="State 1" > + <Action id="BtnState1-Action" eyeball="True" triggerObject="#BtnState1" event="onPressureDown" targetObject="#Scene" handler="Go to Slide" > + <HandlerArgument name="Slide" type="String" argtype="Slide" value="Slide1" /> + </Action> + </Add> + <Add ref="#BtnState2" name="BtnState2" font="TitilliumWeb-Regular" position="-100 -400 0" textstring="State 2" > + <Action id="BtnState2-Action" eyeball="True" triggerObject="#BtnState2" event="onPressureDown" targetObject="#Scene" handler="Go to Slide" > + <HandlerArgument name="Slide" type="String" argtype="Slide" value="Slide2" /> + </Action> + </Add> + <Add ref="#BtnState3" name="BtnState3" font="TitilliumWeb-Regular" position="100 -400 0" textstring="State 3" > + <Action id="BtnState3-Action" eyeball="True" triggerObject="#BtnState3" event="onPressureDown" targetObject="#Scene" handler="Go to Slide" > + <HandlerArgument name="Slide" type="String" argtype="Slide" value="Slide3" /> + </Action> + </Add> + <Add ref="#BtnState4" name="BtnState4" font="TitilliumWeb-Regular" position="300 -400 0" textstring="State 4" > + <Action id="BtnState4-Action" eyeball="True" triggerObject="#BtnState4" event="onPressureDown" targetObject="#Scene" handler="Go to Slide" > + <HandlerArgument name="Slide" type="String" argtype="Slide" value="Slide4" /> + </Action> + </Add> + <State id="Scene-Slide1" name="Slide1" > + <Set ref="#Layer" endtime="6000" /> + <Set ref="#Camera" endtime="6000" /> + <Set ref="#Rectangle" endtime="6000" position="0 0 0" > + <AnimationTrack property="position.x" type="EaseInOut" dynamic="True" >0 -900 0 0 2 -900 0 0</AnimationTrack> + <AnimationTrack property="position.y" type="EaseInOut" dynamic="True" >0 300 0 0 2 300 0 0</AnimationTrack> + <AnimationTrack property="position.z" type="EaseInOut" dynamic="True" >0 0 0 0 2 0 0 0</AnimationTrack> + </Set> + <Set ref="#Rectangle2" endtime="6000" position="0 0 0" > + <AnimationTrack property="position.x" type="EaseInOut" dynamic="True" >4 -900 0 0 6 -900 0 0</AnimationTrack> + <AnimationTrack property="position.y" type="EaseInOut" dynamic="True" >4 300 0 0 6 300 0 0</AnimationTrack> + <AnimationTrack property="position.z" type="EaseInOut" dynamic="True" >4 0 0 0 6 0 0 0</AnimationTrack> + </Set> + <Set ref="#Group" endtime="6000" /> + <Set ref="#State1" endtime="6000" /> + <Set ref="#State2" endtime="6000" /> + <Set ref="#State3" endtime="6000" /> + <Set ref="#State4" endtime="6000" /> + <Set ref="#CTRLs" endtime="6000" /> + <Set ref="#BtnState1" endtime="6000" /> + <Set ref="#BtnState2" endtime="6000" /> + <Set ref="#BtnState3" endtime="6000" /> + <Set ref="#BtnState4" endtime="6000" /> + </State> + <State id="Scene-Slide2" name="Slide2" playthroughto="Previous" > + <Set ref="#Layer" endtime="5999" /> + <Set ref="#Camera" endtime="5999" /> + <Set ref="#Rectangle" endtime="5999" position="0 0 0" > + <AnimationTrack property="position.x" type="EaseInOut" dynamic="True" >0 900 0 0 2 900 0 0</AnimationTrack> + <AnimationTrack property="position.y" type="EaseInOut" dynamic="True" >0 300 0 0 2 300 0 0</AnimationTrack> + <AnimationTrack property="position.z" type="EaseInOut" dynamic="True" >0 0 0 0 2 0 0 0</AnimationTrack> + </Set> + <Set ref="#Rectangle2" endtime="5999" position="0 0 0" > + <AnimationTrack property="position.x" type="EaseInOut" dynamic="True" >3.999 900 0 0 5.999 900 0 0</AnimationTrack> + <AnimationTrack property="position.y" type="EaseInOut" dynamic="True" >3.999 300 0 0 5.999 300 0 0</AnimationTrack> + <AnimationTrack property="position.z" type="EaseInOut" dynamic="True" >3.999 0 0 0 5.999 0 0 0</AnimationTrack> + </Set> + <Set ref="#Group" endtime="5999" /> + <Set ref="#State1" endtime="5999" /> + <Set ref="#State2" endtime="5999" /> + <Set ref="#State3" endtime="5999" /> + <Set ref="#State4" endtime="5999" /> + <Set ref="#CTRLs" endtime="5999" /> + <Set ref="#BtnState1" endtime="5999" /> + <Set ref="#BtnState2" endtime="5999" /> + <Set ref="#BtnState3" endtime="5999" /> + <Set ref="#BtnState4" endtime="5999" /> + </State> + <State id="Scene-Slide3" name="Slide3" playthroughto="Previous" > + <Set ref="#Layer" endtime="5999" /> + <Set ref="#Camera" endtime="5999" /> + <Set ref="#Rectangle" endtime="5999" position="0 0 0" > + <AnimationTrack property="position.x" type="EaseInOut" dynamic="True" >0 -900 0 0 2 -900 0 0</AnimationTrack> + <AnimationTrack property="position.y" type="EaseInOut" dynamic="True" >0 -300 0 0 2 -300 0 0</AnimationTrack> + <AnimationTrack property="position.z" type="EaseInOut" dynamic="True" >0 0 0 0 2 0 0 0</AnimationTrack> + </Set> + <Set ref="#Rectangle2" endtime="5999" position="0 0 0" > + <AnimationTrack property="position.x" type="EaseInOut" dynamic="True" >3.999 -900 0 0 5.999 -900 0 0</AnimationTrack> + <AnimationTrack property="position.y" type="EaseInOut" dynamic="True" >3.999 -300 0 0 5.999 -300 0 0</AnimationTrack> + <AnimationTrack property="position.z" type="EaseInOut" dynamic="True" >3.999 0 0 0 5.999 0 0 0</AnimationTrack> + </Set> + <Set ref="#Group" endtime="5999" /> + <Set ref="#State1" endtime="5999" /> + <Set ref="#State2" endtime="5999" /> + <Set ref="#State3" endtime="5999" /> + <Set ref="#State4" endtime="5999" /> + <Set ref="#CTRLs" endtime="5999" /> + <Set ref="#BtnState1" endtime="5999" /> + <Set ref="#BtnState2" endtime="5999" /> + <Set ref="#BtnState3" endtime="5999" /> + <Set ref="#BtnState4" endtime="5999" /> + </State> + <State id="Scene-Slide4" name="Slide4" initialplaystate="Play" playmode="Stop at end" playthroughto="Previous" > + <Set ref="#Layer" endtime="6000" /> + <Set ref="#Camera" endtime="6000" /> + <Set ref="#Rectangle" endtime="6000" position="0 0 0" > + <AnimationTrack property="position.x" type="EaseInOut" dynamic="True" >0 900 0 0 2 900 0 0</AnimationTrack> + <AnimationTrack property="position.y" type="EaseInOut" dynamic="True" >0 -300 0 0 2 -300 0 0</AnimationTrack> + <AnimationTrack property="position.z" type="EaseInOut" dynamic="True" >0 0 0 0 2 0 0 0</AnimationTrack> + </Set> + <Set ref="#Rectangle2" endtime="6000" position="0 0 0" > + <AnimationTrack property="position.x" type="EaseInOut" dynamic="True" >4 900 0 0 5.999 900 0 0</AnimationTrack> + <AnimationTrack property="position.y" type="EaseInOut" dynamic="True" >4 -300 0 0 5.999 -300 0 0</AnimationTrack> + <AnimationTrack property="position.z" type="EaseInOut" dynamic="True" >4 0 0 0 5.999 0 0 0</AnimationTrack> + </Set> + <Set ref="#Group" endtime="6000" /> + <Set ref="#State1" endtime="6000" /> + <Set ref="#State2" endtime="6000" /> + <Set ref="#State3" endtime="6000" /> + <Set ref="#State4" endtime="6000" /> + <Set ref="#CTRLs" endtime="6000" /> + <Set ref="#BtnState1" endtime="6000" /> + <Set ref="#BtnState2" endtime="6000" /> + <Set ref="#BtnState3" endtime="6000" /> + <Set ref="#BtnState4" endtime="6000" /> + </State> + </State> + </Logic> + </Project> +</UIP> |