add flag for affectsCollidingTransform, add setParent method for transforms

This commit is contained in:
Nick Fisher
2024-02-15 14:50:14 +08:00
parent 023900bb99
commit 935b876ce9
7 changed files with 87 additions and 46 deletions

View File

@@ -1163,7 +1163,19 @@ namespace polyvox
tm.setTransform(tm.getInstance(inst->getRoot()), transform);
}
void AssetManager::addCollisionComponent(EntityId entityId, void(*onCollisionCallback)(EntityId entityId)) {
void AssetManager::setParent(EntityId childEntityId, EntityId parentEntityId) {
auto& tm = _engine->getTransformManager();
const auto child = Entity::import(childEntityId);
const auto parent = Entity::import(parentEntityId);
const auto& parentInstance = tm.getInstance(parent);
const auto& childInstance = tm.getInstance(child);
tm.setParent(childInstance, parentInstance);
}
void AssetManager::addCollisionComponent(EntityId entityId, void(*onCollisionCallback)(EntityId entityId), bool affectsCollidingTransform) {
std::lock_guard lock(_mutex);
const auto &pos = _entityIdLookup.find(entityId);
if (pos == _entityIdLookup.end())
@@ -1176,6 +1188,7 @@ namespace polyvox
auto collisionInstance = _collisionComponentManager->addComponent(asset.asset->getRoot());
_collisionComponentManager->elementAt<0>(collisionInstance) = asset.asset->getInstance()->getBoundingBox();
_collisionComponentManager->elementAt<1>(collisionInstance) = onCollisionCallback;
_collisionComponentManager->elementAt<2>(collisionInstance) = affectsCollidingTransform;
}
@@ -1227,18 +1240,16 @@ namespace polyvox
auto bb = asset.asset->getBoundingBox();
auto transformedBB = bb.transform(transform);
auto collisions = _collisionComponentManager->collides(transformedBB, relativeTranslation);
auto collisionAxes = _collisionComponentManager->collides(transformedBB);
Log("%d collisions", collisions.size());
if(collisions.size() == 1) {
auto globalAxis = collisions[0];
if(collisionAxes.size() == 1) {
auto globalAxis = collisionAxes[0];
globalAxis *= norm(relativeTranslation);
auto newRelativeTranslation = relativeTranslation + globalAxis;
// Log("Collision axis global : %f %f %f relativeTranslation %f %f %f relativeTranslation (after subtracting global collision vector) %f %f %f", globalAxis.x, globalAxis.y, globalAxis.z, relativeTranslation.x, relativeTranslation.y, relativeTranslation.z, newRelativeTranslation.x, newRelativeTranslation.y, newRelativeTranslation.z);
translation -= relativeTranslation;
translation += newRelativeTranslation;
transform = composeMatrix(translation, rotation, scale);
} else if(collisions.size() > 1) {
} else if(collisionAxes.size() > 1) {
translation -= relativeTranslation;
transform = composeMatrix(translation, rotation, scale);
}

View File

@@ -547,8 +547,8 @@ extern "C"
free(ptr);
}
FLUTTER_PLUGIN_EXPORT void add_collision_component(void *const assetManager, EntityId entityId, void (*onCollisionCallback)(const EntityId entityId)) {
((AssetManager*)assetManager)->addCollisionComponent(entityId, onCollisionCallback);
FLUTTER_PLUGIN_EXPORT void add_collision_component(void *const assetManager, EntityId entityId, void (*onCollisionCallback)(const EntityId entityId), bool affectsCollidingTransform) {
((AssetManager*)assetManager)->addCollisionComponent(entityId, onCollisionCallback, affectsCollidingTransform);
}
FLUTTER_PLUGIN_EXPORT EntityId create_geometry(void *const viewer, float* vertices, int numVertices, uint16_t* indices, int numIndices, const char* materialPath) {
@@ -560,4 +560,8 @@ extern "C"
return Entity::smuggle(entity);
}
FLUTTER_PLUGIN_EXPORT void set_parent(void *const assetManager, EntityId child, EntityId parent) {
((AssetManager*)assetManager)->setParent(child, parent);
}
}