RapyutaSimulationPlugins
RRMeshData.h
Go to the documentation of this file.
1 
17 #pragma once
18 
19 
20 
21 // Native
22 
23 #include <string>
24 
25 
26 
27 // UE
28 
29 #include "Engine/Texture.h"
30 
31 #include "Materials/MaterialInstanceDynamic.h"
32 
33 #include "ProceduralMeshComponent.h"
34 
35 
36 
37 // Assimp
38 
39 #include "assimp/Importer.hpp"
40 
41 #include "assimp/mesh.h"
42 
43 #include "assimp/scene.h"
44 
45 
46 
47 // RapyutaSimulationPlugins
48 
49 #include "Core/RRCoreUtils.h"
50 
51 #include "Core/RREntityStructs.h"
52 
54 
55 
56 
57 #include "RRMeshData.generated.h"
58 
59 
60 
61 DECLARE_DELEGATE_TwoParams(FOnMeshCreationDone, bool /* bCreationResult */, UObject* /*MeshBodyComponent*/);
62 
63 
64 
65 #define RAPYUTA_MESH_VISUAL_DEBUG (1)
66 
67 
68 
82 struct RAPYUTASIMULATIONPLUGINS_API FRRBoneProperty
83 
84 {
85 
86 public:
87 
88 
93  FString Name;
94 
95 
96 
97 
102  int32 Index = 0;
103 
104 
105 
106 
111  int32 ParentIndex = 0;
112 
113 
114 
116 
117 
122  FTransform RelTransform = FTransform::Identity;
123 
124 
125 
126 
131  FVector MeshScale3D = FVector::OneVector;
132 
133 
134 
135 
140  FVector MeshSize = FVector::ZeroVector;
141 
142 
143 
144 
149  float Mass = 0.f;
150 
151 
152 
154 
155  {
156 
157  FRRRobotLinkProperty linkProp;
158 
159  linkProp.Name = Name;
160 
161  linkProp.LinkIndex = Index;
162 
163  linkProp.ParentLinkIndex = ParentIndex;
164 
165  linkProp.Location = RelTransform.GetLocation();
166 
167  linkProp.Rotation = RelTransform.GetRotation();
168 
169  linkProp.Inertia.Mass = Mass;
170 
171  FRREntityGeometryInfo visualInfo;
172 
173  visualInfo.Size = MeshSize;
174 
175  visualInfo.WorldScale = MeshScale3D;
176 
177  FRREntityGeometryInfo collisionInfo = visualInfo;
178 
179  linkProp.VisualList.Emplace(MoveTemp(visualInfo));
180 
181  linkProp.CollisionList.Emplace(MoveTemp(collisionInfo));
182 
183  return linkProp;
184 
185  }
186 
187 
188 
189  FRRRobotJointProperty GetDefaultJointProperty(const FString& InParentLinkName) const
190 
191  {
192 
193  FRRRobotJointProperty jointProp;
194 
195  jointProp.Name = Name;
196 
197  jointProp.Type = ERRRobotJointType::FIXED;
198 
199  jointProp.ChildLinkName = Name;
200 
201  jointProp.ParentLinkName = InParentLinkName;
202 
203  jointProp.Location = RelTransform.GetLocation();
204 
205  jointProp.Rotation = RelTransform.GetRotation();
206 
207  return jointProp;
208 
209  }
210 
211 
212 
213  static void GenerateLinkJointPropListFromBoneProps(const TArray<FRRBoneProperty>& InBonePropList,
214 
215  FRREntityModelData& OutEntityModelData)
216 
217  {
218 
219  auto& linkPropList = OutEntityModelData.LinkPropList;
220 
221  auto& jointPropList = OutEntityModelData.JointPropList;
222 
223  for (const auto& boneProp : InBonePropList)
224 
225  {
226 
227  linkPropList.Add(boneProp.ConvertToLinkProperty());
228 
229  }
230 
231  for (const auto& boneProp : InBonePropList)
232 
233  {
234 
235  if (linkPropList.IsValidIndex(boneProp.ParentIndex))
236 
237  {
238 
239  jointPropList.Add(boneProp.GetDefaultJointProperty(linkPropList[boneProp.ParentIndex].Name));
240 
241  }
242 
243  }
244 
245  }
246 
247  void PrintSelf() const;
248 
249 };
250 
251 
252 
266 struct RAPYUTASIMULATIONPLUGINS_API FRRBoneInfluence
267 
268 {
269 
270 
271 
272 
277  float Weight = 0.f;
278 
279 
284  int32 VertexIndex = 0;
285 
286 
291  int32 BoneIndex = 0;
292 
293 };
294 
295 
296 
310 struct RAPYUTASIMULATIONPLUGINS_API FRRBoneVertInfo
311 
312 {
313 
314 
315 
316 
321  TArray<FVector3f> Positions;
322 
323 
328  TArray<FVector3f> Normals;
329 
330 };
331 
332 
333 
347 struct RAPYUTASIMULATIONPLUGINS_API FRRMeshNodeData
348 
349 {
350 
351 
352 
353 
358  TArray<FVector> Vertices;
359 
360 
365  TArray<FColor> VertexColors;
366 
367 
368 
369 
374  TArray<int32> TriangleIndices;
375 
376 
377 
378 
383  TArray<FVector> Normals;
384 
385 
386 
387 
392  TArray<FVector2f> UV2fs;
393 
394 
395 
396 
401  TArray<FVector2D> UVs;
402 
403 
404 
405 
410  TArray<FProcMeshTangent> ProcTangents;
411 
412 
413 
414 
419  TArray<FRRBoneInfluence> BoneInfluences;
420 
421 
422 
423 
428  uint32 MaterialIndex = 0;
429 
430 
431 
432  void Reset(uint64 InNum = 0)
433 
434  {
435 
436  Vertices.SetNumZeroed(InNum);
437 
438  VertexColors.SetNumZeroed(InNum);
439 
440  Normals.SetNumZeroed(InNum);
441 
442  UVs.SetNumZeroed(InNum);
443 
444  UV2fs.SetNumZeroed(InNum);
445 
446  ProcTangents.SetNumZeroed(InNum);
447 
448  TriangleIndices.SetNumZeroed(3 * InNum);
449 
450  BoneInfluences.Reset();
451 
452  }
453 
454 
455 
456  void PrintSelf() const;
457 
458 };
459 
460 
461 
475 struct RAPYUTASIMULATIONPLUGINS_API FRRMeshNode
476 
477 {
478 
479 
480 
481 
486  FTransform RelativeTransform = FTransform::Identity;
487 
488 
489 
490 
495  int NodeParentIndex = 0;
496 
497 
498 
499 
504  TArray<FRRMeshNodeData> Meshes;
505 
506 };
507 
508 
509 
523 struct RAPYUTASIMULATIONPLUGINS_API FRRMeshData
524 
525 {
526 
527 private:
528 
529  static TMap<FString /* MeshUniqueName */, TSharedPtr<FRRMeshData>> MeshDataStore;
530 
531 
532 
533 public:
534 
535  static void AddMeshData(const FString& InMeshUniqueName, const TSharedPtr<FRRMeshData>& InMeshData)
536 
537  {
538 
539  MeshDataStore.Add(InMeshUniqueName, InMeshData);
540 
541  }
542 
543  static TSharedPtr<FRRMeshData> GetMeshData(const FString& InMeshUniqueName)
544 
545  {
546 
547  return MeshDataStore.FindRef(InMeshUniqueName);
548 
549  }
550 
551  static bool IsMeshDataAvailable(const FString& InMeshUniqueName)
552 
553  {
554 
555  return MeshDataStore.Contains(InMeshUniqueName);
556 
557  }
558 
559 
560 
561 
566  FString MeshUniqueName;
567 
568 
569 
571 
572  TSharedPtr<Assimp::Importer> MeshImporter = nullptr;
573 
574 
575 
576 
581  bool bIsValid = false;
582 
583  bool IsValid() const
584 
585  {
586 
587  return bIsValid;
588 
589  }
590 
591 
592 
593 
598  TArray<FRRMeshNode> Nodes;
599 
600 
601 
602 
607  TArray<UMaterialInstanceDynamic*> MaterialInstances;
608 
609 
610 
611  void Reset()
612 
613  {
614 
615  Nodes.Reset();
616 
617  MaterialInstances.Reset();
618 
619  }
620 
621 
622 
623  void PrintSelf() const;
624 
625 
626 
627  void TransformBy(const FTransform& InTransform)
628 
629  {
630 
631  for (auto& meshNode : Nodes)
632 
633  {
634 
635  for (auto& mesh : meshNode.Meshes)
636 
637  {
638 
639  for (auto& vertex : mesh.Vertices)
640 
641  {
642 
643  vertex = InTransform.TransformPosition(vertex);
644 
645  }
646 
647 
648 
649  for (auto& normal : mesh.Normals)
650 
651  {
652 
653  normal = InTransform.TransformVectorNoScale(normal);
654 
655  }
656 
657 
658 
659  for (auto& procTangent : mesh.ProcTangents)
660 
661  {
662 
663  procTangent.TangentX = InTransform.TransformVectorNoScale(procTangent.TangentX);
664 
665  }
666 
667  }
668 
669  }
670 
671  }
672 
673 
674 
675  int32 GetVerticesNum() const
676 
677  {
678 
679  int32 verticesNum = 0;
680 
681  for (const auto& meshNode : Nodes)
682 
683  {
684 
685  for (const auto& mesh : meshNode.Meshes)
686 
687  {
688 
689  verticesNum += mesh.Vertices.Num();
690 
691  }
692 
693  }
694 
695  return verticesNum;
696 
697  }
698 
699 
700 
701  bool HasVertexColors() const
702 
703  {
704 
705  for (const auto& meshNode : Nodes)
706 
707  {
708 
709  for (const auto& mesh : meshNode.Meshes)
710 
711  {
712 
713  if (mesh.VertexColors.Num() > 0)
714 
715  {
716 
717  return true;
718 
719  }
720 
721  }
722 
723  }
724 
725  return false;
726 
727  }
728 
729 
730 
731  int32 GetIndicesNum() const
732 
733  {
734 
735  int32 indicesNum = 0;
736 
737  for (const auto& meshNode : Nodes)
738 
739  {
740 
741  for (const auto& mesh : meshNode.Meshes)
742 
743  {
744 
745  indicesNum += mesh.TriangleIndices.Num();
746 
747  }
748 
749  }
750 
751  return indicesNum;
752 
753  }
754 
755 
756 
757  int32 GetUVsNum() const
758 
759  {
760 
761  for (const auto& meshNode : Nodes)
762 
763  {
764 
765  for (const auto& mesh : meshNode.Meshes)
766 
767  {
768 
769  return mesh.UVs.Num();
770 
771  }
772 
773  }
774 
775  return 0;
776 
777  }
778 
779 };
780 
FRRMeshData::IsValid
bool IsValid() const
Definition: RRMeshData.h:583
FRRRobotJointProperty
The FRRRobotJointProperty struct.
Definition: RREntityStructs.h:524
RapyutaSimulationPlugins.h
Unreal Engine Mudule class.
FRREntityGeometryInfo::WorldScale
FVector WorldScale
Definition: RREntityStructs.h:1261
FRRMeshData::TransformBy
void TransformBy(const FTransform &InTransform)
Definition: RRMeshData.h:627
FRRBoneVertInfo
Contains the vertices that are most dominated by that bone. Vertices are in Bone space.
Definition: RRMeshData.h:310
FRRMeshNodeData::Normals
TArray< FVector > Normals
Definition: RRMeshData.h:383
FRRBoneProperty::Name
FString Name
Definition: RRMeshData.h:93
FRRMeshData::GetIndicesNum
int32 GetIndicesNum() const
Definition: RRMeshData.h:731
FRREntityGeometryInfo::Size
FVector Size
This size is mostly used for Collision info in case of links being Runtime mesh components.
Definition: RREntityStructs.h:1252
FRRMeshData::GetMeshData
static TSharedPtr< FRRMeshData > GetMeshData(const FString &InMeshUniqueName)
Definition: RRMeshData.h:543
FRRMeshNodeData
todo
Definition: RRMeshData.h:347
FRRRobotJointProperty::Location
FVector Location
[cm] In URDF/SDF: Child Link's relative Location to its Parent
Definition: RREntityStructs.h:598
RREntityStructs.h
Contains various commonly used struct definitions for robot & object entities.
FRRMeshNodeData::TriangleIndices
TArray< int32 > TriangleIndices
Definition: RRMeshData.h:374
FRRMeshNode
todo
Definition: RRMeshData.h:475
FRRBoneProperty::GetDefaultJointProperty
FRRRobotJointProperty GetDefaultJointProperty(const FString &InParentLinkName) const
Definition: RRMeshData.h:189
FRRMeshNodeData::BoneInfluences
TArray< FRRBoneInfluence > BoneInfluences
Definition: RRMeshData.h:419
FRRMeshData::MeshDataStore
static TMap< FString, TSharedPtr< FRRMeshData > > MeshDataStore
Definition: RRMeshData.h:529
FRRMeshData::HasVertexColors
bool HasVertexColors() const
Definition: RRMeshData.h:701
FRRBoneVertInfo::Positions
TArray< FVector3f > Positions
Definition: RRMeshData.h:321
DECLARE_DELEGATE_TwoParams
DECLARE_DELEGATE_TwoParams(FOnMeshCreationDone, bool, UObject *)
ERRRobotJointType::FIXED
@ FIXED
FRRMeshNodeData::Reset
void Reset(uint64 InNum=0)
Definition: RRMeshData.h:432
FRRMeshData::MaterialInstances
TArray< UMaterialInstanceDynamic * > MaterialInstances
Definition: RRMeshData.h:607
FRREntityModelData
Core UE struct housing entity (robot, object) model data, wrapped by FRREntityModelInfo & FRREntityMo...
Definition: RREntityStructs.h:2414
FRREntityGeometryInfo
Definition: RREntityStructs.h:1223
FRRRobotJointProperty::ChildLinkName
FString ChildLinkName
Definition: RREntityStructs.h:644
FRRMeshData::GetUVsNum
int32 GetUVsNum() const
Definition: RRMeshData.h:757
FRRMeshNodeData::VertexColors
TArray< FColor > VertexColors
Definition: RRMeshData.h:365
FRRMeshData::AddMeshData
static void AddMeshData(const FString &InMeshUniqueName, const TSharedPtr< FRRMeshData > &InMeshData)
Definition: RRMeshData.h:535
FRRRobotJointProperty::Type
ERRRobotJointType Type
Definition: RREntityStructs.h:558
FRRRobotJointProperty::Name
FString Name
Definition: RREntityStructs.h:549
FRRMeshNodeData::ProcTangents
TArray< FProcMeshTangent > ProcTangents
Definition: RRMeshData.h:410
FRREntityModelData::LinkPropList
TArray< FRRRobotLinkProperty > LinkPropList
Definition: RREntityStructs.h:2729
FRRBoneInfluence
todo
Definition: RRMeshData.h:266
FRRMeshNodeData::UVs
TArray< FVector2D > UVs
Definition: RRMeshData.h:401
FRRMeshData
todo
Definition: RRMeshData.h:523
FRRBoneVertInfo::Normals
TArray< FVector3f > Normals
Definition: RRMeshData.h:328
FRRMeshNode::Meshes
TArray< FRRMeshNodeData > Meshes
Definition: RRMeshData.h:504
FRREntityModelData::JointPropList
TArray< FRRRobotJointProperty > JointPropList
Definition: RREntityStructs.h:2736
FRRMeshData::MeshUniqueName
FString MeshUniqueName
Definition: RRMeshData.h:566
FRRMeshNodeData::UV2fs
TArray< FVector2f > UV2fs
Definition: RRMeshData.h:392
FRRMeshData::Nodes
TArray< FRRMeshNode > Nodes
Definition: RRMeshData.h:598
FRRMeshData::Reset
void Reset()
Definition: RRMeshData.h:611
FRRMeshNodeData::Vertices
TArray< FVector > Vertices
Definition: RRMeshData.h:358
FRRBoneProperty
todo
Definition: RRMeshData.h:82
FRRMeshData::GetVerticesNum
int32 GetVerticesNum() const
Definition: RRMeshData.h:675
FRRMeshData::IsMeshDataAvailable
static bool IsMeshDataAvailable(const FString &InMeshUniqueName)
Definition: RRMeshData.h:551
FRRRobotJointProperty::ParentLinkName
FString ParentLinkName
Definition: RREntityStructs.h:637
FRRRobotJointProperty::Rotation
FQuat Rotation
[Quaternion] In URDF/SDF: Child Link's relative Rotation to its Parent
Definition: RREntityStructs.h:609
FRRBoneProperty::ConvertToLinkProperty
FRRRobotLinkProperty ConvertToLinkProperty() const
Definition: RRMeshData.h:153
FRRBoneProperty::GenerateLinkJointPropListFromBoneProps
static void GenerateLinkJointPropListFromBoneProps(const TArray< FRRBoneProperty > &InBonePropList, FRREntityModelData &OutEntityModelData)
Definition: RRMeshData.h:213
RRCoreUtils.h
Core utils.