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.2.7, "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
55 UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "{instant3DhubDrawings}|Drawing Editor")
56 double Scale{ 1 };
57
63 int32 GetSliceSize(const int32 SliceId) const
64 {
65 if (SliceIndices.IsValidIndex(SliceId + 1))
66 {
67 return SliceIndices[SliceId + 1] - SliceIndices[SliceId];
68 }
69 return Points.Num() - SliceIndices[SliceId];
70 }
71
77 TConstArrayView<FVector> GetSlicePoints(const int32 SliceId) const
78 {
79 const int32 SliceIndex = SliceIndices[SliceId];
80 return TConstArrayView<FVector>(&Points[SliceIndex], GetSliceSize(SliceId));
81 }
82
88 TArrayView<FVector> GetSlicePoints(const int32 SliceId)
89 {
90 const int32 SliceIndex = SliceIndices[SliceId];
91 return TArrayView<FVector>(&Points[SliceIndex], GetSliceSize(SliceId));
92 }
93
99 int32 FindSliceId(const int32 PointIndex) const
100 {
101 // SliceIndices are sorted and the first element always starts with Point 0
102 // Algo::LowerBound performs binary search, resulting in position of the first element >= Value
103 // Min the result with the last valid Slice returns the correct SliceId for a given PointIndex
104 return FMath::Min(Algo::LowerBound(SliceIndices, PointIndex), SliceIndices.Num() - 1);
105 }
106
113 FTransform MakeControlPointTransform(const int32 ControlPointIndex) const
114 {
115 return FTransform{ FQuat::Identity, Points[ControlPointIndex], FVector{ Scale } };
116 }
117
125 FTransform MakeSegmentTransform(const int32 ControlPointIndex, const FVector& NextPointLocation) const
126 {
127 const FVector& CurrentPointLocation = Points[ControlPointIndex];
128 const FRotator SegmentLookBackRotation = FRotationMatrix::MakeFromZ(CurrentPointLocation - NextPointLocation).Rotator();
129 const double SegmentLength = FVector::Distance(NextPointLocation, CurrentPointLocation);
130 return FTransform{ SegmentLookBackRotation, NextPointLocation, FVector{ Scale, Scale, SegmentLength } };
131 }
132
139 FTransform MakeSegmentTransform(const int32 SegmentIndex) const
140 {
141 return MakeSegmentTransform(SegmentIndex, Points[SegmentIndex + 1]);
142 }
143};
144
#define INSTANT3DHUB_EXPERIMENTAL(Version, Message)
Macro for marking up experimental code, functions and types.
Definition I3DHVersion.h:212
Raw data of a single spline created by the AI3DHDrawingEditor.
Definition I3DHSplineData.h:21