BoxCollider BoxCollider::generateCage(const Entity &entity) { const Transform &t = entity.getComponent<Transform>(); const Vector3f &rotation = t.rotation; const Vector3f &position = t.position; const Vector3f &scale = t.scale; if (entity.hasComponent<MeshDrawable>()) { Mesh &mesh = entity.getComponent<MeshDrawable>().mesh; Matrix4f modelMatrix; modelMatrix.rotate(rotation); modelMatrix.scale(scale); Vector3f size; for (unsigned int i = 0; i < mesh.vertices.size(); i++) { Vector3f v = modelMatrix.transform(mesh.vertices[i]); size.x = (fabs(v.x) > size.x) ? fabs(v.x) : size.x; size.y = (fabs(v.y) > size.y) ? fabs(v.y) : size.y; size.z = (fabs(v.z) > size.z) ? fabs(v.z) : size.z; } return BoxCollider(position, size * 2); } return BoxCollider(position, scale * 2); }
void Level00::LoadStaticSceneObjects(LegacySceneObject** sceneObjects, mat4f** transforms, BoxColliderComponent** colliders, vec3f* positions, vec3f* rotations, vec3f* scales, int size) { // Allocate size SceneObjects *sceneObjects = reinterpret_cast<LegacySceneObject*>(mSceneAllocator.Allocate(sizeof(LegacySceneObject) * size, alignof(BaseSceneObject), 0)); *transforms = reinterpret_cast<mat4f*>(mSceneAllocator.Allocate(sizeof(mat4f) * size, alignof(mat4f), 0)); *colliders = reinterpret_cast<BoxColliderComponent*>(mSceneAllocator.Allocate(sizeof(BoxColliderComponent) * size, alignof(BoxColliderComponent), 0)); for (int i = 0; i < size; i++) { (*transforms)[i] = (mat4f::scale(scales[i]) * mat4f::translate(positions[i])).transpose(); (*colliders)[i].mCollider = BoxCollider({ positions[i], vec3f(0.85f) * scales[i] }); (*sceneObjects)[i].mWorldMatrix = transforms[i]; (*sceneObjects)[i].mBoxCollider = colliders[i]; } }
BoxCollider BoxCollider::generateCage(const VisualEntity &entity) { Matrix4f modelMatrix; //modelMatrix.translate(entity.position); modelMatrix.rotate(entity.rotation); modelMatrix.scale(entity.scale); Vector3f position; position.set(entity.position); Vector3f size; for (unsigned int i = 0; i < entity.mesh.vertices.size(); i++) { Vector3f v = modelMatrix.transform(entity.mesh.vertices[i]); size.x = (fabs(v.x) > size.x) ? fabs(v.x) : size.x; size.y = (fabs(v.y) > size.y) ? fabs(v.y) : size.y; size.z = (fabs(v.z) > size.z) ? fabs(v.z) : size.z; } return BoxCollider(position, size * 2); }