xref: /AOO41X/main/svx/source/engine3d/obj3d.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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