| 721 | } |
| 722 | |
| 723 | void TSShape::removeMeshFromObject(S32 objIndex, S32 meshIndex) |
| 724 | { |
| 725 | TSShape::Object& obj = objects[objIndex]; |
| 726 | |
| 727 | // Remove the mesh, but do not destroy it (this must be done by the caller) |
| 728 | meshes[obj.startMeshIndex + meshIndex] = NULL; |
| 729 | |
| 730 | // Check if there are any objects remaining that have a valid mesh at this |
| 731 | // detail size |
| 732 | bool removeDetail = true; |
| 733 | for (S32 i = 0; i < objects.size(); i++) |
| 734 | { |
| 735 | if ((meshIndex < objects[i].numMeshes) && meshes[objects[i].startMeshIndex + meshIndex]) |
| 736 | { |
| 737 | removeDetail = false; |
| 738 | break; |
| 739 | } |
| 740 | } |
| 741 | |
| 742 | // Remove detail level if possible |
| 743 | if (removeDetail) |
| 744 | { |
| 745 | for (S32 i = 0; i < objects.size(); i++) |
| 746 | { |
| 747 | if (meshIndex < objects[i].numMeshes) |
| 748 | { |
| 749 | U32 idxToRemove = objects[i].startMeshIndex + meshIndex; |
| 750 | meshes.erase(idxToRemove); |
| 751 | objects[i].numMeshes--; |
| 752 | |
| 753 | // Clear invalid parent |
| 754 | for (U32 k = 0; k < meshes.size(); k++) |
| 755 | { |
| 756 | if (meshes[k] == NULL) |
| 757 | continue; |
| 758 | |
| 759 | if (meshes[k]->parentMesh == idxToRemove) |
| 760 | { |
| 761 | meshes[k]->parentMesh = -1; |
| 762 | } |
| 763 | else if (meshes[k]->parentMesh > idxToRemove) |
| 764 | { |
| 765 | meshes[k]->parentMesh--; |
| 766 | } |
| 767 | } |
| 768 | |
| 769 | for (S32 j = 0; j < objects.size(); j++) |
| 770 | { |
| 771 | if (objects[j].startMeshIndex > objects[i].startMeshIndex) |
| 772 | objects[j].startMeshIndex--; |
| 773 | } |
| 774 | } |
| 775 | } |
| 776 | |
| 777 | Vector<S32> validDetails; |
| 778 | getSubShapeDetails(getSubShapeForObject(objIndex), validDetails); |
| 779 | |
| 780 | for (S32 i = 0; i < validDetails.size(); i++) |