| 132 | } |
| 133 | |
| 134 | CollisionMesh::CollisionMesh(const Vector3& pos, const Quaternion& orient, const CollisionMeshDesc& desc) |
| 135 | { |
| 136 | _position = pos; |
| 137 | _orientation = orient; |
| 138 | _vertices = desc.GetVertices(); |
| 139 | |
| 140 | // Add triangles. |
| 141 | for (int i = 0; i < desc.GetIds().size(); i += LocalCollisionTriangle::VERTEX_COUNT) |
| 142 | _triangles.push_back(LocalCollisionTriangle(desc.GetIds()[i], desc.GetIds()[i + 1], desc.GetIds()[i + 2])); |
| 143 | |
| 144 | auto triIds = std::vector<int>{}; |
| 145 | triIds.reserve(_triangles.size()); |
| 146 | auto triAabbs = std::vector<BoundingBox>{}; |
| 147 | triAabbs.reserve(_triangles.size()); |
| 148 | |
| 149 | // Collect triangle IDs and AABBs. |
| 150 | for (int i = 0; i < _triangles.size(); i++) |
| 151 | { |
| 152 | const auto& tri = _triangles[i]; |
| 153 | |
| 154 | triIds.push_back(i); |
| 155 | triAabbs.push_back(tri.GetAabb(_vertices)); |
| 156 | } |
| 157 | |
| 158 | // Create triangle tree. |
| 159 | _triangleTree = Bvh(triIds, triAabbs); |
| 160 | } |
| 161 | |
| 162 | std::optional<CollisionMeshRayCollisionData> CollisionMesh::GetCollision(const Ray& ray, float dist) const |
| 163 | { |