@@ -147,6 +147,11 @@ void Transform::setParentTransform(Transform *parent, bool force) {
147147 return ;
148148 }
149149
150+ if (parent && actor ()->parent () != parent->actor ()) {
151+ actor ()->setParent (parent->actor ());
152+ return ;
153+ }
154+
150155 Vector3 p;
151156 Vector3 e;
152157 Vector3 s;
@@ -185,60 +190,42 @@ void Transform::setParentTransform(Transform *parent, bool force) {
185190 Returns current transform matrix in local space.
186191*/
187192const Matrix4 &Transform::localTransform () const {
188- if (m_dirty) {
189- std::unique_lock<std::mutex> locker (m_mutex);
190- cleanDirty ();
191- }
193+ cleanDirty ();
192194 return m_transform;
193195}
194196/* !
195197 Returns current transform matrix in world space.
196198*/
197199const Matrix4 &Transform::worldTransform () const {
198- if (m_dirty) {
199- std::unique_lock<std::mutex> locker (m_mutex);
200- cleanDirty ();
201- }
200+ cleanDirty ();
202201 return m_worldTransform;
203202}
204203/* !
205204 Returns current position of the transform in world space.
206205*/
207206Vector3 Transform::worldPosition () const {
208- if (m_dirty) {
209- std::unique_lock<std::mutex> locker (m_mutex);
210- cleanDirty ();
211- }
207+ cleanDirty ();
212208 return Vector3 (m_worldTransform[12 ], m_worldTransform[13 ], m_worldTransform[14 ]);
213209}
214210/* !
215211 Returns current rotation of the transform in world space as Euler angles in degrees.
216212*/
217213Vector3 Transform::worldRotation () const {
218- if (m_dirty) {
219- std::unique_lock<std::mutex> locker (m_mutex);
220- cleanDirty ();
221- }
214+ cleanDirty ();
222215 return m_worldRotation;
223216}
224217/* !
225218 Returns current rotation of the transform in world space as Quaternion.
226219*/
227220Quaternion Transform::worldQuaternion () const {
228- if (m_dirty) {
229- std::unique_lock<std::mutex> locker (m_mutex);
230- cleanDirty ();
231- }
221+ cleanDirty ();
232222 return m_worldQuaternion;
233223}
234224/* !
235225 Returns current scale of the transform in world space.
236226*/
237227Vector3 Transform::worldScale () const {
238- if (m_dirty) {
239- std::unique_lock<std::mutex> locker (m_mutex);
240- cleanDirty ();
241- }
228+ cleanDirty ();
242229 return m_worldScale;
243230}
244231/* !
@@ -261,10 +248,7 @@ void Transform::setParent(Object *parent, int32_t position, bool force) {
261248 \internal
262249*/
263250uint32_t Transform::hash () const {
264- if (m_dirty) {
265- std::unique_lock<std::mutex> locker (m_mutex);
266- cleanDirty ();
267- }
251+ cleanDirty ();
268252 return m_hash;
269253}
270254/* !
@@ -275,20 +259,24 @@ const std::list<Transform *> &Transform::children() const {
275259}
276260
277261void Transform::cleanDirty () const {
278- m_transform = Matrix4 (m_position, m_quaternion, m_scale);
279- m_worldTransform = m_transform;
280- m_worldRotation = m_rotation;
281- m_worldQuaternion = m_quaternion;
282- m_worldScale = m_scale;
283- if (m_parent) {
284- m_worldScale = m_parent->worldScale () * m_worldScale;
285- m_worldRotation = m_parent->worldRotation () + m_worldRotation;
286- m_worldQuaternion = m_parent->worldQuaternion () * m_worldQuaternion;
287- m_worldTransform = m_parent->worldTransform () * m_worldTransform;
288- }
289- m_hash = 16 ;
290- for (int i = 0 ; i < 16 ; i++) {
291- Mathf::hashCombine (m_hash, m_worldTransform[i]);
262+ if (m_dirty) {
263+ std::unique_lock<std::mutex> locker (m_mutex);
264+
265+ m_transform = Matrix4 (m_position, m_quaternion, m_scale);
266+ m_worldTransform = m_transform;
267+ m_worldRotation = m_rotation;
268+ m_worldQuaternion = m_quaternion;
269+ m_worldScale = m_scale;
270+ if (m_parent) {
271+ m_worldScale = m_parent->worldScale () * m_worldScale;
272+ m_worldRotation = m_parent->worldRotation () + m_worldRotation;
273+ m_worldQuaternion = m_parent->worldQuaternion () * m_worldQuaternion;
274+ m_worldTransform = m_parent->worldTransform () * m_worldTransform;
275+ }
276+ m_hash = 16 ;
277+ for (int i = 0 ; i < 16 ; i++) {
278+ Mathf::hashCombine (m_hash, m_worldTransform[i]);
279+ }
280+ m_dirty = false ;
292281 }
293- m_dirty = false ;
294282}
0 commit comments