I3DHSplineData.h Source File

instant3Dhub: I3DHSplineData.h Source File
instant3Dhub
I3DHSplineData.h
Go to the documentation of this file.
1
6#pragma once
7
8#include "CoreMinimal.h"
9
10#include "I3DHVersion.h"
11
12#include "Algo/BinarySearch.h"
13
14#include "I3DHSplineData.generated.h"
15
16struct INSTANT3DHUB_EXPERIMENTAL(0.0.27, "The instant3Dhub Drawings feature is available as a preview and is actively under development.") FI3DHSplineData;
17
19USTRUCT(BlueprintType, meta = (DisplayName = "I3DH SplineData (Experimental)"))
21{
22 GENERATED_BODY()
23
24 FI3DHSplineData() = default;
25 FI3DHSplineData(const FLinearColor& InColor, const double InScale)
26 : Color(InColor), Scale(InScale) {}
27
33 UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "{instant3DhubDrawings}|Drawing Editor")
34 TArray<FVector> Points;
35
47 UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "{instant3DhubDrawings}|Drawing Editor")
48 TArray<int32> SliceIndices;
49
51 UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "{instant3DhubDrawings}|Drawing Editor")
52 FLinearColor Color{ FLinearColor::Black };
53
58 UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "{instant3DhubDrawings}|Drawing Editor")
59 double Scale{ 1 };
60
66 int32 GetSliceSize(const int32 SliceId) const
67 {
68 if (SliceIndices.IsValidIndex(SliceId + 1))
69 {
70 return SliceIndices[SliceId + 1] - SliceIndices[SliceId];
71 }
72 return Points.Num() - SliceIndices[SliceId];
73 }
74
80 TConstArrayView<FVector> GetSlicePoints(const int32 SliceId) const
81 {
82 const int32 SliceIndex = SliceIndices[SliceId];
83 return TConstArrayView<FVector>(&Points[SliceIndex], GetSliceSize(SliceId));
84 }
85
91 TArrayView<FVector> GetSlicePoints(const int32 SliceId)
92 {
93 const int32 SliceIndex = SliceIndices[SliceId];
94 return TArrayView<FVector>(&Points[SliceIndex], GetSliceSize(SliceId));
95 }
96
102 int32 FindSliceId(const int32 PointIndex) const
103 {
104 // SliceIndices are sorted and the first element always starts with Point 0
105 // Algo::LowerBound performs binary search, resulting in position of the first element >= Value
106 // Min the result with the last valid Slice returns the correct SliceId for a given PointIndex
107 return FMath::Min(Algo::LowerBound(SliceIndices, PointIndex), SliceIndices.Num() - 1);
108 }
109
116 FTransform MakeControlPointTransform(const int32 ControlPointIndex) const
117 {
118 return FTransform{ FQuat::Identity, Points[ControlPointIndex], FVector{ Scale } };
119 }
120
128 FTransform MakeSegmentTransform(const int32 ControlPointIndex, const FVector& NextPointLocation) const
129 {
130 const FVector& CurrentPointLocation = Points[ControlPointIndex];
131 const FRotator SegmentLookBackRotation = FRotationMatrix::MakeFromZ(CurrentPointLocation - NextPointLocation).Rotator();
132 const double SegmentLength = FVector::Distance(NextPointLocation, CurrentPointLocation);
133 return FTransform{ SegmentLookBackRotation, NextPointLocation, FVector{ Scale, Scale, SegmentLength } };
134 }
135
142 FTransform MakeSegmentTransform(const int32 SegmentIndex) const
143 {
144 return MakeSegmentTransform(SegmentIndex, Points[SegmentIndex + 1]);
145 }
146};
147
#define INSTANT3DHUB_EXPERIMENTAL(Version, Message)
Macro for marking up experimental code, functions and types.
Definition I3DHVersion.h:245
Raw data of a single spline created by the AI3DHDrawingEditor.
Definition I3DHSplineData.h:21