GLTFLoader: updated node transforms handling
assiduous
2 years ago
239 | 239 | |
240 | 240 | float4x4 LocalMatrix() const; |
241 | 241 | float4x4 GetMatrix() const; |
242 | void Update(); | |
242 | void UpdateTransforms(); | |
243 | 243 | }; |
244 | 244 | |
245 | 245 |
220 | 220 | return mat; |
221 | 221 | } |
222 | 222 | |
223 | void Node::Update() | |
223 | void Node::UpdateTransforms() | |
224 | 224 | { |
225 | 225 | if (pMesh) |
226 | 226 | { |
242 | 242 | |
243 | 243 | for (auto& child : Children) |
244 | 244 | { |
245 | child->Update(); | |
245 | child->UpdateTransforms(); | |
246 | 246 | } |
247 | 247 | } |
248 | 248 | |
1683 | 1683 | { |
1684 | 1684 | node->pSkin = Skins[node->SkinIndex].get(); |
1685 | 1685 | } |
1686 | ||
1687 | // Initial pose | |
1688 | if (node->pMesh) | |
1689 | { | |
1690 | node->Update(); | |
1691 | } | |
1692 | } | |
1686 | } | |
1687 | ||
1688 | // Initial pose | |
1689 | for (auto& root_node : Nodes) | |
1690 | { | |
1691 | root_node->UpdateTransforms(); | |
1692 | } | |
1693 | CalculateSceneDimensions(); | |
1693 | 1694 | |
1694 | 1695 | |
1695 | 1696 | Extensions = gltf_model.extensionsUsed; |
1769 | 1770 | { |
1770 | 1771 | PrepareGPUResources(pDevice, pContext); |
1771 | 1772 | } |
1772 | ||
1773 | CalculateSceneDimensions(); | |
1774 | 1773 | } |
1775 | 1774 | |
1776 | 1775 | void Model::CalculateBoundingBox(Node* node, const Node* parent) |
1896 | 1895 | { |
1897 | 1896 | for (auto& node : Nodes) |
1898 | 1897 | { |
1899 | node->Update(); | |
1898 | node->UpdateTransforms(); | |
1900 | 1899 | } |
1901 | 1900 | } |
1902 | 1901 | } |
1904 | 1903 | void Model::Transform(const float4x4& Matrix) |
1905 | 1904 | { |
1906 | 1905 | for (auto& root_node : Nodes) |
1906 | { | |
1907 | 1907 | root_node->Matrix *= Matrix; |
1908 | ||
1909 | for (auto* node : LinearNodes) | |
1910 | { | |
1911 | if (node->pMesh) | |
1912 | node->Update(); | |
1908 | root_node->UpdateTransforms(); | |
1913 | 1909 | } |
1914 | 1910 | |
1915 | 1911 | CalculateSceneDimensions(); |