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