void GameObject::SetParent(GameObject *newParent, bool keepWorldTransform) { if (keepWorldTransform) Debug_Log("Set parent of " << this << " to " << newParent); if (m_parent != newParent) { if (m_parent) { m_parent->m_children.Remove(this); } if (keepWorldTransform) { // TODO: Not working yet (sometimes scaling breaks) Matrix4 oldParentToWorld; parent->transform->GetLocalToWorldMatrix(&oldParentToWorld); //Debug_Log("LOCAL TO WORLD: " << Transform::FromTransformMatrix(oldParentToWorld)); Matrix4 worldToNewParent; if (newParent) { newParent->transform->GetLocalToWorldMatrix(&worldToNewParent); worldToNewParent = worldToNewParent.Inversed(); //Debug_Log("WORLD TO NEW PARENT: " << Transform::FromTransformMatrix(worldToNewParent)); } Matrix4 keepWorldTransformMatrix = worldToNewParent * oldParentToWorld * transform->GetLocalToParentMatrix(); //Debug_Log("LOCALTOPARENT: " << // Quaternion::EulerAngles( // Transform::GetRotationFromMatrix4(transform->GetLocalToParentMatrix()))); //Debug_Log("KEEPWORLDMATRIX: " << Transform::FromTransformMatrix(keepWorldTransformMatrix)); Transform t = Transform::FromTransformMatrix(keepWorldTransformMatrix); transform->SetLocalPosition(t.GetLocalPosition()); transform->SetLocalRotation(t.GetLocalRotation()); transform->SetLocalScale (t.GetLocalScale()); } m_parent = newParent; if (m_parent) { m_parent->m_children.PushBack(this); } } }