xref: /trunk/main/tools/source/generic/b3dtrans.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1*89b56da7SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*89b56da7SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*89b56da7SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*89b56da7SAndrew Rist  * distributed with this work for additional information
6*89b56da7SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*89b56da7SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*89b56da7SAndrew Rist  * "License"); you may not use this file except in compliance
9*89b56da7SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*89b56da7SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*89b56da7SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*89b56da7SAndrew Rist  * software distributed under the License is distributed on an
15*89b56da7SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*89b56da7SAndrew Rist  * KIND, either express or implied.  See the License for the
17*89b56da7SAndrew Rist  * specific language governing permissions and limitations
18*89b56da7SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*89b56da7SAndrew Rist  *************************************************************/
21*89b56da7SAndrew Rist 
22*89b56da7SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_tools.hxx"
26cdf0e10cSrcweir #include <tools/b3dtrans.hxx>
27cdf0e10cSrcweir #include <tools/debug.hxx>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir /*************************************************************************
30cdf0e10cSrcweir |*
31cdf0e10cSrcweir |* Transformationen fuer alle 3D Ausgaben
32cdf0e10cSrcweir |*
33cdf0e10cSrcweir \************************************************************************/
34cdf0e10cSrcweir 
B3dTransformationSet()35cdf0e10cSrcweir B3dTransformationSet::B3dTransformationSet()
36cdf0e10cSrcweir {
37cdf0e10cSrcweir     Reset();
38cdf0e10cSrcweir }
39cdf0e10cSrcweir 
~B3dTransformationSet()40cdf0e10cSrcweir B3dTransformationSet::~B3dTransformationSet()
41cdf0e10cSrcweir {
42cdf0e10cSrcweir }
43cdf0e10cSrcweir 
Orientation(basegfx::B3DHomMatrix & rTarget,basegfx::B3DPoint aVRP,basegfx::B3DVector aVPN,basegfx::B3DVector aVUP)44cdf0e10cSrcweir void B3dTransformationSet::Orientation(basegfx::B3DHomMatrix& rTarget, basegfx::B3DPoint aVRP, basegfx::B3DVector aVPN, basegfx::B3DVector aVUP)
45cdf0e10cSrcweir {
46cdf0e10cSrcweir     rTarget.translate( -aVRP.getX(), -aVRP.getY(), -aVRP.getZ());
47cdf0e10cSrcweir     aVUP.normalize();
48cdf0e10cSrcweir     aVPN.normalize();
49cdf0e10cSrcweir     basegfx::B3DVector aRx(aVUP);
50cdf0e10cSrcweir     basegfx::B3DVector aRy(aVPN);
51cdf0e10cSrcweir     aRx = aRx.getPerpendicular(aRy);
52cdf0e10cSrcweir     aRx.normalize();
53cdf0e10cSrcweir     aRy = aRy.getPerpendicular(aRx);
54cdf0e10cSrcweir     aRy.normalize();
55cdf0e10cSrcweir     basegfx::B3DHomMatrix aTemp;
56cdf0e10cSrcweir     aTemp.set(0, 0, aRx.getX());
57cdf0e10cSrcweir     aTemp.set(0, 1, aRx.getY());
58cdf0e10cSrcweir     aTemp.set(0, 2, aRx.getZ());
59cdf0e10cSrcweir     aTemp.set(1, 0, aRy.getX());
60cdf0e10cSrcweir     aTemp.set(1, 1, aRy.getY());
61cdf0e10cSrcweir     aTemp.set(1, 2, aRy.getZ());
62cdf0e10cSrcweir     aTemp.set(2, 0, aVPN.getX());
63cdf0e10cSrcweir     aTemp.set(2, 1, aVPN.getY());
64cdf0e10cSrcweir     aTemp.set(2, 2, aVPN.getZ());
65cdf0e10cSrcweir     rTarget *= aTemp;
66cdf0e10cSrcweir }
67cdf0e10cSrcweir 
Frustum(basegfx::B3DHomMatrix & rTarget,double fLeft,double fRight,double fBottom,double fTop,double fNear,double fFar)68cdf0e10cSrcweir void B3dTransformationSet::Frustum(basegfx::B3DHomMatrix& rTarget, double fLeft, double fRight, double fBottom, double fTop, double fNear, double fFar)
69cdf0e10cSrcweir {
70cdf0e10cSrcweir     if(!(fNear > 0.0))
71cdf0e10cSrcweir     {
72cdf0e10cSrcweir         fNear = 0.001;
73cdf0e10cSrcweir     }
74cdf0e10cSrcweir     if(!(fFar > 0.0))
75cdf0e10cSrcweir     {
76cdf0e10cSrcweir         fFar = 1.0;
77cdf0e10cSrcweir     }
78cdf0e10cSrcweir     if(fNear == fFar)
79cdf0e10cSrcweir     {
80cdf0e10cSrcweir         fFar = fNear + 1.0;
81cdf0e10cSrcweir     }
82cdf0e10cSrcweir     if(fLeft == fRight)
83cdf0e10cSrcweir     {
84cdf0e10cSrcweir         fLeft -= 1.0;
85cdf0e10cSrcweir         fRight += 1.0;
86cdf0e10cSrcweir     }
87cdf0e10cSrcweir     if(fTop == fBottom)
88cdf0e10cSrcweir     {
89cdf0e10cSrcweir         fBottom -= 1.0;
90cdf0e10cSrcweir         fTop += 1.0;
91cdf0e10cSrcweir     }
92cdf0e10cSrcweir     basegfx::B3DHomMatrix aTemp;
93cdf0e10cSrcweir 
94cdf0e10cSrcweir     aTemp.set(0, 0, 2.0 * fNear / (fRight - fLeft));
95cdf0e10cSrcweir     aTemp.set(1, 1, 2.0 * fNear / (fTop - fBottom));
96cdf0e10cSrcweir     aTemp.set(0, 2, (fRight + fLeft) / (fRight - fLeft));
97cdf0e10cSrcweir     aTemp.set(1, 2, (fTop + fBottom) / (fTop - fBottom));
98cdf0e10cSrcweir     aTemp.set(2, 2, -1.0 * ((fFar + fNear) / (fFar - fNear)));
99cdf0e10cSrcweir     aTemp.set(3, 2, -1.0);
100cdf0e10cSrcweir     aTemp.set(2, 3, -1.0 * ((2.0 * fFar * fNear) / (fFar - fNear)));
101cdf0e10cSrcweir     aTemp.set(3, 3, 0.0);
102cdf0e10cSrcweir 
103cdf0e10cSrcweir     rTarget *= aTemp;
104cdf0e10cSrcweir }
105cdf0e10cSrcweir 
Ortho(basegfx::B3DHomMatrix & rTarget,double fLeft,double fRight,double fBottom,double fTop,double fNear,double fFar)106cdf0e10cSrcweir void B3dTransformationSet::Ortho(basegfx::B3DHomMatrix& rTarget, double fLeft, double fRight, double fBottom, double fTop, double fNear, double fFar)
107cdf0e10cSrcweir {
108cdf0e10cSrcweir     if(fNear == fFar)
109cdf0e10cSrcweir     {
110cdf0e10cSrcweir         DBG_ERROR("Near and far clipping plane in Ortho definition are identical");
111cdf0e10cSrcweir         fFar = fNear + 1.0;
112cdf0e10cSrcweir     }
113cdf0e10cSrcweir     if(fLeft == fRight)
114cdf0e10cSrcweir     {
115cdf0e10cSrcweir         DBG_ERROR("Left and right in Ortho definition are identical");
116cdf0e10cSrcweir         fLeft -= 1.0;
117cdf0e10cSrcweir         fRight += 1.0;
118cdf0e10cSrcweir     }
119cdf0e10cSrcweir     if(fTop == fBottom)
120cdf0e10cSrcweir     {
121cdf0e10cSrcweir         DBG_ERROR("Top and bottom in Ortho definition are identical");
122cdf0e10cSrcweir         fBottom -= 1.0;
123cdf0e10cSrcweir         fTop += 1.0;
124cdf0e10cSrcweir     }
125cdf0e10cSrcweir     basegfx::B3DHomMatrix aTemp;
126cdf0e10cSrcweir 
127cdf0e10cSrcweir     aTemp.set(0, 0, 2.0 / (fRight - fLeft));
128cdf0e10cSrcweir     aTemp.set(1, 1, 2.0 / (fTop - fBottom));
129cdf0e10cSrcweir     aTemp.set(2, 2, -1.0 * (2.0 / (fFar - fNear)));
130cdf0e10cSrcweir     aTemp.set(0, 3, -1.0 * ((fRight + fLeft) / (fRight - fLeft)));
131cdf0e10cSrcweir     aTemp.set(1, 3, -1.0 * ((fTop + fBottom) / (fTop - fBottom)));
132cdf0e10cSrcweir     aTemp.set(2, 3, -1.0 * ((fFar + fNear) / (fFar - fNear)));
133cdf0e10cSrcweir 
134cdf0e10cSrcweir     rTarget *= aTemp;
135cdf0e10cSrcweir }
136cdf0e10cSrcweir 
137cdf0e10cSrcweir /*************************************************************************
138cdf0e10cSrcweir |*
139cdf0e10cSrcweir |* Reset der Werte
140cdf0e10cSrcweir |*
141cdf0e10cSrcweir \************************************************************************/
142cdf0e10cSrcweir 
Reset()143cdf0e10cSrcweir void B3dTransformationSet::Reset()
144cdf0e10cSrcweir {
145cdf0e10cSrcweir     // Matritzen auf Einheitsmatritzen
146cdf0e10cSrcweir     maObjectTrans.identity();
147cdf0e10cSrcweir     PostSetObjectTrans();
148cdf0e10cSrcweir 
149cdf0e10cSrcweir     Orientation(maOrientation);
150cdf0e10cSrcweir     PostSetOrientation();
151cdf0e10cSrcweir 
152cdf0e10cSrcweir     maTexture.identity();
153cdf0e10cSrcweir 
154cdf0e10cSrcweir     mfLeftBound = mfBottomBound = -1.0;
155cdf0e10cSrcweir     mfRightBound = mfTopBound = 1.0;
156cdf0e10cSrcweir     mfNearBound = 0.001;
157cdf0e10cSrcweir     mfFarBound = 1.001;
158cdf0e10cSrcweir 
159cdf0e10cSrcweir     meRatio = Base3DRatioGrow;
160cdf0e10cSrcweir     mfRatio = 0.0;
161cdf0e10cSrcweir 
162cdf0e10cSrcweir     maViewportRectangle = Rectangle(-1, -1, 2, 2);
163cdf0e10cSrcweir     maVisibleRectangle = maViewportRectangle;
164cdf0e10cSrcweir 
165cdf0e10cSrcweir     mbPerspective = sal_True;
166cdf0e10cSrcweir 
167cdf0e10cSrcweir     mbProjectionValid = sal_False;
168cdf0e10cSrcweir     mbObjectToDeviceValid = sal_False;
169cdf0e10cSrcweir     mbWorldToViewValid = sal_False;
170cdf0e10cSrcweir 
171cdf0e10cSrcweir     CalcViewport();
172cdf0e10cSrcweir }
173cdf0e10cSrcweir 
174cdf0e10cSrcweir /*************************************************************************
175cdf0e10cSrcweir |*
176cdf0e10cSrcweir |* Objekttransformation
177cdf0e10cSrcweir |*
178cdf0e10cSrcweir \************************************************************************/
179cdf0e10cSrcweir 
SetObjectTrans(const basegfx::B3DHomMatrix & rObj)180cdf0e10cSrcweir void B3dTransformationSet::SetObjectTrans(const basegfx::B3DHomMatrix& rObj)
181cdf0e10cSrcweir {
182cdf0e10cSrcweir     maObjectTrans = rObj;
183cdf0e10cSrcweir 
184cdf0e10cSrcweir     mbObjectToDeviceValid = sal_False;
185cdf0e10cSrcweir     mbInvTransObjectToEyeValid = sal_False;
186cdf0e10cSrcweir 
187cdf0e10cSrcweir     PostSetObjectTrans();
188cdf0e10cSrcweir }
189cdf0e10cSrcweir 
PostSetObjectTrans()190cdf0e10cSrcweir void B3dTransformationSet::PostSetObjectTrans()
191cdf0e10cSrcweir {
192cdf0e10cSrcweir     // Zuweisen und Inverse bestimmen
193cdf0e10cSrcweir     maInvObjectTrans = maObjectTrans;
194cdf0e10cSrcweir     maInvObjectTrans.invert();
195cdf0e10cSrcweir }
196cdf0e10cSrcweir 
197cdf0e10cSrcweir /*************************************************************************
198cdf0e10cSrcweir |*
199cdf0e10cSrcweir |* Orientierungstransformation
200cdf0e10cSrcweir |*
201cdf0e10cSrcweir \************************************************************************/
202cdf0e10cSrcweir 
SetOrientation(basegfx::B3DPoint aVRP,basegfx::B3DVector aVPN,basegfx::B3DVector aVUP)203cdf0e10cSrcweir void B3dTransformationSet::SetOrientation( basegfx::B3DPoint aVRP, basegfx::B3DVector aVPN, basegfx::B3DVector aVUP)
204cdf0e10cSrcweir {
205cdf0e10cSrcweir     maOrientation.identity();
206cdf0e10cSrcweir     Orientation(maOrientation, aVRP, aVPN, aVUP);
207cdf0e10cSrcweir 
208cdf0e10cSrcweir     mbInvTransObjectToEyeValid = sal_False;
209cdf0e10cSrcweir     mbObjectToDeviceValid = sal_False;
210cdf0e10cSrcweir     mbWorldToViewValid = sal_False;
211cdf0e10cSrcweir 
212cdf0e10cSrcweir     PostSetOrientation();
213cdf0e10cSrcweir }
214cdf0e10cSrcweir 
SetOrientation(basegfx::B3DHomMatrix & mOrient)215cdf0e10cSrcweir void B3dTransformationSet::SetOrientation(basegfx::B3DHomMatrix& mOrient)
216cdf0e10cSrcweir {
217cdf0e10cSrcweir     maOrientation = mOrient;
218cdf0e10cSrcweir 
219cdf0e10cSrcweir     mbInvTransObjectToEyeValid = sal_False;
220cdf0e10cSrcweir     mbObjectToDeviceValid = sal_False;
221cdf0e10cSrcweir     mbWorldToViewValid = sal_False;
222cdf0e10cSrcweir 
223cdf0e10cSrcweir     PostSetOrientation();
224cdf0e10cSrcweir }
225cdf0e10cSrcweir 
PostSetOrientation()226cdf0e10cSrcweir void B3dTransformationSet::PostSetOrientation()
227cdf0e10cSrcweir {
228cdf0e10cSrcweir     // Zuweisen und Inverse bestimmen
229cdf0e10cSrcweir     maInvOrientation = maOrientation;
230cdf0e10cSrcweir     maInvOrientation.invert();
231cdf0e10cSrcweir }
232cdf0e10cSrcweir 
233cdf0e10cSrcweir /*************************************************************************
234cdf0e10cSrcweir |*
235cdf0e10cSrcweir |* Projektionstransformation
236cdf0e10cSrcweir |*
237cdf0e10cSrcweir \************************************************************************/
238cdf0e10cSrcweir 
SetProjection(const basegfx::B3DHomMatrix & mProject)239cdf0e10cSrcweir void B3dTransformationSet::SetProjection(const basegfx::B3DHomMatrix& mProject)
240cdf0e10cSrcweir {
241cdf0e10cSrcweir     maProjection = mProject;
242cdf0e10cSrcweir     PostSetProjection();
243cdf0e10cSrcweir }
244cdf0e10cSrcweir 
GetProjection()245cdf0e10cSrcweir const basegfx::B3DHomMatrix& B3dTransformationSet::GetProjection()
246cdf0e10cSrcweir {
247cdf0e10cSrcweir     if(!mbProjectionValid)
248cdf0e10cSrcweir         CalcViewport();
249cdf0e10cSrcweir     return maProjection;
250cdf0e10cSrcweir }
251cdf0e10cSrcweir 
GetInvProjection()252cdf0e10cSrcweir const basegfx::B3DHomMatrix& B3dTransformationSet::GetInvProjection()
253cdf0e10cSrcweir {
254cdf0e10cSrcweir     if(!mbProjectionValid)
255cdf0e10cSrcweir         CalcViewport();
256cdf0e10cSrcweir     return maInvProjection;
257cdf0e10cSrcweir }
258cdf0e10cSrcweir 
PostSetProjection()259cdf0e10cSrcweir void B3dTransformationSet::PostSetProjection()
260cdf0e10cSrcweir {
261cdf0e10cSrcweir     // Zuweisen und Inverse bestimmen
262cdf0e10cSrcweir     maInvProjection = GetProjection();
263cdf0e10cSrcweir     maInvProjection.invert();
264cdf0e10cSrcweir 
265cdf0e10cSrcweir     // Abhaengige Matritzen invalidieren
266cdf0e10cSrcweir     mbObjectToDeviceValid = sal_False;
267cdf0e10cSrcweir     mbWorldToViewValid = sal_False;
268cdf0e10cSrcweir }
269cdf0e10cSrcweir 
270cdf0e10cSrcweir /*************************************************************************
271cdf0e10cSrcweir |*
272cdf0e10cSrcweir |* Texturtransformation
273cdf0e10cSrcweir |*
274cdf0e10cSrcweir \************************************************************************/
275cdf0e10cSrcweir 
SetTexture(const basegfx::B2DHomMatrix & rTxt)276cdf0e10cSrcweir void B3dTransformationSet::SetTexture(const basegfx::B2DHomMatrix& rTxt)
277cdf0e10cSrcweir {
278cdf0e10cSrcweir     maTexture = rTxt;
279cdf0e10cSrcweir     PostSetTexture();
280cdf0e10cSrcweir }
281cdf0e10cSrcweir 
PostSetTexture()282cdf0e10cSrcweir void B3dTransformationSet::PostSetTexture()
283cdf0e10cSrcweir {
284cdf0e10cSrcweir }
285cdf0e10cSrcweir 
286cdf0e10cSrcweir /*************************************************************************
287cdf0e10cSrcweir |*
288cdf0e10cSrcweir |* Viewport-Transformation
289cdf0e10cSrcweir |*
290cdf0e10cSrcweir \************************************************************************/
291cdf0e10cSrcweir 
CalcViewport()292cdf0e10cSrcweir void B3dTransformationSet::CalcViewport()
293cdf0e10cSrcweir {
294cdf0e10cSrcweir     // Faktoren fuer die Projektion
295cdf0e10cSrcweir     double fLeft(mfLeftBound);
296cdf0e10cSrcweir     double fRight(mfRightBound);
297cdf0e10cSrcweir     double fBottom(mfBottomBound);
298cdf0e10cSrcweir     double fTop(mfTopBound);
299cdf0e10cSrcweir 
300cdf0e10cSrcweir     // Soll das Seitenverhaeltnis Beachtung finden?
301cdf0e10cSrcweir     // Falls ja, Bereich der Projektion an Seitenverhaeltnis anpassen
302cdf0e10cSrcweir     if(GetRatio() != 0.0)
303cdf0e10cSrcweir     {
304cdf0e10cSrcweir         // Berechne aktuelles Seitenverhaeltnis der Bounds
305cdf0e10cSrcweir         double fBoundWidth = (double)(maViewportRectangle.GetWidth() + 1);
306cdf0e10cSrcweir         double fBoundHeight = (double)(maViewportRectangle.GetHeight() + 1);
307cdf0e10cSrcweir         double fActRatio = 1;
308cdf0e10cSrcweir         double fFactor;
309cdf0e10cSrcweir 
310cdf0e10cSrcweir         if(fBoundWidth != 0.0)
311cdf0e10cSrcweir             fActRatio = fBoundHeight / fBoundWidth;
312cdf0e10cSrcweir         // FIXME   else in this case has a lot of problems,  should this return.
313cdf0e10cSrcweir 
314cdf0e10cSrcweir         switch(meRatio)
315cdf0e10cSrcweir         {
316cdf0e10cSrcweir             case Base3DRatioShrink :
317cdf0e10cSrcweir             {
318cdf0e10cSrcweir                 // Kleineren Teil vergroessern
319cdf0e10cSrcweir                 if(fActRatio > mfRatio)
320cdf0e10cSrcweir                 {
321cdf0e10cSrcweir                     // X vergroessern
322cdf0e10cSrcweir                     fFactor = 1.0 / fActRatio;
323cdf0e10cSrcweir                     fRight  *= fFactor;
324cdf0e10cSrcweir                     fLeft *= fFactor;
325cdf0e10cSrcweir                 }
326cdf0e10cSrcweir                 else
327cdf0e10cSrcweir                 {
328cdf0e10cSrcweir                     // Y vergroessern
329cdf0e10cSrcweir                     fFactor = fActRatio;
330cdf0e10cSrcweir                     fTop *= fFactor;
331cdf0e10cSrcweir                     fBottom *= fFactor;
332cdf0e10cSrcweir                 }
333cdf0e10cSrcweir                 break;
334cdf0e10cSrcweir             }
335cdf0e10cSrcweir             case Base3DRatioGrow :
336cdf0e10cSrcweir             {
337cdf0e10cSrcweir                 // GroesserenTeil verkleinern
338cdf0e10cSrcweir                 if(fActRatio > mfRatio)
339cdf0e10cSrcweir                 {
340cdf0e10cSrcweir                     // Y verkleinern
341cdf0e10cSrcweir                     fFactor = fActRatio;
342cdf0e10cSrcweir                     fTop *= fFactor;
343cdf0e10cSrcweir                     fBottom *= fFactor;
344cdf0e10cSrcweir                 }
345cdf0e10cSrcweir                 else
346cdf0e10cSrcweir                 {
347cdf0e10cSrcweir                     // X verkleinern
348cdf0e10cSrcweir                     fFactor = 1.0 / fActRatio;
349cdf0e10cSrcweir                     fRight  *= fFactor;
350cdf0e10cSrcweir                     fLeft *= fFactor;
351cdf0e10cSrcweir                 }
352cdf0e10cSrcweir                 break;
353cdf0e10cSrcweir             }
354cdf0e10cSrcweir             case Base3DRatioMiddle :
355cdf0e10cSrcweir             {
356cdf0e10cSrcweir                 // Mitteln
357cdf0e10cSrcweir                 fFactor = ((1.0 / fActRatio) + 1.0) / 2.0;
358cdf0e10cSrcweir                 fRight *= fFactor;
359cdf0e10cSrcweir                 fLeft *= fFactor;
360cdf0e10cSrcweir                 fFactor = (fActRatio + 1.0) / 2.0;
361cdf0e10cSrcweir                 fTop *= fFactor;
362cdf0e10cSrcweir                 fBottom *= fFactor;
363cdf0e10cSrcweir                 break;
364cdf0e10cSrcweir             }
365cdf0e10cSrcweir         }
366cdf0e10cSrcweir     }
367cdf0e10cSrcweir 
368cdf0e10cSrcweir     // Ueberschneiden sich Darstellungsflaeche und Objektflaeche?
369cdf0e10cSrcweir     maSetBound = maViewportRectangle;
370cdf0e10cSrcweir 
371cdf0e10cSrcweir     // Mit den neuen Werten Projektion und ViewPort setzen
372cdf0e10cSrcweir     basegfx::B3DHomMatrix aNewProjection;
373cdf0e10cSrcweir 
374cdf0e10cSrcweir     // #i36281#
375cdf0e10cSrcweir     // OpenGL needs a little more rough additional size to not let
376cdf0e10cSrcweir     // the front face vanish. Changed from SMALL_DVALUE to 0.000001,
377cdf0e10cSrcweir     // which is 1/10000th, comared with 1/tenth of a million from SMALL_DVALUE.
378cdf0e10cSrcweir     const double fDistPart((mfFarBound - mfNearBound) * 0.0001);
379cdf0e10cSrcweir 
380cdf0e10cSrcweir     // Near, Far etwas grosszuegiger setzen, um falsches,
381cdf0e10cSrcweir     // zu kritisches clippen zu verhindern
382cdf0e10cSrcweir     if(mbPerspective)
383cdf0e10cSrcweir     {
384cdf0e10cSrcweir         Frustum(aNewProjection, fLeft, fRight, fBottom, fTop, mfNearBound - fDistPart, mfFarBound + fDistPart);
385cdf0e10cSrcweir     }
386cdf0e10cSrcweir     else
387cdf0e10cSrcweir     {
388cdf0e10cSrcweir         Ortho(aNewProjection, fLeft, fRight, fBottom, fTop, mfNearBound - fDistPart, mfFarBound + fDistPart);
389cdf0e10cSrcweir     }
390cdf0e10cSrcweir 
391cdf0e10cSrcweir     // jetzt schon auf gueltig setzen um Endlosschleife zu vermeiden
392cdf0e10cSrcweir     mbProjectionValid = sal_True;
393cdf0e10cSrcweir 
394cdf0e10cSrcweir     // Neue Projektion setzen
395cdf0e10cSrcweir     SetProjection(aNewProjection);
396cdf0e10cSrcweir 
397cdf0e10cSrcweir     // fill parameters for ViewportTransformation
398cdf0e10cSrcweir     // Translation
399cdf0e10cSrcweir     maTranslate.setX((double)maSetBound.Left() + ((maSetBound.GetWidth() - 1L) / 2.0));
400cdf0e10cSrcweir     maTranslate.setY((double)maSetBound.Top() + ((maSetBound.GetHeight() - 1L) / 2.0));
401cdf0e10cSrcweir     maTranslate.setZ(ZBUFFER_DEPTH_RANGE / 2.0);
402cdf0e10cSrcweir 
403cdf0e10cSrcweir     // Skalierung
404cdf0e10cSrcweir     maScale.setX((maSetBound.GetWidth() - 1L) / 2.0);
405cdf0e10cSrcweir     maScale.setY((maSetBound.GetHeight() - 1L) / -2.0);
406cdf0e10cSrcweir     maScale.setZ(ZBUFFER_DEPTH_RANGE / 2.0);
407cdf0e10cSrcweir 
408cdf0e10cSrcweir     // Auf Veraenderung des ViewPorts reagieren
409cdf0e10cSrcweir     PostSetViewport();
410cdf0e10cSrcweir }
411cdf0e10cSrcweir 
SetRatio(double fNew)412cdf0e10cSrcweir void B3dTransformationSet::SetRatio(double fNew)
413cdf0e10cSrcweir {
414cdf0e10cSrcweir     if(mfRatio != fNew)
415cdf0e10cSrcweir     {
416cdf0e10cSrcweir         mfRatio = fNew;
417cdf0e10cSrcweir         mbProjectionValid = sal_False;
418cdf0e10cSrcweir         mbObjectToDeviceValid = sal_False;
419cdf0e10cSrcweir         mbWorldToViewValid = sal_False;
420cdf0e10cSrcweir     }
421cdf0e10cSrcweir }
422cdf0e10cSrcweir 
SetRatioMode(Base3DRatio eNew)423cdf0e10cSrcweir void B3dTransformationSet::SetRatioMode(Base3DRatio eNew)
424cdf0e10cSrcweir {
425cdf0e10cSrcweir     if(meRatio != eNew)
426cdf0e10cSrcweir     {
427cdf0e10cSrcweir         meRatio = eNew;
428cdf0e10cSrcweir         mbProjectionValid = sal_False;
429cdf0e10cSrcweir         mbObjectToDeviceValid = sal_False;
430cdf0e10cSrcweir         mbWorldToViewValid = sal_False;
431cdf0e10cSrcweir     }
432cdf0e10cSrcweir }
433cdf0e10cSrcweir 
SetDeviceRectangle(double fL,double fR,double fB,double fT,sal_Bool bBroadCastChange)434cdf0e10cSrcweir void B3dTransformationSet::SetDeviceRectangle(double fL, double fR, double fB, double fT,
435cdf0e10cSrcweir     sal_Bool bBroadCastChange)
436cdf0e10cSrcweir {
437cdf0e10cSrcweir     if(fL != mfLeftBound || fR != mfRightBound || fB != mfBottomBound || fT != mfTopBound)
438cdf0e10cSrcweir     {
439cdf0e10cSrcweir         mfLeftBound = fL;
440cdf0e10cSrcweir         mfRightBound = fR;
441cdf0e10cSrcweir         mfBottomBound = fB;
442cdf0e10cSrcweir         mfTopBound = fT;
443cdf0e10cSrcweir 
444cdf0e10cSrcweir         mbProjectionValid = sal_False;
445cdf0e10cSrcweir         mbObjectToDeviceValid = sal_False;
446cdf0e10cSrcweir         mbWorldToViewValid = sal_False;
447cdf0e10cSrcweir 
448cdf0e10cSrcweir         // Aenderung bekanntmachen
449cdf0e10cSrcweir         if(bBroadCastChange)
450cdf0e10cSrcweir             DeviceRectangleChange();
451cdf0e10cSrcweir     }
452cdf0e10cSrcweir }
453cdf0e10cSrcweir 
SetDeviceVolume(const basegfx::B3DRange & rVol,sal_Bool bBroadCastChange)454cdf0e10cSrcweir void B3dTransformationSet::SetDeviceVolume(const basegfx::B3DRange& rVol, sal_Bool bBroadCastChange)
455cdf0e10cSrcweir {
456cdf0e10cSrcweir     SetDeviceRectangle(rVol.getMinX(), rVol.getMaxX(), rVol.getMinY(), rVol.getMaxY(), bBroadCastChange);
457cdf0e10cSrcweir     SetFrontClippingPlane(rVol.getMinZ());
458cdf0e10cSrcweir     SetBackClippingPlane(rVol.getMaxZ());
459cdf0e10cSrcweir }
460cdf0e10cSrcweir 
DeviceRectangleChange()461cdf0e10cSrcweir void B3dTransformationSet::DeviceRectangleChange()
462cdf0e10cSrcweir {
463cdf0e10cSrcweir }
464cdf0e10cSrcweir 
GetDeviceRectangle(double & fL,double & fR,double & fB,double & fT)465cdf0e10cSrcweir void B3dTransformationSet::GetDeviceRectangle(double &fL, double &fR, double& fB, double& fT)
466cdf0e10cSrcweir {
467cdf0e10cSrcweir     fL = mfLeftBound;
468cdf0e10cSrcweir     fR = mfRightBound;
469cdf0e10cSrcweir     fB = mfBottomBound;
470cdf0e10cSrcweir     fT = mfTopBound;
471cdf0e10cSrcweir 
472cdf0e10cSrcweir     mbProjectionValid = sal_False;
473cdf0e10cSrcweir     mbObjectToDeviceValid = sal_False;
474cdf0e10cSrcweir     mbWorldToViewValid = sal_False;
475cdf0e10cSrcweir }
476cdf0e10cSrcweir 
GetDeviceVolume()477cdf0e10cSrcweir basegfx::B3DRange B3dTransformationSet::GetDeviceVolume()
478cdf0e10cSrcweir {
479cdf0e10cSrcweir     basegfx::B3DRange aRet;
480cdf0e10cSrcweir 
481cdf0e10cSrcweir     aRet.expand(basegfx::B3DTuple(mfLeftBound, mfBottomBound, mfNearBound));
482cdf0e10cSrcweir     aRet.expand(basegfx::B3DTuple(mfRightBound, mfTopBound, mfFarBound));
483cdf0e10cSrcweir 
484cdf0e10cSrcweir     return aRet;
485cdf0e10cSrcweir }
486cdf0e10cSrcweir 
SetFrontClippingPlane(double fF)487cdf0e10cSrcweir void B3dTransformationSet::SetFrontClippingPlane(double fF)
488cdf0e10cSrcweir {
489cdf0e10cSrcweir     if(mfNearBound != fF)
490cdf0e10cSrcweir     {
491cdf0e10cSrcweir         mfNearBound = fF;
492cdf0e10cSrcweir         mbProjectionValid = sal_False;
493cdf0e10cSrcweir         mbObjectToDeviceValid = sal_False;
494cdf0e10cSrcweir         mbWorldToViewValid = sal_False;
495cdf0e10cSrcweir     }
496cdf0e10cSrcweir }
497cdf0e10cSrcweir 
SetBackClippingPlane(double fB)498cdf0e10cSrcweir void B3dTransformationSet::SetBackClippingPlane(double fB)
499cdf0e10cSrcweir {
500cdf0e10cSrcweir     if(mfFarBound != fB)
501cdf0e10cSrcweir     {
502cdf0e10cSrcweir         mfFarBound = fB;
503cdf0e10cSrcweir         mbProjectionValid = sal_False;
504cdf0e10cSrcweir         mbObjectToDeviceValid = sal_False;
505cdf0e10cSrcweir         mbWorldToViewValid = sal_False;
506cdf0e10cSrcweir     }
507cdf0e10cSrcweir }
508cdf0e10cSrcweir 
SetPerspective(sal_Bool bNew)509cdf0e10cSrcweir void B3dTransformationSet::SetPerspective(sal_Bool bNew)
510cdf0e10cSrcweir {
511cdf0e10cSrcweir     if(mbPerspective != bNew)
512cdf0e10cSrcweir     {
513cdf0e10cSrcweir         mbPerspective = bNew;
514cdf0e10cSrcweir         mbProjectionValid = sal_False;
515cdf0e10cSrcweir         mbObjectToDeviceValid = sal_False;
516cdf0e10cSrcweir         mbWorldToViewValid = sal_False;
517cdf0e10cSrcweir     }
518cdf0e10cSrcweir }
519cdf0e10cSrcweir 
SetViewportRectangle(Rectangle & rRect,Rectangle & rVisible)520cdf0e10cSrcweir void B3dTransformationSet::SetViewportRectangle(Rectangle& rRect, Rectangle& rVisible)
521cdf0e10cSrcweir {
522cdf0e10cSrcweir     if(rRect != maViewportRectangle || rVisible != maVisibleRectangle)
523cdf0e10cSrcweir     {
524cdf0e10cSrcweir         maViewportRectangle = rRect;
525cdf0e10cSrcweir         maVisibleRectangle = rVisible;
526cdf0e10cSrcweir 
527cdf0e10cSrcweir         mbProjectionValid = sal_False;
528cdf0e10cSrcweir         mbObjectToDeviceValid = sal_False;
529cdf0e10cSrcweir         mbWorldToViewValid = sal_False;
530cdf0e10cSrcweir     }
531cdf0e10cSrcweir }
532cdf0e10cSrcweir 
PostSetViewport()533cdf0e10cSrcweir void B3dTransformationSet::PostSetViewport()
534cdf0e10cSrcweir {
535cdf0e10cSrcweir }
536cdf0e10cSrcweir 
GetLogicalViewportBounds()537cdf0e10cSrcweir const Rectangle& B3dTransformationSet::GetLogicalViewportBounds()
538cdf0e10cSrcweir {
539cdf0e10cSrcweir     if(!mbProjectionValid)
540cdf0e10cSrcweir         CalcViewport();
541cdf0e10cSrcweir     return maSetBound;
542cdf0e10cSrcweir }
543cdf0e10cSrcweir 
GetScale()544cdf0e10cSrcweir const basegfx::B3DVector& B3dTransformationSet::GetScale()
545cdf0e10cSrcweir {
546cdf0e10cSrcweir     if(!mbProjectionValid)
547cdf0e10cSrcweir         CalcViewport();
548cdf0e10cSrcweir     return maScale;
549cdf0e10cSrcweir }
550cdf0e10cSrcweir 
GetTranslate()551cdf0e10cSrcweir const basegfx::B3DVector& B3dTransformationSet::GetTranslate()
552cdf0e10cSrcweir {
553cdf0e10cSrcweir     if(!mbProjectionValid)
554cdf0e10cSrcweir         CalcViewport();
555cdf0e10cSrcweir     return maTranslate;
556cdf0e10cSrcweir }
557cdf0e10cSrcweir 
558cdf0e10cSrcweir /*************************************************************************
559cdf0e10cSrcweir |*
560cdf0e10cSrcweir |* Hilfsmatrixberechnungsroutinen
561cdf0e10cSrcweir |*
562cdf0e10cSrcweir \************************************************************************/
563cdf0e10cSrcweir 
CalcMatObjectToDevice()564cdf0e10cSrcweir void B3dTransformationSet::CalcMatObjectToDevice()
565cdf0e10cSrcweir {
566cdf0e10cSrcweir     // ObjectToDevice berechnen (Orientation * Projection * Object)
567cdf0e10cSrcweir     maObjectToDevice = maObjectTrans;
568cdf0e10cSrcweir     maObjectToDevice *= maOrientation;
569cdf0e10cSrcweir     maObjectToDevice *= GetProjection();
570cdf0e10cSrcweir 
571cdf0e10cSrcweir     // auf gueltig setzen
572cdf0e10cSrcweir     mbObjectToDeviceValid = sal_True;
573cdf0e10cSrcweir }
574cdf0e10cSrcweir 
GetObjectToDevice()575cdf0e10cSrcweir const basegfx::B3DHomMatrix& B3dTransformationSet::GetObjectToDevice()
576cdf0e10cSrcweir {
577cdf0e10cSrcweir     if(!mbObjectToDeviceValid)
578cdf0e10cSrcweir         CalcMatObjectToDevice();
579cdf0e10cSrcweir     return maObjectToDevice;
580cdf0e10cSrcweir }
581cdf0e10cSrcweir 
CalcMatInvTransObjectToEye()582cdf0e10cSrcweir void B3dTransformationSet::CalcMatInvTransObjectToEye()
583cdf0e10cSrcweir {
584cdf0e10cSrcweir     maInvTransObjectToEye = maObjectTrans;
585cdf0e10cSrcweir     maInvTransObjectToEye *= maOrientation;
586cdf0e10cSrcweir     maInvTransObjectToEye.invert();
587cdf0e10cSrcweir     maInvTransObjectToEye.transpose();
588cdf0e10cSrcweir 
589cdf0e10cSrcweir     // eventuelle Translationen rausschmeissen, da diese
590cdf0e10cSrcweir     // Matrix nur zur Transformation von Vektoren gedacht ist
591cdf0e10cSrcweir     maInvTransObjectToEye.set(3, 0, 0.0);
592cdf0e10cSrcweir     maInvTransObjectToEye.set(3, 1, 0.0);
593cdf0e10cSrcweir     maInvTransObjectToEye.set(3, 2, 0.0);
594cdf0e10cSrcweir     maInvTransObjectToEye.set(3, 3, 1.0);
595cdf0e10cSrcweir 
596cdf0e10cSrcweir     // auf gueltig setzen
597cdf0e10cSrcweir     mbInvTransObjectToEyeValid = sal_True;
598cdf0e10cSrcweir }
599cdf0e10cSrcweir 
GetInvTransObjectToEye()600cdf0e10cSrcweir const basegfx::B3DHomMatrix& B3dTransformationSet::GetInvTransObjectToEye()
601cdf0e10cSrcweir {
602cdf0e10cSrcweir     if(!mbInvTransObjectToEyeValid)
603cdf0e10cSrcweir         CalcMatInvTransObjectToEye();
604cdf0e10cSrcweir     return maInvTransObjectToEye;
605cdf0e10cSrcweir }
606cdf0e10cSrcweir 
GetMatFromObjectToView()607cdf0e10cSrcweir basegfx::B3DHomMatrix B3dTransformationSet::GetMatFromObjectToView()
608cdf0e10cSrcweir {
609cdf0e10cSrcweir     basegfx::B3DHomMatrix aFromObjectToView = GetObjectToDevice();
610cdf0e10cSrcweir 
611cdf0e10cSrcweir     const basegfx::B3DVector& rScale(GetScale());
612cdf0e10cSrcweir     aFromObjectToView.scale(rScale.getX(), rScale.getY(), rScale.getZ());
613cdf0e10cSrcweir     const basegfx::B3DVector& rTranslate(GetTranslate());
614cdf0e10cSrcweir     aFromObjectToView.translate(rTranslate.getX(), rTranslate.getY(), rTranslate.getZ());
615cdf0e10cSrcweir 
616cdf0e10cSrcweir     return aFromObjectToView;
617cdf0e10cSrcweir }
618cdf0e10cSrcweir 
CalcMatFromWorldToView()619cdf0e10cSrcweir void B3dTransformationSet::CalcMatFromWorldToView()
620cdf0e10cSrcweir {
621cdf0e10cSrcweir     maMatFromWorldToView = maOrientation;
622cdf0e10cSrcweir     maMatFromWorldToView *= GetProjection();
623cdf0e10cSrcweir     const basegfx::B3DVector& rScale(GetScale());
624cdf0e10cSrcweir     maMatFromWorldToView.scale(rScale.getX(), rScale.getY(), rScale.getZ());
625cdf0e10cSrcweir     const basegfx::B3DVector& rTranslate(GetTranslate());
626cdf0e10cSrcweir     maMatFromWorldToView.translate(rTranslate.getX(), rTranslate.getY(), rTranslate.getZ());
627cdf0e10cSrcweir     maInvMatFromWorldToView = maMatFromWorldToView;
628cdf0e10cSrcweir     maInvMatFromWorldToView.invert();
629cdf0e10cSrcweir 
630cdf0e10cSrcweir     // gueltig setzen
631cdf0e10cSrcweir     mbWorldToViewValid = sal_True;
632cdf0e10cSrcweir }
633cdf0e10cSrcweir 
GetMatFromWorldToView()634cdf0e10cSrcweir const basegfx::B3DHomMatrix& B3dTransformationSet::GetMatFromWorldToView()
635cdf0e10cSrcweir {
636cdf0e10cSrcweir     if(!mbWorldToViewValid)
637cdf0e10cSrcweir         CalcMatFromWorldToView();
638cdf0e10cSrcweir     return maMatFromWorldToView;
639cdf0e10cSrcweir }
640cdf0e10cSrcweir 
GetInvMatFromWorldToView()641cdf0e10cSrcweir const basegfx::B3DHomMatrix& B3dTransformationSet::GetInvMatFromWorldToView()
642cdf0e10cSrcweir {
643cdf0e10cSrcweir     if(!mbWorldToViewValid)
644cdf0e10cSrcweir         CalcMatFromWorldToView();
645cdf0e10cSrcweir     return maInvMatFromWorldToView;
646cdf0e10cSrcweir }
647cdf0e10cSrcweir 
648cdf0e10cSrcweir /*************************************************************************
649cdf0e10cSrcweir |*
650cdf0e10cSrcweir |* Direkter Zugriff auf verschiedene Transformationen
651cdf0e10cSrcweir |*
652cdf0e10cSrcweir \************************************************************************/
653cdf0e10cSrcweir 
WorldToEyeCoor(const basegfx::B3DPoint & rVec)654cdf0e10cSrcweir const basegfx::B3DPoint B3dTransformationSet::WorldToEyeCoor(const basegfx::B3DPoint& rVec)
655cdf0e10cSrcweir {
656cdf0e10cSrcweir     basegfx::B3DPoint aVec(rVec);
657cdf0e10cSrcweir     aVec *= GetOrientation();
658cdf0e10cSrcweir     return aVec;
659cdf0e10cSrcweir }
660cdf0e10cSrcweir 
EyeToWorldCoor(const basegfx::B3DPoint & rVec)661cdf0e10cSrcweir const basegfx::B3DPoint B3dTransformationSet::EyeToWorldCoor(const basegfx::B3DPoint& rVec)
662cdf0e10cSrcweir {
663cdf0e10cSrcweir     basegfx::B3DPoint aVec(rVec);
664cdf0e10cSrcweir     aVec *= GetInvOrientation();
665cdf0e10cSrcweir     return aVec;
666cdf0e10cSrcweir }
667cdf0e10cSrcweir 
EyeToViewCoor(const basegfx::B3DPoint & rVec)668cdf0e10cSrcweir const basegfx::B3DPoint B3dTransformationSet::EyeToViewCoor(const basegfx::B3DPoint& rVec)
669cdf0e10cSrcweir {
670cdf0e10cSrcweir     basegfx::B3DPoint aVec(rVec);
671cdf0e10cSrcweir     aVec *= GetProjection();
672cdf0e10cSrcweir     aVec *= GetScale();
673cdf0e10cSrcweir     aVec += GetTranslate();
674cdf0e10cSrcweir     return aVec;
675cdf0e10cSrcweir }
676cdf0e10cSrcweir 
ViewToEyeCoor(const basegfx::B3DPoint & rVec)677cdf0e10cSrcweir const basegfx::B3DPoint B3dTransformationSet::ViewToEyeCoor(const basegfx::B3DPoint& rVec)
678cdf0e10cSrcweir {
679cdf0e10cSrcweir     basegfx::B3DPoint aVec(rVec);
680cdf0e10cSrcweir     aVec -= GetTranslate();
681cdf0e10cSrcweir     aVec = aVec / GetScale();
682cdf0e10cSrcweir     aVec *= GetInvProjection();
683cdf0e10cSrcweir     return aVec;
684cdf0e10cSrcweir }
685cdf0e10cSrcweir 
WorldToViewCoor(const basegfx::B3DPoint & rVec)686cdf0e10cSrcweir const basegfx::B3DPoint B3dTransformationSet::WorldToViewCoor(const basegfx::B3DPoint& rVec)
687cdf0e10cSrcweir {
688cdf0e10cSrcweir     basegfx::B3DPoint aVec(rVec);
689cdf0e10cSrcweir     aVec *= GetMatFromWorldToView();
690cdf0e10cSrcweir     return aVec;
691cdf0e10cSrcweir }
692cdf0e10cSrcweir 
ViewToWorldCoor(const basegfx::B3DPoint & rVec)693cdf0e10cSrcweir const basegfx::B3DPoint B3dTransformationSet::ViewToWorldCoor(const basegfx::B3DPoint& rVec)
694cdf0e10cSrcweir {
695cdf0e10cSrcweir     basegfx::B3DPoint aVec(rVec);
696cdf0e10cSrcweir     aVec *= GetInvMatFromWorldToView();
697cdf0e10cSrcweir     return aVec;
698cdf0e10cSrcweir }
699cdf0e10cSrcweir 
DeviceToViewCoor(const basegfx::B3DPoint & rVec)700cdf0e10cSrcweir const basegfx::B3DPoint B3dTransformationSet::DeviceToViewCoor(const basegfx::B3DPoint& rVec)
701cdf0e10cSrcweir {
702cdf0e10cSrcweir     basegfx::B3DPoint aVec(rVec);
703cdf0e10cSrcweir     aVec *= GetScale();
704cdf0e10cSrcweir     aVec += GetTranslate();
705cdf0e10cSrcweir     return aVec;
706cdf0e10cSrcweir }
707cdf0e10cSrcweir 
ViewToDeviceCoor(const basegfx::B3DPoint & rVec)708cdf0e10cSrcweir const basegfx::B3DPoint B3dTransformationSet::ViewToDeviceCoor(const basegfx::B3DPoint& rVec)
709cdf0e10cSrcweir {
710cdf0e10cSrcweir     basegfx::B3DPoint aVec(rVec);
711cdf0e10cSrcweir     aVec -= GetTranslate();
712cdf0e10cSrcweir     aVec = aVec / GetScale();
713cdf0e10cSrcweir     return aVec;
714cdf0e10cSrcweir }
715cdf0e10cSrcweir 
ObjectToWorldCoor(const basegfx::B3DPoint & rVec)716cdf0e10cSrcweir const basegfx::B3DPoint B3dTransformationSet::ObjectToWorldCoor(const basegfx::B3DPoint& rVec)
717cdf0e10cSrcweir {
718cdf0e10cSrcweir     basegfx::B3DPoint aVec(rVec);
719cdf0e10cSrcweir     aVec *= GetObjectTrans();
720cdf0e10cSrcweir     return aVec;
721cdf0e10cSrcweir }
722cdf0e10cSrcweir 
WorldToObjectCoor(const basegfx::B3DPoint & rVec)723cdf0e10cSrcweir const basegfx::B3DPoint B3dTransformationSet::WorldToObjectCoor(const basegfx::B3DPoint& rVec)
724cdf0e10cSrcweir {
725cdf0e10cSrcweir     basegfx::B3DPoint aVec(rVec);
726cdf0e10cSrcweir     aVec *= GetInvObjectTrans();
727cdf0e10cSrcweir     return aVec;
728cdf0e10cSrcweir }
729cdf0e10cSrcweir 
ObjectToViewCoor(const basegfx::B3DPoint & rVec)730cdf0e10cSrcweir const basegfx::B3DPoint B3dTransformationSet::ObjectToViewCoor(const basegfx::B3DPoint& rVec)
731cdf0e10cSrcweir {
732cdf0e10cSrcweir     basegfx::B3DPoint aVec(rVec);
733cdf0e10cSrcweir     aVec *= GetObjectTrans();
734cdf0e10cSrcweir     aVec *= GetMatFromWorldToView();
735cdf0e10cSrcweir     return aVec;
736cdf0e10cSrcweir }
737cdf0e10cSrcweir 
ViewToObjectCoor(const basegfx::B3DPoint & rVec)738cdf0e10cSrcweir const basegfx::B3DPoint B3dTransformationSet::ViewToObjectCoor(const basegfx::B3DPoint& rVec)
739cdf0e10cSrcweir {
740cdf0e10cSrcweir     basegfx::B3DPoint aVec(rVec);
741cdf0e10cSrcweir     aVec *= GetInvMatFromWorldToView();
742cdf0e10cSrcweir     aVec *= GetInvObjectTrans();
743cdf0e10cSrcweir     return aVec;
744cdf0e10cSrcweir }
745cdf0e10cSrcweir 
ObjectToEyeCoor(const basegfx::B3DPoint & rVec)746cdf0e10cSrcweir const basegfx::B3DPoint B3dTransformationSet::ObjectToEyeCoor(const basegfx::B3DPoint& rVec)
747cdf0e10cSrcweir {
748cdf0e10cSrcweir     basegfx::B3DPoint aVec(rVec);
749cdf0e10cSrcweir     aVec *= GetObjectTrans();
750cdf0e10cSrcweir     aVec *= GetOrientation();
751cdf0e10cSrcweir     return aVec;
752cdf0e10cSrcweir }
753cdf0e10cSrcweir 
EyeToObjectCoor(const basegfx::B3DPoint & rVec)754cdf0e10cSrcweir const basegfx::B3DPoint B3dTransformationSet::EyeToObjectCoor(const basegfx::B3DPoint& rVec)
755cdf0e10cSrcweir {
756cdf0e10cSrcweir     basegfx::B3DPoint aVec(rVec);
757cdf0e10cSrcweir     aVec *= GetInvOrientation();
758cdf0e10cSrcweir     aVec *= GetInvObjectTrans();
759cdf0e10cSrcweir     return aVec;
760cdf0e10cSrcweir }
761cdf0e10cSrcweir 
DeviceToEyeCoor(const basegfx::B3DPoint & rVec)762cdf0e10cSrcweir const basegfx::B3DPoint B3dTransformationSet::DeviceToEyeCoor(const basegfx::B3DPoint& rVec)
763cdf0e10cSrcweir {
764cdf0e10cSrcweir     basegfx::B3DPoint aVec(rVec);
765cdf0e10cSrcweir     aVec *= GetInvProjection();
766cdf0e10cSrcweir     return aVec;
767cdf0e10cSrcweir }
768cdf0e10cSrcweir 
EyeToDeviceCoor(const basegfx::B3DPoint & rVec)769cdf0e10cSrcweir const basegfx::B3DPoint B3dTransformationSet::EyeToDeviceCoor(const basegfx::B3DPoint& rVec)
770cdf0e10cSrcweir {
771cdf0e10cSrcweir     basegfx::B3DPoint aVec(rVec);
772cdf0e10cSrcweir     aVec *= GetProjection();
773cdf0e10cSrcweir     return aVec;
774cdf0e10cSrcweir }
775cdf0e10cSrcweir 
InvTransObjectToEye(const basegfx::B3DPoint & rVec)776cdf0e10cSrcweir const basegfx::B3DPoint B3dTransformationSet::InvTransObjectToEye(const basegfx::B3DPoint& rVec)
777cdf0e10cSrcweir {
778cdf0e10cSrcweir     basegfx::B3DPoint aVec(rVec);
779cdf0e10cSrcweir     aVec *= GetInvTransObjectToEye();
780cdf0e10cSrcweir     return aVec;
781cdf0e10cSrcweir }
782cdf0e10cSrcweir 
TransTextureCoor(const basegfx::B2DPoint & rVec)783cdf0e10cSrcweir const basegfx::B2DPoint B3dTransformationSet::TransTextureCoor(const basegfx::B2DPoint& rVec)
784cdf0e10cSrcweir {
785cdf0e10cSrcweir     basegfx::B2DPoint aVec(rVec);
786cdf0e10cSrcweir     aVec *= GetTexture();
787cdf0e10cSrcweir     return aVec;
788cdf0e10cSrcweir }
789cdf0e10cSrcweir 
790cdf0e10cSrcweir /*************************************************************************
791cdf0e10cSrcweir |*
792cdf0e10cSrcweir |* Konstruktor B3dViewport
793cdf0e10cSrcweir |*
794cdf0e10cSrcweir \************************************************************************/
795cdf0e10cSrcweir 
B3dViewport()796cdf0e10cSrcweir B3dViewport::B3dViewport()
797cdf0e10cSrcweir :   B3dTransformationSet(),
798cdf0e10cSrcweir     aVRP(0, 0, 0),
799cdf0e10cSrcweir     aVPN(0, 0, 1),
800cdf0e10cSrcweir     aVUV(0, 1, 0)
801cdf0e10cSrcweir {
802cdf0e10cSrcweir     CalcOrientation();
803cdf0e10cSrcweir }
804cdf0e10cSrcweir 
~B3dViewport()805cdf0e10cSrcweir B3dViewport::~B3dViewport()
806cdf0e10cSrcweir {
807cdf0e10cSrcweir }
808cdf0e10cSrcweir 
SetVRP(const basegfx::B3DPoint & rNewVRP)809cdf0e10cSrcweir void B3dViewport::SetVRP(const basegfx::B3DPoint& rNewVRP)
810cdf0e10cSrcweir {
811cdf0e10cSrcweir     aVRP = rNewVRP;
812cdf0e10cSrcweir     CalcOrientation();
813cdf0e10cSrcweir }
814cdf0e10cSrcweir 
SetVPN(const basegfx::B3DVector & rNewVPN)815cdf0e10cSrcweir void B3dViewport::SetVPN(const basegfx::B3DVector& rNewVPN)
816cdf0e10cSrcweir {
817cdf0e10cSrcweir     aVPN = rNewVPN;
818cdf0e10cSrcweir     CalcOrientation();
819cdf0e10cSrcweir }
820cdf0e10cSrcweir 
SetVUV(const basegfx::B3DVector & rNewVUV)821cdf0e10cSrcweir void B3dViewport::SetVUV(const basegfx::B3DVector& rNewVUV)
822cdf0e10cSrcweir {
823cdf0e10cSrcweir     aVUV = rNewVUV;
824cdf0e10cSrcweir     CalcOrientation();
825cdf0e10cSrcweir }
826cdf0e10cSrcweir 
SetViewportValues(const basegfx::B3DPoint & rNewVRP,const basegfx::B3DVector & rNewVPN,const basegfx::B3DVector & rNewVUV)827cdf0e10cSrcweir void B3dViewport::SetViewportValues(
828cdf0e10cSrcweir     const basegfx::B3DPoint& rNewVRP,
829cdf0e10cSrcweir     const basegfx::B3DVector& rNewVPN,
830cdf0e10cSrcweir     const basegfx::B3DVector& rNewVUV)
831cdf0e10cSrcweir {
832cdf0e10cSrcweir     aVRP = rNewVRP;
833cdf0e10cSrcweir     aVPN = rNewVPN;
834cdf0e10cSrcweir     aVUV = rNewVUV;
835cdf0e10cSrcweir     CalcOrientation();
836cdf0e10cSrcweir }
837cdf0e10cSrcweir 
CalcOrientation()838cdf0e10cSrcweir void B3dViewport::CalcOrientation()
839cdf0e10cSrcweir {
840cdf0e10cSrcweir     SetOrientation(aVRP, aVPN, aVUV);
841cdf0e10cSrcweir }
842cdf0e10cSrcweir 
843cdf0e10cSrcweir /*************************************************************************
844cdf0e10cSrcweir |*
845cdf0e10cSrcweir |* Konstruktor B3dViewport
846cdf0e10cSrcweir |*
847cdf0e10cSrcweir \************************************************************************/
848cdf0e10cSrcweir 
B3dCamera(const basegfx::B3DPoint & rPos,const basegfx::B3DVector & rLkAt,double fFocLen,double fBnkAng,sal_Bool bUseFocLen)849cdf0e10cSrcweir B3dCamera::B3dCamera(
850cdf0e10cSrcweir     const basegfx::B3DPoint& rPos, const basegfx::B3DVector& rLkAt,
851cdf0e10cSrcweir     double fFocLen, double fBnkAng, sal_Bool bUseFocLen)
852cdf0e10cSrcweir :   B3dViewport(),
853cdf0e10cSrcweir     aPosition(rPos),
854cdf0e10cSrcweir     aCorrectedPosition(rPos),
855cdf0e10cSrcweir     aLookAt(rLkAt),
856cdf0e10cSrcweir     fFocalLength(fFocLen),
857cdf0e10cSrcweir     fBankAngle(fBnkAng),
858cdf0e10cSrcweir     bUseFocalLength(bUseFocLen)
859cdf0e10cSrcweir {
860cdf0e10cSrcweir     CalcNewViewportValues();
861cdf0e10cSrcweir }
862cdf0e10cSrcweir 
~B3dCamera()863cdf0e10cSrcweir B3dCamera::~B3dCamera()
864cdf0e10cSrcweir {
865cdf0e10cSrcweir }
866cdf0e10cSrcweir 
SetPosition(const basegfx::B3DPoint & rNewPos)867cdf0e10cSrcweir void B3dCamera::SetPosition(const basegfx::B3DPoint& rNewPos)
868cdf0e10cSrcweir {
869cdf0e10cSrcweir     if(rNewPos != aPosition)
870cdf0e10cSrcweir     {
871cdf0e10cSrcweir         // Zuweisen
872cdf0e10cSrcweir         aCorrectedPosition = aPosition = rNewPos;
873cdf0e10cSrcweir 
874cdf0e10cSrcweir         // Neuberechnung
875cdf0e10cSrcweir         CalcNewViewportValues();
876cdf0e10cSrcweir     }
877cdf0e10cSrcweir }
878cdf0e10cSrcweir 
SetLookAt(const basegfx::B3DVector & rNewLookAt)879cdf0e10cSrcweir void B3dCamera::SetLookAt(const basegfx::B3DVector& rNewLookAt)
880cdf0e10cSrcweir {
881cdf0e10cSrcweir     if(rNewLookAt != aLookAt)
882cdf0e10cSrcweir     {
883cdf0e10cSrcweir         // Zuweisen
884cdf0e10cSrcweir         aLookAt = rNewLookAt;
885cdf0e10cSrcweir 
886cdf0e10cSrcweir         // Neuberechnung
887cdf0e10cSrcweir         CalcNewViewportValues();
888cdf0e10cSrcweir     }
889cdf0e10cSrcweir }
890cdf0e10cSrcweir 
SetPositionAndLookAt(const basegfx::B3DPoint & rNewPos,const basegfx::B3DVector & rNewLookAt)891cdf0e10cSrcweir void B3dCamera::SetPositionAndLookAt(const basegfx::B3DPoint& rNewPos, const basegfx::B3DVector& rNewLookAt)
892cdf0e10cSrcweir {
893cdf0e10cSrcweir     if(rNewPos != aPosition || rNewLookAt != aLookAt)
894cdf0e10cSrcweir     {
895cdf0e10cSrcweir         // Zuweisen
896cdf0e10cSrcweir         aPosition = rNewPos;
897cdf0e10cSrcweir         aLookAt = rNewLookAt;
898cdf0e10cSrcweir 
899cdf0e10cSrcweir         // Neuberechnung
900cdf0e10cSrcweir         CalcNewViewportValues();
901cdf0e10cSrcweir     }
902cdf0e10cSrcweir }
903cdf0e10cSrcweir 
SetFocalLength(double fLen)904cdf0e10cSrcweir void B3dCamera::SetFocalLength(double fLen)
905cdf0e10cSrcweir {
906cdf0e10cSrcweir     if(fLen != fFocalLength)
907cdf0e10cSrcweir     {
908cdf0e10cSrcweir         // Zuweisen
909cdf0e10cSrcweir         if(fLen < 5.0)
910cdf0e10cSrcweir             fLen = 5.0;
911cdf0e10cSrcweir         fFocalLength = fLen;
912cdf0e10cSrcweir 
913cdf0e10cSrcweir         // Neuberechnung
914cdf0e10cSrcweir         CalcNewViewportValues();
915cdf0e10cSrcweir     }
916cdf0e10cSrcweir }
917cdf0e10cSrcweir 
SetBankAngle(double fAngle)918cdf0e10cSrcweir void B3dCamera::SetBankAngle(double fAngle)
919cdf0e10cSrcweir {
920cdf0e10cSrcweir     if(fAngle != fBankAngle)
921cdf0e10cSrcweir     {
922cdf0e10cSrcweir         // Zuweisen
923cdf0e10cSrcweir         fBankAngle = fAngle;
924cdf0e10cSrcweir 
925cdf0e10cSrcweir         // Neuberechnung
926cdf0e10cSrcweir         CalcNewViewportValues();
927cdf0e10cSrcweir     }
928cdf0e10cSrcweir }
929cdf0e10cSrcweir 
SetUseFocalLength(sal_Bool bNew)930cdf0e10cSrcweir void B3dCamera::SetUseFocalLength(sal_Bool bNew)
931cdf0e10cSrcweir {
932cdf0e10cSrcweir     if(bNew != (sal_Bool)bUseFocalLength)
933cdf0e10cSrcweir     {
934cdf0e10cSrcweir         // Zuweisen
935cdf0e10cSrcweir         bUseFocalLength = bNew;
936cdf0e10cSrcweir 
937cdf0e10cSrcweir         // Neuberechnung
938cdf0e10cSrcweir         CalcNewViewportValues();
939cdf0e10cSrcweir     }
940cdf0e10cSrcweir }
941cdf0e10cSrcweir 
DeviceRectangleChange()942cdf0e10cSrcweir void B3dCamera::DeviceRectangleChange()
943cdf0e10cSrcweir {
944cdf0e10cSrcweir     // call parent
945cdf0e10cSrcweir     B3dViewport::DeviceRectangleChange();
946cdf0e10cSrcweir 
947cdf0e10cSrcweir     // Auf Aenderung reagieren
948cdf0e10cSrcweir     CalcNewViewportValues();
949cdf0e10cSrcweir }
950cdf0e10cSrcweir 
CalcNewViewportValues()951cdf0e10cSrcweir void B3dCamera::CalcNewViewportValues()
952cdf0e10cSrcweir {
953cdf0e10cSrcweir     basegfx::B3DVector aViewVector(aPosition - aLookAt);
954cdf0e10cSrcweir     basegfx::B3DVector aNewVPN(aViewVector);
955cdf0e10cSrcweir 
956cdf0e10cSrcweir     basegfx::B3DVector aNewVUV(0.0, 1.0, 0.0);
957cdf0e10cSrcweir     if(aNewVPN.getLength() < aNewVPN.getY())
958cdf0e10cSrcweir         aNewVUV.setX(0.5);
959cdf0e10cSrcweir 
960cdf0e10cSrcweir     aNewVUV.normalize();
961cdf0e10cSrcweir     aNewVPN.normalize();
962cdf0e10cSrcweir 
963cdf0e10cSrcweir     basegfx::B3DVector aNewToTheRight = aNewVPN;
964cdf0e10cSrcweir     aNewToTheRight = aNewToTheRight.getPerpendicular(aNewVUV);
965cdf0e10cSrcweir     aNewToTheRight.normalize();
966cdf0e10cSrcweir     aNewVUV = aNewToTheRight.getPerpendicular(aNewVPN);
967cdf0e10cSrcweir     aNewVUV.normalize();
968cdf0e10cSrcweir 
969cdf0e10cSrcweir     SetViewportValues(aPosition, aNewVPN, aNewVUV);
970cdf0e10cSrcweir     if(CalcFocalLength())
971cdf0e10cSrcweir         SetViewportValues(aCorrectedPosition, aNewVPN, aNewVUV);
972cdf0e10cSrcweir 
973cdf0e10cSrcweir     if(fBankAngle != 0.0)
974cdf0e10cSrcweir     {
975cdf0e10cSrcweir         basegfx::B3DHomMatrix aRotMat;
976cdf0e10cSrcweir         aRotMat.rotate(0.0, 0.0, fBankAngle);
977cdf0e10cSrcweir         basegfx::B3DVector aUp(0.0, 1.0, 0.0);
978cdf0e10cSrcweir         aUp *= aRotMat;
979cdf0e10cSrcweir         aUp = EyeToWorldCoor(aUp);
980cdf0e10cSrcweir         aUp.normalize();
981cdf0e10cSrcweir         SetVUV(aUp);
982cdf0e10cSrcweir     }
983cdf0e10cSrcweir }
984cdf0e10cSrcweir 
CalcFocalLength()985cdf0e10cSrcweir sal_Bool B3dCamera::CalcFocalLength()
986cdf0e10cSrcweir {
987cdf0e10cSrcweir     double fWidth = GetDeviceRectangleWidth();
988cdf0e10cSrcweir     sal_Bool bRetval = sal_False;
989cdf0e10cSrcweir 
990cdf0e10cSrcweir     if(bUseFocalLength)
991cdf0e10cSrcweir     {
992cdf0e10cSrcweir         // Position aufgrund der FocalLength korrigieren
993cdf0e10cSrcweir         aCorrectedPosition = basegfx::B3DPoint(0.0, 0.0, fFocalLength * fWidth / 35.0);
994cdf0e10cSrcweir         aCorrectedPosition = EyeToWorldCoor(aCorrectedPosition);
995cdf0e10cSrcweir         bRetval = sal_True;
996cdf0e10cSrcweir     }
997cdf0e10cSrcweir     else
998cdf0e10cSrcweir     {
999cdf0e10cSrcweir         // FocalLength anhand der Position anpassen
1000cdf0e10cSrcweir         basegfx::B3DPoint aOldPosition;
1001cdf0e10cSrcweir         aOldPosition = WorldToEyeCoor(aOldPosition);
1002cdf0e10cSrcweir         if(fWidth != 0.0)
1003cdf0e10cSrcweir             fFocalLength = aOldPosition.getZ() / fWidth * 35.0;
1004cdf0e10cSrcweir         if(fFocalLength < 5.0)
1005cdf0e10cSrcweir             fFocalLength = 5.0;
1006cdf0e10cSrcweir     }
1007cdf0e10cSrcweir     return bRetval;
1008cdf0e10cSrcweir }
1009cdf0e10cSrcweir 
1010cdf0e10cSrcweir // eof
1011