Cogs.Core
RiserJointComponent.cpp
1#include "RiserJointComponent.h"
2
3#include "Types.h"
4
5#include "Components/Geometry/VariableExtrusionComponent.h"
6#include "Components/Data/TrajectoryComponent.h"
7
8#include "Foundation/Geometry/SampleListGenerator.hpp"
9
10#include "ProfileGenerator.h"
11
12using namespace Cogs::Reflection;
13
14void Cogs::Core::RiserJointComponent::registerType()
15{
16 Field fields [] = {
19
22
25 };
26
27 Method methods [] = {
28 Method(Name("update"), &RiserJointComponent::update),
29 };
30
31 DynamicComponent::registerDerivedType<RiserJointComponent>().setFields(fields).setMethods(methods);
32}
33
34void Cogs::Core::RiserJointComponent::update()
35{
36 auto variableExtrusion = getComponent<VariableExtrusionComponent>();
37
38 assert(variableExtrusion && "No variable extrusion available for riser.");
39
40 if (!variableExtrusion->trajectory) return;
41
42 auto trajectory = variableExtrusion->trajectory->getComponent<TrajectoryComponent>();
43
44 if (!trajectory) return;
45
46 if (!this->hasChanged() && !variableExtrusion->hasChanged() && !trajectory->hasChanged()) return;
47
48 std::vector<float> trajectoryDepths;
49
50 SampleListGenerator::generateIndexedSamples(startDepth, endDepth, trajectory->indexes.data(), static_cast<int>(trajectory->indexes.size()), trajectoryDepths);
51
52 if (trajectoryDepths.size() < 2) return;
53
54 if (trajectoryDepths[0] > startDepth || trajectoryDepths[trajectoryDepths.size() - 1] < endDepth) return;
55
56 const float innerRadius = this->innerRadius;
57 const float outerRadius = this->outerRadius;
58
59 const float connectorRadius = this->connectorRadius;
60 const float connectorLength = this->connectorLength * variableExtrusion->radiusScale;
61
62 std::vector<glm::vec2> profile;
63 std::vector<float> depths;
64
65 Cogs::Geometry::ProfileGenerator::generateConnector(depths, profile, startDepth, startDepth + connectorLength, innerRadius, connectorRadius, outerRadius, startDepth);
66 Cogs::Geometry::ProfileGenerator::insertPoints(depths, profile, outerRadius, startDepth, endDepth, trajectoryDepths.cbegin(), trajectoryDepths.cend());
67 Cogs::Geometry::ProfileGenerator::generateConnector(depths, profile, endDepth - connectorLength, endDepth, outerRadius, connectorRadius, innerRadius, endDepth);
68 Cogs::Geometry::ProfileGenerator::insertPointsReverse(depths, profile, innerRadius, startDepth, endDepth, trajectoryDepths.cend());
69
70 profile.push_back(glm::vec2(innerRadius, 0)); depths.push_back(startDepth);
71
72 variableExtrusion->depths = std::move(depths);
73 variableExtrusion->profile = std::move(profile);
74
75 variableExtrusion->setChanged();
76}
float connectorLength
Radius of the connectors.
float startDepth
Start depth along trajectory.
float innerRadius
Inner radius of the joint.
float outerRadius
Outer radius of the joint.
float endDepth
End depth along trajectory.
float connectorRadius
Length of the connectors.
Field definition describing a single data member of a data structure.
Definition: Field.h:68
Simple method definition.
Definition: Method.h:72
Contains reflection support.
Definition: Component.h:11
Represents an unique name.
Definition: Name.h:70