xref: /aoo4110/main/sd/source/ui/func/fucon3d.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sd.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "fucon3d.hxx"
28*b1cdbd2cSJim Jagielski #include <vcl/waitobj.hxx>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <svx/svxids.hrc>
31*b1cdbd2cSJim Jagielski #include <svl/aeitem.hxx>
32*b1cdbd2cSJim Jagielski #include <sfx2/app.hxx>
33*b1cdbd2cSJim Jagielski #include <sfx2/dispatch.hxx>
34*b1cdbd2cSJim Jagielski #include <sfx2/viewfrm.hxx>
35*b1cdbd2cSJim Jagielski #include <tools/poly.hxx>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <math.h>
38*b1cdbd2cSJim Jagielski #include <svx/globl3d.hxx>
39*b1cdbd2cSJim Jagielski #include <svx/scene3d.hxx>
40*b1cdbd2cSJim Jagielski #include <svx/sphere3d.hxx>
41*b1cdbd2cSJim Jagielski #include <svx/cube3d.hxx>
42*b1cdbd2cSJim Jagielski #include <svx/lathe3d.hxx>
43*b1cdbd2cSJim Jagielski #include <svx/camera3d.hxx>
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski #include "app.hrc"
46*b1cdbd2cSJim Jagielski #include "res_bmp.hrc"
47*b1cdbd2cSJim Jagielski #include "View.hxx"
48*b1cdbd2cSJim Jagielski #include "Window.hxx"
49*b1cdbd2cSJim Jagielski #include "ViewShell.hxx"
50*b1cdbd2cSJim Jagielski #include "drawdoc.hxx"
51*b1cdbd2cSJim Jagielski #include "ViewShellBase.hxx"
52*b1cdbd2cSJim Jagielski #include "ToolBarManager.hxx"
53*b1cdbd2cSJim Jagielski #include <svx/svx3ditems.hxx>
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski // #97016#
56*b1cdbd2cSJim Jagielski #include <svx/polysc3d.hxx>
57*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygontools.hxx>
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski namespace sd {
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski TYPEINIT1( FuConstruct3dObject, FuConstruct );
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski /*************************************************************************
64*b1cdbd2cSJim Jagielski |*
65*b1cdbd2cSJim Jagielski |* Konstruktor
66*b1cdbd2cSJim Jagielski |*
67*b1cdbd2cSJim Jagielski \************************************************************************/
68*b1cdbd2cSJim Jagielski 
FuConstruct3dObject(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq)69*b1cdbd2cSJim Jagielski FuConstruct3dObject::FuConstruct3dObject (
70*b1cdbd2cSJim Jagielski     ViewShell* 	pViewSh,
71*b1cdbd2cSJim Jagielski     ::sd::Window*		pWin,
72*b1cdbd2cSJim Jagielski     ::sd::View*			pView,
73*b1cdbd2cSJim Jagielski     SdDrawDocument*	pDoc,
74*b1cdbd2cSJim Jagielski     SfxRequest&		rReq)
75*b1cdbd2cSJim Jagielski     : FuConstruct(pViewSh, pWin, pView, pDoc, rReq)
76*b1cdbd2cSJim Jagielski {
77*b1cdbd2cSJim Jagielski }
78*b1cdbd2cSJim Jagielski 
Create(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq,bool bPermanent)79*b1cdbd2cSJim Jagielski FunctionReference FuConstruct3dObject::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent )
80*b1cdbd2cSJim Jagielski {
81*b1cdbd2cSJim Jagielski 	FuConstruct3dObject* pFunc;
82*b1cdbd2cSJim Jagielski 	FunctionReference xFunc( pFunc = new FuConstruct3dObject( pViewSh, pWin, pView, pDoc, rReq ) );
83*b1cdbd2cSJim Jagielski 	xFunc->DoExecute(rReq);
84*b1cdbd2cSJim Jagielski 	pFunc->SetPermanent(bPermanent);
85*b1cdbd2cSJim Jagielski 	return xFunc;
86*b1cdbd2cSJim Jagielski }
87*b1cdbd2cSJim Jagielski 
DoExecute(SfxRequest & rReq)88*b1cdbd2cSJim Jagielski void FuConstruct3dObject::DoExecute( SfxRequest& rReq )
89*b1cdbd2cSJim Jagielski {
90*b1cdbd2cSJim Jagielski 	FuConstruct::DoExecute( rReq );
91*b1cdbd2cSJim Jagielski     mpViewShell->GetViewShellBase().GetToolBarManager()->SetToolBar(
92*b1cdbd2cSJim Jagielski         ToolBarManager::TBG_FUNCTION,
93*b1cdbd2cSJim Jagielski         ToolBarManager::msDrawingObjectToolBar);
94*b1cdbd2cSJim Jagielski }
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski /*************************************************************************
97*b1cdbd2cSJim Jagielski |*
98*b1cdbd2cSJim Jagielski |* MouseButtonDown-event
99*b1cdbd2cSJim Jagielski |*
100*b1cdbd2cSJim Jagielski \************************************************************************/
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski // #97016#
ImpCreateBasic3DShape()103*b1cdbd2cSJim Jagielski E3dCompoundObject* FuConstruct3dObject::ImpCreateBasic3DShape()
104*b1cdbd2cSJim Jagielski {
105*b1cdbd2cSJim Jagielski 	E3dCompoundObject* p3DObj = NULL;
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski 	switch (nSlotId)
108*b1cdbd2cSJim Jagielski 	{
109*b1cdbd2cSJim Jagielski 		default:
110*b1cdbd2cSJim Jagielski 		case SID_3D_CUBE:
111*b1cdbd2cSJim Jagielski 		{
112*b1cdbd2cSJim Jagielski 			p3DObj = new E3dCubeObj(
113*b1cdbd2cSJim Jagielski 				mpView->Get3DDefaultAttributes(),
114*b1cdbd2cSJim Jagielski 				::basegfx::B3DPoint(-2500, -2500, -2500),
115*b1cdbd2cSJim Jagielski 				::basegfx::B3DVector(5000, 5000, 5000));
116*b1cdbd2cSJim Jagielski 			break;
117*b1cdbd2cSJim Jagielski 		}
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski 		case SID_3D_SPHERE:
120*b1cdbd2cSJim Jagielski 		{
121*b1cdbd2cSJim Jagielski 			p3DObj = new E3dSphereObj(
122*b1cdbd2cSJim Jagielski 				mpView->Get3DDefaultAttributes(),
123*b1cdbd2cSJim Jagielski 				::basegfx::B3DPoint(0, 0, 0),
124*b1cdbd2cSJim Jagielski 				::basegfx::B3DVector(5000, 5000, 5000));
125*b1cdbd2cSJim Jagielski 			break;
126*b1cdbd2cSJim Jagielski 		}
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski 		case SID_3D_SHELL:
129*b1cdbd2cSJim Jagielski 		{
130*b1cdbd2cSJim Jagielski 			XPolygon aXPoly(Point (0, 1250), 2500, 2500, 0, 900, sal_False);
131*b1cdbd2cSJim Jagielski 			aXPoly.Scale(5.0, 5.0);
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 			::basegfx::B2DPolygon aB2DPolygon(aXPoly.getB2DPolygon());
134*b1cdbd2cSJim Jagielski 			if(aB2DPolygon.areControlPointsUsed())
135*b1cdbd2cSJim Jagielski 			{
136*b1cdbd2cSJim Jagielski 				aB2DPolygon = ::basegfx::tools::adaptiveSubdivideByAngle(aB2DPolygon);
137*b1cdbd2cSJim Jagielski 			}
138*b1cdbd2cSJim Jagielski 			p3DObj = new E3dLatheObj(mpView->Get3DDefaultAttributes(), ::basegfx::B2DPolyPolygon(aB2DPolygon));
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski 			// Dies ist ein offenes Objekt, muss daher defaultmaessig
141*b1cdbd2cSJim Jagielski 			// doppelseitig behandelt werden
142*b1cdbd2cSJim Jagielski 			p3DObj->SetMergedItem(Svx3DDoubleSidedItem(sal_True));
143*b1cdbd2cSJim Jagielski 			break;
144*b1cdbd2cSJim Jagielski 		}
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski 		case SID_3D_HALF_SPHERE:
147*b1cdbd2cSJim Jagielski 		{
148*b1cdbd2cSJim Jagielski 			XPolygon aXPoly(Point (0, 1250), 2500, 2500, 0, 900, sal_False);
149*b1cdbd2cSJim Jagielski 			aXPoly.Scale(5.0, 5.0);
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski 			aXPoly.Insert(0, Point (2400*5, 1250*5), XPOLY_NORMAL);
152*b1cdbd2cSJim Jagielski 			aXPoly.Insert(0, Point (2000*5, 1250*5), XPOLY_NORMAL);
153*b1cdbd2cSJim Jagielski 			aXPoly.Insert(0, Point (1500*5, 1250*5), XPOLY_NORMAL);
154*b1cdbd2cSJim Jagielski 			aXPoly.Insert(0, Point (1000*5, 1250*5), XPOLY_NORMAL);
155*b1cdbd2cSJim Jagielski 			aXPoly.Insert(0, Point (500*5, 1250*5), XPOLY_NORMAL);
156*b1cdbd2cSJim Jagielski 			aXPoly.Insert(0, Point (250*5, 1250*5), XPOLY_NORMAL);
157*b1cdbd2cSJim Jagielski 			aXPoly.Insert(0, Point (50*5, 1250*5), XPOLY_NORMAL);
158*b1cdbd2cSJim Jagielski 			aXPoly.Insert(0, Point (0*5, 1250*5), XPOLY_NORMAL);
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski 			::basegfx::B2DPolygon aB2DPolygon(aXPoly.getB2DPolygon());
161*b1cdbd2cSJim Jagielski 			if(aB2DPolygon.areControlPointsUsed())
162*b1cdbd2cSJim Jagielski 			{
163*b1cdbd2cSJim Jagielski 				aB2DPolygon = ::basegfx::tools::adaptiveSubdivideByAngle(aB2DPolygon);
164*b1cdbd2cSJim Jagielski 			}
165*b1cdbd2cSJim Jagielski 			p3DObj = new E3dLatheObj(mpView->Get3DDefaultAttributes(), ::basegfx::B2DPolyPolygon(aB2DPolygon));
166*b1cdbd2cSJim Jagielski 			break;
167*b1cdbd2cSJim Jagielski 		}
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski 		case SID_3D_TORUS:
170*b1cdbd2cSJim Jagielski 		{
171*b1cdbd2cSJim Jagielski 			::basegfx::B2DPolygon aB2DPolygon(::basegfx::tools::createPolygonFromCircle(::basegfx::B2DPoint(1000.0, 0.0), 500.0));
172*b1cdbd2cSJim Jagielski 			if(aB2DPolygon.areControlPointsUsed())
173*b1cdbd2cSJim Jagielski 			{
174*b1cdbd2cSJim Jagielski 				aB2DPolygon = ::basegfx::tools::adaptiveSubdivideByAngle(aB2DPolygon);
175*b1cdbd2cSJim Jagielski 			}
176*b1cdbd2cSJim Jagielski 			p3DObj = new E3dLatheObj(mpView->Get3DDefaultAttributes(), ::basegfx::B2DPolyPolygon(aB2DPolygon));
177*b1cdbd2cSJim Jagielski 			break;
178*b1cdbd2cSJim Jagielski 		}
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski 		case SID_3D_CYLINDER:
181*b1cdbd2cSJim Jagielski 		{
182*b1cdbd2cSJim Jagielski 			::basegfx::B2DPolygon aInnerPoly;
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(0, 1000*5));
185*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(50*5, 1000*5));
186*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(100*5, 1000*5));
187*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(200*5, 1000*5));
188*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(300*5, 1000*5));
189*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(400*5, 1000*5));
190*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(450*5, 1000*5));
191*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(500*5, 1000*5));
192*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(500*5, -1000*5));
193*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(450*5, -1000*5));
194*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(400*5, -1000*5));
195*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(300*5, -1000*5));
196*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(200*5, -1000*5));
197*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(100*5, -1000*5));
198*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(50*5, -1000*5));
199*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(0*5, -1000*5));
200*b1cdbd2cSJim Jagielski 			aInnerPoly.setClosed(true);
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski 			p3DObj = new E3dLatheObj(mpView->Get3DDefaultAttributes(), ::basegfx::B2DPolyPolygon(aInnerPoly));
203*b1cdbd2cSJim Jagielski 			break;
204*b1cdbd2cSJim Jagielski 		}
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski 		case SID_3D_CONE:
207*b1cdbd2cSJim Jagielski 		{
208*b1cdbd2cSJim Jagielski 			::basegfx::B2DPolygon aInnerPoly;
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(0, -1000*5));
211*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(25*5, -900*5));
212*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(50*5, -800*5));
213*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(100*5, -600*5));
214*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(200*5, -200*5));
215*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(300*5, 200*5));
216*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(400*5, 600*5));
217*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(500*5, 1000*5));
218*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(400*5, 1000*5));
219*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(300*5, 1000*5));
220*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(200*5, 1000*5));
221*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(100*5, 1000*5));
222*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(50*5, 1000*5));
223*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(0*5, 1000*5));
224*b1cdbd2cSJim Jagielski 			aInnerPoly.setClosed(true);
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski 			p3DObj = new E3dLatheObj(mpView->Get3DDefaultAttributes(), ::basegfx::B2DPolyPolygon(aInnerPoly));
227*b1cdbd2cSJim Jagielski 			break;
228*b1cdbd2cSJim Jagielski 		}
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski 		case SID_3D_PYRAMID:
231*b1cdbd2cSJim Jagielski 		{
232*b1cdbd2cSJim Jagielski 			::basegfx::B2DPolygon aInnerPoly;
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(0, -1000*5));
235*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(25*5, -900*5));
236*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(50*5, -800*5));
237*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(100*5, -600*5));
238*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(200*5, -200*5));
239*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(300*5, 200*5));
240*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(400*5, 600*5));
241*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(500*5, 1000*5));
242*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(400*5, 1000*5));
243*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(300*5, 1000*5));
244*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(200*5, 1000*5));
245*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(100*5, 1000*5));
246*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(50*5, 1000*5));
247*b1cdbd2cSJim Jagielski 			aInnerPoly.append(::basegfx::B2DPoint(0, 1000*5));
248*b1cdbd2cSJim Jagielski 			aInnerPoly.setClosed(true);
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski 			p3DObj = new E3dLatheObj(mpView->Get3DDefaultAttributes(), ::basegfx::B2DPolyPolygon(aInnerPoly));
251*b1cdbd2cSJim Jagielski 			p3DObj->SetMergedItem(Svx3DHorizontalSegmentsItem(4));
252*b1cdbd2cSJim Jagielski 			break;
253*b1cdbd2cSJim Jagielski 		}
254*b1cdbd2cSJim Jagielski 	}
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski 	return p3DObj;
257*b1cdbd2cSJim Jagielski }
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski // #97016#
ImpPrepareBasic3DShape(E3dCompoundObject * p3DObj,E3dScene * pScene)260*b1cdbd2cSJim Jagielski void FuConstruct3dObject::ImpPrepareBasic3DShape(E3dCompoundObject* p3DObj, E3dScene *pScene)
261*b1cdbd2cSJim Jagielski {
262*b1cdbd2cSJim Jagielski 	Camera3D &aCamera  = (Camera3D&) pScene->GetCamera ();
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski 	// get transformed BoundVolume of the new object
265*b1cdbd2cSJim Jagielski 	basegfx::B3DRange aBoundVol;
266*b1cdbd2cSJim Jagielski 	basegfx::B3DRange aObjVol(p3DObj->GetBoundVolume());
267*b1cdbd2cSJim Jagielski 	aObjVol.transform(p3DObj->GetTransform());
268*b1cdbd2cSJim Jagielski 	aBoundVol.expand(aObjVol);
269*b1cdbd2cSJim Jagielski 	double fDeepth(aBoundVol.getDepth());
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski 	aCamera.SetPRP(::basegfx::B3DPoint(0.0, 0.0, 1000.0));
272*b1cdbd2cSJim Jagielski 	aCamera.SetPosition(::basegfx::B3DPoint(0.0, 0.0, mpView->GetDefaultCamPosZ() + fDeepth / 2));
273*b1cdbd2cSJim Jagielski 	aCamera.SetFocalLength(mpView->GetDefaultCamFocal());
274*b1cdbd2cSJim Jagielski 	pScene->SetCamera(aCamera);
275*b1cdbd2cSJim Jagielski 	basegfx::B3DHomMatrix aTransformation;
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski 	switch (nSlotId)
278*b1cdbd2cSJim Jagielski 	{
279*b1cdbd2cSJim Jagielski 		case SID_3D_CUBE:
280*b1cdbd2cSJim Jagielski 		{
281*b1cdbd2cSJim Jagielski 			aTransformation.rotate(DEG2RAD(20), 0.0, 0.0);
282*b1cdbd2cSJim Jagielski 		}
283*b1cdbd2cSJim Jagielski 		break;
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski 		case SID_3D_SPHERE:
286*b1cdbd2cSJim Jagielski 		{
287*b1cdbd2cSJim Jagielski //				pScene->RotateX(DEG2RAD(60));
288*b1cdbd2cSJim Jagielski 		}
289*b1cdbd2cSJim Jagielski 		break;
290*b1cdbd2cSJim Jagielski 
291*b1cdbd2cSJim Jagielski 		case SID_3D_SHELL:
292*b1cdbd2cSJim Jagielski 		case SID_3D_HALF_SPHERE:
293*b1cdbd2cSJim Jagielski 		{
294*b1cdbd2cSJim Jagielski 			aTransformation.rotate(DEG2RAD(200), 0.0, 0.0);
295*b1cdbd2cSJim Jagielski 		}
296*b1cdbd2cSJim Jagielski 		break;
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski 		case SID_3D_CYLINDER:
299*b1cdbd2cSJim Jagielski 		case SID_3D_CONE:
300*b1cdbd2cSJim Jagielski 		case SID_3D_PYRAMID:
301*b1cdbd2cSJim Jagielski 		{
302*b1cdbd2cSJim Jagielski //				pScene->RotateX(DEG2RAD(25));
303*b1cdbd2cSJim Jagielski 		}
304*b1cdbd2cSJim Jagielski 		break;
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski 		case SID_3D_TORUS:
307*b1cdbd2cSJim Jagielski 		{
308*b1cdbd2cSJim Jagielski //				pScene->RotateX(DEG2RAD(15));
309*b1cdbd2cSJim Jagielski 			aTransformation.rotate(DEG2RAD(90), 0.0, 0.0);
310*b1cdbd2cSJim Jagielski 		}
311*b1cdbd2cSJim Jagielski 		break;
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski 		default:
314*b1cdbd2cSJim Jagielski 		{
315*b1cdbd2cSJim Jagielski 		}
316*b1cdbd2cSJim Jagielski 		break;
317*b1cdbd2cSJim Jagielski 	}
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski 	pScene->SetTransform(aTransformation * pScene->GetTransform());
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski 	SfxItemSet aAttr (mpViewShell->GetPool());
322*b1cdbd2cSJim Jagielski 	pScene->SetMergedItemSetAndBroadcast(aAttr);
323*b1cdbd2cSJim Jagielski }
324*b1cdbd2cSJim Jagielski 
MouseButtonDown(const MouseEvent & rMEvt)325*b1cdbd2cSJim Jagielski sal_Bool FuConstruct3dObject::MouseButtonDown(const MouseEvent& rMEvt)
326*b1cdbd2cSJim Jagielski {
327*b1cdbd2cSJim Jagielski 	sal_Bool bReturn = FuConstruct::MouseButtonDown(rMEvt);
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski 	if ( rMEvt.IsLeft() && !mpView->IsAction() )
330*b1cdbd2cSJim Jagielski 	{
331*b1cdbd2cSJim Jagielski 		Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski 		mpWindow->CaptureMouse();
334*b1cdbd2cSJim Jagielski 		sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski 		E3dCompoundObject* p3DObj = NULL;
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski 		WaitObject aWait( (Window*)mpViewShell->GetActiveWindow() );
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski 		// #97016#
341*b1cdbd2cSJim Jagielski 		p3DObj = ImpCreateBasic3DShape();
342*b1cdbd2cSJim Jagielski 		E3dScene* pScene = mpView->SetCurrent3DObj(p3DObj);
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski 		// #97016#
345*b1cdbd2cSJim Jagielski 		ImpPrepareBasic3DShape(p3DObj, pScene);
346*b1cdbd2cSJim Jagielski 		bReturn = mpView->BegCreatePreparedObject(aPnt, nDrgLog, pScene);
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski 		SdrObject* pObj = mpView->GetCreateObj();
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski 		if (pObj)
351*b1cdbd2cSJim Jagielski 		{
352*b1cdbd2cSJim Jagielski 			SfxItemSet aAttr(mpDoc->GetPool());
353*b1cdbd2cSJim Jagielski 			SetStyleSheet(aAttr, pObj);
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski 			// LineStyle rausnehmen
356*b1cdbd2cSJim Jagielski 			aAttr.Put(XLineStyleItem (XLINE_NONE));
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski 			pObj->SetMergedItemSet(aAttr);
359*b1cdbd2cSJim Jagielski 		}
360*b1cdbd2cSJim Jagielski 	}
361*b1cdbd2cSJim Jagielski 
362*b1cdbd2cSJim Jagielski 	return bReturn;
363*b1cdbd2cSJim Jagielski }
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski /*************************************************************************
366*b1cdbd2cSJim Jagielski |*
367*b1cdbd2cSJim Jagielski |* MouseMove-event
368*b1cdbd2cSJim Jagielski |*
369*b1cdbd2cSJim Jagielski \************************************************************************/
370*b1cdbd2cSJim Jagielski 
MouseMove(const MouseEvent & rMEvt)371*b1cdbd2cSJim Jagielski sal_Bool FuConstruct3dObject::MouseMove(const MouseEvent& rMEvt)
372*b1cdbd2cSJim Jagielski {
373*b1cdbd2cSJim Jagielski 	return FuConstruct::MouseMove(rMEvt);
374*b1cdbd2cSJim Jagielski }
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski /*************************************************************************
377*b1cdbd2cSJim Jagielski |*
378*b1cdbd2cSJim Jagielski |* MouseButtonUp-event
379*b1cdbd2cSJim Jagielski |*
380*b1cdbd2cSJim Jagielski \************************************************************************/
381*b1cdbd2cSJim Jagielski 
MouseButtonUp(const MouseEvent & rMEvt)382*b1cdbd2cSJim Jagielski sal_Bool FuConstruct3dObject::MouseButtonUp(const MouseEvent& rMEvt)
383*b1cdbd2cSJim Jagielski {
384*b1cdbd2cSJim Jagielski 	sal_Bool bReturn = sal_False;
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski 	if ( mpView->IsCreateObj() && rMEvt.IsLeft() )
387*b1cdbd2cSJim Jagielski 	{
388*b1cdbd2cSJim Jagielski 		Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
389*b1cdbd2cSJim Jagielski 		mpView->EndCreateObj(SDRCREATE_FORCEEND);
390*b1cdbd2cSJim Jagielski 		bReturn = sal_True;
391*b1cdbd2cSJim Jagielski 	}
392*b1cdbd2cSJim Jagielski 
393*b1cdbd2cSJim Jagielski 	bReturn = FuConstruct::MouseButtonUp(rMEvt) || bReturn;
394*b1cdbd2cSJim Jagielski 
395*b1cdbd2cSJim Jagielski 	if (!bPermanent)
396*b1cdbd2cSJim Jagielski 		mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON);
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski 	return bReturn;
399*b1cdbd2cSJim Jagielski }
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski /*************************************************************************
402*b1cdbd2cSJim Jagielski |*
403*b1cdbd2cSJim Jagielski |* Tastaturereignisse bearbeiten
404*b1cdbd2cSJim Jagielski |*
405*b1cdbd2cSJim Jagielski |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls
406*b1cdbd2cSJim Jagielski |* sal_False.
407*b1cdbd2cSJim Jagielski |*
408*b1cdbd2cSJim Jagielski \************************************************************************/
409*b1cdbd2cSJim Jagielski 
KeyInput(const KeyEvent & rKEvt)410*b1cdbd2cSJim Jagielski sal_Bool FuConstruct3dObject::KeyInput(const KeyEvent& rKEvt)
411*b1cdbd2cSJim Jagielski {
412*b1cdbd2cSJim Jagielski 	return( FuConstruct::KeyInput(rKEvt) );
413*b1cdbd2cSJim Jagielski }
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski /*************************************************************************
416*b1cdbd2cSJim Jagielski |*
417*b1cdbd2cSJim Jagielski |* Function aktivieren
418*b1cdbd2cSJim Jagielski |*
419*b1cdbd2cSJim Jagielski \************************************************************************/
420*b1cdbd2cSJim Jagielski 
Activate()421*b1cdbd2cSJim Jagielski void FuConstruct3dObject::Activate()
422*b1cdbd2cSJim Jagielski {
423*b1cdbd2cSJim Jagielski 	mpView->SetCurrentObj(OBJ_NONE);
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski 	FuConstruct::Activate();
426*b1cdbd2cSJim Jagielski }
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski /*************************************************************************
429*b1cdbd2cSJim Jagielski |*
430*b1cdbd2cSJim Jagielski |* Function deaktivieren
431*b1cdbd2cSJim Jagielski |*
432*b1cdbd2cSJim Jagielski \************************************************************************/
433*b1cdbd2cSJim Jagielski 
Deactivate()434*b1cdbd2cSJim Jagielski void FuConstruct3dObject::Deactivate()
435*b1cdbd2cSJim Jagielski {
436*b1cdbd2cSJim Jagielski 	FuConstruct::Deactivate();
437*b1cdbd2cSJim Jagielski }
438*b1cdbd2cSJim Jagielski 
439*b1cdbd2cSJim Jagielski // #97016#
CreateDefaultObject(const sal_uInt16 nID,const Rectangle & rRectangle)440*b1cdbd2cSJim Jagielski SdrObject* FuConstruct3dObject::CreateDefaultObject(const sal_uInt16 nID, const Rectangle& rRectangle)
441*b1cdbd2cSJim Jagielski {
442*b1cdbd2cSJim Jagielski 	// case SID_3D_CUBE:
443*b1cdbd2cSJim Jagielski 	// case SID_3D_SHELL:
444*b1cdbd2cSJim Jagielski 	// case SID_3D_SPHERE:
445*b1cdbd2cSJim Jagielski 	// case SID_3D_TORUS:
446*b1cdbd2cSJim Jagielski 	// case SID_3D_HALF_SPHERE:
447*b1cdbd2cSJim Jagielski 	// case SID_3D_CYLINDER:
448*b1cdbd2cSJim Jagielski 	// case SID_3D_CONE:
449*b1cdbd2cSJim Jagielski 	// case SID_3D_PYRAMID:
450*b1cdbd2cSJim Jagielski 
451*b1cdbd2cSJim Jagielski 	E3dCompoundObject* p3DObj = ImpCreateBasic3DShape();
452*b1cdbd2cSJim Jagielski 
453*b1cdbd2cSJim Jagielski 	// E3dView::SetCurrent3DObj part
454*b1cdbd2cSJim Jagielski 	// get transformed BoundVolume of the object
455*b1cdbd2cSJim Jagielski 	basegfx::B3DRange aObjVol(p3DObj->GetBoundVolume());
456*b1cdbd2cSJim Jagielski 	aObjVol.transform(p3DObj->GetTransform());
457*b1cdbd2cSJim Jagielski 	basegfx::B3DRange aVolume(aObjVol);
458*b1cdbd2cSJim Jagielski 	double fW(aVolume.getWidth());
459*b1cdbd2cSJim Jagielski 	double fH(aVolume.getHeight());
460*b1cdbd2cSJim Jagielski 	Rectangle a3DRect(0, 0, (long)fW, (long)fH);
461*b1cdbd2cSJim Jagielski 	E3dScene* pScene = new E3dPolyScene(mpView->Get3DDefaultAttributes());
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski 	// mpView->InitScene(pScene, fW, fH, aVolume.MaxVec().Z() + ((fW + fH) / 4.0));
464*b1cdbd2cSJim Jagielski 	// copied code from E3dView::InitScene
465*b1cdbd2cSJim Jagielski 	double fCamZ(aVolume.getMaxZ() + ((fW + fH) / 4.0));
466*b1cdbd2cSJim Jagielski 	Camera3D aCam(pScene->GetCamera());
467*b1cdbd2cSJim Jagielski 	aCam.SetAutoAdjustProjection(sal_False);
468*b1cdbd2cSJim Jagielski 	aCam.SetViewWindow(- fW / 2, - fH / 2, fW, fH);
469*b1cdbd2cSJim Jagielski 	::basegfx::B3DPoint aLookAt;
470*b1cdbd2cSJim Jagielski 	double fDefaultCamPosZ = mpView->GetDefaultCamPosZ();
471*b1cdbd2cSJim Jagielski 	::basegfx::B3DPoint aCamPos(0.0, 0.0, fCamZ < fDefaultCamPosZ ? fDefaultCamPosZ : fCamZ);
472*b1cdbd2cSJim Jagielski 	aCam.SetPosAndLookAt(aCamPos, aLookAt);
473*b1cdbd2cSJim Jagielski 	aCam.SetFocalLength(mpView->GetDefaultCamFocal());
474*b1cdbd2cSJim Jagielski 	aCam.SetDefaults(::basegfx::B3DPoint(0.0, 0.0, fDefaultCamPosZ), aLookAt, mpView->GetDefaultCamFocal());
475*b1cdbd2cSJim Jagielski 	pScene->SetCamera(aCam);
476*b1cdbd2cSJim Jagielski 
477*b1cdbd2cSJim Jagielski 	pScene->Insert3DObj(p3DObj);
478*b1cdbd2cSJim Jagielski 	pScene->NbcSetSnapRect(a3DRect);
479*b1cdbd2cSJim Jagielski 	pScene->SetModel(mpDoc);
480*b1cdbd2cSJim Jagielski 
481*b1cdbd2cSJim Jagielski 	ImpPrepareBasic3DShape(p3DObj, pScene);
482*b1cdbd2cSJim Jagielski 
483*b1cdbd2cSJim Jagielski 	SfxItemSet aAttr(mpDoc->GetPool());
484*b1cdbd2cSJim Jagielski 	SetStyleSheet(aAttr, p3DObj);
485*b1cdbd2cSJim Jagielski 	aAttr.Put(XLineStyleItem (XLINE_NONE));
486*b1cdbd2cSJim Jagielski 	p3DObj->SetMergedItemSet(aAttr);
487*b1cdbd2cSJim Jagielski 
488*b1cdbd2cSJim Jagielski 	// make object interactive at once
489*b1cdbd2cSJim Jagielski 	pScene->SetRectsDirty();
490*b1cdbd2cSJim Jagielski 
491*b1cdbd2cSJim Jagielski 	// Take care of restrictions for the rectangle
492*b1cdbd2cSJim Jagielski 	Rectangle aRect(rRectangle);
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski 	switch(nID)
495*b1cdbd2cSJim Jagielski 	{
496*b1cdbd2cSJim Jagielski 		case SID_3D_CUBE:
497*b1cdbd2cSJim Jagielski 		case SID_3D_SPHERE:
498*b1cdbd2cSJim Jagielski 		case SID_3D_TORUS:
499*b1cdbd2cSJim Jagielski 		{
500*b1cdbd2cSJim Jagielski 			// force quadratic
501*b1cdbd2cSJim Jagielski 			ImpForceQuadratic(aRect);
502*b1cdbd2cSJim Jagielski 			break;
503*b1cdbd2cSJim Jagielski 		}
504*b1cdbd2cSJim Jagielski 
505*b1cdbd2cSJim Jagielski 		case SID_3D_SHELL:
506*b1cdbd2cSJim Jagielski 		case SID_3D_HALF_SPHERE:
507*b1cdbd2cSJim Jagielski 		{
508*b1cdbd2cSJim Jagielski 			// force horizontal layout
509*b1cdbd2cSJim Jagielski 			break;
510*b1cdbd2cSJim Jagielski 		}
511*b1cdbd2cSJim Jagielski 
512*b1cdbd2cSJim Jagielski 		case SID_3D_CYLINDER:
513*b1cdbd2cSJim Jagielski 		case SID_3D_CONE:
514*b1cdbd2cSJim Jagielski 		case SID_3D_PYRAMID:
515*b1cdbd2cSJim Jagielski 		{
516*b1cdbd2cSJim Jagielski 			// force vertical layout
517*b1cdbd2cSJim Jagielski 			break;
518*b1cdbd2cSJim Jagielski 		}
519*b1cdbd2cSJim Jagielski 	}
520*b1cdbd2cSJim Jagielski 
521*b1cdbd2cSJim Jagielski 	// #97016#, #98245# use changed rectangle, not original one
522*b1cdbd2cSJim Jagielski 	pScene->SetLogicRect(aRect);
523*b1cdbd2cSJim Jagielski 
524*b1cdbd2cSJim Jagielski 	return pScene;
525*b1cdbd2cSJim Jagielski }
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski } // end of namespace sd
528