xref: /aoo42x/main/tools/source/generic/b3dtrans.cxx (revision 89b56da7)
1*89b56da7SAndrew Rist /**************************************************************
2*89b56da7SAndrew Rist  *
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
10*89b56da7SAndrew Rist  *
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.
19*89b56da7SAndrew Rist  *
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