| 822 | } |
| 823 | |
| 824 | void SceneGraph::HairSetNode::compact_vertices() |
| 825 | { |
| 826 | std::vector<avector<Vec3ff>> positions_o(positions.size()); |
| 827 | for (size_t i=0; i<positions.size(); i++) |
| 828 | positions_o.reserve(positions[i].size()); |
| 829 | |
| 830 | for (size_t i=0; i<hairs.size(); i++) |
| 831 | { |
| 832 | unsigned idx = hairs[i].vertex; |
| 833 | if (test_location(positions,idx,positions_o,positions_o[0].size()-1)) |
| 834 | { |
| 835 | hairs[i].vertex = (unsigned) positions_o[0].size()-1; |
| 836 | for (size_t k=0; k<positions.size(); k++) { |
| 837 | positions_o[k].push_back(positions[k][idx+1]); |
| 838 | positions_o[k].push_back(positions[k][idx+2]); |
| 839 | positions_o[k].push_back(positions[k][idx+3]); |
| 840 | } |
| 841 | } |
| 842 | |
| 843 | else if (test_location(positions,idx,positions_o,positions_o[0].size()-3)) |
| 844 | { |
| 845 | hairs[i].vertex = (unsigned) positions_o[0].size()-3; |
| 846 | for (size_t k=0; k<positions.size(); k++) |
| 847 | positions_o[k].push_back(positions[k][idx+3]); |
| 848 | } |
| 849 | |
| 850 | else |
| 851 | { |
| 852 | hairs[i].vertex = (unsigned) positions_o[0].size(); |
| 853 | for (size_t k=0; k<positions.size(); k++) { |
| 854 | positions_o[k].push_back(positions[k][idx+0]); |
| 855 | positions_o[k].push_back(positions[k][idx+1]); |
| 856 | positions_o[k].push_back(positions[k][idx+2]); |
| 857 | positions_o[k].push_back(positions[k][idx+3]); |
| 858 | } |
| 859 | } |
| 860 | } |
| 861 | |
| 862 | for (auto& v : positions_o) |
| 863 | v.shrink_to_fit(); |
| 864 | |
| 865 | positions = std::move(positions_o); |
| 866 | } |
| 867 | |
| 868 | void SceneGraph::extend_animation(Ref<SceneGraph::Node> node0, Ref<SceneGraph::Node> node1) |
| 869 | { |
nothing calls this directly
no test coverage detected