Cogs.Core
GetDepth.cpp
1#include "GetDepth.h"
2
3#include "Systems/Core/TransformSystem.h"
4
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"
9
10#include "Context.h"
11#include "EntityStore.h"
12
13#include "Foundation/Geometry/BoundingBox.hpp"
14#include "Foundation/Geometry/DepthQuery.hpp"
15#include "Foundation/Logging/Logger.h"
16
17#include <vector>
18
19namespace {
20 float returnFail(const char* message)
21 {
22 const Cogs::Logging::Log logger = Cogs::Logging::getLogger("GetDepth");
23 LOG_ERROR(logger, "%s", message);
24 return 0.0f;
25 }
26}
27
28float Cogs::Core::getDepth(Context * context, const EntityId id, const glm::vec3 position)
29{
30 const Entity* entity = context->store->getEntityPtr(id);
31 if (!entity) {
32 return returnFail("Invalid entity id");
33 }
34
35 const TransformComponent* transform = entity->getComponent<TransformComponent>();
36 if (!transform) {
37 return returnFail("Missing TransformComponent");
38 }
39
40 glm::mat4 world2Object = glm::inverse(context->transformSystem->getLocalToWorld(transform));
41 glm::vec3 localPosition(world2Object * glm::vec4(position, 1));
42
43 {
44 const TrajectoryComponent* trajectory = entity->getComponent<TrajectoryComponent>();
45 if (trajectory) {
46 return Cogs::Geometry::getDepthAtPosition(trajectory->indexes, trajectory->positions, localPosition, trajectory->indexes[0], trajectory->indexes[trajectory->indexes.size() - 1]);
47 }
48 }
49
50 const ExtrusionComponent* extrusion = entity->getComponent<ExtrusionComponent>();
51 if (extrusion) {
52 if (extrusion->trajectory) {
53 // Wellbore
54 const TrajectoryComponent* trajectory2 = extrusion->trajectory->getComponent<TrajectoryComponent>();
55
56 if (trajectory2) {
57 if (trajectory2->indexes.empty()) {
58 return returnFail("Empty Extrusion trajectory indexes field");
59 }
60 else if (trajectory2->indexes.size() != trajectory2->positions.size()) {
61 return returnFail("Extrusion trajectory fields indexes and positions size mismatch");
62 }
63
64 return Cogs::Geometry::getDepthAtPosition(trajectory2->indexes, trajectory2->positions, localPosition, trajectory2->indexes.front(), trajectory2->indexes.back());
65 }
66 }
67 }
68
69 const ZipComponent* zip = entity->getComponent<ZipComponent>();
70 if (zip) {
71 if (zip->extrusion) {
72 const ExtrusionComponent* extrusionComponent = zip->extrusion->getComponent<ExtrusionComponent>();
73 if (extrusionComponent) {
74 // Wellbore
75 const TrajectoryComponent* trajectory2 = extrusionComponent->trajectory->getComponent<TrajectoryComponent>();
76
77 if (trajectory2) {
78 if (trajectory2->indexes.empty()) {
79 return returnFail("Empty Zip Extrusion trajectory indexes field");
80 }
81 else if (trajectory2->indexes.size() != trajectory2->positions.size()) {
82 return returnFail("Zip Extrusion trajectory fields indexes and positions size mismatch");
83 }
84
85 return Cogs::Geometry::getDepthAtPosition(trajectory2->indexes, trajectory2->positions, localPosition, trajectory2->indexes.front(), trajectory2->indexes.back());
86 }
87 }
88 }
89 }
90
91 return returnFail("Entity does not contain component setup required for Depth calculation");
92}
Container for components, providing composition of dynamic entities.
Definition: Entity.h:18
T * getComponent() const
Get a pointer to the first component implementing the given type in the entity.
Definition: Entity.h:35
Log implementation class.
Definition: LogManager.h:139
constexpr Log getLogger(const char(&name)[LEN]) noexcept
Definition: LogManager.h:180