| 2013 | } |
| 2014 | |
| 2015 | void BulletWorld::FinalizeStaticEntries() { |
| 2016 | // Create meta model of all models combined |
| 2017 | vert_indices.clear(); |
| 2018 | vertices.clear(); |
| 2019 | for (auto &static_entrie : static_entries) { |
| 2020 | Model &model = Models::Instance()->GetModel(static_entrie.model_id); |
| 2021 | mat4 &transform = static_entrie.transform; |
| 2022 | // int start_vert_indices = vert_indices.size(); |
| 2023 | int start_vertices = vertices.size() / 3; |
| 2024 | for (int j = 0, len = model.vertices.size(); j < len; j += 3) { |
| 2025 | vec3 vec(model.vertices[j + 0], model.vertices[j + 1], model.vertices[j + 2]); |
| 2026 | vec = transform * vec; |
| 2027 | vertices.push_back(vec[0]); |
| 2028 | vertices.push_back(vec[1]); |
| 2029 | vertices.push_back(vec[2]); |
| 2030 | } |
| 2031 | for (unsigned int face : model.faces) { |
| 2032 | vert_indices.push_back(face + start_vertices); |
| 2033 | } |
| 2034 | } |
| 2035 | // Create physics object |
| 2036 | SharedShapePtr shape; |
| 2037 | ShapeDisposalData *sdd = NULL; |
| 2038 | sdd = new ShapeDisposalData(); |
| 2039 | btBvhTriangleMeshShape *new_shape; |
| 2040 | { |
| 2041 | int index_stride = 3 * sizeof(int); |
| 2042 | int vertex_stride = 3 * sizeof(GLfloat); |
| 2043 | std::vector<int> &faces = sdd->faces; |
| 2044 | faces.resize(vert_indices.size()); |
| 2045 | for (unsigned i = 0; i < faces.size(); i++) { |
| 2046 | faces[i] = vert_indices[i]; |
| 2047 | } |
| 2048 | sdd->index_vert_array = new btTriangleIndexVertexArray(vert_indices.size() / 3, |
| 2049 | &vert_indices[0], |
| 2050 | index_stride, |
| 2051 | vertices.size() / 3, |
| 2052 | (btScalar *)&vertices[0], |
| 2053 | vertex_stride); |
| 2054 | new_shape = new btBvhTriangleMeshShape(sdd->index_vert_array, true); |
| 2055 | sdd->triangle_info_map = new btTriangleInfoMap(); |
| 2056 | btGenerateInternalEdgeInfo(new_shape, sdd->triangle_info_map); |
| 2057 | } |
| 2058 | shape.reset(new_shape); |
| 2059 | BulletObject *obj = CreateRigidBody(shape, 0.0f, BW_NO_FLAGS); |
| 2060 | if (sdd) { |
| 2061 | obj->shape_disposal_data.reset(sdd); |
| 2062 | } |
| 2063 | obj->body->setCollisionFlags(obj->body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); |
| 2064 | merged_obj = obj; |
| 2065 | } |