1 /* Copyright Jukka Jyl�nki
2
3    Licensed under the Apache License, Version 2.0 (the "License");
4    you may not use this file except in compliance with the License.
5    You may obtain a copy of the License at
6
7        http://www.apache.org/licenses/LICENSE-2.0
8
9    Unless required by applicable law or agreed to in writing, software
10    distributed under the License is distributed on an "AS IS" BASIS,
11    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12    See the License for the specific language governing permissions and
13    limitations under the License. */
14
15 /** @file TransformOps.h
16         @author Jukka Jyl�nki
17         @brief */
18 #pragma once
19
20 #include "../MathGeoLibFwd.h"
21 #include "float3.h"
22 #include "SSEMath.h"
23
24 MATH_BEGIN_NAMESPACE
25
26 /// A structure that represents the translate operation for 3D objects.
27 /** This structure is used to optimize special cases of 3D transformation concatenations. The use of this
28         class occurs transparently to the user. You do not need to instantiate new TranslateOp objects in your code. */
29 class ALIGN16 TranslateOp
30 {
31 public:
32         vec offset;
33
34         /// Constructs an uninitialized TranslateOp.
35         TranslateOp() {}
36
37         /// Constructs a TranslateOp that translates the given amount.
38         explicit TranslateOp(const float3 &offset);
39         explicit TranslateOp(const float4 &offset);
40         TranslateOp(float x, float y, float z);
41
42         /// Returns the translation offset (x, y, z).
43         vec Offset() const;
44
45         /// Converts this TranslateOp object to a matrix.
46         float3x4 ToFloat3x4() const;
47         /// Converts this TranslateOp object to a matrix.
48         float4x4 ToFloat4x4() const;
49
50         /// Converts this TranslateOp object to a matrix.
51         operator float3x4() const;
52         /// Converts this TranslateOp object to a matrix.
53         operator float4x4() const;
54
55 #ifdef MATH_ENABLE_STL_SUPPORT
56         /// Returns "(x, y, z)".
57         std::string ToString() const;
58 #endif
59 };
60
61 float3x4 operator *(const TranslateOp &lhs, const float3x4 &rhs);
62 float3x4 operator *(const float3x4 &lhs, const TranslateOp &rhs);
63
64 // This form of multiplication is based on the optimization assumption that the last row of rhs is [0,0,0,1], i.e.
65 // that rhs does not contain a "projective" part. If this does not hold, cast TranslateOp lhs to a float4x4 to 
66 // perform a full generic 4x4 matrix multiplication instead.
67 float4x4 operator *(const TranslateOp &lhs, const float4x4 &rhs);
68 float4x4 operator *(const float4x4 &lhs, const TranslateOp &rhs);
69
70 /// A structure that represents the scale operation for 3D objects.
71 /** This structure is used to optimize special cases of 3D transformation concatenations. The use of this
72         class occurs transparently to the user. You do not need to instantiate new ScaleOp objects in your code. */
73 class ALIGN16 ScaleOp
74 {
75 public:
76         vec scale;
77
78         /// Constructs an uninitialized ScaleOp.
79         ScaleOp() {}
80
81         /// Constructs a ScaleOp with the given scale factors.
82         explicit ScaleOp(const float3 &scale);
83         explicit ScaleOp(const float4 &scale);
84         ScaleOp(float sx, float sy, float sz);
85
86         /// Returns the scale factors (x, y, z).
87         vec Offset() const;
88
89         /// Converts this ScaleOp to a matrix.
90         operator float3x3() const;
91         /// Converts this ScaleOp to a matrix.
92         operator float3x4() const;
93         /// Converts this ScaleOp to a matrix.
94         operator float4x4() const;
95
96         /// Converts this ScaleOp to a matrix.
97         float3x3 ToFloat3x3() const;
98         /// Converts this ScaleOp to a matrix.
99         float3x4 ToFloat3x4() const;
100         /// Converts this ScaleOp to a matrix.
101         float4x4 ToFloat4x4() const;
102
103 #ifdef MATH_ENABLE_STL_SUPPORT
104         /// Returns "(x, y, z)".
105         std::string ToString() const;
106 #endif
107 };
108
109 float3x3 operator *(const ScaleOp &lhs, const float3x3 &rhs);
110 float3x3 operator *(const float3x3 &lhs, const ScaleOp &rhs);
111 float3x4 operator *(const ScaleOp &lhs, const float3x4 &rhs);
112 float3x4 operator *(const float3x4 &lhs, const ScaleOp &rhs);
113 float4x4 operator *(const ScaleOp &lhs, const float4x4 &rhs);
114 float4x4 operator *(const float4x4 &lhs, const ScaleOp &rhs);
115
116 float3x4 operator *(const ScaleOp &lhs, const TranslateOp &rhs);
117 float3x4 operator *(const TranslateOp &lhs, const ScaleOp &rhs);
118
119 #ifdef MATH_QT_INTEROP
120 Q_DECLARE_METATYPE(TranslateOp)
121 Q_DECLARE_METATYPE(TranslateOp*)
122 Q_DECLARE_METATYPE(ScaleOp)
123 Q_DECLARE_METATYPE(ScaleOp*)
124 #endif
125
126 MATH_END_NAMESPACE

Go back to previous page