| 4563 | } |
| 4564 | |
| 4565 | Result SetNodeParent(HScene scene, HNode node, HNode parent, bool keep_scene_transform) |
| 4566 | { |
| 4567 | if (node == parent) |
| 4568 | return RESULT_INF_RECURSION; |
| 4569 | InternalNode* n = GetNode(scene, node); |
| 4570 | uint16_t parent_index = INVALID_INDEX; |
| 4571 | InternalNode* parent_node = 0x0; |
| 4572 | if (parent != INVALID_HANDLE) |
| 4573 | { |
| 4574 | parent_node = GetNode(scene, parent); |
| 4575 | // Check for infinite recursion |
| 4576 | uint16_t ancestor_index = parent_node->m_ParentIndex; |
| 4577 | while (ancestor_index != INVALID_INDEX) |
| 4578 | { |
| 4579 | if (n->m_Index == ancestor_index) |
| 4580 | return RESULT_INF_RECURSION; |
| 4581 | ancestor_index = scene->m_Nodes[ancestor_index].m_ParentIndex; |
| 4582 | } |
| 4583 | parent_index = parent_node->m_Index; |
| 4584 | } |
| 4585 | if (parent_index != n->m_ParentIndex) |
| 4586 | { |
| 4587 | if (keep_scene_transform) { |
| 4588 | |
| 4589 | Matrix4 node_m; |
| 4590 | // Calculate the nodes current scene transform |
| 4591 | CalculateNodeTransform(scene, n, CalculateNodeTransformFlags(), node_m); |
| 4592 | Vector3 node_pos = node_m.getCol3().getXYZ(); |
| 4593 | |
| 4594 | SetScreenPosition(scene, n, parent_node, node_pos); |
| 4595 | } |
| 4596 | |
| 4597 | RemoveFromNodeList(scene, n); |
| 4598 | InternalNode* prev = 0x0; |
| 4599 | uint16_t prev_index = scene->m_RenderTail; |
| 4600 | if (parent_index != INVALID_INDEX) |
| 4601 | { |
| 4602 | prev_index = parent_node->m_ChildTail; |
| 4603 | } |
| 4604 | if (prev_index != INVALID_INDEX) |
| 4605 | { |
| 4606 | prev = &scene->m_Nodes[prev_index]; |
| 4607 | } |
| 4608 | AddToNodeList(scene, n, parent_node, prev); |
| 4609 | } |
| 4610 | return RESULT_OK; |
| 4611 | } |
| 4612 | |
| 4613 | Result CloneNode(HScene scene, HNode node, HNode* out_node) |
| 4614 | { |