xref: /AOO41X/main/basegfx/inc/basegfx/matrix/b3dhommatrix.hxx (revision ce9c7ef7bd056b6da7d6eeebb749fbf2160d647b)
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 
32 namespace basegfx
33 {
34     class B3DTuple;
35     class Impl3DHomMatrix;
36 
37     class B3DHomMatrix
38     {
39     public:
40         typedef o3tl::cow_wrapper< Impl3DHomMatrix > ImplType;
41 
42     private:
43         ImplType                                     mpImpl;
44 
45     public:
46         B3DHomMatrix();
47         B3DHomMatrix(const B3DHomMatrix& rMat);
48         ~B3DHomMatrix();
49 
50         /// unshare this matrix with all internally shared instances
51         void makeUnique();
52 
53         double get(sal_uInt16 nRow, sal_uInt16 nColumn) const;
54         void set(sal_uInt16 nRow, sal_uInt16 nColumn, double fValue);
55 
56         // test if last line is default to see if last line needs to be
57         // involved in calculations
58         bool isLastLineDefault() const;
59 
60         bool isIdentity() const;
61         /// Reset to the identity matrix
62         void identity();
63 
64         bool isInvertible() const;
65         /// Invert the matrix (if possible)
66         bool invert();
67 
68         bool isNormalized() const;
69         /// Normalize (i.e. force w=1) the matrix
70         void normalize();
71 
72         /// Calc the matrix determinant
73         double determinant() const;
74 
75         /// Calc the matrix trace
76         double trace() const;
77 
78         /// Transpose the matrix
79         void transpose();
80 
81         /// Rotation
82         void rotate(double fAngleX,double fAngleY,double fAngleZ);
83 
84         /// Translation
85         void translate(double fX, double fY, double fZ);
86 
87         /// Scaling
88         void scale(double fX, double fY, double fZ);
89 
90         // Shearing-Matrices
91         void shearXY(double fSx, double fSy);
92         void shearYZ(double fSy, double fSz);
93         void shearXZ(double fSx, double fSz);
94 
95         // Projection matrices, used for converting between eye and
96         // clip coordinates
97         void frustum(double fLeft = -1.0, double fRight = 1.0,
98             double fBottom = -1.0, double fTop = 1.0,
99             double fNear = 0.001, double fFar = 1.0);
100 
101         void ortho(double fLeft = -1.0, double fRight = 1.0,
102             double fBottom = -1.0, double fTop = 1.0,
103             double fNear = 0.0, double fFar = 1.0);
104 
105         // build orientation matrix
106         void orientation(
107             B3DPoint aVRP = B3DPoint(0.0,0.0,1.0),
108             B3DVector aVPN = B3DVector(0.0,0.0,1.0),
109             B3DVector aVUV = B3DVector(0.0,1.0,0.0));
110 
111         // addition, subtraction
112         B3DHomMatrix& operator+=(const B3DHomMatrix& rMat);
113         B3DHomMatrix& operator-=(const B3DHomMatrix& rMat);
114 
115         // comparison
116         bool operator==(const B3DHomMatrix& rMat) const;
117         bool operator!=(const B3DHomMatrix& rMat) const;
118 
119         // multiplication, division by constant value
120         B3DHomMatrix& operator*=(double fValue);
121         B3DHomMatrix& operator/=(double fValue);
122 
123         // matrix multiplication (from the left)
124         B3DHomMatrix& operator*=(const B3DHomMatrix& rMat);
125 
126         // assignment operator
127         B3DHomMatrix& operator=(const B3DHomMatrix& rMat);
128 
129         // decomposition
130         bool decompose(B3DTuple& rScale, B3DTuple& rTranslate, B3DTuple& rRotate, B3DTuple& rShear) const;
131     };
132 
133     // addition, subtraction
operator +(const B3DHomMatrix & rMatA,const B3DHomMatrix & rMatB)134     inline B3DHomMatrix operator+(const B3DHomMatrix& rMatA, const B3DHomMatrix& rMatB)
135     {
136         B3DHomMatrix aSum(rMatA);
137         aSum += rMatB;
138         return aSum;
139     }
140 
operator -(const B3DHomMatrix & rMatA,const B3DHomMatrix & rMatB)141     inline B3DHomMatrix operator-(const B3DHomMatrix& rMatA, const B3DHomMatrix& rMatB)
142     {
143         B3DHomMatrix aDiv(rMatA);
144         aDiv -= rMatB;
145         return aDiv;
146     }
147 
148     // multiplication, division by constant value
operator *(const B3DHomMatrix & rMat,double fValue)149     inline B3DHomMatrix operator*(const B3DHomMatrix& rMat, double fValue)
150     {
151         B3DHomMatrix aNew(rMat);
152         aNew *= fValue;
153         return aNew;
154     }
155 
operator /(const B3DHomMatrix & rMat,double fValue)156     inline B3DHomMatrix operator/(const B3DHomMatrix& rMat, double fValue)
157     {
158         B3DHomMatrix aNew(rMat);
159         aNew *= 1.0 / fValue;
160         return aNew;
161     }
162 
operator *(const B3DHomMatrix & rMatA,const B3DHomMatrix & rMatB)163     inline B3DHomMatrix operator*(const B3DHomMatrix& rMatA, const B3DHomMatrix& rMatB)
164     {
165         B3DHomMatrix aMul(rMatB);
166         aMul *= rMatA;
167         return aMul;
168     }
169 } // end of namespace basegfx
170 
171 #endif /* _BGFX_MATRIX_B3DHOMMATRIX_HXX */
172