1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_svx.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include "svx/svdstr.hrc" 32*cdf0e10cSrcweir #include "svx/svdglob.hxx" 33*cdf0e10cSrcweir #include <svx/svdview.hxx> 34*cdf0e10cSrcweir #include <svx/svdattr.hxx> 35*cdf0e10cSrcweir #include <svx/svdpage.hxx> 36*cdf0e10cSrcweir #include <svx/svdmodel.hxx> 37*cdf0e10cSrcweir #include "svx/svditer.hxx" 38*cdf0e10cSrcweir #include "svx/globl3d.hxx" 39*cdf0e10cSrcweir #include <svx/camera3d.hxx> 40*cdf0e10cSrcweir #include <svx/scene3d.hxx> 41*cdf0e10cSrcweir #include <svx/polysc3d.hxx> 42*cdf0e10cSrcweir #include <svx/cube3d.hxx> 43*cdf0e10cSrcweir #include <svx/lathe3d.hxx> 44*cdf0e10cSrcweir #include <svx/sphere3d.hxx> 45*cdf0e10cSrcweir #include <svx/extrud3d.hxx> 46*cdf0e10cSrcweir #include <svx/obj3d.hxx> 47*cdf0e10cSrcweir #include <svx/xtable.hxx> 48*cdf0e10cSrcweir #include <svx/xflclit.hxx> 49*cdf0e10cSrcweir #include <vcl/svapp.hxx> 50*cdf0e10cSrcweir #include <vcl/settings.hxx> 51*cdf0e10cSrcweir #include <svx/xlnclit.hxx> 52*cdf0e10cSrcweir #include <svl/metitem.hxx> 53*cdf0e10cSrcweir #include <svx/xtable.hxx> 54*cdf0e10cSrcweir #include <svx/xfillit.hxx> 55*cdf0e10cSrcweir #include <svx/xlnwtit.hxx> 56*cdf0e10cSrcweir #include <vcl/virdev.hxx> 57*cdf0e10cSrcweir #include <tools/poly.hxx> 58*cdf0e10cSrcweir #include <tools/b3dtrans.hxx> 59*cdf0e10cSrcweir #include <svx/svxids.hrc> 60*cdf0e10cSrcweir #include <editeng/colritem.hxx> 61*cdf0e10cSrcweir #include <svx/e3ditem.hxx> 62*cdf0e10cSrcweir #include <svx/xlntrit.hxx> 63*cdf0e10cSrcweir #include <svx/xfltrit.hxx> 64*cdf0e10cSrcweir #include <svx/svdpagv.hxx> 65*cdf0e10cSrcweir #include <vcl/gradient.hxx> 66*cdf0e10cSrcweir #include <vcl/metaact.hxx> 67*cdf0e10cSrcweir #include <svx/svx3ditems.hxx> 68*cdf0e10cSrcweir #include <svl/whiter.hxx> 69*cdf0e10cSrcweir #include <svtools/colorcfg.hxx> 70*cdf0e10cSrcweir #include <editeng/eeitem.hxx> 71*cdf0e10cSrcweir #include <svx/xgrscit.hxx> 72*cdf0e10cSrcweir #include "svdoimp.hxx" 73*cdf0e10cSrcweir #include <svx/sdr/properties/e3dproperties.hxx> 74*cdf0e10cSrcweir #include <svx/sdr/properties/e3dcompoundproperties.hxx> 75*cdf0e10cSrcweir #include <basegfx/polygon/b3dpolypolygontools.hxx> 76*cdf0e10cSrcweir #include <basegfx/point/b3dpoint.hxx> 77*cdf0e10cSrcweir #include <basegfx/vector/b3dvector.hxx> 78*cdf0e10cSrcweir #include <svx/xlndsit.hxx> 79*cdf0e10cSrcweir #include <basegfx/matrix/b3dhommatrix.hxx> 80*cdf0e10cSrcweir #include <basegfx/polygon/b3dpolygon.hxx> 81*cdf0e10cSrcweir #include <basegfx/matrix/b2dhommatrix.hxx> 82*cdf0e10cSrcweir #include <basegfx/polygon/b2dpolypolygontools.hxx> 83*cdf0e10cSrcweir #include <basegfx/polygon/b3dpolygontools.hxx> 84*cdf0e10cSrcweir #include <svx/helperhittest3d.hxx> 85*cdf0e10cSrcweir #include <svx/sdr/contact/viewcontactofe3d.hxx> 86*cdf0e10cSrcweir #include <drawinglayer/geometry/viewinformation3d.hxx> 87*cdf0e10cSrcweir #include <com/sun/star/uno/Sequence.h> 88*cdf0e10cSrcweir #include <svx/sdr/contact/viewcontactofe3dscene.hxx> 89*cdf0e10cSrcweir #include <basegfx/polygon/b3dpolypolygontools.hxx> 90*cdf0e10cSrcweir #include <svx/e3dsceneupdater.hxx> 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir #define ITEMVALUE(ItemSet,Id,Cast) ((const Cast&)(ItemSet).Get(Id)).GetValue() 93*cdf0e10cSrcweir 94*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir using namespace com::sun::star; 97*cdf0e10cSrcweir 98*cdf0e10cSrcweir /************************************************************************* 99*cdf0e10cSrcweir |* 100*cdf0e10cSrcweir |* Liste fuer 3D-Objekte 101*cdf0e10cSrcweir |* 102*cdf0e10cSrcweir \************************************************************************/ 103*cdf0e10cSrcweir 104*cdf0e10cSrcweir TYPEINIT1(E3dObjList, SdrObjList); 105*cdf0e10cSrcweir 106*cdf0e10cSrcweir E3dObjList::E3dObjList(SdrModel* pNewModel, SdrPage* pNewPage, E3dObjList* pNewUpList) 107*cdf0e10cSrcweir : SdrObjList(pNewModel, pNewPage, pNewUpList) 108*cdf0e10cSrcweir { 109*cdf0e10cSrcweir } 110*cdf0e10cSrcweir 111*cdf0e10cSrcweir E3dObjList::E3dObjList(const E3dObjList& rSrcList) 112*cdf0e10cSrcweir : SdrObjList(rSrcList) 113*cdf0e10cSrcweir { 114*cdf0e10cSrcweir } 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir E3dObjList::~E3dObjList() 117*cdf0e10cSrcweir { 118*cdf0e10cSrcweir } 119*cdf0e10cSrcweir 120*cdf0e10cSrcweir void E3dObjList::NbcInsertObject(SdrObject* pObj, sal_uIntPtr nPos, const SdrInsertReason* pReason) 121*cdf0e10cSrcweir { 122*cdf0e10cSrcweir // Owner holen 123*cdf0e10cSrcweir DBG_ASSERT(GetOwnerObj()->ISA(E3dObject), "AW: Einfuegen 3DObject in Parent != 3DObject"); 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir // Ist es ueberhaupt ein 3D-Objekt? 126*cdf0e10cSrcweir if(pObj && pObj->ISA(E3dObject)) 127*cdf0e10cSrcweir { 128*cdf0e10cSrcweir // Normales 3D Objekt, einfuegen mittels 129*cdf0e10cSrcweir // call parent 130*cdf0e10cSrcweir SdrObjList::NbcInsertObject(pObj, nPos, pReason); 131*cdf0e10cSrcweir } 132*cdf0e10cSrcweir else 133*cdf0e10cSrcweir { 134*cdf0e10cSrcweir // Kein 3D Objekt, fuege in Seite statt in Szene ein... 135*cdf0e10cSrcweir GetOwnerObj()->GetPage()->InsertObject(pObj, nPos); 136*cdf0e10cSrcweir } 137*cdf0e10cSrcweir } 138*cdf0e10cSrcweir 139*cdf0e10cSrcweir void E3dObjList::InsertObject(SdrObject* pObj, sal_uIntPtr nPos, const SdrInsertReason* pReason) 140*cdf0e10cSrcweir { 141*cdf0e10cSrcweir OSL_ENSURE(GetOwnerObj()->ISA(E3dObject), "Insert 3DObject in non-3D Parent"); 142*cdf0e10cSrcweir //E3DModifySceneSnapRectUpdater aUpdater(GetOwnerObj()); 143*cdf0e10cSrcweir 144*cdf0e10cSrcweir // call parent 145*cdf0e10cSrcweir SdrObjList::InsertObject(pObj, nPos, pReason); 146*cdf0e10cSrcweir 147*cdf0e10cSrcweir E3dScene* pScene = ((E3dObject*)GetOwnerObj())->GetScene(); 148*cdf0e10cSrcweir if(pScene) 149*cdf0e10cSrcweir { 150*cdf0e10cSrcweir pScene->Cleanup3DDepthMapper(); 151*cdf0e10cSrcweir } 152*cdf0e10cSrcweir } 153*cdf0e10cSrcweir 154*cdf0e10cSrcweir SdrObject* E3dObjList::NbcRemoveObject(sal_uIntPtr nObjNum) 155*cdf0e10cSrcweir { 156*cdf0e10cSrcweir DBG_ASSERT(GetOwnerObj()->ISA(E3dObject), "AW: Entfernen 3DObject aus Parent != 3DObject"); 157*cdf0e10cSrcweir //E3DModifySceneSnapRectUpdater aUpdater(GetOwnerObj()); 158*cdf0e10cSrcweir 159*cdf0e10cSrcweir // call parent 160*cdf0e10cSrcweir SdrObject* pRetval = SdrObjList::NbcRemoveObject(nObjNum); 161*cdf0e10cSrcweir 162*cdf0e10cSrcweir E3dScene* pScene = ((E3dObject*)GetOwnerObj())->GetScene(); 163*cdf0e10cSrcweir if(pScene) 164*cdf0e10cSrcweir { 165*cdf0e10cSrcweir pScene->Cleanup3DDepthMapper(); 166*cdf0e10cSrcweir } 167*cdf0e10cSrcweir 168*cdf0e10cSrcweir return pRetval; 169*cdf0e10cSrcweir } 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir SdrObject* E3dObjList::RemoveObject(sal_uIntPtr nObjNum) 172*cdf0e10cSrcweir { 173*cdf0e10cSrcweir OSL_ENSURE(GetOwnerObj()->ISA(E3dObject), "3DObject is removed from non-3D Parent"); 174*cdf0e10cSrcweir //E3DModifySceneSnapRectUpdater aUpdater(GetOwnerObj()); 175*cdf0e10cSrcweir 176*cdf0e10cSrcweir // call parent 177*cdf0e10cSrcweir SdrObject* pRetval = SdrObjList::RemoveObject(nObjNum); 178*cdf0e10cSrcweir 179*cdf0e10cSrcweir E3dScene* pScene = ((E3dObject*)GetOwnerObj())->GetScene(); 180*cdf0e10cSrcweir if(pScene) 181*cdf0e10cSrcweir { 182*cdf0e10cSrcweir pScene->Cleanup3DDepthMapper(); 183*cdf0e10cSrcweir } 184*cdf0e10cSrcweir 185*cdf0e10cSrcweir return pRetval; 186*cdf0e10cSrcweir } 187*cdf0e10cSrcweir 188*cdf0e10cSrcweir /************************************************************************* 189*cdf0e10cSrcweir |* 190*cdf0e10cSrcweir |* Konstruktor 191*cdf0e10cSrcweir |* 192*cdf0e10cSrcweir \************************************************************************/ 193*cdf0e10cSrcweir 194*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 195*cdf0e10cSrcweir 196*cdf0e10cSrcweir sdr::properties::BaseProperties* E3dObject::CreateObjectSpecificProperties() 197*cdf0e10cSrcweir { 198*cdf0e10cSrcweir return new sdr::properties::E3dProperties(*this); 199*cdf0e10cSrcweir } 200*cdf0e10cSrcweir 201*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 202*cdf0e10cSrcweir 203*cdf0e10cSrcweir TYPEINIT1(E3dObject, SdrAttrObj); 204*cdf0e10cSrcweir 205*cdf0e10cSrcweir E3dObject::E3dObject() 206*cdf0e10cSrcweir : maSubList(), 207*cdf0e10cSrcweir maLocalBoundVol(), 208*cdf0e10cSrcweir maTransformation(), 209*cdf0e10cSrcweir maFullTransform(), 210*cdf0e10cSrcweir mbTfHasChanged(true), 211*cdf0e10cSrcweir mbIsSelected(false) 212*cdf0e10cSrcweir { 213*cdf0e10cSrcweir bIs3DObj = true; 214*cdf0e10cSrcweir maSubList.SetOwnerObj(this); 215*cdf0e10cSrcweir maSubList.SetListKind(SDROBJLIST_GROUPOBJ); 216*cdf0e10cSrcweir bClosedObj = true; 217*cdf0e10cSrcweir } 218*cdf0e10cSrcweir 219*cdf0e10cSrcweir /************************************************************************* 220*cdf0e10cSrcweir |* 221*cdf0e10cSrcweir |* Destruktor 222*cdf0e10cSrcweir |* 223*cdf0e10cSrcweir \************************************************************************/ 224*cdf0e10cSrcweir 225*cdf0e10cSrcweir E3dObject::~E3dObject() 226*cdf0e10cSrcweir { 227*cdf0e10cSrcweir } 228*cdf0e10cSrcweir 229*cdf0e10cSrcweir /************************************************************************* 230*cdf0e10cSrcweir |* 231*cdf0e10cSrcweir |* Selektions-Flag setzen 232*cdf0e10cSrcweir |* 233*cdf0e10cSrcweir \************************************************************************/ 234*cdf0e10cSrcweir 235*cdf0e10cSrcweir void E3dObject::SetSelected(bool bNew) 236*cdf0e10cSrcweir { 237*cdf0e10cSrcweir if((bool)mbIsSelected != bNew) 238*cdf0e10cSrcweir { 239*cdf0e10cSrcweir mbIsSelected = bNew; 240*cdf0e10cSrcweir } 241*cdf0e10cSrcweir 242*cdf0e10cSrcweir for(sal_uInt32 a(0); a < maSubList.GetObjCount(); a++) 243*cdf0e10cSrcweir { 244*cdf0e10cSrcweir E3dObject* pCandidate = dynamic_cast< E3dObject* >(maSubList.GetObj(a)); 245*cdf0e10cSrcweir 246*cdf0e10cSrcweir if(pCandidate) 247*cdf0e10cSrcweir { 248*cdf0e10cSrcweir pCandidate->SetSelected(bNew); 249*cdf0e10cSrcweir } 250*cdf0e10cSrcweir } 251*cdf0e10cSrcweir } 252*cdf0e10cSrcweir 253*cdf0e10cSrcweir /************************************************************************* 254*cdf0e10cSrcweir |* 255*cdf0e10cSrcweir |* Aufbrechen, default-Implementierungen 256*cdf0e10cSrcweir |* 257*cdf0e10cSrcweir \************************************************************************/ 258*cdf0e10cSrcweir 259*cdf0e10cSrcweir sal_Bool E3dObject::IsBreakObjPossible() 260*cdf0e10cSrcweir { 261*cdf0e10cSrcweir return sal_False; 262*cdf0e10cSrcweir } 263*cdf0e10cSrcweir 264*cdf0e10cSrcweir SdrAttrObj* E3dObject::GetBreakObj() 265*cdf0e10cSrcweir { 266*cdf0e10cSrcweir return 0L; 267*cdf0e10cSrcweir } 268*cdf0e10cSrcweir 269*cdf0e10cSrcweir /************************************************************************* 270*cdf0e10cSrcweir |* 271*cdf0e10cSrcweir |* SetRectsDirty muss ueber die lokale SdrSubList gehen 272*cdf0e10cSrcweir |* 273*cdf0e10cSrcweir \************************************************************************/ 274*cdf0e10cSrcweir 275*cdf0e10cSrcweir void E3dObject::SetRectsDirty(sal_Bool bNotMyself) 276*cdf0e10cSrcweir { 277*cdf0e10cSrcweir // call parent 278*cdf0e10cSrcweir SdrAttrObj::SetRectsDirty(bNotMyself); 279*cdf0e10cSrcweir 280*cdf0e10cSrcweir for(sal_uInt32 a(0); a < maSubList.GetObjCount(); a++) 281*cdf0e10cSrcweir { 282*cdf0e10cSrcweir E3dObject* pCandidate = dynamic_cast< E3dObject* >(maSubList.GetObj(a)); 283*cdf0e10cSrcweir 284*cdf0e10cSrcweir if(pCandidate) 285*cdf0e10cSrcweir { 286*cdf0e10cSrcweir pCandidate->SetRectsDirty(bNotMyself); 287*cdf0e10cSrcweir } 288*cdf0e10cSrcweir } 289*cdf0e10cSrcweir } 290*cdf0e10cSrcweir 291*cdf0e10cSrcweir /************************************************************************* 292*cdf0e10cSrcweir |* 293*cdf0e10cSrcweir |* Inventor zurueckgeben 294*cdf0e10cSrcweir |* 295*cdf0e10cSrcweir \************************************************************************/ 296*cdf0e10cSrcweir 297*cdf0e10cSrcweir sal_uInt32 E3dObject::GetObjInventor() const 298*cdf0e10cSrcweir { 299*cdf0e10cSrcweir return E3dInventor; 300*cdf0e10cSrcweir } 301*cdf0e10cSrcweir 302*cdf0e10cSrcweir /************************************************************************* 303*cdf0e10cSrcweir |* 304*cdf0e10cSrcweir |* Identifier zurueckgeben 305*cdf0e10cSrcweir |* 306*cdf0e10cSrcweir \************************************************************************/ 307*cdf0e10cSrcweir 308*cdf0e10cSrcweir sal_uInt16 E3dObject::GetObjIdentifier() const 309*cdf0e10cSrcweir { 310*cdf0e10cSrcweir return E3D_OBJECT_ID; 311*cdf0e10cSrcweir } 312*cdf0e10cSrcweir 313*cdf0e10cSrcweir /************************************************************************* 314*cdf0e10cSrcweir |* 315*cdf0e10cSrcweir |* Faehigkeiten des Objektes feststellen 316*cdf0e10cSrcweir |* 317*cdf0e10cSrcweir \************************************************************************/ 318*cdf0e10cSrcweir 319*cdf0e10cSrcweir void E3dObject::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const 320*cdf0e10cSrcweir { 321*cdf0e10cSrcweir rInfo.bResizeFreeAllowed = sal_True; 322*cdf0e10cSrcweir rInfo.bResizePropAllowed = sal_True; 323*cdf0e10cSrcweir rInfo.bRotateFreeAllowed = sal_True; 324*cdf0e10cSrcweir rInfo.bRotate90Allowed = sal_True; 325*cdf0e10cSrcweir rInfo.bMirrorFreeAllowed = sal_False; 326*cdf0e10cSrcweir rInfo.bMirror45Allowed = sal_False; 327*cdf0e10cSrcweir rInfo.bMirror90Allowed = sal_False; 328*cdf0e10cSrcweir rInfo.bShearAllowed = sal_False; 329*cdf0e10cSrcweir rInfo.bEdgeRadiusAllowed = sal_False; 330*cdf0e10cSrcweir rInfo.bCanConvToPath = sal_False; 331*cdf0e10cSrcweir 332*cdf0e10cSrcweir // no transparence for 3d objects 333*cdf0e10cSrcweir rInfo.bTransparenceAllowed = sal_False; 334*cdf0e10cSrcweir 335*cdf0e10cSrcweir // gradient depends on fillstyle 336*cdf0e10cSrcweir // BM *** check if SetItem is NULL *** 337*cdf0e10cSrcweir XFillStyle eFillStyle = ((XFillStyleItem&)(GetMergedItem(XATTR_FILLSTYLE))).GetValue(); 338*cdf0e10cSrcweir rInfo.bGradientAllowed = (eFillStyle == XFILL_GRADIENT); 339*cdf0e10cSrcweir 340*cdf0e10cSrcweir // Umwandeln von 3D-Koerpern in Gruppe von Polygonen: 341*cdf0e10cSrcweir // 342*cdf0e10cSrcweir // Erst mal nicht moeglich, da die Erzeugung einer Gruppe von 343*cdf0e10cSrcweir // 2D-Polygonen notwendig waere, die tiefensortiert werden muessten, 344*cdf0e10cSrcweir // also bei Durchdringugnen auch gegeneinander geschnitten werden 345*cdf0e10cSrcweir // muessten. Auch die Texturkoorinaten waeren ein ungeloestes 346*cdf0e10cSrcweir // Problem. 347*cdf0e10cSrcweir rInfo.bCanConvToPoly = sal_False; 348*cdf0e10cSrcweir rInfo.bCanConvToContour = sal_False; 349*cdf0e10cSrcweir rInfo.bCanConvToPathLineToArea = sal_False; 350*cdf0e10cSrcweir rInfo.bCanConvToPolyLineToArea = sal_False; 351*cdf0e10cSrcweir } 352*cdf0e10cSrcweir 353*cdf0e10cSrcweir /************************************************************************* 354*cdf0e10cSrcweir |* 355*cdf0e10cSrcweir |* Layer setzen 356*cdf0e10cSrcweir |* 357*cdf0e10cSrcweir \************************************************************************/ 358*cdf0e10cSrcweir 359*cdf0e10cSrcweir void E3dObject::NbcSetLayer(SdrLayerID nLayer) 360*cdf0e10cSrcweir { 361*cdf0e10cSrcweir SdrAttrObj::NbcSetLayer(nLayer); 362*cdf0e10cSrcweir 363*cdf0e10cSrcweir for(sal_uInt32 a(0); a < maSubList.GetObjCount(); a++) 364*cdf0e10cSrcweir { 365*cdf0e10cSrcweir E3dObject* pCandidate = dynamic_cast< E3dObject* >(maSubList.GetObj(a)); 366*cdf0e10cSrcweir 367*cdf0e10cSrcweir if(pCandidate) 368*cdf0e10cSrcweir { 369*cdf0e10cSrcweir pCandidate->NbcSetLayer(nLayer); 370*cdf0e10cSrcweir } 371*cdf0e10cSrcweir } 372*cdf0e10cSrcweir } 373*cdf0e10cSrcweir 374*cdf0e10cSrcweir /************************************************************************* 375*cdf0e10cSrcweir |* 376*cdf0e10cSrcweir |* ObjList auch an SubList setzen 377*cdf0e10cSrcweir |* 378*cdf0e10cSrcweir \************************************************************************/ 379*cdf0e10cSrcweir 380*cdf0e10cSrcweir void E3dObject::SetObjList(SdrObjList* pNewObjList) 381*cdf0e10cSrcweir { 382*cdf0e10cSrcweir SdrObject::SetObjList(pNewObjList); 383*cdf0e10cSrcweir maSubList.SetUpList(pNewObjList); 384*cdf0e10cSrcweir } 385*cdf0e10cSrcweir 386*cdf0e10cSrcweir /************************************************************************* 387*cdf0e10cSrcweir |* 388*cdf0e10cSrcweir |* Layer setzen 389*cdf0e10cSrcweir |* 390*cdf0e10cSrcweir \************************************************************************/ 391*cdf0e10cSrcweir 392*cdf0e10cSrcweir void E3dObject::SetPage(SdrPage* pNewPage) 393*cdf0e10cSrcweir { 394*cdf0e10cSrcweir SdrAttrObj::SetPage(pNewPage); 395*cdf0e10cSrcweir maSubList.SetPage(pNewPage); 396*cdf0e10cSrcweir } 397*cdf0e10cSrcweir 398*cdf0e10cSrcweir /************************************************************************* 399*cdf0e10cSrcweir |* 400*cdf0e10cSrcweir |* Layer setzen 401*cdf0e10cSrcweir |* 402*cdf0e10cSrcweir \************************************************************************/ 403*cdf0e10cSrcweir 404*cdf0e10cSrcweir void E3dObject::SetModel(SdrModel* pNewModel) 405*cdf0e10cSrcweir { 406*cdf0e10cSrcweir SdrAttrObj::SetModel(pNewModel); 407*cdf0e10cSrcweir maSubList.SetModel(pNewModel); 408*cdf0e10cSrcweir } 409*cdf0e10cSrcweir 410*cdf0e10cSrcweir /************************************************************************* 411*cdf0e10cSrcweir |* 412*cdf0e10cSrcweir |* resize object, used from old 2d interfaces, e.g. in Move/Scale dialog 413*cdf0e10cSrcweir |* (F4) 414*cdf0e10cSrcweir |* 415*cdf0e10cSrcweir \************************************************************************/ 416*cdf0e10cSrcweir void E3dObject::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) 417*cdf0e10cSrcweir { 418*cdf0e10cSrcweir // Bewegung in X,Y im Augkoordinatensystem 419*cdf0e10cSrcweir E3dScene* pScene = GetScene(); 420*cdf0e10cSrcweir 421*cdf0e10cSrcweir if(pScene) 422*cdf0e10cSrcweir { 423*cdf0e10cSrcweir // transform pos from 2D world to 3D eye 424*cdf0e10cSrcweir const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(pScene->GetViewContact()); 425*cdf0e10cSrcweir const drawinglayer::geometry::ViewInformation3D aViewInfo3D(rVCScene.getViewInformation3D()); 426*cdf0e10cSrcweir basegfx::B2DPoint aScaleCenter2D((double)rRef.X(), (double)rRef.Y()); 427*cdf0e10cSrcweir basegfx::B2DHomMatrix aInverseSceneTransform(rVCScene.getObjectTransformation()); 428*cdf0e10cSrcweir 429*cdf0e10cSrcweir aInverseSceneTransform.invert(); 430*cdf0e10cSrcweir aScaleCenter2D = aInverseSceneTransform * aScaleCenter2D; 431*cdf0e10cSrcweir 432*cdf0e10cSrcweir basegfx::B3DPoint aScaleCenter3D(aScaleCenter2D.getX(), aScaleCenter2D.getY(), 0.5); 433*cdf0e10cSrcweir basegfx::B3DHomMatrix aInverseViewToEye(aViewInfo3D.getDeviceToView() * aViewInfo3D.getProjection()); 434*cdf0e10cSrcweir 435*cdf0e10cSrcweir aInverseViewToEye.invert(); 436*cdf0e10cSrcweir aScaleCenter3D = aInverseViewToEye * aScaleCenter3D; 437*cdf0e10cSrcweir 438*cdf0e10cSrcweir // scale-faktoren holen 439*cdf0e10cSrcweir double fScaleX(xFact); 440*cdf0e10cSrcweir double fScaleY(yFact); 441*cdf0e10cSrcweir 442*cdf0e10cSrcweir // build transform 443*cdf0e10cSrcweir basegfx::B3DHomMatrix aInverseOrientation(aViewInfo3D.getOrientation()); 444*cdf0e10cSrcweir aInverseOrientation.invert(); 445*cdf0e10cSrcweir basegfx::B3DHomMatrix mFullTransform(GetFullTransform()); 446*cdf0e10cSrcweir basegfx::B3DHomMatrix mTrans(mFullTransform); 447*cdf0e10cSrcweir 448*cdf0e10cSrcweir mTrans *= aViewInfo3D.getOrientation(); 449*cdf0e10cSrcweir mTrans.translate(-aScaleCenter3D.getX(), -aScaleCenter3D.getY(), -aScaleCenter3D.getZ()); 450*cdf0e10cSrcweir mTrans.scale(fScaleX, fScaleY, 1.0); 451*cdf0e10cSrcweir mTrans.translate(aScaleCenter3D.getX(), aScaleCenter3D.getY(), aScaleCenter3D.getZ()); 452*cdf0e10cSrcweir mTrans *= aInverseOrientation; 453*cdf0e10cSrcweir mFullTransform.invert(); 454*cdf0e10cSrcweir mTrans *= mFullTransform; 455*cdf0e10cSrcweir 456*cdf0e10cSrcweir // anwenden 457*cdf0e10cSrcweir basegfx::B3DHomMatrix mObjTrans(GetTransform()); 458*cdf0e10cSrcweir mObjTrans *= mTrans; 459*cdf0e10cSrcweir 460*cdf0e10cSrcweir E3DModifySceneSnapRectUpdater aUpdater(this); 461*cdf0e10cSrcweir SetTransform(mObjTrans); 462*cdf0e10cSrcweir } 463*cdf0e10cSrcweir } 464*cdf0e10cSrcweir 465*cdf0e10cSrcweir /************************************************************************* 466*cdf0e10cSrcweir |* 467*cdf0e10cSrcweir |* Objekt verschieben in 2D, wird bei Cursortasten benoetigt 468*cdf0e10cSrcweir |* 469*cdf0e10cSrcweir \************************************************************************/ 470*cdf0e10cSrcweir void E3dObject::NbcMove(const Size& rSize) 471*cdf0e10cSrcweir { 472*cdf0e10cSrcweir // Bewegung in X,Y im Augkoordinatensystem 473*cdf0e10cSrcweir E3dScene* pScene = GetScene(); 474*cdf0e10cSrcweir 475*cdf0e10cSrcweir if(pScene) 476*cdf0e10cSrcweir { 477*cdf0e10cSrcweir // Abmessungen der Szene in 3D und 2D als Vergleich 478*cdf0e10cSrcweir Rectangle aRect = pScene->GetSnapRect(); 479*cdf0e10cSrcweir 480*cdf0e10cSrcweir // Transformation Weltkoordinaten bis eine VOR Objektkoordinaten holen 481*cdf0e10cSrcweir basegfx::B3DHomMatrix mInvDispTransform; 482*cdf0e10cSrcweir if(GetParentObj()) 483*cdf0e10cSrcweir { 484*cdf0e10cSrcweir mInvDispTransform = GetParentObj()->GetFullTransform(); 485*cdf0e10cSrcweir mInvDispTransform.invert(); 486*cdf0e10cSrcweir } 487*cdf0e10cSrcweir 488*cdf0e10cSrcweir // BoundVolume from 3d world to 3d eye 489*cdf0e10cSrcweir const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(pScene->GetViewContact()); 490*cdf0e10cSrcweir const drawinglayer::geometry::ViewInformation3D aViewInfo3D(rVCScene.getViewInformation3D()); 491*cdf0e10cSrcweir basegfx::B3DRange aEyeVol(pScene->GetBoundVolume()); 492*cdf0e10cSrcweir aEyeVol.transform(aViewInfo3D.getOrientation()); 493*cdf0e10cSrcweir 494*cdf0e10cSrcweir // build relative movement vector in eye coordinates 495*cdf0e10cSrcweir basegfx::B3DPoint aMove( 496*cdf0e10cSrcweir (double)rSize.Width() * aEyeVol.getWidth() / (double)aRect.GetWidth(), 497*cdf0e10cSrcweir (double)-rSize.Height() * aEyeVol.getHeight() / (double)aRect.GetHeight(), 498*cdf0e10cSrcweir 0.0); 499*cdf0e10cSrcweir basegfx::B3DPoint aPos(0.0, 0.0, 0.0); 500*cdf0e10cSrcweir 501*cdf0e10cSrcweir // movement vektor to local coordinates of objects' parent 502*cdf0e10cSrcweir basegfx::B3DHomMatrix aInverseOrientation(aViewInfo3D.getOrientation()); 503*cdf0e10cSrcweir aInverseOrientation.invert(); 504*cdf0e10cSrcweir basegfx::B3DHomMatrix aCompleteTrans(mInvDispTransform * aInverseOrientation); 505*cdf0e10cSrcweir 506*cdf0e10cSrcweir aMove = aCompleteTrans * aMove; 507*cdf0e10cSrcweir aPos = aCompleteTrans * aPos; 508*cdf0e10cSrcweir 509*cdf0e10cSrcweir // build transformation and apply 510*cdf0e10cSrcweir basegfx::B3DHomMatrix aTranslate; 511*cdf0e10cSrcweir aTranslate.translate(aMove.getX() - aPos.getX(), aMove.getY() - aPos.getY(), aMove.getZ() - aPos.getZ()); 512*cdf0e10cSrcweir 513*cdf0e10cSrcweir E3DModifySceneSnapRectUpdater aUpdater(pScene); 514*cdf0e10cSrcweir SetTransform(aTranslate * GetTransform()); 515*cdf0e10cSrcweir } 516*cdf0e10cSrcweir } 517*cdf0e10cSrcweir 518*cdf0e10cSrcweir /************************************************************************* 519*cdf0e10cSrcweir |* 520*cdf0e10cSrcweir |* liefere die Sublist, aber nur dann, wenn darin Objekte enthalten sind ! 521*cdf0e10cSrcweir |* 522*cdf0e10cSrcweir \************************************************************************/ 523*cdf0e10cSrcweir 524*cdf0e10cSrcweir SdrObjList* E3dObject::GetSubList() const 525*cdf0e10cSrcweir { 526*cdf0e10cSrcweir return &(const_cast< E3dObjList& >(maSubList)); 527*cdf0e10cSrcweir } 528*cdf0e10cSrcweir 529*cdf0e10cSrcweir /************************************************************************* 530*cdf0e10cSrcweir |* 531*cdf0e10cSrcweir |* SnapRect berechnen 532*cdf0e10cSrcweir |* 533*cdf0e10cSrcweir \************************************************************************/ 534*cdf0e10cSrcweir 535*cdf0e10cSrcweir void E3dObject::RecalcSnapRect() 536*cdf0e10cSrcweir { 537*cdf0e10cSrcweir maSnapRect = Rectangle(); 538*cdf0e10cSrcweir 539*cdf0e10cSrcweir for(sal_uInt32 a(0); a < maSubList.GetObjCount(); a++) 540*cdf0e10cSrcweir { 541*cdf0e10cSrcweir E3dObject* pCandidate = dynamic_cast< E3dObject* >(maSubList.GetObj(a)); 542*cdf0e10cSrcweir 543*cdf0e10cSrcweir if(pCandidate) 544*cdf0e10cSrcweir { 545*cdf0e10cSrcweir maSnapRect.Union(pCandidate->GetSnapRect()); 546*cdf0e10cSrcweir } 547*cdf0e10cSrcweir } 548*cdf0e10cSrcweir } 549*cdf0e10cSrcweir 550*cdf0e10cSrcweir /************************************************************************* 551*cdf0e10cSrcweir |* 552*cdf0e10cSrcweir |* Einfuegen eines 3D-Objekts an den Parent weitermelden, damit dieser 553*cdf0e10cSrcweir |* ggf. eine Sonderbehandlung fuer spezielle Objekte durchfuehren kann 554*cdf0e10cSrcweir |* (z.B. Light/Label in E3dScene) 555*cdf0e10cSrcweir |* 556*cdf0e10cSrcweir \************************************************************************/ 557*cdf0e10cSrcweir 558*cdf0e10cSrcweir void E3dObject::NewObjectInserted(const E3dObject* p3DObj) 559*cdf0e10cSrcweir { 560*cdf0e10cSrcweir if(GetParentObj()) 561*cdf0e10cSrcweir GetParentObj()->NewObjectInserted(p3DObj); 562*cdf0e10cSrcweir } 563*cdf0e10cSrcweir 564*cdf0e10cSrcweir /************************************************************************* 565*cdf0e10cSrcweir |* 566*cdf0e10cSrcweir |* Parent ueber Aenderung der Struktur (z.B. durch Transformation) 567*cdf0e10cSrcweir |* informieren; dabei wird das Objekt, in welchem die Aenderung 568*cdf0e10cSrcweir |* aufgetreten ist, uebergeben 569*cdf0e10cSrcweir |* 570*cdf0e10cSrcweir \************************************************************************/ 571*cdf0e10cSrcweir 572*cdf0e10cSrcweir void E3dObject::StructureChanged() 573*cdf0e10cSrcweir { 574*cdf0e10cSrcweir if ( GetParentObj() ) 575*cdf0e10cSrcweir { 576*cdf0e10cSrcweir GetParentObj()->InvalidateBoundVolume(); 577*cdf0e10cSrcweir GetParentObj()->StructureChanged(); 578*cdf0e10cSrcweir } 579*cdf0e10cSrcweir } 580*cdf0e10cSrcweir 581*cdf0e10cSrcweir /************************************************************************* 582*cdf0e10cSrcweir |* 583*cdf0e10cSrcweir |* 3D-Objekt einfuegen 584*cdf0e10cSrcweir |* 585*cdf0e10cSrcweir \************************************************************************/ 586*cdf0e10cSrcweir 587*cdf0e10cSrcweir void E3dObject::Insert3DObj(E3dObject* p3DObj) 588*cdf0e10cSrcweir { 589*cdf0e10cSrcweir DBG_ASSERT(p3DObj, "Insert3DObj mit NULL-Zeiger!"); 590*cdf0e10cSrcweir SdrPage* pPg = pPage; 591*cdf0e10cSrcweir maSubList.InsertObject(p3DObj); 592*cdf0e10cSrcweir pPage = pPg; 593*cdf0e10cSrcweir InvalidateBoundVolume(); 594*cdf0e10cSrcweir NewObjectInserted(p3DObj); 595*cdf0e10cSrcweir StructureChanged(); 596*cdf0e10cSrcweir } 597*cdf0e10cSrcweir 598*cdf0e10cSrcweir void E3dObject::Remove3DObj(E3dObject* p3DObj) 599*cdf0e10cSrcweir { 600*cdf0e10cSrcweir DBG_ASSERT(p3DObj, "Remove3DObj mit NULL-Zeiger!"); 601*cdf0e10cSrcweir 602*cdf0e10cSrcweir if(p3DObj->GetParentObj() == this) 603*cdf0e10cSrcweir { 604*cdf0e10cSrcweir SdrPage* pPg = pPage; 605*cdf0e10cSrcweir maSubList.RemoveObject(p3DObj->GetOrdNum()); 606*cdf0e10cSrcweir pPage = pPg; 607*cdf0e10cSrcweir 608*cdf0e10cSrcweir InvalidateBoundVolume(); 609*cdf0e10cSrcweir StructureChanged(); 610*cdf0e10cSrcweir } 611*cdf0e10cSrcweir } 612*cdf0e10cSrcweir 613*cdf0e10cSrcweir /************************************************************************* 614*cdf0e10cSrcweir |* 615*cdf0e10cSrcweir |* Parent holen 616*cdf0e10cSrcweir |* 617*cdf0e10cSrcweir \************************************************************************/ 618*cdf0e10cSrcweir 619*cdf0e10cSrcweir E3dObject* E3dObject::GetParentObj() const 620*cdf0e10cSrcweir { 621*cdf0e10cSrcweir E3dObject* pRetval = NULL; 622*cdf0e10cSrcweir 623*cdf0e10cSrcweir if(GetObjList() 624*cdf0e10cSrcweir && GetObjList()->GetOwnerObj() 625*cdf0e10cSrcweir && GetObjList()->GetOwnerObj()->ISA(E3dObject)) 626*cdf0e10cSrcweir pRetval = ((E3dObject*)GetObjList()->GetOwnerObj()); 627*cdf0e10cSrcweir return pRetval; 628*cdf0e10cSrcweir } 629*cdf0e10cSrcweir 630*cdf0e10cSrcweir /************************************************************************* 631*cdf0e10cSrcweir |* 632*cdf0e10cSrcweir |* Uebergeordnetes Szenenobjekt bestimmen 633*cdf0e10cSrcweir |* 634*cdf0e10cSrcweir \************************************************************************/ 635*cdf0e10cSrcweir 636*cdf0e10cSrcweir E3dScene* E3dObject::GetScene() const 637*cdf0e10cSrcweir { 638*cdf0e10cSrcweir if(GetParentObj()) 639*cdf0e10cSrcweir return GetParentObj()->GetScene(); 640*cdf0e10cSrcweir return NULL; 641*cdf0e10cSrcweir } 642*cdf0e10cSrcweir 643*cdf0e10cSrcweir /************************************************************************* 644*cdf0e10cSrcweir |* 645*cdf0e10cSrcweir |* umschliessendes Volumen inklusive aller Kindobjekte berechnen 646*cdf0e10cSrcweir |* 647*cdf0e10cSrcweir \************************************************************************/ 648*cdf0e10cSrcweir 649*cdf0e10cSrcweir basegfx::B3DRange E3dObject::RecalcBoundVolume() const 650*cdf0e10cSrcweir { 651*cdf0e10cSrcweir basegfx::B3DRange aRetval; 652*cdf0e10cSrcweir const sal_uInt32 nObjCnt(maSubList.GetObjCount()); 653*cdf0e10cSrcweir 654*cdf0e10cSrcweir if(nObjCnt) 655*cdf0e10cSrcweir { 656*cdf0e10cSrcweir for(sal_uInt32 a(0); a < nObjCnt; a++) 657*cdf0e10cSrcweir { 658*cdf0e10cSrcweir const E3dObject* p3DObject = dynamic_cast< const E3dObject* >(maSubList.GetObj(a)); 659*cdf0e10cSrcweir 660*cdf0e10cSrcweir if(p3DObject) 661*cdf0e10cSrcweir { 662*cdf0e10cSrcweir basegfx::B3DRange aLocalRange(p3DObject->GetBoundVolume()); 663*cdf0e10cSrcweir aLocalRange.transform(p3DObject->GetTransform()); 664*cdf0e10cSrcweir aRetval.expand(aLocalRange); 665*cdf0e10cSrcweir } 666*cdf0e10cSrcweir } 667*cdf0e10cSrcweir } 668*cdf0e10cSrcweir else 669*cdf0e10cSrcweir { 670*cdf0e10cSrcweir // single 3D object 671*cdf0e10cSrcweir const sdr::contact::ViewContactOfE3d* pVCOfE3D = dynamic_cast< const sdr::contact::ViewContactOfE3d* >(&GetViewContact()); 672*cdf0e10cSrcweir 673*cdf0e10cSrcweir if(pVCOfE3D) 674*cdf0e10cSrcweir { 675*cdf0e10cSrcweir // BoundVolume is without 3D object transformation, use correct sequence 676*cdf0e10cSrcweir const drawinglayer::primitive3d::Primitive3DSequence xLocalSequence(pVCOfE3D->getVIP3DSWithoutObjectTransform()); 677*cdf0e10cSrcweir 678*cdf0e10cSrcweir if(xLocalSequence.hasElements()) 679*cdf0e10cSrcweir { 680*cdf0e10cSrcweir const uno::Sequence< beans::PropertyValue > aEmptyParameters; 681*cdf0e10cSrcweir const drawinglayer::geometry::ViewInformation3D aLocalViewInformation3D(aEmptyParameters); 682*cdf0e10cSrcweir 683*cdf0e10cSrcweir aRetval = drawinglayer::primitive3d::getB3DRangeFromPrimitive3DSequence( 684*cdf0e10cSrcweir xLocalSequence, aLocalViewInformation3D); 685*cdf0e10cSrcweir } 686*cdf0e10cSrcweir } 687*cdf0e10cSrcweir } 688*cdf0e10cSrcweir 689*cdf0e10cSrcweir return aRetval; 690*cdf0e10cSrcweir } 691*cdf0e10cSrcweir 692*cdf0e10cSrcweir /************************************************************************* 693*cdf0e10cSrcweir |* 694*cdf0e10cSrcweir |* umschliessendes Volumen zurueckgeben und ggf. neu berechnen 695*cdf0e10cSrcweir |* 696*cdf0e10cSrcweir \************************************************************************/ 697*cdf0e10cSrcweir 698*cdf0e10cSrcweir const basegfx::B3DRange& E3dObject::GetBoundVolume() const 699*cdf0e10cSrcweir { 700*cdf0e10cSrcweir if(maLocalBoundVol.isEmpty()) 701*cdf0e10cSrcweir { 702*cdf0e10cSrcweir const_cast< E3dObject* >(this)->maLocalBoundVol = RecalcBoundVolume(); 703*cdf0e10cSrcweir } 704*cdf0e10cSrcweir 705*cdf0e10cSrcweir return maLocalBoundVol; 706*cdf0e10cSrcweir } 707*cdf0e10cSrcweir 708*cdf0e10cSrcweir void E3dObject::InvalidateBoundVolume() 709*cdf0e10cSrcweir { 710*cdf0e10cSrcweir maLocalBoundVol.reset(); 711*cdf0e10cSrcweir } 712*cdf0e10cSrcweir 713*cdf0e10cSrcweir /************************************************************************* 714*cdf0e10cSrcweir |* 715*cdf0e10cSrcweir |* Aederung des BoundVolumes an alle Kindobjekte weitergeben 716*cdf0e10cSrcweir |* 717*cdf0e10cSrcweir \************************************************************************/ 718*cdf0e10cSrcweir 719*cdf0e10cSrcweir void E3dObject::SetBoundVolInvalid() 720*cdf0e10cSrcweir { 721*cdf0e10cSrcweir InvalidateBoundVolume(); 722*cdf0e10cSrcweir 723*cdf0e10cSrcweir for(sal_uInt32 a(0); a < maSubList.GetObjCount(); a++) 724*cdf0e10cSrcweir { 725*cdf0e10cSrcweir E3dObject* pCandidate = dynamic_cast< E3dObject* >(maSubList.GetObj(a)); 726*cdf0e10cSrcweir 727*cdf0e10cSrcweir if(pCandidate) 728*cdf0e10cSrcweir { 729*cdf0e10cSrcweir pCandidate->SetBoundVolInvalid(); 730*cdf0e10cSrcweir } 731*cdf0e10cSrcweir } 732*cdf0e10cSrcweir } 733*cdf0e10cSrcweir 734*cdf0e10cSrcweir /************************************************************************* 735*cdf0e10cSrcweir |* 736*cdf0e10cSrcweir |* Aederung der Transformation an alle Kindobjekte weitergeben 737*cdf0e10cSrcweir |* 738*cdf0e10cSrcweir \************************************************************************/ 739*cdf0e10cSrcweir 740*cdf0e10cSrcweir void E3dObject::SetTransformChanged() 741*cdf0e10cSrcweir { 742*cdf0e10cSrcweir InvalidateBoundVolume(); 743*cdf0e10cSrcweir mbTfHasChanged = true; 744*cdf0e10cSrcweir 745*cdf0e10cSrcweir for(sal_uInt32 a(0); a < maSubList.GetObjCount(); a++) 746*cdf0e10cSrcweir { 747*cdf0e10cSrcweir E3dObject* pCandidate = dynamic_cast< E3dObject* >(maSubList.GetObj(a)); 748*cdf0e10cSrcweir 749*cdf0e10cSrcweir if(pCandidate) 750*cdf0e10cSrcweir { 751*cdf0e10cSrcweir pCandidate->SetTransformChanged(); 752*cdf0e10cSrcweir } 753*cdf0e10cSrcweir } 754*cdf0e10cSrcweir } 755*cdf0e10cSrcweir 756*cdf0e10cSrcweir /************************************************************************* 757*cdf0e10cSrcweir |* 758*cdf0e10cSrcweir |* hierarchische Transformation ueber alle Parents bestimmen, in 759*cdf0e10cSrcweir |* maFullTransform ablegen und diese zurueckgeben 760*cdf0e10cSrcweir |* 761*cdf0e10cSrcweir \************************************************************************/ 762*cdf0e10cSrcweir 763*cdf0e10cSrcweir const basegfx::B3DHomMatrix& E3dObject::GetFullTransform() const 764*cdf0e10cSrcweir { 765*cdf0e10cSrcweir if(mbTfHasChanged) 766*cdf0e10cSrcweir { 767*cdf0e10cSrcweir basegfx::B3DHomMatrix aNewFullTransformation(maTransformation); 768*cdf0e10cSrcweir 769*cdf0e10cSrcweir if ( GetParentObj() ) 770*cdf0e10cSrcweir { 771*cdf0e10cSrcweir aNewFullTransformation = GetParentObj()->GetFullTransform() * aNewFullTransformation; 772*cdf0e10cSrcweir } 773*cdf0e10cSrcweir 774*cdf0e10cSrcweir const_cast< E3dObject* >(this)->maFullTransform = aNewFullTransformation; 775*cdf0e10cSrcweir const_cast< E3dObject* >(this)->mbTfHasChanged = false; 776*cdf0e10cSrcweir } 777*cdf0e10cSrcweir 778*cdf0e10cSrcweir return maFullTransform; 779*cdf0e10cSrcweir } 780*cdf0e10cSrcweir 781*cdf0e10cSrcweir /************************************************************************* 782*cdf0e10cSrcweir |* 783*cdf0e10cSrcweir |* Transformationsmatrix abfragen 784*cdf0e10cSrcweir |* 785*cdf0e10cSrcweir \************************************************************************/ 786*cdf0e10cSrcweir 787*cdf0e10cSrcweir const basegfx::B3DHomMatrix& E3dObject::GetTransform() const 788*cdf0e10cSrcweir { 789*cdf0e10cSrcweir return maTransformation; 790*cdf0e10cSrcweir } 791*cdf0e10cSrcweir 792*cdf0e10cSrcweir /************************************************************************* 793*cdf0e10cSrcweir |* 794*cdf0e10cSrcweir |* Transformationsmatrix setzen 795*cdf0e10cSrcweir |* 796*cdf0e10cSrcweir \************************************************************************/ 797*cdf0e10cSrcweir 798*cdf0e10cSrcweir void E3dObject::NbcSetTransform(const basegfx::B3DHomMatrix& rMatrix) 799*cdf0e10cSrcweir { 800*cdf0e10cSrcweir if(maTransformation != rMatrix) 801*cdf0e10cSrcweir { 802*cdf0e10cSrcweir maTransformation = rMatrix; 803*cdf0e10cSrcweir SetTransformChanged(); 804*cdf0e10cSrcweir StructureChanged(); 805*cdf0e10cSrcweir } 806*cdf0e10cSrcweir } 807*cdf0e10cSrcweir 808*cdf0e10cSrcweir /************************************************************************* 809*cdf0e10cSrcweir |* 810*cdf0e10cSrcweir |* Transformationsmatrix setzen mit Repaint-Broadcast 811*cdf0e10cSrcweir |* 812*cdf0e10cSrcweir \************************************************************************/ 813*cdf0e10cSrcweir 814*cdf0e10cSrcweir void E3dObject::SetTransform(const basegfx::B3DHomMatrix& rMatrix) 815*cdf0e10cSrcweir { 816*cdf0e10cSrcweir if(rMatrix != maTransformation) 817*cdf0e10cSrcweir { 818*cdf0e10cSrcweir // #110094#-14 SendRepaintBroadcast(); 819*cdf0e10cSrcweir NbcSetTransform(rMatrix); 820*cdf0e10cSrcweir SetChanged(); 821*cdf0e10cSrcweir BroadcastObjectChange(); 822*cdf0e10cSrcweir if (pUserCall != NULL) pUserCall->Changed(*this, SDRUSERCALL_RESIZE, Rectangle()); 823*cdf0e10cSrcweir } 824*cdf0e10cSrcweir } 825*cdf0e10cSrcweir 826*cdf0e10cSrcweir /************************************************************************* 827*cdf0e10cSrcweir |* 828*cdf0e10cSrcweir |* Linien fuer die Wireframe-Darstellung des Objekts dem uebergebenen 829*cdf0e10cSrcweir |* basegfx::B3DPolygon hinzufuegen 830*cdf0e10cSrcweir |* 831*cdf0e10cSrcweir \************************************************************************/ 832*cdf0e10cSrcweir 833*cdf0e10cSrcweir basegfx::B3DPolyPolygon E3dObject::CreateWireframe() const 834*cdf0e10cSrcweir { 835*cdf0e10cSrcweir const basegfx::B3DRange aBoundVolume(GetBoundVolume()); 836*cdf0e10cSrcweir return basegfx::tools::createCubePolyPolygonFromB3DRange(aBoundVolume); 837*cdf0e10cSrcweir } 838*cdf0e10cSrcweir 839*cdf0e10cSrcweir /************************************************************************* 840*cdf0e10cSrcweir |* 841*cdf0e10cSrcweir |* Get the name of the object (singular) 842*cdf0e10cSrcweir |* 843*cdf0e10cSrcweir \************************************************************************/ 844*cdf0e10cSrcweir 845*cdf0e10cSrcweir void E3dObject::TakeObjNameSingul(XubString& rName) const 846*cdf0e10cSrcweir { 847*cdf0e10cSrcweir rName=ImpGetResStr(STR_ObjNameSingulObj3d); 848*cdf0e10cSrcweir 849*cdf0e10cSrcweir String aName( GetName() ); 850*cdf0e10cSrcweir if(aName.Len()) 851*cdf0e10cSrcweir { 852*cdf0e10cSrcweir rName += sal_Unicode(' '); 853*cdf0e10cSrcweir rName += sal_Unicode('\''); 854*cdf0e10cSrcweir rName += aName; 855*cdf0e10cSrcweir rName += sal_Unicode('\''); 856*cdf0e10cSrcweir } 857*cdf0e10cSrcweir } 858*cdf0e10cSrcweir 859*cdf0e10cSrcweir /************************************************************************* 860*cdf0e10cSrcweir |* 861*cdf0e10cSrcweir |* Get the name of the object (plural) 862*cdf0e10cSrcweir |* 863*cdf0e10cSrcweir \************************************************************************/ 864*cdf0e10cSrcweir 865*cdf0e10cSrcweir void E3dObject::TakeObjNamePlural(XubString& rName) const 866*cdf0e10cSrcweir { 867*cdf0e10cSrcweir rName=ImpGetResStr(STR_ObjNamePluralObj3d); 868*cdf0e10cSrcweir } 869*cdf0e10cSrcweir 870*cdf0e10cSrcweir /************************************************************************* 871*cdf0e10cSrcweir |* 872*cdf0e10cSrcweir |* Zuweisungsoperator 873*cdf0e10cSrcweir |* 874*cdf0e10cSrcweir \************************************************************************/ 875*cdf0e10cSrcweir 876*cdf0e10cSrcweir void E3dObject::operator=(const SdrObject& rObj) 877*cdf0e10cSrcweir { 878*cdf0e10cSrcweir SdrObject::operator=(rObj); 879*cdf0e10cSrcweir 880*cdf0e10cSrcweir const E3dObject& r3DObj = (const E3dObject&) rObj; 881*cdf0e10cSrcweir if (r3DObj.GetSubList()) 882*cdf0e10cSrcweir { 883*cdf0e10cSrcweir maSubList.CopyObjects(*r3DObj.GetSubList()); 884*cdf0e10cSrcweir } 885*cdf0e10cSrcweir 886*cdf0e10cSrcweir // BoundVol kann uebernommen werden, da die Childs auch kopiert werden 887*cdf0e10cSrcweir maLocalBoundVol = r3DObj.maLocalBoundVol; 888*cdf0e10cSrcweir maTransformation = r3DObj.maTransformation; 889*cdf0e10cSrcweir 890*cdf0e10cSrcweir // Da sich der Parent geaendert haben kann, Gesamttransformation beim 891*cdf0e10cSrcweir // naechsten Mal auf jeden Fall neu bestimmen 892*cdf0e10cSrcweir SetTransformChanged(); 893*cdf0e10cSrcweir 894*cdf0e10cSrcweir // Selektionsstatus kopieren 895*cdf0e10cSrcweir mbIsSelected = r3DObj.mbIsSelected; 896*cdf0e10cSrcweir } 897*cdf0e10cSrcweir 898*cdf0e10cSrcweir /************************************************************************* 899*cdf0e10cSrcweir |* 900*cdf0e10cSrcweir |* erstelle neues GeoData-Objekt 901*cdf0e10cSrcweir |* 902*cdf0e10cSrcweir \************************************************************************/ 903*cdf0e10cSrcweir 904*cdf0e10cSrcweir SdrObjGeoData *E3dObject::NewGeoData() const 905*cdf0e10cSrcweir { 906*cdf0e10cSrcweir // Theoretisch duerfen auch nur Szenen ihre GeoDatas erstellen und verwalten !! 907*cdf0e10cSrcweir // AW: Dies stimmt nicht mehr, diese Stelle ist mit der neuen Engine OK! 908*cdf0e10cSrcweir return new E3DObjGeoData; 909*cdf0e10cSrcweir } 910*cdf0e10cSrcweir 911*cdf0e10cSrcweir /************************************************************************* 912*cdf0e10cSrcweir |* 913*cdf0e10cSrcweir |* uebergebe aktuelle werte an das GeoData-Objekt 914*cdf0e10cSrcweir |* 915*cdf0e10cSrcweir \************************************************************************/ 916*cdf0e10cSrcweir 917*cdf0e10cSrcweir void E3dObject::SaveGeoData(SdrObjGeoData& rGeo) const 918*cdf0e10cSrcweir { 919*cdf0e10cSrcweir SdrAttrObj::SaveGeoData (rGeo); 920*cdf0e10cSrcweir 921*cdf0e10cSrcweir ((E3DObjGeoData &) rGeo).maLocalBoundVol = maLocalBoundVol; 922*cdf0e10cSrcweir ((E3DObjGeoData &) rGeo).maTransformation = maTransformation; 923*cdf0e10cSrcweir } 924*cdf0e10cSrcweir 925*cdf0e10cSrcweir /************************************************************************* 926*cdf0e10cSrcweir |* 927*cdf0e10cSrcweir |* uebernehme werte aus dem GeoData-Objekt 928*cdf0e10cSrcweir |* 929*cdf0e10cSrcweir \************************************************************************/ 930*cdf0e10cSrcweir 931*cdf0e10cSrcweir void E3dObject::RestGeoData(const SdrObjGeoData& rGeo) 932*cdf0e10cSrcweir { 933*cdf0e10cSrcweir maLocalBoundVol = ((E3DObjGeoData &) rGeo).maLocalBoundVol; 934*cdf0e10cSrcweir E3DModifySceneSnapRectUpdater aUpdater(this); 935*cdf0e10cSrcweir NbcSetTransform(((E3DObjGeoData &) rGeo).maTransformation); 936*cdf0e10cSrcweir SdrAttrObj::RestGeoData (rGeo); 937*cdf0e10cSrcweir } 938*cdf0e10cSrcweir 939*cdf0e10cSrcweir /************************************************************************* 940*cdf0e10cSrcweir |* 941*cdf0e10cSrcweir |* Rotation eines 3d-Koerpers 942*cdf0e10cSrcweir |* 943*cdf0e10cSrcweir \************************************************************************/ 944*cdf0e10cSrcweir // 2D-rotation eines 3D-Koerpers, normalerweise macht das die Szene selbst 945*cdf0e10cSrcweir // Ist aber eine korrekte Implementierung, denn alles was passiert ist eine 946*cdf0e10cSrcweir // Rotation um die Achse die senkrecht auf dem Bildschirm steht und zwar 947*cdf0e10cSrcweir // unabhaengig davon, wie die Szene bisher gedreht worden ist. 948*cdf0e10cSrcweir 949*cdf0e10cSrcweir void E3dObject::NbcRotate(const Point& rRef, long nWink, double sn, double cs) 950*cdf0e10cSrcweir { 951*cdf0e10cSrcweir // Also derzeit sind die Klebepunkte relativ zum aOutRect der Szene definiert. Vor dem Drehen 952*cdf0e10cSrcweir // werden die Klebepunkte relativ zur Seite definiert. Sie nehmen an der Drehung der Szene noch nicht Teil 953*cdf0e10cSrcweir // dafuer gibt es den 954*cdf0e10cSrcweir SetGlueReallyAbsolute(sal_True); 955*cdf0e10cSrcweir 956*cdf0e10cSrcweir // SendRepaintBroadcast(); 957*cdf0e10cSrcweir double fWinkelInRad = nWink/100 * F_PI180; 958*cdf0e10cSrcweir 959*cdf0e10cSrcweir basegfx::B3DHomMatrix aRotateZ; 960*cdf0e10cSrcweir aRotateZ.rotate(0.0, 0.0, fWinkelInRad); 961*cdf0e10cSrcweir NbcSetTransform(aRotateZ * GetTransform()); 962*cdf0e10cSrcweir 963*cdf0e10cSrcweir SetRectsDirty(); // Veranlasst eine Neuberechnung aller BoundRects 964*cdf0e10cSrcweir NbcRotateGluePoints(rRef,nWink,sn,cs); // Rotiert die Klebepunkte (die haben noch Koordinaten relativ 965*cdf0e10cSrcweir // zum Urpsung des Blattes 966*cdf0e10cSrcweir SetGlueReallyAbsolute(sal_False); // ab jetzt sind sie wieder relativ zum BoundRect (also dem aOutRect definiert) 967*cdf0e10cSrcweir } 968*cdf0e10cSrcweir 969*cdf0e10cSrcweir /*************************************************************************/ 970*cdf0e10cSrcweir 971*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 972*cdf0e10cSrcweir 973*cdf0e10cSrcweir sdr::properties::BaseProperties* E3dCompoundObject::CreateObjectSpecificProperties() 974*cdf0e10cSrcweir { 975*cdf0e10cSrcweir return new sdr::properties::E3dCompoundProperties(*this); 976*cdf0e10cSrcweir } 977*cdf0e10cSrcweir 978*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////////////////////////// 979*cdf0e10cSrcweir 980*cdf0e10cSrcweir TYPEINIT1(E3dCompoundObject, E3dObject); 981*cdf0e10cSrcweir 982*cdf0e10cSrcweir /************************************************************************* 983*cdf0e10cSrcweir |* 984*cdf0e10cSrcweir |* Konstruktor 985*cdf0e10cSrcweir |* 986*cdf0e10cSrcweir \************************************************************************/ 987*cdf0e10cSrcweir 988*cdf0e10cSrcweir E3dCompoundObject::E3dCompoundObject() 989*cdf0e10cSrcweir : E3dObject(), 990*cdf0e10cSrcweir aMaterialAmbientColor(), 991*cdf0e10cSrcweir bCreateNormals(false), 992*cdf0e10cSrcweir bCreateTexture(false) 993*cdf0e10cSrcweir { 994*cdf0e10cSrcweir // Defaults setzen 995*cdf0e10cSrcweir E3dDefaultAttributes aDefault; 996*cdf0e10cSrcweir SetDefaultAttributes(aDefault); 997*cdf0e10cSrcweir } 998*cdf0e10cSrcweir 999*cdf0e10cSrcweir E3dCompoundObject::E3dCompoundObject(E3dDefaultAttributes& rDefault) 1000*cdf0e10cSrcweir : E3dObject(), 1001*cdf0e10cSrcweir aMaterialAmbientColor(), 1002*cdf0e10cSrcweir bCreateNormals(false), 1003*cdf0e10cSrcweir bCreateTexture(false) 1004*cdf0e10cSrcweir { 1005*cdf0e10cSrcweir // Defaults setzen 1006*cdf0e10cSrcweir SetDefaultAttributes(rDefault); 1007*cdf0e10cSrcweir } 1008*cdf0e10cSrcweir 1009*cdf0e10cSrcweir void E3dCompoundObject::SetDefaultAttributes(E3dDefaultAttributes& rDefault) 1010*cdf0e10cSrcweir { 1011*cdf0e10cSrcweir // Defaults setzen 1012*cdf0e10cSrcweir aMaterialAmbientColor = rDefault.GetDefaultAmbientColor(); 1013*cdf0e10cSrcweir 1014*cdf0e10cSrcweir bCreateNormals = rDefault.GetDefaultCreateNormals(); 1015*cdf0e10cSrcweir bCreateTexture = rDefault.GetDefaultCreateTexture(); 1016*cdf0e10cSrcweir } 1017*cdf0e10cSrcweir 1018*cdf0e10cSrcweir /************************************************************************* 1019*cdf0e10cSrcweir |* 1020*cdf0e10cSrcweir |* Destruktor 1021*cdf0e10cSrcweir |* 1022*cdf0e10cSrcweir \************************************************************************/ 1023*cdf0e10cSrcweir 1024*cdf0e10cSrcweir E3dCompoundObject::~E3dCompoundObject () 1025*cdf0e10cSrcweir { 1026*cdf0e10cSrcweir } 1027*cdf0e10cSrcweir 1028*cdf0e10cSrcweir /************************************************************************* 1029*cdf0e10cSrcweir |* 1030*cdf0e10cSrcweir |* Drag-Polygon zurueckgeben 1031*cdf0e10cSrcweir |* 1032*cdf0e10cSrcweir \************************************************************************/ 1033*cdf0e10cSrcweir 1034*cdf0e10cSrcweir basegfx::B2DPolyPolygon E3dCompoundObject::TakeXorPoly() const 1035*cdf0e10cSrcweir { 1036*cdf0e10cSrcweir basegfx::B2DPolyPolygon aRetval; 1037*cdf0e10cSrcweir const uno::Sequence< beans::PropertyValue > aEmptyParameters; 1038*cdf0e10cSrcweir drawinglayer::geometry::ViewInformation3D aViewInfo3D(aEmptyParameters); 1039*cdf0e10cSrcweir E3dScene* pRootScene = fillViewInformation3DForCompoundObject(aViewInfo3D, *this); 1040*cdf0e10cSrcweir 1041*cdf0e10cSrcweir if(pRootScene) 1042*cdf0e10cSrcweir { 1043*cdf0e10cSrcweir const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(pRootScene->GetViewContact()); 1044*cdf0e10cSrcweir const basegfx::B3DPolyPolygon aCubePolyPolygon(CreateWireframe()); 1045*cdf0e10cSrcweir aRetval = basegfx::tools::createB2DPolyPolygonFromB3DPolyPolygon(aCubePolyPolygon, 1046*cdf0e10cSrcweir aViewInfo3D.getObjectToView() * GetTransform()); 1047*cdf0e10cSrcweir aRetval.transform(rVCScene.getObjectTransformation()); 1048*cdf0e10cSrcweir } 1049*cdf0e10cSrcweir 1050*cdf0e10cSrcweir return aRetval; 1051*cdf0e10cSrcweir } 1052*cdf0e10cSrcweir 1053*cdf0e10cSrcweir /************************************************************************* 1054*cdf0e10cSrcweir |* 1055*cdf0e10cSrcweir |* Anzahl der Handles zurueckgeben 1056*cdf0e10cSrcweir |* 1057*cdf0e10cSrcweir \************************************************************************/ 1058*cdf0e10cSrcweir 1059*cdf0e10cSrcweir sal_uInt32 E3dCompoundObject::GetHdlCount() const 1060*cdf0e10cSrcweir { 1061*cdf0e10cSrcweir // 8 Eckpunkte + 1 E3dVolumeMarker (= Wireframe-Darstellung) 1062*cdf0e10cSrcweir return 9L; 1063*cdf0e10cSrcweir } 1064*cdf0e10cSrcweir 1065*cdf0e10cSrcweir /************************************************************************* 1066*cdf0e10cSrcweir |* 1067*cdf0e10cSrcweir |* Handle-Liste fuellen 1068*cdf0e10cSrcweir |* 1069*cdf0e10cSrcweir \************************************************************************/ 1070*cdf0e10cSrcweir 1071*cdf0e10cSrcweir void E3dCompoundObject::AddToHdlList(SdrHdlList& rHdlList) const 1072*cdf0e10cSrcweir { 1073*cdf0e10cSrcweir const uno::Sequence< beans::PropertyValue > aEmptyParameters; 1074*cdf0e10cSrcweir drawinglayer::geometry::ViewInformation3D aViewInfo3D(aEmptyParameters); 1075*cdf0e10cSrcweir E3dScene* pRootScene = fillViewInformation3DForCompoundObject(aViewInfo3D, *this); 1076*cdf0e10cSrcweir 1077*cdf0e10cSrcweir if(pRootScene) 1078*cdf0e10cSrcweir { 1079*cdf0e10cSrcweir const basegfx::B3DRange aBoundVolume(GetBoundVolume()); 1080*cdf0e10cSrcweir 1081*cdf0e10cSrcweir if(!aBoundVolume.isEmpty()) 1082*cdf0e10cSrcweir { 1083*cdf0e10cSrcweir const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(pRootScene->GetViewContact()); 1084*cdf0e10cSrcweir 1085*cdf0e10cSrcweir for(sal_uInt32 a(0); a < 8; a++) 1086*cdf0e10cSrcweir { 1087*cdf0e10cSrcweir basegfx::B3DPoint aPos3D; 1088*cdf0e10cSrcweir 1089*cdf0e10cSrcweir switch(a) 1090*cdf0e10cSrcweir { 1091*cdf0e10cSrcweir case 0 : aPos3D.setX(aBoundVolume.getMinX()); aPos3D.setY(aBoundVolume.getMinY()); aPos3D.setZ(aBoundVolume.getMinZ()); break; 1092*cdf0e10cSrcweir case 1 : aPos3D.setX(aBoundVolume.getMinX()); aPos3D.setY(aBoundVolume.getMinY()); aPos3D.setZ(aBoundVolume.getMaxZ()); break; 1093*cdf0e10cSrcweir case 2 : aPos3D.setX(aBoundVolume.getMinX()); aPos3D.setY(aBoundVolume.getMaxY()); aPos3D.setZ(aBoundVolume.getMinZ()); break; 1094*cdf0e10cSrcweir case 3 : aPos3D.setX(aBoundVolume.getMinX()); aPos3D.setY(aBoundVolume.getMaxY()); aPos3D.setZ(aBoundVolume.getMaxZ()); break; 1095*cdf0e10cSrcweir case 4 : aPos3D.setX(aBoundVolume.getMaxX()); aPos3D.setY(aBoundVolume.getMinY()); aPos3D.setZ(aBoundVolume.getMinZ()); break; 1096*cdf0e10cSrcweir case 5 : aPos3D.setX(aBoundVolume.getMaxX()); aPos3D.setY(aBoundVolume.getMinY()); aPos3D.setZ(aBoundVolume.getMaxZ()); break; 1097*cdf0e10cSrcweir case 6 : aPos3D.setX(aBoundVolume.getMaxX()); aPos3D.setY(aBoundVolume.getMaxY()); aPos3D.setZ(aBoundVolume.getMinZ()); break; 1098*cdf0e10cSrcweir case 7 : aPos3D.setX(aBoundVolume.getMaxX()); aPos3D.setY(aBoundVolume.getMaxY()); aPos3D.setZ(aBoundVolume.getMaxZ()); break; 1099*cdf0e10cSrcweir } 1100*cdf0e10cSrcweir 1101*cdf0e10cSrcweir // to 3d view coor 1102*cdf0e10cSrcweir aPos3D *= aViewInfo3D.getObjectToView() * GetTransform(); 1103*cdf0e10cSrcweir 1104*cdf0e10cSrcweir // create 2d relative scene 1105*cdf0e10cSrcweir basegfx::B2DPoint aPos2D(aPos3D.getX(), aPos3D.getY()); 1106*cdf0e10cSrcweir 1107*cdf0e10cSrcweir // to 2d world coor 1108*cdf0e10cSrcweir aPos2D *= rVCScene.getObjectTransformation(); 1109*cdf0e10cSrcweir 1110*cdf0e10cSrcweir rHdlList.AddHdl(new SdrHdl(Point(basegfx::fround(aPos2D.getX()), basegfx::fround(aPos2D.getY())), HDL_BWGT)); 1111*cdf0e10cSrcweir } 1112*cdf0e10cSrcweir } 1113*cdf0e10cSrcweir } 1114*cdf0e10cSrcweir 1115*cdf0e10cSrcweir const basegfx::B2DPolyPolygon aPolyPolygon(TakeXorPoly()); 1116*cdf0e10cSrcweir 1117*cdf0e10cSrcweir if(aPolyPolygon.count()) 1118*cdf0e10cSrcweir { 1119*cdf0e10cSrcweir E3dVolumeMarker* pVolMarker = new E3dVolumeMarker(aPolyPolygon); 1120*cdf0e10cSrcweir rHdlList.AddHdl(pVolMarker); 1121*cdf0e10cSrcweir } 1122*cdf0e10cSrcweir } 1123*cdf0e10cSrcweir 1124*cdf0e10cSrcweir /************************************************************************* 1125*cdf0e10cSrcweir |* 1126*cdf0e10cSrcweir |* Identifier zurueckgeben 1127*cdf0e10cSrcweir |* 1128*cdf0e10cSrcweir \************************************************************************/ 1129*cdf0e10cSrcweir 1130*cdf0e10cSrcweir sal_uInt16 E3dCompoundObject::GetObjIdentifier() const 1131*cdf0e10cSrcweir { 1132*cdf0e10cSrcweir return E3D_COMPOUNDOBJ_ID; 1133*cdf0e10cSrcweir } 1134*cdf0e10cSrcweir 1135*cdf0e10cSrcweir /************************************************************************* 1136*cdf0e10cSrcweir |* 1137*cdf0e10cSrcweir |* SnapRect berechnen 1138*cdf0e10cSrcweir |* 1139*cdf0e10cSrcweir \************************************************************************/ 1140*cdf0e10cSrcweir 1141*cdf0e10cSrcweir void E3dCompoundObject::RecalcSnapRect() 1142*cdf0e10cSrcweir { 1143*cdf0e10cSrcweir const uno::Sequence< beans::PropertyValue > aEmptyParameters; 1144*cdf0e10cSrcweir drawinglayer::geometry::ViewInformation3D aViewInfo3D(aEmptyParameters); 1145*cdf0e10cSrcweir E3dScene* pRootScene = fillViewInformation3DForCompoundObject(aViewInfo3D, *this); 1146*cdf0e10cSrcweir maSnapRect = Rectangle(); 1147*cdf0e10cSrcweir 1148*cdf0e10cSrcweir if(pRootScene) 1149*cdf0e10cSrcweir { 1150*cdf0e10cSrcweir // get VC of 3D candidate 1151*cdf0e10cSrcweir const sdr::contact::ViewContactOfE3d* pVCOfE3D = dynamic_cast< const sdr::contact::ViewContactOfE3d* >(&GetViewContact()); 1152*cdf0e10cSrcweir 1153*cdf0e10cSrcweir if(pVCOfE3D) 1154*cdf0e10cSrcweir { 1155*cdf0e10cSrcweir // get 3D primitive sequence 1156*cdf0e10cSrcweir const drawinglayer::primitive3d::Primitive3DSequence xLocalSequence(pVCOfE3D->getViewIndependentPrimitive3DSequence()); 1157*cdf0e10cSrcweir 1158*cdf0e10cSrcweir if(xLocalSequence.hasElements()) 1159*cdf0e10cSrcweir { 1160*cdf0e10cSrcweir // get BoundVolume 1161*cdf0e10cSrcweir basegfx::B3DRange aBoundVolume(drawinglayer::primitive3d::getB3DRangeFromPrimitive3DSequence( 1162*cdf0e10cSrcweir xLocalSequence, aViewInfo3D)); 1163*cdf0e10cSrcweir 1164*cdf0e10cSrcweir // transform bound volume to relative scene coordinates 1165*cdf0e10cSrcweir aBoundVolume.transform(aViewInfo3D.getObjectToView()); 1166*cdf0e10cSrcweir 1167*cdf0e10cSrcweir // build 2d relative scene range 1168*cdf0e10cSrcweir basegfx::B2DRange aSnapRange( 1169*cdf0e10cSrcweir aBoundVolume.getMinX(), aBoundVolume.getMinY(), 1170*cdf0e10cSrcweir aBoundVolume.getMaxX(), aBoundVolume.getMaxY()); 1171*cdf0e10cSrcweir 1172*cdf0e10cSrcweir // transform to 2D world coordiantes 1173*cdf0e10cSrcweir const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(pRootScene->GetViewContact()); 1174*cdf0e10cSrcweir aSnapRange.transform(rVCScene.getObjectTransformation()); 1175*cdf0e10cSrcweir 1176*cdf0e10cSrcweir // snap to integer 1177*cdf0e10cSrcweir maSnapRect = Rectangle( 1178*cdf0e10cSrcweir sal_Int32(floor(aSnapRange.getMinX())), sal_Int32(floor(aSnapRange.getMinY())), 1179*cdf0e10cSrcweir sal_Int32(ceil(aSnapRange.getMaxX())), sal_Int32(ceil(aSnapRange.getMaxY()))); 1180*cdf0e10cSrcweir } 1181*cdf0e10cSrcweir } 1182*cdf0e10cSrcweir } 1183*cdf0e10cSrcweir } 1184*cdf0e10cSrcweir 1185*cdf0e10cSrcweir /************************************************************************* 1186*cdf0e10cSrcweir |* 1187*cdf0e10cSrcweir |* Copy-Operator 1188*cdf0e10cSrcweir |* 1189*cdf0e10cSrcweir \************************************************************************/ 1190*cdf0e10cSrcweir 1191*cdf0e10cSrcweir void E3dCompoundObject::operator=(const SdrObject& rObj) 1192*cdf0e10cSrcweir { 1193*cdf0e10cSrcweir // erstmal alle Childs kopieren 1194*cdf0e10cSrcweir E3dObject::operator=(rObj); 1195*cdf0e10cSrcweir 1196*cdf0e10cSrcweir // weitere Parameter kopieren 1197*cdf0e10cSrcweir const E3dCompoundObject& r3DObj = (const E3dCompoundObject&) rObj; 1198*cdf0e10cSrcweir 1199*cdf0e10cSrcweir bCreateNormals = r3DObj.bCreateNormals; 1200*cdf0e10cSrcweir bCreateTexture = r3DObj.bCreateTexture; 1201*cdf0e10cSrcweir aMaterialAmbientColor = r3DObj.aMaterialAmbientColor; 1202*cdf0e10cSrcweir } 1203*cdf0e10cSrcweir 1204*cdf0e10cSrcweir /************************************************************************* 1205*cdf0e10cSrcweir |* 1206*cdf0e10cSrcweir |* Parameter Geometrieerzeugung setzen 1207*cdf0e10cSrcweir |* 1208*cdf0e10cSrcweir \************************************************************************/ 1209*cdf0e10cSrcweir 1210*cdf0e10cSrcweir void E3dCompoundObject::SetCreateNormals(sal_Bool bNew) 1211*cdf0e10cSrcweir { 1212*cdf0e10cSrcweir if(bCreateNormals != bNew) 1213*cdf0e10cSrcweir { 1214*cdf0e10cSrcweir bCreateNormals = bNew; 1215*cdf0e10cSrcweir ActionChanged(); 1216*cdf0e10cSrcweir } 1217*cdf0e10cSrcweir } 1218*cdf0e10cSrcweir 1219*cdf0e10cSrcweir void E3dCompoundObject::SetCreateTexture(sal_Bool bNew) 1220*cdf0e10cSrcweir { 1221*cdf0e10cSrcweir if(bCreateTexture != bNew) 1222*cdf0e10cSrcweir { 1223*cdf0e10cSrcweir bCreateTexture = bNew; 1224*cdf0e10cSrcweir ActionChanged(); 1225*cdf0e10cSrcweir } 1226*cdf0e10cSrcweir } 1227*cdf0e10cSrcweir 1228*cdf0e10cSrcweir /************************************************************************* 1229*cdf0e10cSrcweir |* 1230*cdf0e10cSrcweir |* Material des Objektes 1231*cdf0e10cSrcweir |* 1232*cdf0e10cSrcweir \************************************************************************/ 1233*cdf0e10cSrcweir 1234*cdf0e10cSrcweir void E3dCompoundObject::SetMaterialAmbientColor(const Color& rColor) 1235*cdf0e10cSrcweir { 1236*cdf0e10cSrcweir if(aMaterialAmbientColor != rColor) 1237*cdf0e10cSrcweir { 1238*cdf0e10cSrcweir aMaterialAmbientColor = rColor; 1239*cdf0e10cSrcweir } 1240*cdf0e10cSrcweir } 1241*cdf0e10cSrcweir 1242*cdf0e10cSrcweir /************************************************************************* 1243*cdf0e10cSrcweir |* 1244*cdf0e10cSrcweir |* convert given basegfx::B3DPolyPolygon to screen coor 1245*cdf0e10cSrcweir |* 1246*cdf0e10cSrcweir \************************************************************************/ 1247*cdf0e10cSrcweir 1248*cdf0e10cSrcweir basegfx::B2DPolyPolygon E3dCompoundObject::TransformToScreenCoor(const basegfx::B3DPolyPolygon& rCandidate) 1249*cdf0e10cSrcweir { 1250*cdf0e10cSrcweir const uno::Sequence< beans::PropertyValue > aEmptyParameters; 1251*cdf0e10cSrcweir drawinglayer::geometry::ViewInformation3D aViewInfo3D(aEmptyParameters); 1252*cdf0e10cSrcweir E3dScene* pRootScene = fillViewInformation3DForCompoundObject(aViewInfo3D, *this); 1253*cdf0e10cSrcweir basegfx::B2DPolyPolygon aRetval; 1254*cdf0e10cSrcweir 1255*cdf0e10cSrcweir if(pRootScene) 1256*cdf0e10cSrcweir { 1257*cdf0e10cSrcweir aRetval = basegfx::tools::createB2DPolyPolygonFromB3DPolyPolygon(rCandidate, 1258*cdf0e10cSrcweir aViewInfo3D.getObjectToView() * GetTransform()); 1259*cdf0e10cSrcweir const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(pRootScene->GetViewContact()); 1260*cdf0e10cSrcweir aRetval.transform(rVCScene.getObjectTransformation()); 1261*cdf0e10cSrcweir } 1262*cdf0e10cSrcweir 1263*cdf0e10cSrcweir return aRetval; 1264*cdf0e10cSrcweir } 1265*cdf0e10cSrcweir 1266*cdf0e10cSrcweir sal_Bool E3dCompoundObject::IsAOrdNumRemapCandidate(E3dScene*& prScene) const 1267*cdf0e10cSrcweir { 1268*cdf0e10cSrcweir if(GetObjList() 1269*cdf0e10cSrcweir && GetObjList()->GetOwnerObj() 1270*cdf0e10cSrcweir && GetObjList()->GetOwnerObj()->ISA(E3dScene)) 1271*cdf0e10cSrcweir { 1272*cdf0e10cSrcweir prScene = (E3dScene*)GetObjList()->GetOwnerObj(); 1273*cdf0e10cSrcweir return sal_True; 1274*cdf0e10cSrcweir } 1275*cdf0e10cSrcweir 1276*cdf0e10cSrcweir return sal_False; 1277*cdf0e10cSrcweir } 1278*cdf0e10cSrcweir 1279*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 1280*cdf0e10cSrcweir // eof 1281