xref: /trunk/main/basegfx/inc/basegfx/matrix/b3dhommatrix.hxx (revision 914d351e5f5b84e4342a86d6ab8d4aca7308b9bd)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _BGFX_MATRIX_B3DHOMMATRIX_HXX
25 #define _BGFX_MATRIX_B3DHOMMATRIX_HXX
26 
27 #include <sal/types.h>
28 #include <basegfx/point/b3dpoint.hxx>
29 #include <basegfx/vector/b3dvector.hxx>
30 #include <o3tl/cow_wrapper.hxx>
31 #include <basegfx/basegfxdllapi.h>
32 
33 namespace basegfx
34 {
35     class B3DTuple;
36     class Impl3DHomMatrix;
37 
38     class BASEGFX_DLLPUBLIC B3DHomMatrix
39     {
40     public:
41         typedef o3tl::cow_wrapper< Impl3DHomMatrix > ImplType;
42 
43     private:
44         ImplType                                     mpImpl;
45 
46     public:
47         B3DHomMatrix();
48         B3DHomMatrix(const B3DHomMatrix& rMat);
49         ~B3DHomMatrix();
50 
51         /// unshare this matrix with all internally shared instances
52         void makeUnique();
53 
54         double get(sal_uInt16 nRow, sal_uInt16 nColumn) const;
55         void set(sal_uInt16 nRow, sal_uInt16 nColumn, double fValue);
56 
57         // test if last line is default to see if last line needs to be
58         // involved in calculations
59         bool isLastLineDefault() const;
60 
61         bool isIdentity() const;
62         /// Reset to the identity matrix
63         void identity();
64 
65         bool isInvertible() const;
66         /// Invert the matrix (if possible)
67         bool invert();
68 
69         bool isNormalized() const;
70         /// Normalize (i.e. force w=1) the matrix
71         void normalize();
72 
73         /// Calc the matrix determinant
74         double determinant() const;
75 
76         /// Calc the matrix trace
77         double trace() const;
78 
79         /// Transpose the matrix
80         void transpose();
81 
82         /// Rotation
83         void rotate(double fAngleX,double fAngleY,double fAngleZ);
84 
85         /// Translation
86         void translate(double fX, double fY, double fZ);
87 
88         /// Scaling
89         void scale(double fX, double fY, double fZ);
90 
91         // Shearing-Matrices
92         void shearXY(double fSx, double fSy);
93         void shearYZ(double fSy, double fSz);
94         void shearXZ(double fSx, double fSz);
95 
96         // Projection matrices, used for converting between eye and
97         // clip coordinates
98         void frustum(double fLeft = -1.0, double fRight = 1.0,
99             double fBottom = -1.0, double fTop = 1.0,
100             double fNear = 0.001, double fFar = 1.0);
101 
102         void ortho(double fLeft = -1.0, double fRight = 1.0,
103             double fBottom = -1.0, double fTop = 1.0,
104             double fNear = 0.0, double fFar = 1.0);
105 
106         // build orientation matrix
107         void orientation(
108             B3DPoint aVRP = B3DPoint(0.0,0.0,1.0),
109             B3DVector aVPN = B3DVector(0.0,0.0,1.0),
110             B3DVector aVUV = B3DVector(0.0,1.0,0.0));
111 
112         // addition, subtraction
113         B3DHomMatrix& operator+=(const B3DHomMatrix& rMat);
114         B3DHomMatrix& operator-=(const B3DHomMatrix& rMat);
115 
116         // comparison
117         bool operator==(const B3DHomMatrix& rMat) const;
118         bool operator!=(const B3DHomMatrix& rMat) const;
119 
120         // multiplication, division by constant value
121         B3DHomMatrix& operator*=(double fValue);
122         B3DHomMatrix& operator/=(double fValue);
123 
124         // matrix multiplication (from the left)
125         B3DHomMatrix& operator*=(const B3DHomMatrix& rMat);
126 
127         // assignment operator
128         B3DHomMatrix& operator=(const B3DHomMatrix& rMat);
129 
130         // decomposition
131         bool decompose(B3DTuple& rScale, B3DTuple& rTranslate, B3DTuple& rRotate, B3DTuple& rShear) const;
132     };
133 
134     // addition, subtraction
operator +(const B3DHomMatrix & rMatA,const B3DHomMatrix & rMatB)135     inline B3DHomMatrix operator+(const B3DHomMatrix& rMatA, const B3DHomMatrix& rMatB)
136     {
137         B3DHomMatrix aSum(rMatA);
138         aSum += rMatB;
139         return aSum;
140     }
141 
operator -(const B3DHomMatrix & rMatA,const B3DHomMatrix & rMatB)142     inline B3DHomMatrix operator-(const B3DHomMatrix& rMatA, const B3DHomMatrix& rMatB)
143     {
144         B3DHomMatrix aDiv(rMatA);
145         aDiv -= rMatB;
146         return aDiv;
147     }
148 
149     // multiplication, division by constant value
operator *(const B3DHomMatrix & rMat,double fValue)150     inline B3DHomMatrix operator*(const B3DHomMatrix& rMat, double fValue)
151     {
152         B3DHomMatrix aNew(rMat);
153         aNew *= fValue;
154         return aNew;
155     }
156 
operator /(const B3DHomMatrix & rMat,double fValue)157     inline B3DHomMatrix operator/(const B3DHomMatrix& rMat, double fValue)
158     {
159         B3DHomMatrix aNew(rMat);
160         aNew *= 1.0 / fValue;
161         return aNew;
162     }
163 
operator *(const B3DHomMatrix & rMatA,const B3DHomMatrix & rMatB)164     inline B3DHomMatrix operator*(const B3DHomMatrix& rMatA, const B3DHomMatrix& rMatB)
165     {
166         B3DHomMatrix aMul(rMatB);
167         aMul *= rMatA;
168         return aMul;
169     }
170 } // end of namespace basegfx
171 
172 #endif /* _BGFX_MATRIX_B3DHOMMATRIX_HXX */
173