//---------------------------------------- void ofNode::setParent(ofNode& parent, bool bMaintainGlobalTransform) { if(bMaintainGlobalTransform) { ofMatrix4x4 postParentGlobalTransform = getGlobalTransformMatrix() * parent.getGlobalTransformMatrix().getInverse(); parent.addListener(*this); setTransformMatrix(postParentGlobalTransform); } else { parent.addListener(*this); } this->parent = &parent; }
//---------------------------------------- void ofNode::setParent(ofNode& parent, bool bMaintainGlobalTransform) { if (this->parent) { // we need to make sure to clear before // re-assigning parenthood. clearParent(bMaintainGlobalTransform); } if(bMaintainGlobalTransform) { auto postParentGlobalTransform = glm::inverse(parent.getGlobalTransformMatrix()) * getGlobalTransformMatrix(); parent.addListener(*this); setTransformMatrix(postParentGlobalTransform); } else { parent.addListener(*this); } this->parent = &parent; }
//---------------------------------------- void ofNode::setParent(ofNode& parent, bool bMaintainGlobalTransform) { if (this->parent) { // we need to make sure to clear before // re-assigning parenthood. clearParent(bMaintainGlobalTransform); } if(bMaintainGlobalTransform) { auto postParentPosition = position - parent.getGlobalPosition(); auto postParentOrientation = orientation.get() * glm::inverse(parent.getGlobalOrientation()); auto postParentScale = scale / parent.getGlobalScale(); parent.addListener(*this); setOrientation(postParentOrientation); setPosition(postParentPosition); setScale(postParentScale); } else { parent.addListener(*this); } this->parent = &parent; }