LibreOffice Module svx (master) 1
e3dsceneupdater.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
22#include <svx/obj3d.hxx>
23#include <svx/scene3d.hxx>
25
26
28: mpScene(nullptr)
29{
30 // Secure old 3D transformation stack before modification
31 const E3dObject* pE3dObject = DynCastE3dObject(pObject);
32 if(!pE3dObject)
33 return;
34
36
38 return;
39
40 // if there is a scene and it's the outmost scene, get current 3D range
42 const basegfx::B3DRange aAllContentRange(rVCScene.getAllContentRange3D());
43
44 if(aAllContentRange.isEmpty())
45 {
46 // no content, nothing to do
47 mpScene = nullptr;
48 }
49 else
50 {
51 // secure current 3D transformation stack
52 mpViewInformation3D = rVCScene.getViewInformation3D(aAllContentRange);
53 }
54}
55
57{
59 return;
60
61 // after changing parts of the scene, use the secured last 3d transformation stack and the new content
62 // range to calculate a new, eventually expanded or shrunk, 2D geometry for the scene and apply it.
63 // Get new content range
65 basegfx::B3DRange aAllContentRange(rVCScene.getAllContentRange3D());
66
67 // only change when there is still content; else let scene stay at old SnapRect
68 if(aAllContentRange.isEmpty())
69 return;
70
71 // check if object transform of scene has changed
72 if(mpViewInformation3D->getObjectTransformation() != mpScene->GetTransform())
73 {
74 // If Yes, it needs to be updated since it's - for historical reasons -
75 // part of the basic 3d transformation stack of the scene
77 mpScene->GetTransform(), // replace object transformation with new local transform
78 mpViewInformation3D->getOrientation(),
79 mpViewInformation3D->getProjection(),
80 mpViewInformation3D->getDeviceToView(),
81 mpViewInformation3D->getViewTime(),
82 mpViewInformation3D->getExtendedInformationSequence());
83 }
84
85 // transform content range to scene-relative coordinates using old 3d transformation stack
86 aAllContentRange.transform(mpViewInformation3D->getObjectToView());
87
88 // build 2d relative content range
89 basegfx::B2DRange aSnapRange(
90 aAllContentRange.getMinX(), aAllContentRange.getMinY(),
91 aAllContentRange.getMaxX(), aAllContentRange.getMaxY());
92
93 // transform to 2D world coordinates using scene's 2D transformation
94 aSnapRange.transform(rVCScene.getObjectTransformation());
95
96 // snap to (old) integer
97 const tools::Rectangle aNewSnapRect(
98 sal_Int32(floor(aSnapRange.getMinX())), sal_Int32(floor(aSnapRange.getMinY())),
99 sal_Int32(ceil(aSnapRange.getMaxX())), sal_Int32(ceil(aSnapRange.getMaxY())));
100
101 // set as new SnapRect and invalidate bound volume
102 if(mpScene->GetSnapRect() != aNewSnapRect)
103 {
104 mpScene->SetSnapRect(aNewSnapRect);
106 }
107}
108
109/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
E3DModifySceneSnapRectUpdater(const SdrObject *mpObject)
std::optional< drawinglayer::geometry::ViewInformation3D > mpViewInformation3D
void InvalidateBoundVolume()
Definition: obj3d.cxx:320
const basegfx::B3DHomMatrix & GetTransform() const
Definition: obj3d.hxx:112
virtual E3dScene * getRootE3dSceneFromE3dObject() const
Definition: obj3d.cxx:271
virtual E3dScene * getRootE3dSceneFromE3dObject() const override
Definition: scene3d.cxx:387
virtual const tools::Rectangle & GetSnapRect() const override
Definition: svdoattr.cxx:49
Abstract DrawObject.
Definition: svdobj.hxx:261
sdr::contact::ViewContact & GetViewContact() const
Definition: svdobj.cxx:261
virtual void SetSnapRect(const tools::Rectangle &rRect)
Definition: svdobj.cxx:1690
BASEGFX_DLLPUBLIC void transform(const B2DHomMatrix &rMatrix)
BASEGFX_DLLPUBLIC void transform(const B3DHomMatrix &rMatrix)
double getMinX() const
bool isEmpty() const
double getMinY() const
double getMaxX() const
double getMaxY() const
TYPE getMaxX() const
TYPE getMinX() const
TYPE getMinY() const
TYPE getMaxY() const
const drawinglayer::geometry::ViewInformation3D & getViewInformation3D(const ::basegfx::B3DRange &rContentRange) const
basegfx::B3DRange getAllContentRange3D() const
const basegfx::B2DHomMatrix & getObjectTransformation() const
EmbeddedObjectRef * pObject
E3dObject * DynCastE3dObject(SdrObject *pObj)
Definition: svdobj.cxx:3210