| 2992 | } |
| 2993 | |
| 2994 | static void AdjustPosScale(HScene scene, InternalNode* n, const Vector4& reference_scale, Vector4& position, Vector4& scale) |
| 2995 | { |
| 2996 | if (scene->m_AdjustReference == ADJUST_REFERENCE_LEGACY && n->m_ParentIndex != INVALID_INDEX) |
| 2997 | { |
| 2998 | return; |
| 2999 | } |
| 3000 | |
| 3001 | Node& node = n->m_Node; |
| 3002 | // Apply ref-scaling to scale uniformly, select the smallest scale component to make sure everything fits |
| 3003 | Vector4 adjust_scale = ApplyAdjustOnReferenceScale(reference_scale, node.m_AdjustMode); |
| 3004 | |
| 3005 | Vector4 parent_dims; |
| 3006 | |
| 3007 | if (scene->m_AdjustReference == ADJUST_REFERENCE_LEGACY || n->m_ParentIndex == INVALID_INDEX) { |
| 3008 | parent_dims = Vector4((float) scene->m_Width, (float) scene->m_Height, 0.0f, 1.0f); |
| 3009 | } else { |
| 3010 | InternalNode* parent = &scene->m_Nodes[n->m_ParentIndex]; |
| 3011 | parent_dims = Vector4(parent->m_Node.m_Properties[dmGui::PROPERTY_SIZE].getX(), parent->m_Node.m_Properties[dmGui::PROPERTY_SIZE].getY(), 0.0f, 1.0f); |
| 3012 | } |
| 3013 | |
| 3014 | Vector4 offset = Vector4(0.0f, 0.0f, 0.0f, 0.0f); |
| 3015 | Vector4 adjusted_dims = mulPerElem(parent_dims, adjust_scale); |
| 3016 | Vector4 ref_size; |
| 3017 | if (scene->m_AdjustReference == ADJUST_REFERENCE_LEGACY || n->m_ParentIndex == INVALID_INDEX) { |
| 3018 | ref_size = Vector4((float) scene->m_AdjustWidth, (float) scene->m_AdjustHeight, 0.0f, 1.0f); |
| 3019 | |
| 3020 | // need to calculate offset for root nodes, since (0,0) is in middle of scene |
| 3021 | offset = (ref_size - adjusted_dims) * 0.5f; |
| 3022 | offset.setX(offset.getX() + scene->m_AdjustOffsetX); |
| 3023 | offset.setY(offset.getY() + scene->m_AdjustOffsetY); |
| 3024 | } else { |
| 3025 | InternalNode* parent = &scene->m_Nodes[n->m_ParentIndex]; |
| 3026 | ref_size = Vector4(parent->m_Node.m_Properties[dmGui::PROPERTY_SIZE].getX() * reference_scale.getX(), parent->m_Node.m_Properties[dmGui::PROPERTY_SIZE].getY() * reference_scale.getY(), 0.0f, 1.0f); |
| 3027 | } |
| 3028 | |
| 3029 | // Apply anchoring |
| 3030 | Vector4 scaled_position = mulPerElem(position, adjust_scale); |
| 3031 | if (node.m_XAnchor == XANCHOR_LEFT || node.m_XAnchor == XANCHOR_RIGHT) |
| 3032 | { |
| 3033 | offset.setX(0.0f); |
| 3034 | scaled_position.setX(position.getX() * reference_scale.getX()); |
| 3035 | } |
| 3036 | |
| 3037 | if (node.m_YAnchor == YANCHOR_TOP || node.m_YAnchor == YANCHOR_BOTTOM) |
| 3038 | { |
| 3039 | offset.setY(0.0f); |
| 3040 | scaled_position.setY(position.getY() * reference_scale.getY()); |
| 3041 | } |
| 3042 | |
| 3043 | position = scaled_position + offset; |
| 3044 | scale = mulPerElem(adjust_scale, scale); |
| 3045 | } |
| 3046 | |
| 3047 | // Same euler checks as in gameobject.cpp |
| 3048 | static void UpdateEulerToRotation(Node& node) |
no test coverage detected