void ScaleSelected::visit(const scene::INodePtr& node) const { ITransformNodePtr transformNode = Node_getTransformNode(node); if(transformNode != 0) { ITransformablePtr transform = Node_getTransformable(node); if(transform != 0) { transform->setType(TRANSFORM_PRIMITIVE); transform->setScale(c_scale_identity); transform->setTranslation(c_translation_identity); transform->setType(TRANSFORM_PRIMITIVE); transform->setScale(m_scale); { EditablePtr editable = Node_getEditable(node); const Matrix4& localPivot = editable != 0 ? editable->getLocalPivot() : Matrix4::getIdentity(); Vector3 parent_translation; translation_for_pivoted_scale( parent_translation, m_scale, m_world_pivot, node->localToWorld().getMultipliedBy(localPivot), transformNode->localToParent().getMultipliedBy(localPivot) ); transform->setTranslation(parent_translation); } } } }
void matrix4_assign_rotation_for_pivot(Matrix4& matrix, const scene::INodePtr& node) { EditablePtr editable = Node_getEditable(node); // If the instance is editable, take the localpivot point into account, otherwise just apply the rotation if (editable != 0) { matrix4_assign_rotation(matrix, node->localToWorld().getMultipliedBy(editable->getLocalPivot())); } else { matrix4_assign_rotation(matrix, node->localToWorld()); } }