3#include "Systems/Core/TransformSystem.h"
5#include "Components/Data/TrajectoryComponent.h"
6#include "Components/Core/TransformComponent.h"
7#include "Components/Geometry/ExtrusionComponent.h"
8#include "../../Extensions/WellLog/Source/Components/ZipComponent.h"
11#include "EntityStore.h"
13#include "Foundation/Geometry/BoundingBox.hpp"
14#include "Foundation/Geometry/DepthQuery.hpp"
15#include "Foundation/Logging/Logger.h"
20 float returnFail(
const char* message)
23 LOG_ERROR(logger,
"%s", message);
28float Cogs::Core::getDepth(Context * context,
const EntityId
id,
const glm::vec3 position)
30 const Entity* entity = context->store->getEntityPtr(
id);
32 return returnFail(
"Invalid entity id");
35 const TransformComponent* transform = entity->
getComponent<TransformComponent>();
37 return returnFail(
"Missing TransformComponent");
40 glm::mat4 world2Object = glm::inverse(context->transformSystem->getLocalToWorld(transform));
41 glm::vec3 localPosition(world2Object * glm::vec4(position, 1));
44 const TrajectoryComponent* trajectory = entity->
getComponent<TrajectoryComponent>();
46 return Cogs::Geometry::getDepthAtPosition(trajectory->indexes, trajectory->positions, localPosition, trajectory->indexes[0], trajectory->indexes[trajectory->indexes.size() - 1]);
50 const ExtrusionComponent* extrusion = entity->
getComponent<ExtrusionComponent>();
52 if (extrusion->trajectory) {
54 const TrajectoryComponent* trajectory2 = extrusion->trajectory->getComponent<TrajectoryComponent>();
57 if (trajectory2->indexes.empty()) {
58 return returnFail(
"Empty Extrusion trajectory indexes field");
60 else if (trajectory2->indexes.size() != trajectory2->positions.size()) {
61 return returnFail(
"Extrusion trajectory fields indexes and positions size mismatch");
64 return Cogs::Geometry::getDepthAtPosition(trajectory2->indexes, trajectory2->positions, localPosition, trajectory2->indexes.front(), trajectory2->indexes.back());
69 const ZipComponent* zip = entity->
getComponent<ZipComponent>();
72 const ExtrusionComponent* extrusionComponent = zip->extrusion->getComponent<ExtrusionComponent>();
73 if (extrusionComponent) {
75 const TrajectoryComponent* trajectory2 = extrusionComponent->trajectory->getComponent<TrajectoryComponent>();
78 if (trajectory2->indexes.empty()) {
79 return returnFail(
"Empty Zip Extrusion trajectory indexes field");
81 else if (trajectory2->indexes.size() != trajectory2->positions.size()) {
82 return returnFail(
"Zip Extrusion trajectory fields indexes and positions size mismatch");
85 return Cogs::Geometry::getDepthAtPosition(trajectory2->indexes, trajectory2->positions, localPosition, trajectory2->indexes.front(), trajectory2->indexes.back());
91 return returnFail(
"Entity does not contain component setup required for Depth calculation");
Container for components, providing composition of dynamic entities.
T * getComponent() const
Get a pointer to the first component implementing the given type in the entity.
Log implementation class.
constexpr Log getLogger(const char(&name)[LEN]) noexcept