[Libreoffice-commits] core.git: Branch 'private/quwex/gsoc-box2d-experimental' - 5 commits - offapi/com slideshow/Library_slideshow.mk slideshow/source slideshow/test
Sarper Akdemir (via logerrit)
logerrit at kemper.freedesktop.org
Mon Jun 22 08:36:38 UTC 2020
Rebased ref, commits from common ancestor:
commit c7d8e0e693cfeb7361e62378b3d725f84318f1b5
Author: Sarper Akdemir <q.sarperakdemir at gmail.com>
AuthorDate: Wed Jun 17 13:08:03 2020 +0300
Commit: Sarper Akdemir <q.sarperakdemir at gmail.com>
CommitDate: Mon Jun 22 11:08:18 2020 +0300
override creation of PathMotionNode for testing
Change-Id: Iaa1c28f00c090dda4734675e549911c711003758
diff --git a/slideshow/source/engine/animationnodes/animationnodefactory.cxx b/slideshow/source/engine/animationnodes/animationnodefactory.cxx
index a88c3a8ab7e0..f07dfd2f3572 100644
--- a/slideshow/source/engine/animationnodes/animationnodefactory.cxx
+++ b/slideshow/source/engine/animationnodes/animationnodefactory.cxx
@@ -480,7 +480,8 @@ BaseNodeSharedPtr implCreateAnimationNode(
break;
case animations::AnimationNodeType::ANIMATEMOTION:
- pCreatedNode = std::make_shared<AnimationPathMotionNode>(
+// pCreatedNode = std::make_shared<AnimationPathMotionNode>(
+ pCreatedNode = std::make_shared<AnimationSimulatedNode>(
xNode, rParent, rContext );
break;
commit a1c17f84b5b487b8b210dd6e0898f5ba6c5e63c5
Author: Sarper Akdemir <q.sarperakdemir at gmail.com>
AuthorDate: Thu Jun 11 19:29:38 2020 +0300
Commit: Sarper Akdemir <q.sarperakdemir at gmail.com>
CommitDate: Mon Jun 22 10:57:07 2020 +0300
make simulated animations part of the animation engine
Wiring up and creating required classes for simulated
animations to be part of the animation engine.
Creating a new animation node AnimationSimulationNode
for simulated animations and SimulatedAnimation class
that inherits from NumberAnimation in the animation
factory.
Also, this commit makes it possible to have two box2d
animation effects in parallel with -with previous-
option
Change-Id: I1f125df5324673e9937b8164c0fc267c9683afa0
diff --git a/offapi/com/sun/star/animations/AnimationNodeType.idl b/offapi/com/sun/star/animations/AnimationNodeType.idl
index 31bed11ff728..770f148356ae 100644
--- a/offapi/com/sun/star/animations/AnimationNodeType.idl
+++ b/offapi/com/sun/star/animations/AnimationNodeType.idl
@@ -68,6 +68,9 @@ constants AnimationNodeType
/** Defines a command effect. */
const short COMMAND = 11;
+ /** Defines a simulated animation */
+ const short ANIMATESIMULATED = 12;
+
};
diff --git a/slideshow/Library_slideshow.mk b/slideshow/Library_slideshow.mk
index 53324ea25dcc..398f82bd1f51 100644
--- a/slideshow/Library_slideshow.mk
+++ b/slideshow/Library_slideshow.mk
@@ -75,6 +75,7 @@ $(eval $(call gb_Library_add_exception_objects,slideshow,\
slideshow/source/engine/animationnodes/animationnodefactory \
slideshow/source/engine/animationnodes/animationpathmotionnode \
slideshow/source/engine/animationnodes/animationsetnode \
+ slideshow/source/engine/animationnodes/animationsimulatednode \
slideshow/source/engine/animationnodes/animationtransformnode \
slideshow/source/engine/animationnodes/animationtransitionfilternode \
slideshow/source/engine/animationnodes/basecontainernode \
diff --git a/slideshow/source/engine/animationfactory.cxx b/slideshow/source/engine/animationfactory.cxx
index f81c37b77df3..7c06a32c388a 100644
--- a/slideshow/source/engine/animationfactory.cxx
+++ b/slideshow/source/engine/animationfactory.cxx
@@ -35,6 +35,7 @@
#include <basegfx/polygon/b2dpolygontools.hxx>
#include <basegfx/polygon/b2dpolypolygontools.hxx>
+#include <box2dtools.hxx>
using namespace ::com::sun::star;
@@ -341,6 +342,174 @@ namespace slideshow::internal
sal_Int16 mnAdditive;
};
+ class SimulatedAnimation : public NumberAnimation
+ {
+ public:
+ SimulatedAnimation( const ::box2d::utils::Box2DWorldSharedPtr pBox2DWorld,
+ const double fDuration,
+ sal_Int16 nAdditive,
+ const ShapeManagerSharedPtr& rShapeManager,
+ const ::basegfx::B2DVector& rSlideSize,
+ int nFlags ) :
+ mpShape(),
+ mpAttrLayer(),
+ mpShapeManager( rShapeManager ),
+ maPageSize( rSlideSize ),
+ maShapeOrig(),
+ mnFlags( nFlags ),
+ mbAnimationStarted( false ),
+ mnAdditive( nAdditive ),
+ mpBox2DBody(),
+ mpBox2DWorld( pBox2DWorld ),
+ mfDuration(fDuration),
+ mfPreviousElapsedTime(0.00f),
+ mbIsBox2dWorldStepper(false)
+ {
+ ENSURE_OR_THROW( rShapeManager,
+ "SimulatedAnimation::SimulatedAnimation(): Invalid ShapeManager" );
+ }
+
+ virtual ~SimulatedAnimation() override
+ {
+ end_();
+ }
+
+ // Animation interface
+
+ virtual void prefetch() override
+ {}
+
+ virtual void start( const AnimatableShapeSharedPtr& rShape,
+ const ShapeAttributeLayerSharedPtr& rAttrLayer ) override
+ {
+ OSL_ENSURE( !mpShape,
+ "PathAnimation::start(): Shape already set" );
+ OSL_ENSURE( !mpAttrLayer,
+ "PathAnimation::start(): Attribute layer already set" );
+
+ mpShape = rShape;
+ mpAttrLayer = rAttrLayer;
+
+ if( !(mpBox2DWorld->getShapesInitialized()) )
+ mpBox2DWorld->initateAllShapesAsStaticBodies( mpShapeManager );
+
+ mpBox2DBody = mpBox2DWorld->makeShapeDynamic( rShape );
+
+ ENSURE_OR_THROW( rShape,
+ "SimulatedAnimation::start(): Invalid shape" );
+ ENSURE_OR_THROW( rAttrLayer,
+ "SimulatedAnimation::(): Invalid attribute layer" );
+
+ // TODO(F1): Check whether _shape_ bounds are correct here.
+ // Theoretically, our AttrLayer is way down the stack, and
+ // we only have to consider _that_ value, not the one from
+ // the top of the stack as returned by Shape::getBounds()
+ if( mnAdditive == animations::AnimationAdditiveMode::SUM )
+ maShapeOrig = mpShape->getBounds().getCenter();
+ else
+ maShapeOrig = mpShape->getDomBounds().getCenter();
+
+ if( !mbAnimationStarted )
+ {
+ mbAnimationStarted = true;
+
+ if( !(mnFlags & AnimationFactory::FLAG_NO_SPRITE) )
+ mpShapeManager->enterAnimationMode( mpShape );
+ }
+ }
+
+ virtual void end() override { end_(); }
+ void end_()
+ {
+ if( mbIsBox2dWorldStepper )
+ {
+ mbIsBox2dWorldStepper = false;
+ mpBox2DWorld->setHasWorldStepper(false);
+ }
+
+ if( mbAnimationStarted )
+ {
+ mbAnimationStarted = false;
+
+ // Animation have ended for this body, make it static
+ mpBox2DWorld->makeBodyStatic( mpBox2DBody );
+
+ if( !(mnFlags & AnimationFactory::FLAG_NO_SPRITE) )
+ mpShapeManager->leaveAnimationMode( mpShape );
+
+ if( mpShape->isContentChanged() )
+ mpShapeManager->notifyShapeUpdate( mpShape );
+ }
+ }
+
+ // NumberAnimation interface
+
+
+ virtual bool operator()( double nValue ) override
+ {
+ ENSURE_OR_RETURN_FALSE( mpAttrLayer && mpShape,
+ "SimulatedAnimation::operator(): Invalid ShapeAttributeLayer" );
+
+ // if there are multiple simulated animations going in parallel
+ // like "with previous" option. Only one of them should step
+ // the box2d world
+ if( !mpBox2DWorld->hasWorldStepper() )
+ {
+ mbIsBox2dWorldStepper = true;
+ mpBox2DWorld->setHasWorldStepper(true);
+ }
+
+ if( mbIsBox2dWorldStepper )
+ {
+ double fPassedTime = (mfDuration * nValue) - mfPreviousElapsedTime;
+
+ double fTimeStep = 1.0f/60.0f;
+
+ for( ; fPassedTime - fTimeStep >= 0; fPassedTime -= fTimeStep )
+ {
+ mpBox2DWorld->step( fTimeStep );
+ mfPreviousElapsedTime += fTimeStep;
+ }
+ }
+
+ ::basegfx::B2DPoint rOutPos = mpBox2DBody->getPosition( maPageSize );
+ mpAttrLayer->setPosition( rOutPos );
+
+ double fAngle = mpBox2DBody->getAngle();
+ mpAttrLayer->setRotationAngle( fAngle );
+
+ if( mpShape->isContentChanged() )
+ mpShapeManager->notifyShapeUpdate( mpShape );
+
+ return true;
+ }
+
+ virtual double getUnderlyingValue() const override
+ {
+ ENSURE_OR_THROW( mpAttrLayer,
+ "SimulatedAnimation::getUnderlyingValue(): Invalid ShapeAttributeLayer" );
+
+ return 0.0; // though this should be used in concert with
+ // ActivitiesFactory::createSimpleActivity, better
+ // explicitly name our start value.
+ // Permissible range for operator() above is [0,1]
+ }
+
+ private:
+ AnimatableShapeSharedPtr mpShape;
+ ShapeAttributeLayerSharedPtr mpAttrLayer;
+ ShapeManagerSharedPtr mpShapeManager;
+ const ::basegfx::B2DSize maPageSize;
+ ::basegfx::B2DPoint maShapeOrig;
+ const int mnFlags;
+ bool mbAnimationStarted;
+ sal_Int16 mnAdditive;
+ box2d::utils::Box2DBodySharedPtr mpBox2DBody;
+ box2d::utils::Box2DWorldSharedPtr mpBox2DWorld;
+ double mfDuration;
+ double mfPreviousElapsedTime;
+ bool mbIsBox2dWorldStepper;
+ };
/** GenericAnimation template
@@ -1228,6 +1397,20 @@ namespace slideshow::internal
nFlags );
}
+ NumberAnimationSharedPtr AnimationFactory::createSimulatedAnimation( const box2d::utils::Box2DWorldSharedPtr pBox2DWorld,
+ const double fDuration,
+ sal_Int16 nAdditive,
+ const AnimatableShapeSharedPtr& /*rShape*/,
+ const ShapeManagerSharedPtr& rShapeManager,
+ const ::basegfx::B2DVector& rSlideSize,
+ int nFlags )
+ {
+ return std::make_shared<SimulatedAnimation>( pBox2DWorld, fDuration, nAdditive,
+ rShapeManager,
+ rSlideSize,
+ nFlags );
+ }
+
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/slideshow/source/engine/animationnodes/animationnodefactory.cxx b/slideshow/source/engine/animationnodes/animationnodefactory.cxx
index f9fa01b2f1fd..a88c3a8ab7e0 100644
--- a/slideshow/source/engine/animationnodes/animationnodefactory.cxx
+++ b/slideshow/source/engine/animationnodes/animationnodefactory.cxx
@@ -33,6 +33,7 @@
#include "propertyanimationnode.hxx"
#include "animationsetnode.hxx"
#include "animationpathmotionnode.hxx"
+#include "animationsimulatednode.hxx"
#include "animationcolornode.hxx"
#include "animationtransformnode.hxx"
#include "animationtransitionfilternode.hxx"
@@ -493,6 +494,11 @@ BaseNodeSharedPtr implCreateAnimationNode(
xNode, rParent, rContext );
break;
+ case animations::AnimationNodeType::ANIMATESIMULATED:
+ pCreatedNode = std::make_shared<AnimationSimulatedNode>(
+ xNode, rParent, rContext );
+ break;
+
case animations::AnimationNodeType::TRANSITIONFILTER:
pCreatedNode = std::make_shared<AnimationTransitionFilterNode>(
xNode, rParent, rContext );
diff --git a/slideshow/source/engine/animationnodes/animationsimulatednode.cxx b/slideshow/source/engine/animationnodes/animationsimulatednode.cxx
new file mode 100644
index 000000000000..aef5192c0be5
--- /dev/null
+++ b/slideshow/source/engine/animationnodes/animationsimulatednode.cxx
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include "animationsimulatednode.hxx"
+#include <animationfactory.hxx>
+
+namespace slideshow::internal
+{
+void AnimationSimulatedNode::dispose()
+{
+ mxSimulatedMotionNode.clear();
+ AnimationBaseNode::dispose();
+}
+
+AnimationActivitySharedPtr AnimationSimulatedNode::createActivity() const
+{
+ double fDuration;
+ ENSURE_OR_THROW((mxSimulatedMotionNode->getDuration() >>= fDuration),
+ "Couldn't get the animation duration.");
+
+ ActivitiesFactory::CommonParameters const aParms(fillCommonParameters());
+ return ActivitiesFactory::createSimpleActivity(
+ aParms,
+ AnimationFactory::createSimulatedAnimation(
+ getContext().mpBox2DWorld, fDuration, mxSimulatedMotionNode->getAdditive(), getShape(),
+ getContext().mpSubsettableShapeManager, getSlideSize(), 0),
+ true);
+}
+
+} // namespace slideshow::internal
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/slideshow/source/engine/animationnodes/animationsimulatednode.hxx b/slideshow/source/engine/animationnodes/animationsimulatednode.hxx
new file mode 100644
index 000000000000..82fa764c805d
--- /dev/null
+++ b/slideshow/source/engine/animationnodes/animationsimulatednode.hxx
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+#pragma once
+
+#include "animationbasenode.hxx"
+#include <com/sun/star/animations/XAnimateMotion.hpp>
+
+namespace slideshow
+{
+namespace internal
+{
+class AnimationSimulatedNode : public AnimationBaseNode
+{
+public:
+ AnimationSimulatedNode(const css::uno::Reference<css::animations::XAnimationNode>& xNode,
+ const BaseContainerNodeSharedPtr& rParent, const NodeContext& rContext)
+ : AnimationBaseNode(xNode, rParent, rContext)
+ , mxSimulatedMotionNode(xNode, css::uno::UNO_QUERY_THROW)
+ {
+ }
+
+#if defined(DBG_UTIL)
+ virtual const char* getDescription() const override { return "AnimationSimulationNode"; }
+#endif
+
+protected:
+ virtual void dispose() override;
+
+private:
+ virtual AnimationActivitySharedPtr createActivity() const override;
+
+ css::uno::Reference<css::animations::XAnimateMotion> mxSimulatedMotionNode;
+};
+
+} // namespace internal
+} // namespace slideshow
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/slideshow/source/engine/slide/slideimpl.cxx b/slideshow/source/engine/slide/slideimpl.cxx
index a9120c6da829..a300c946e52a 100644
--- a/slideshow/source/engine/slide/slideimpl.cxx
+++ b/slideshow/source/engine/slide/slideimpl.cxx
@@ -47,6 +47,7 @@
#include "userpaintoverlay.hxx"
#include "targetpropertiescreator.hxx"
#include <tools.hxx>
+#include <box2dtools.hxx>
using namespace ::com::sun::star;
@@ -193,6 +194,7 @@ private:
LayerManagerSharedPtr mpLayerManager;
std::shared_ptr<ShapeManagerImpl> mpShapeManager;
std::shared_ptr<SubsettableShapeManager> mpSubsettableShapeManager;
+ box2d::utils::Box2DWorldSharedPtr mpBox2DWorld;
/// Contains common objects needed throughout the slideshow
SlideShowContext maContext;
@@ -316,6 +318,8 @@ SlideImpl::SlideImpl( const uno::Reference< drawing::XDrawPage >& xDra
rShapeCursorMap,
xDrawPage)),
mpSubsettableShapeManager( mpShapeManager ),
+ mpBox2DWorld( std::make_shared<box2d::utils::box2DWorld>(
+ basegfx::B2DSize( getSlideSizeImpl() ) ) ),
maContext( mpSubsettableShapeManager,
rEventQueue,
rEventMultiplexer,
@@ -325,7 +329,8 @@ SlideImpl::SlideImpl( const uno::Reference< drawing::XDrawPage >& xDra
*this,
rMediaFileManager,
rViewContainer,
- xComponentContext ),
+ xComponentContext,
+ mpBox2DWorld ),
mrCursorManager( rCursorManager ),
maAnimations( maContext,
basegfx::B2DSize( getSlideSizeImpl() ) ),
diff --git a/slideshow/source/engine/slideshowcontext.cxx b/slideshow/source/engine/slideshowcontext.cxx
index 8c0811e9ecf7..3ea5ab50393b 100644
--- a/slideshow/source/engine/slideshowcontext.cxx
+++ b/slideshow/source/engine/slideshowcontext.cxx
@@ -45,7 +45,8 @@ SlideShowContext::SlideShowContext( SubsettableShapeManagerSharedPtr& rSubsettab
MediaFileManager& rMediaFileManager,
const UnoViewContainer& rViewContainer,
const uno::Reference<
- uno::XComponentContext>& rComponentContext ) :
+ uno::XComponentContext>& rComponentContext,
+ box2d::utils::Box2DWorldSharedPtr rBox2DWorldPtr ) :
mpSubsettableShapeManager( rSubsettableShapeManager ),
mrEventQueue( rEventQueue ),
mrEventMultiplexer( rEventMultiplexer ),
@@ -55,7 +56,8 @@ SlideShowContext::SlideShowContext( SubsettableShapeManagerSharedPtr& rSubsettab
mrCursorManager( rCursorManager ),
mrMediaFileManager( rMediaFileManager ),
mrViewContainer( rViewContainer ),
- mxComponentContext( rComponentContext )
+ mxComponentContext( rComponentContext ),
+ mpBox2DWorld( rBox2DWorldPtr )
{}
void SlideShowContext::dispose()
diff --git a/slideshow/source/engine/slideshowimpl.cxx b/slideshow/source/engine/slideshowimpl.cxx
index 9fd3d536dbce..afac7a392763 100644
--- a/slideshow/source/engine/slideshowimpl.cxx
+++ b/slideshow/source/engine/slideshowimpl.cxx
@@ -84,6 +84,9 @@
using namespace com::sun::star;
using namespace ::slideshow::internal;
+namespace box2d::utils { class box2DWorld;
+ typedef ::std::shared_ptr< box2DWorld > Box2DWorldSharedPtr; }
+
namespace {
/** During animations the update() method tells its caller to call it as
@@ -416,6 +419,7 @@ private:
ActivitiesQueue maActivitiesQueue;
UserEventQueue maUserEventQueue;
SubsettableShapeManagerSharedPtr mpDummyPtr;
+ box2d::utils::Box2DWorldSharedPtr mpBox2DDummyPtr;
std::shared_ptr<SeparateListenerImpl> mpListener;
@@ -544,6 +548,7 @@ SlideShowImpl::SlideShowImpl(
maEventQueue,
*this ),
mpDummyPtr(),
+ mpBox2DDummyPtr(),
mpListener(),
mpRehearseTimingsActivity(),
mpWaitSymbol(),
@@ -1673,7 +1678,8 @@ sal_Bool SlideShowImpl::setProperty( beans::PropertyValue const& rProperty )
*this,
*this,
maViewContainer,
- mxComponentContext) );
+ mxComponentContext,
+ mpBox2DDummyPtr ) );
}
else if (mpRehearseTimingsActivity)
{
diff --git a/slideshow/source/inc/animationfactory.hxx b/slideshow/source/inc/animationfactory.hxx
index 7d2f205c63a5..caff30684563 100644
--- a/slideshow/source/inc/animationfactory.hxx
+++ b/slideshow/source/inc/animationfactory.hxx
@@ -30,6 +30,9 @@
#include "shapemanager.hxx"
+namespace box2d::utils { class box2DWorld;
+ typedef ::std::shared_ptr< box2DWorld > Box2DWorldSharedPtr; }
+
/* Definition of AnimationFactory class */
namespace slideshow
@@ -126,6 +129,14 @@ namespace slideshow
const ShapeManagerSharedPtr& rShapeManager,
const ::basegfx::B2DVector& rSlideSize,
int nFlags);
+
+ NumberAnimationSharedPtr createSimulatedAnimation( const box2d::utils::Box2DWorldSharedPtr pBox2DWorld,
+ const double fDuration,
+ sal_Int16 nAdditive,
+ const AnimatableShapeSharedPtr& /*rShape*/,
+ const ShapeManagerSharedPtr& rShapeManager,
+ const ::basegfx::B2DVector& rSlideSize,
+ int nFlags );
}
}
}
diff --git a/slideshow/source/inc/slideshowcontext.hxx b/slideshow/source/inc/slideshowcontext.hxx
index 6d14fb34b1b2..3d2918674112 100644
--- a/slideshow/source/inc/slideshowcontext.hxx
+++ b/slideshow/source/inc/slideshowcontext.hxx
@@ -24,6 +24,9 @@
#include <memory>
namespace com::sun::star::uno { class XComponentContext; }
+namespace box2d::utils { class box2DWorld;
+ typedef ::std::shared_ptr< box2DWorld > Box2DWorldSharedPtr; }
+
namespace slideshow
@@ -41,7 +44,6 @@ namespace slideshow
class MediaFileManager;
class SubsettableShapeManager;
typedef ::std::shared_ptr< SubsettableShapeManager > SubsettableShapeManagerSharedPtr;
-
/** Common arguments for slideshow objects.
This struct combines a number of object references
@@ -92,7 +94,8 @@ namespace slideshow
CursorManager& rCursorManager,
MediaFileManager& rMediaFileManager,
const UnoViewContainer& rViewContainer,
- const css::uno::Reference< css::uno::XComponentContext>& rComponentContext );
+ const css::uno::Reference< css::uno::XComponentContext>& rComponentContext,
+ box2d::utils::Box2DWorldSharedPtr rBox2DWorldPtr );
void dispose();
std::shared_ptr<SubsettableShapeManager>& mpSubsettableShapeManager;
@@ -105,6 +108,7 @@ namespace slideshow
MediaFileManager& mrMediaFileManager;
const UnoViewContainer& mrViewContainer;
css::uno::Reference< css::uno::XComponentContext> mxComponentContext;
+ box2d::utils::Box2DWorldSharedPtr mpBox2DWorld;
};
}
}
commit 7ac1c8af0377687e48214ca6a1e0d82b8b2b1054
Author: Sarper Akdemir <q.sarperakdemir at gmail.com>
AuthorDate: Wed Jun 10 02:33:22 2020 +0300
Commit: Sarper Akdemir <q.sarperakdemir at gmail.com>
CommitDate: Mon Jun 22 10:57:06 2020 +0300
Add Shape mbIsForeground flag and getters and setters for it
mbIsForeground is a flag that is set if a shape is known to not belong
to the foreground.
It is set to false while shapes are being imported and the shape
belongs to the master slide or is a group shape, right now.
Change-Id: I7f7d5cc8b5ca99961049ab7b1062fa20b77884ca
diff --git a/slideshow/source/engine/shapes/backgroundshape.cxx b/slideshow/source/engine/shapes/backgroundshape.cxx
index 88d48b7e72e9..a4e02ac7e0c1 100644
--- a/slideshow/source/engine/shapes/backgroundshape.cxx
+++ b/slideshow/source/engine/shapes/backgroundshape.cxx
@@ -83,6 +83,8 @@ namespace slideshow::internal
virtual ::basegfx::B2DRectangle getUpdateArea() const override;
virtual bool isVisible() const override;
virtual double getPriority() const override;
+ virtual bool isForeground() const override;
+ virtual void setIsForeground( const bool bIsForeground) override;
virtual bool isBackgroundDetached() const override;
@@ -98,6 +100,7 @@ namespace slideshow::internal
GDIMetaFileSharedPtr mpMtf;
// The attributes of this Shape
+ bool mbIsForeground;
::basegfx::B2DRectangle maBounds; // always needed for rendering
/// the list of active view shapes (one for each registered view layer)
@@ -111,6 +114,7 @@ namespace slideshow::internal
const uno::Reference< drawing::XDrawPage >& xMasterPage,
const SlideShowContext& rContext ) :
mpMtf(),
+ mbIsForeground(true),
maBounds(),
maViewShapes()
{
@@ -235,6 +239,16 @@ namespace slideshow::internal
return 0.0; // lowest prio, we're the background
}
+ bool BackgroundShape::isForeground() const
+ {
+ return mbIsForeground;
+ }
+
+ void BackgroundShape::setIsForeground( const bool bIsForeground )
+ {
+ mbIsForeground = bIsForeground;
+ }
+
bool BackgroundShape::update() const
{
return render();
diff --git a/slideshow/source/engine/shapes/drawshape.cxx b/slideshow/source/engine/shapes/drawshape.cxx
index e8fcd0299ab3..3b9df45dcc91 100644
--- a/slideshow/source/engine/shapes/drawshape.cxx
+++ b/slideshow/source/engine/shapes/drawshape.cxx
@@ -346,6 +346,7 @@ namespace slideshow::internal
? MTF_LOAD_FOREIGN_SOURCE : MTF_LOAD_NONE ),
maCurrentShapeUnitBounds(),
mnPriority( nPrio ), // TODO(F1): When ZOrder someday becomes usable: make this ( getAPIShapePrio( xShape ) ),
+ mbIsForeground(true),
maBounds( getAPIShapeBounds( xShape ) ),
mpAttributeLayer(),
mpIntrinsicAnimationActivity(),
@@ -455,6 +456,7 @@ namespace slideshow::internal
mnCurrMtfLoadFlags( rSrc.mnCurrMtfLoadFlags ),
maCurrentShapeUnitBounds(),
mnPriority( nPrio ),
+ mbIsForeground(true),
maBounds( rSrc.maBounds ),
mpAttributeLayer(),
mpIntrinsicAnimationActivity(),
@@ -796,6 +798,16 @@ namespace slideshow::internal
return mnPriority;
}
+ bool DrawShape::isForeground() const
+ {
+ return mbIsForeground;
+ }
+
+ void DrawShape::setIsForeground(const bool bIsForeground)
+ {
+ mbIsForeground = bIsForeground;
+ }
+
bool DrawShape::isBackgroundDetached() const
{
return mnIsAnimatedCount > 0;
diff --git a/slideshow/source/engine/shapes/drawshape.hxx b/slideshow/source/engine/shapes/drawshape.hxx
index e4def440fe3d..9e65472fd14a 100644
--- a/slideshow/source/engine/shapes/drawshape.hxx
+++ b/slideshow/source/engine/shapes/drawshape.hxx
@@ -137,6 +137,8 @@ namespace slideshow
virtual ::basegfx::B2DRectangle getUpdateArea() const override;
virtual bool isVisible() const override;
virtual double getPriority() const override;
+ virtual bool isForeground() const override;
+ virtual void setIsForeground( const bool bIsForeground ) override;
// animation methods
@@ -296,6 +298,7 @@ namespace slideshow
// The attributes of this Shape
const double mnPriority;
+ bool mbIsForeground;
::basegfx::B2DRectangle maBounds; // always needed for rendering.
// for subset shapes, this member
// might change when views are
diff --git a/slideshow/source/engine/shapes/externalshapebase.cxx b/slideshow/source/engine/shapes/externalshapebase.cxx
index aeff0f412cc9..d2aee17170ed 100644
--- a/slideshow/source/engine/shapes/externalshapebase.cxx
+++ b/slideshow/source/engine/shapes/externalshapebase.cxx
@@ -85,6 +85,7 @@ namespace slideshow::internal
mpShapeManager( rContext.mpSubsettableShapeManager ),
mrEventMultiplexer( rContext.mrEventMultiplexer ),
mnPriority( nPrio ), // TODO(F1): When ZOrder someday becomes usable: make this ( getAPIShapePrio( xShape ) ),
+ mbIsForeground(true),
maBounds( getAPIShapeBounds( xShape ) )
{
ENSURE_OR_THROW( mxShape.is(), "ExternalShapeBase::ExternalShapeBase(): Invalid XShape" );
@@ -198,6 +199,15 @@ namespace slideshow::internal
return mnPriority;
}
+ bool ExternalShapeBase::isForeground() const
+ {
+ return mbIsForeground;
+ }
+
+ void ExternalShapeBase::setIsForeground( const bool bIsForeground )
+ {
+ mbIsForeground = bIsForeground;
+ }
bool ExternalShapeBase::isBackgroundDetached() const
{
diff --git a/slideshow/source/engine/shapes/externalshapebase.hxx b/slideshow/source/engine/shapes/externalshapebase.hxx
index 6b455e387f07..f3c5fa63e49f 100644
--- a/slideshow/source/engine/shapes/externalshapebase.hxx
+++ b/slideshow/source/engine/shapes/externalshapebase.hxx
@@ -84,6 +84,8 @@ namespace slideshow
virtual ::basegfx::B2DRectangle getUpdateArea() const override;
virtual bool isVisible() const override;
virtual double getPriority() const override;
+ virtual bool isForeground() const override;
+ virtual void setIsForeground( const bool bIsForeground ) override;
virtual bool isBackgroundDetached() const override;
protected:
@@ -122,6 +124,7 @@ namespace slideshow
// The attributes of this Shape
const double mnPriority;
+ bool mbIsForeground;
::basegfx::B2DRectangle maBounds;
};
}
diff --git a/slideshow/source/engine/shapes/shapeimporter.cxx b/slideshow/source/engine/shapes/shapeimporter.cxx
index b1b1b3417269..60e884ef6696 100644
--- a/slideshow/source/engine/shapes/shapeimporter.cxx
+++ b/slideshow/source/engine/shapes/shapeimporter.cxx
@@ -97,12 +97,15 @@ public:
virtual basegfx::B2DRectangle getUpdateArea() const override;
virtual bool isVisible() const override;
virtual double getPriority() const override;
+ virtual bool isForeground() const override;
+ virtual void setIsForeground( const bool bIsForeground ) override;
virtual bool isBackgroundDetached() const override;
private:
ShapeSharedPtr const mpGroupShape;
uno::Reference<drawing::XShape> const mxShape;
double const mnPrio;
+ bool mbIsForeground;
basegfx::B2DPoint maPosOffset;
double mnWidth;
double mnHeight;
@@ -114,7 +117,8 @@ ShapeOfGroup::ShapeOfGroup( ShapeSharedPtr const& pGroupSha
double nPrio ) :
mpGroupShape(pGroupShape),
mxShape(xShape),
- mnPrio(nPrio)
+ mnPrio(nPrio),
+ mbIsForeground(true)
{
// read bound rect
uno::Any const aTmpRect_( xPropSet->getPropertyValue( "BoundRect" ));
@@ -188,6 +192,16 @@ double ShapeOfGroup::getPriority() const
return mnPrio;
}
+bool ShapeOfGroup::isForeground() const
+{
+ return mbIsForeground;
+}
+
+void ShapeOfGroup::setIsForeground(const bool bIsForeground)
+{
+ mbIsForeground = bIsForeground;
+}
+
bool ShapeOfGroup::isBackgroundDetached() const
{
return false;
@@ -426,6 +440,7 @@ ShapeSharedPtr ShapeImporter::importBackgroundShape() // throw (ShapeLoadFailedE
uno::UNO_QUERY_THROW),
mrContext) );
mnAscendingPrio += 1.0;
+ pBgShape->setIsForeground(false);
return pBgShape;
}
@@ -495,6 +510,7 @@ ShapeSharedPtr ShapeImporter::importShape() // throw (ShapeLoadFailedException)
}
if( bIsGroupShape && pRet )
{
+ pRet->setIsForeground(false);
// push new group on the stack: group traversal
maShapesStack.push( XShapesEntry( pRet ) );
}
diff --git a/slideshow/source/engine/slide/slideimpl.cxx b/slideshow/source/engine/slide/slideimpl.cxx
index 0805d084e9fa..a9120c6da829 100644
--- a/slideshow/source/engine/slide/slideimpl.cxx
+++ b/slideshow/source/engine/slide/slideimpl.cxx
@@ -981,7 +981,10 @@ bool SlideImpl::loadShapes()
ShapeSharedPtr const& rShape(
aMPShapesFunctor.importShape() );
if( rShape )
+ {
+ rShape->setIsForeground(false);
mpLayerManager->addShape( rShape );
+ }
}
addPolygons(aMPShapesFunctor.getPolygons());
diff --git a/slideshow/source/inc/shape.hxx b/slideshow/source/inc/shape.hxx
index 9b6099462ab6..a522a0f76766 100644
--- a/slideshow/source/inc/shape.hxx
+++ b/slideshow/source/inc/shape.hxx
@@ -204,6 +204,24 @@ namespace slideshow
*/
virtual bool isBackgroundDetached() const = 0;
+ /** Check whether the shape belongs to the foreground
+
+ For instance, if the shape is part of the Master slide
+ it does not belong to the foreground.
+
+ @return true if the shape is on the foreground
+ */
+ virtual bool isForeground() const = 0;
+
+ /**
+ Set the flag that holds wheter the shape is
+ in the foreground or not
+
+ @param bIsForeground
+ Shape is on the foreground
+ */
+ virtual void setIsForeground( const bool bIsForeground ) = 0;
+
// Misc
diff --git a/slideshow/test/testshape.cxx b/slideshow/test/testshape.cxx
index db7031070ba8..d13a05f2be1e 100644
--- a/slideshow/test/testshape.cxx
+++ b/slideshow/test/testshape.cxx
@@ -44,6 +44,7 @@ class ImplTestShape : public TestShape,
ViewVector maViewLayers;
const basegfx::B2DRange maRect;
const double mnPrio;
+ bool mbIsForeground;
sal_Int32 mnAnimated;
mutable sal_Int32 mnNumUpdates;
mutable sal_Int32 mnNumRenders;
@@ -55,6 +56,7 @@ public:
maViewLayers(),
maRect( rRect ),
mnPrio( nPrio ),
+ mbIsForeground(true),
mnAnimated(0),
mnNumUpdates(0),
mnNumRenders(0)
@@ -175,6 +177,14 @@ private:
{
return mnPrio;
}
+ virtual bool isForeground() const override
+ {
+ return mbIsForeground;
+ }
+ virtual void setIsForeground( const bool bIsForeground ) override
+ {
+ mbIsForeground = bIsForeground;
+ }
virtual bool isBackgroundDetached() const override
{
return mnAnimated != 0;
commit ed1a035c0b1a5e673d77c5c804a90fb7d6d4d4d2
Author: Sarper Akdemir <q.sarperakdemir at gmail.com>
AuthorDate: Wed Jun 10 02:11:36 2020 +0300
Commit: Sarper Akdemir <q.sarperakdemir at gmail.com>
CommitDate: Mon Jun 22 10:57:06 2020 +0300
adding XShapeToShapeMapSharedPtr getter to ShapeManager
Refactoring XShapeHash in layermanager as XShapeToShapeMap
and XShapeHash in targetpropertiescreator as XShapeToNamedValuesMap.
This refactoring describes what the types are more clearly and
stops violating one define rule in the desired implementation.
In layer manager getting XShapeToShapeMap ready to be passed around
changing it to be a shared pointer.
And adding getter getXShapeToShapeMap to ShapeManager to enable
Animation::start() to access Shapes and XShapes of the current
slide.
Change-Id: Ida2554b6727861b9be13acc09e2356fdd1793b3e
diff --git a/slideshow/source/engine/slide/layermanager.cxx b/slideshow/source/engine/slide/layermanager.cxx
index 2ec37ee2c6ff..6d21682aee68 100644
--- a/slideshow/source/engine/slide/layermanager.cxx
+++ b/slideshow/source/engine/slide/layermanager.cxx
@@ -67,7 +67,7 @@ namespace slideshow::internal
bool bDisableAnimationZOrder ) :
mrViews(rViews),
maLayers(),
- maXShapeHash( 101 ),
+ mpXShapeHash( std::make_shared<XShapeToShapeMap>(101) ),
maAllShapes(),
maUpdateShapes(),
mnActiveSprites(0),
@@ -210,7 +210,7 @@ namespace slideshow::internal
ENSURE_OR_THROW( rShape, "LayerManager::addShape(): invalid Shape" );
// add shape to XShape hash map
- if( !maXShapeHash.emplace(rShape->getXShape(),
+ if( !mpXShapeHash->emplace(rShape->getXShape(),
rShape).second )
{
// entry already present, nothing to do
@@ -252,7 +252,7 @@ namespace slideshow::internal
bool LayerManager::removeShape( const ShapeSharedPtr& rShape )
{
// remove shape from XShape hash map
- if( maXShapeHash.erase( rShape->getXShape() ) == 0 )
+ if( mpXShapeHash->erase( rShape->getXShape() ) == 0 )
return false; // shape not in map
OSL_ASSERT( maAllShapes.find(rShape) != maAllShapes.end() );
@@ -302,8 +302,8 @@ namespace slideshow::internal
{
ENSURE_OR_THROW( xShape.is(), "LayerManager::lookupShape(): invalid Shape" );
- const XShapeHash::const_iterator aIter( maXShapeHash.find( xShape ));
- if( aIter == maXShapeHash.end() )
+ const XShapeToShapeMap::const_iterator aIter( mpXShapeHash->find( xShape ));
+ if( aIter == mpXShapeHash->end() )
return ShapeSharedPtr(); // not found
// found, return data part of entry pair.
@@ -341,6 +341,11 @@ namespace slideshow::internal
return pSubset;
}
+ std::shared_ptr<XShapeToShapeMap const> LayerManager::getXShapeToShapeMapPtr() const
+ {
+ return mpXShapeHash;
+ }
+
void LayerManager::revokeSubset( const AttributableShapeSharedPtr& rOrigShape,
const AttributableShapeSharedPtr& rSubsetShape )
{
diff --git a/slideshow/source/engine/slide/layermanager.hxx b/slideshow/source/engine/slide/layermanager.hxx
index 0f2844ced967..aa70520089bb 100644
--- a/slideshow/source/engine/slide/layermanager.hxx
+++ b/slideshow/source/engine/slide/layermanager.hxx
@@ -38,6 +38,17 @@ namespace slideshow
{
namespace internal
{
+ /** A hash map which maps the XShape to the corresponding Shape object.
+
+ Provides quicker lookup than ShapeSet for simple mappings
+ */
+ typedef std::unordered_map<
+ css::uno::Reference< css::drawing::XShape >,
+ ShapeSharedPtr,
+ hash< css::uno::Reference< css::drawing::XShape > >
+ > XShapeToShapeMap;
+
+ typedef std::shared_ptr<XShapeToShapeMap> XShapeToShapeMapSharedPtr;
/* Definition of Layermanager class */
/** This class manages all of a slide's layers (and shapes)
@@ -132,6 +143,13 @@ namespace slideshow
AttributableShapeSharedPtr getSubsetShape( const AttributableShapeSharedPtr& rOrigShape,
const DocTreeNode& rTreeNode );
+ /** Get a map that maps all Shapes with their XShape reference as the key
+ *
+ * @return an unordered map shared pointer that contains all shapes in the
+ * current page with their XShape reference as the key
+ */
+ std::shared_ptr<XShapeToShapeMap const> getXShapeToShapeMapPtr() const;
+
/** Revoke a previously queried subset shape.
With this method, a previously requested subset shape
@@ -219,15 +237,7 @@ namespace slideshow
bool renderTo( const ::cppcanvas::CanvasSharedPtr& rTargetCanvas ) const;
private:
- /** A hash map which maps the XShape to the corresponding Shape object.
- Provides quicker lookup than ShapeSet for simple mappings
- */
- typedef std::unordered_map<
- css::uno::Reference< css::drawing::XShape >,
- ShapeSharedPtr,
- hash< css::uno::Reference< css::drawing::XShape > >
- > XShapeHash;
class ShapeComparator
{
@@ -311,7 +321,7 @@ namespace slideshow
/** Contains all shapes with their XShape reference as the key
*/
- XShapeHash maXShapeHash;
+ XShapeToShapeMapSharedPtr mpXShapeHash;
/** Set of shapes this LayerManager own
diff --git a/slideshow/source/engine/slide/shapemanagerimpl.cxx b/slideshow/source/engine/slide/shapemanagerimpl.cxx
index 7863f7e7412b..7553297ec439 100644
--- a/slideshow/source/engine/slide/shapemanagerimpl.cxx
+++ b/slideshow/source/engine/slide/shapemanagerimpl.cxx
@@ -267,6 +267,14 @@ ShapeSharedPtr ShapeManagerImpl::lookupShape( uno::Reference< drawing::XShape >
return ShapeSharedPtr();
}
+std::shared_ptr<XShapeToShapeMap const> ShapeManagerImpl::getXShapeToShapeMapPtr() const
+{
+ if( mpLayerManager )
+ return mpLayerManager->getXShapeToShapeMapPtr();
+
+ return XShapeToShapeMapSharedPtr();
+}
+
void ShapeManagerImpl::addHyperlinkArea( const HyperlinkAreaSharedPtr& rArea )
{
maHyperlinkShapes.insert(rArea);
diff --git a/slideshow/source/engine/slide/shapemanagerimpl.hxx b/slideshow/source/engine/slide/shapemanagerimpl.hxx
index 9730975630b0..fdb37924ba2f 100644
--- a/slideshow/source/engine/slide/shapemanagerimpl.hxx
+++ b/slideshow/source/engine/slide/shapemanagerimpl.hxx
@@ -120,6 +120,7 @@ private:
virtual void notifyShapeUpdate( const ShapeSharedPtr& rShape ) override;
virtual ShapeSharedPtr lookupShape(
css::uno::Reference< css::drawing::XShape > const & xShape ) const override;
+ virtual std::shared_ptr<XShapeToShapeMap const> getXShapeToShapeMapPtr() const override;
virtual void addHyperlinkArea( const HyperlinkAreaSharedPtr& rArea ) override;
diff --git a/slideshow/source/engine/slide/targetpropertiescreator.cxx b/slideshow/source/engine/slide/targetpropertiescreator.cxx
index 7a70b8b63352..b159bc6c2778 100644
--- a/slideshow/source/engine/slide/targetpropertiescreator.cxx
+++ b/slideshow/source/engine/slide/targetpropertiescreator.cxx
@@ -85,14 +85,14 @@ namespace slideshow::internal
};
// A hash map which maps a XShape to the corresponding vector of initial properties
- typedef std::unordered_map< ShapeHashKey, VectorOfNamedValues, ShapeKeyHasher > XShapeHash;
+ typedef std::unordered_map< ShapeHashKey, VectorOfNamedValues, ShapeKeyHasher > XShapeToNamedValuesMap;
class NodeFunctor
{
public:
explicit NodeFunctor(
- XShapeHash& rShapeHash,
+ XShapeToNamedValuesMap& rShapeHash,
bool bInitial )
: mrShapeHash( rShapeHash ),
mxTargetShape(),
@@ -101,7 +101,7 @@ namespace slideshow::internal
{
}
- NodeFunctor( XShapeHash& rShapeHash,
+ NodeFunctor( XShapeToNamedValuesMap& rShapeHash,
const uno::Reference< drawing::XShape >& rTargetShape,
sal_Int16 nParagraphIndex,
bool bInitial) :
@@ -307,7 +307,7 @@ namespace slideshow::internal
}
private:
- XShapeHash& mrShapeHash;
+ XShapeToNamedValuesMap& mrShapeHash;
uno::Reference< drawing::XShape > mxTargetShape;
sal_Int16 mnParagraphIndex;
@@ -324,7 +324,7 @@ namespace slideshow::internal
{
// scan all nodes for visibility changes, and record first
// 'visibility=true' for each shape
- XShapeHash aShapeHash( 101 );
+ XShapeToNamedValuesMap aShapeHash( 101 );
NodeFunctor aFunctor(
aShapeHash,
diff --git a/slideshow/source/inc/shapemanager.hxx b/slideshow/source/inc/shapemanager.hxx
index ef2e40de6466..1a504f86dfd1 100644
--- a/slideshow/source/inc/shapemanager.hxx
+++ b/slideshow/source/inc/shapemanager.hxx
@@ -23,6 +23,8 @@
#include "disposable.hxx"
#include <com/sun/star/uno/Reference.hxx>
#include <memory>
+#include <unordered_map>
+#include "tools.hxx"
namespace com::sun::star::drawing { class XShape; }
@@ -35,9 +37,15 @@ namespace slideshow
class HyperlinkArea;
class AnimatableShape;
class Shape;
+ typedef std::unordered_map<
+ css::uno::Reference< css::drawing::XShape >,
+ ShapeSharedPtr,
+ hash< css::uno::Reference< css::drawing::XShape > >
+ > XShapeToShapeMap;
typedef ::std::shared_ptr< AnimatableShape > AnimatableShapeSharedPtr;
typedef ::std::shared_ptr< Shape > ShapeSharedPtr;
typedef std::shared_ptr< HyperlinkArea > HyperlinkAreaSharedPtr;
+ typedef std::shared_ptr<XShapeToShapeMap> XShapeToShapeMapSharedPtr;
/** ShapeManager interface
@@ -92,6 +100,13 @@ namespace slideshow
virtual ShapeSharedPtr lookupShape(
css::uno::Reference< css::drawing::XShape > const & xShape ) const = 0;
+ /** Get a map that maps all Shapes with their XShape reference as the key
+ *
+ * @return an unordered map shared pointer that contains all shapes in the
+ * current page with their XShape reference as the key
+ */
+ virtual std::shared_ptr<XShapeToShapeMap const> getXShapeToShapeMapPtr() const = 0;
+
/** Register given shape as a hyperlink target
@param rArea
commit 87ac1b844bc17262217739cea365b8aecc6f718b
Author: Sarper Akdemir <q.sarperakdemir at gmail.com>
AuthorDate: Fri Jun 5 20:23:21 2020 +0300
Commit: Sarper Akdemir <q.sarperakdemir at gmail.com>
CommitDate: Mon Jun 22 10:57:06 2020 +0300
box2d tools: initial work for physics based animation effects
Two new classes for managing box2d bodies(b2Body) and box2d worlds(b2World)
::box2d::utils::Box2DBody :
Since b2Body has a private constructor, it is forbidden to make a shared_ptr
out of it.
When there are multiple parallel physics based animation effects going on,
it will be useful to share b2Body pointers around.
This class will help with that and also has get methods that return LO types
instead of box2d ones.
::box2d::utils::Box2DWorld :
A class that manages b2World with convenient functions that will be needed
during animation effects.
Change-Id: Id02fefe937347029daddde043da2b8e8dba3acaf
diff --git a/slideshow/Library_slideshow.mk b/slideshow/Library_slideshow.mk
index 55c531a86f43..53324ea25dcc 100644
--- a/slideshow/Library_slideshow.mk
+++ b/slideshow/Library_slideshow.mk
@@ -24,6 +24,7 @@ $(eval $(call gb_Library_set_precompiled_header,slideshow,slideshow/inc/pch/prec
$(eval $(call gb_Library_use_externals,slideshow,\
boost_headers \
+ box2d \
))
ifeq ($(DISABLE_GUI),)
$(eval $(call gb_Library_use_externals,slideshow,\
@@ -84,6 +85,7 @@ $(eval $(call gb_Library_add_exception_objects,slideshow,\
slideshow/source/engine/animationnodes/propertyanimationnode \
slideshow/source/engine/animationnodes/sequentialtimecontainer \
slideshow/source/engine/attributemap \
+ slideshow/source/engine/box2dtools \
slideshow/source/engine/color \
slideshow/source/engine/delayevent \
slideshow/source/engine/effectrewinder \
diff --git a/slideshow/source/engine/box2dtools.cxx b/slideshow/source/engine/box2dtools.cxx
new file mode 100644
index 000000000000..6454cae09cdf
--- /dev/null
+++ b/slideshow/source/engine/box2dtools.cxx
@@ -0,0 +1,254 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <Box2D/Box2D.h>
+#include <box2dtools.hxx>
+#include <basegfx/numeric/ftools.hxx>
+#include <animatableshape.hxx>
+#include <shapeattributelayer.hxx>
+#include <sal/log.hxx>
+#include <shapemanager.hxx>
+
+namespace box2d::utils
+{
+double calculateScaleFactor(const ::basegfx::B2DVector& rSlideSize)
+{
+ double fWidth = rSlideSize.getX();
+ double fHeight = rSlideSize.getY();
+
+ if (fWidth > fHeight)
+ return BOX2D_SLIDE_SIZE_IN_METERS / fWidth;
+ else
+ return BOX2D_SLIDE_SIZE_IN_METERS / fHeight;
+}
+
+box2DWorld::box2DWorld(const ::basegfx::B2DVector& rSlideSize, const float fGravityX,
+ const float fGravityY)
+ : maBox2DWorld(b2Vec2(fGravityX, fGravityY))
+ , mfScaleFactor(calculateScaleFactor(rSlideSize))
+ , mbShapesInitialized(false)
+ , mbHasWorldStepper(false)
+ , mnDynamicShapeCount(0)
+ , maXShapeToBodyMapPtr()
+{
+ createStaticFrameAroundSlide(rSlideSize);
+}
+
+b2Body* box2DWorld::createStaticFrameAroundSlide(const ::basegfx::B2DVector& rSlideSize)
+{
+ float fWidth = static_cast<float>(rSlideSize.getX() * mfScaleFactor);
+
+ // temporary solution that assumes slide is in 16 / 9
+ // since rSlide appears to give a square
+ float fHeight = BOX2D_SLIDE_SIZE_IN_METERS * 9 / 16;
+
+ // static body for creating the frame made out of four walls
+ b2BodyDef aBodyDef;
+ aBodyDef.type = b2_staticBody;
+ aBodyDef.position.Set(0, 0);
+ b2Body* pStaticBody = maBox2DWorld.CreateBody(&aBodyDef);
+
+ b2PolygonShape aPolygonShape;
+
+ b2FixtureDef aFixtureDef;
+ aFixtureDef.shape = &aPolygonShape;
+
+ //add four walls to the static body
+ aPolygonShape.SetAsBox(fWidth / 2.0f, 1.0f / 10.0f, // ground wall
+ b2Vec2(fWidth / 2, -fHeight - 1.0f / 10.0f), 0);
+ pStaticBody->CreateFixture(&aFixtureDef);
+
+ aPolygonShape.SetAsBox(fWidth / 2.0f, 1.0f / 10.0f, // ceiling wall
+ b2Vec2(fWidth / 2, 1.0f / 10.0f), 0);
+ pStaticBody->CreateFixture(&aFixtureDef);
+
+ aPolygonShape.SetAsBox(1.0f / 10.0f, fHeight / 2, // left wall
+ b2Vec2(-1.0f / 10.0f, -fHeight / 2), 0);
+ pStaticBody->CreateFixture(&aFixtureDef);
+
+ aPolygonShape.SetAsBox(1.0f / 10.0f, fHeight / 2.0f, // right wall
+ b2Vec2(fWidth + 1.0f / 10.0f, -fHeight / 2), 0);
+ pStaticBody->CreateFixture(&aFixtureDef);
+
+ return pStaticBody;
+}
+
+void box2DWorld::initateAllShapesAsStaticBodies(
+ const slideshow::internal::ShapeManagerSharedPtr pShapeManager)
+{
+ mbShapesInitialized = true;
+ auto pXShapeHashMap = pShapeManager->getXShapeToShapeMapPtr();
+
+ // iterate over shapes in the current slide
+ for (auto aIt = pXShapeHashMap->begin(); aIt != pXShapeHashMap->end(); aIt++)
+ {
+ slideshow::internal::ShapeSharedPtr pShape = aIt->second;
+ if (pShape->isVisible() && pShape->isForeground())
+ {
+ Box2DBodySharedPtr pBox2DBody = createStaticBodyFromBoundingBox(pShape);
+ maXShapeToBodyMapPtr.insert(std::make_pair(pShape->getXShape(), pBox2DBody));
+ }
+ }
+}
+
+bool box2DWorld::hasWorldStepper() { return mbHasWorldStepper; }
+
+void box2DWorld::setHasWorldStepper(bool bHasWorldStepper) { mbHasWorldStepper = bHasWorldStepper; }
+
+void box2DWorld::step(const float fTimeStep, const int nVelocityIterations,
+ const int nPositionIterations)
+{
+ maBox2DWorld.Step(fTimeStep, nVelocityIterations, nPositionIterations);
+}
+
+bool box2DWorld::getShapesInitialized() { return mbShapesInitialized; }
+
+Box2DBodySharedPtr box2DWorld::makeShapeDynamic(const slideshow::internal::ShapeSharedPtr pShape)
+{
+ Box2DBodySharedPtr pBox2DBody = maXShapeToBodyMapPtr.find(pShape->getXShape())->second;
+ if (pBox2DBody->getType() != b2_dynamicBody)
+ {
+ pBox2DBody->setType(b2_dynamicBody);
+ mnDynamicShapeCount++;
+ }
+ return pBox2DBody;
+}
+
+Box2DBodySharedPtr box2DWorld::makeBodyDynamic(const Box2DBodySharedPtr pBox2DBody)
+{
+ if (pBox2DBody->getType() != b2_dynamicBody)
+ {
+ pBox2DBody->setType(b2_dynamicBody);
+ mnDynamicShapeCount++;
+ }
+ return pBox2DBody;
+}
+
+Box2DBodySharedPtr box2DWorld::makeShapeStatic(const slideshow::internal::ShapeSharedPtr pShape)
+{
+ Box2DBodySharedPtr pBox2DBody = maXShapeToBodyMapPtr.find(pShape->getXShape())->second;
+ if (pBox2DBody->getType() != b2_staticBody)
+ {
+ pBox2DBody->setType(b2_staticBody);
+ mnDynamicShapeCount--;
+ }
+ return pBox2DBody;
+}
+
+Box2DBodySharedPtr box2DWorld::makeBodyStatic(const Box2DBodySharedPtr pBox2DBody)
+{
+ if (pBox2DBody->getType() != b2_staticBody)
+ {
+ pBox2DBody->setType(b2_staticBody);
+ mnDynamicShapeCount--;
+ }
+ return pBox2DBody;
+}
+
+Box2DBodySharedPtr box2DWorld::createDynamicBodyFromBoundingBox(
+ const slideshow::internal::ShapeSharedPtr& rShape,
+ const slideshow::internal::ShapeAttributeLayerSharedPtr& rAttrLayer, const float fDensity,
+ const float fFriction)
+{
+ ::basegfx::B2DRectangle aShapeBounds = rShape->getBounds();
+ double fShapeWidth = aShapeBounds.getWidth() * mfScaleFactor;
+ double fShapeHeight = aShapeBounds.getHeight() * mfScaleFactor;
+
+ double fRotationAngle = ::basegfx::deg2rad(-rAttrLayer->getRotationAngle());
+
+ ::basegfx::B2DPoint aShapePosition = aShapeBounds.getCenter();
+ float fBodyPosX = aShapePosition.getX() * mfScaleFactor;
+ float fBodyPosY = aShapePosition.getY() * -mfScaleFactor;
+
+ b2BodyDef aBodyDef;
+ aBodyDef.type = b2_dynamicBody;
+ aBodyDef.position.Set(fBodyPosX, fBodyPosY);
+ aBodyDef.angle = static_cast<float>(fRotationAngle);
+
+ b2Body* pBody = maBox2DWorld.CreateBody(&aBodyDef);
+
+ b2PolygonShape aDynamicBox;
+ aDynamicBox.SetAsBox(static_cast<float>(fShapeWidth / 2), static_cast<float>(fShapeHeight / 2));
+
+ b2FixtureDef aFixtureDef;
+ aFixtureDef.shape = &aDynamicBox;
+ aFixtureDef.density = fDensity;
+ aFixtureDef.friction = fFriction;
+
+ pBody->CreateFixture(&aFixtureDef);
+ return std::make_shared<box2DBody>(pBody);
+}
+
+Box2DBodySharedPtr
+box2DWorld::createStaticBodyFromBoundingBox(const slideshow::internal::ShapeSharedPtr& rShape,
+ const float fDensity, const float fFriction)
+{
+ ::basegfx::B2DRectangle aShapeBounds = rShape->getBounds();
+ double fShapeWidth = aShapeBounds.getWidth() * mfScaleFactor;
+ double fShapeHeight = aShapeBounds.getHeight() * mfScaleFactor;
+
+ ::basegfx::B2DPoint aShapePosition = aShapeBounds.getCenter();
+ float fBodyPosX = aShapePosition.getX() * mfScaleFactor;
+ float fBodyPosY = aShapePosition.getY() * -mfScaleFactor;
+
+ b2BodyDef aBodyDef;
+ aBodyDef.type = b2_staticBody;
+ aBodyDef.position.Set(fBodyPosX, fBodyPosY);
+
+ b2Body* pBody = maBox2DWorld.CreateBody(&aBodyDef);
+
+ b2PolygonShape aDynamicBox;
+ aDynamicBox.SetAsBox(static_cast<float>(fShapeWidth / 2), static_cast<float>(fShapeHeight / 2));
+
+ b2FixtureDef aFixtureDef;
+ aFixtureDef.shape = &aDynamicBox;
+ aFixtureDef.density = fDensity;
+ aFixtureDef.friction = fFriction;
+
+ pBody->CreateFixture(&aFixtureDef);
+ return std::make_shared<box2DBody>(pBody);
+}
+
+box2DBody::box2DBody(b2Body* pBox2DBody /*, Box2DWorldSharedPtr pBox2DWorldSharedPtr*/)
+ : mpBox2DBody(pBox2DBody)
+ /* , mpBox2DWorldSharedPtr(pBox2DWorldSharedPtr)*/ {};
+
+box2DBody::~box2DBody() { mpBox2DBody->GetWorld()->DestroyBody(mpBox2DBody); }
+
+::basegfx::B2DPoint box2DBody::getPosition(const ::basegfx::B2DVector& rSlideSize)
+{
+ double fScaleFactor = calculateScaleFactor(rSlideSize);
+ b2Vec2 aPosition = mpBox2DBody->GetPosition();
+ double fX = static_cast<double>(aPosition.x) / fScaleFactor;
+ double fY = static_cast<double>(aPosition.y) / -fScaleFactor;
+ return ::basegfx::B2DPoint(fX, fY);
+}
+
+double box2DBody::getAngle()
+{
+ double fAngle = static_cast<double>(mpBox2DBody->GetAngle());
+ return ::basegfx::rad2deg(-fAngle);
+}
+
+void box2DBody::setType(b2BodyType aType) { mpBox2DBody->SetType(aType); }
+
+b2BodyType box2DBody::getType() { return mpBox2DBody->GetType(); }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/slideshow/source/inc/box2dtools.hxx b/slideshow/source/inc/box2dtools.hxx
new file mode 100644
index 000000000000..7035b2f75d50
--- /dev/null
+++ b/slideshow/source/inc/box2dtools.hxx
@@ -0,0 +1,109 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#pragma once
+
+#include <Box2D/Dynamics/b2Body.h>
+#include <Box2D/Dynamics/b2World.h>
+#include "animatableshape.hxx"
+#include "shapeattributelayer.hxx"
+#include <unordered_map>
+
+#define BOX2D_SLIDE_SIZE_IN_METERS 100.00f
+
+namespace slideshow::internal
+{
+class ShapeManager;
+typedef std::shared_ptr<ShapeManager> ShapeManagerSharedPtr;
+}
+
+namespace box2d::utils
+{
+class box2DBody;
+class box2DWorld;
+typedef std::shared_ptr<box2DWorld> Box2DWorldSharedPtr;
+typedef std::shared_ptr<box2DBody> Box2DBodySharedPtr;
+typedef std::unordered_map<css::uno::Reference<css::drawing::XShape>, Box2DBodySharedPtr>
+ XShapeToBox2DBodyPtrMap;
+typedef std::shared_ptr<XShapeToBox2DBodyPtrMap> XShapeToBox2DBodyPtrMapSharedPtr;
+
+double calculateScaleFactor(const ::basegfx::B2DVector& rSlideSize);
+
+class box2DWorld
+{
+private:
+ b2World maBox2DWorld;
+ double mfScaleFactor;
+ bool mbShapesInitialized;
+ bool mbHasWorldStepper;
+ int mnDynamicShapeCount;
+ XShapeToBox2DBodyPtrMap maXShapeToBodyMapPtr;
+
+ b2Body* createStaticFrameAroundSlide(const ::basegfx::B2DVector& rSlideSize);
+
+public:
+ box2DWorld(const ::basegfx::B2DVector& rSlideSize, const float fGravityX = 0.0f,
+ const float fGravityY = -30.0f);
+
+ void step(const float fTimeStep = 1.0f / 60.0f, const int nVelocityIterations = 6,
+ const int nPositionIterations = 2);
+
+ bool getShapesInitialized();
+
+ Box2DBodySharedPtr makeShapeDynamic(const slideshow::internal::ShapeSharedPtr pShape);
+ Box2DBodySharedPtr makeBodyDynamic(const Box2DBodySharedPtr pBox2DBody);
+ Box2DBodySharedPtr makeShapeStatic(const slideshow::internal::ShapeSharedPtr pShape);
+ Box2DBodySharedPtr makeBodyStatic(const Box2DBodySharedPtr pBox2DBody);
+
+ Box2DBodySharedPtr createDynamicBodyFromBoundingBox(
+ const slideshow::internal::ShapeSharedPtr& rShape,
+ const slideshow::internal::ShapeAttributeLayerSharedPtr& rAttrLayer,
+ const float fDensity = 1.0f, const float fFriction = 0.3f);
+
+ Box2DBodySharedPtr
+ createStaticBodyFromBoundingBox(const slideshow::internal::ShapeSharedPtr& rShape,
+ const float fDensity = 1.0f, const float fFriction = 0.3f);
+
+ void
+ initateAllShapesAsStaticBodies(const slideshow::internal::ShapeManagerSharedPtr pShapeManager);
+
+ bool hasWorldStepper();
+ void setHasWorldStepper(bool bHasWorldStepper);
+};
+
+class box2DBody
+{
+private:
+ b2Body* mpBox2DBody;
+ // Box2DWorldSharedPtr mpBox2DWorldSharedPtr;
+
+public:
+ box2DBody(b2Body* pBox2DBody /*, Box2DWorldSharedPtr pBox2DWorldSharedPtr*/);
+
+ ~box2DBody();
+
+ ::basegfx::B2DPoint getPosition(const ::basegfx::B2DVector& rSlideSize);
+ double getAngle();
+
+ void setType(b2BodyType aType);
+ b2BodyType getType();
+};
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list