RuntimeMeshLibrary.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // Copyright 2016 Chris Conway (Koderz). All Rights Reserved.
  2. #pragma once
  3. #include "Kismet/BlueprintFunctionLibrary.h"
  4. #include "RuntimeMeshComponent.h"
  5. #include "RuntimeMeshLibrary.generated.h"
  6. class RuntimeMeshComponent;
  7. UCLASS()
  8. class RUNTIMEMESHCOMPONENT_API URuntimeMeshLibrary : public UBlueprintFunctionLibrary
  9. {
  10. GENERATED_UCLASS_BODY()
  11. /** Add a quad, specified by four indices, to a triangle index buffer as two triangles. */
  12. UFUNCTION(BlueprintCallable, Category = "Components|RuntimeMesh")
  13. static void ConvertQuadToTriangles(UPARAM(ref) TArray<int32>& Triangles, int32 Vert0, int32 Vert1, int32 Vert2, int32 Vert3);
  14. /**
  15. * Generate an index buffer for a grid of quads.
  16. * @param NumX Number of vertices in X direction (must be >= 2)
  17. * @param NumY Number of vertices in y direction (must be >= 2)
  18. * @param bWinding Reverses winding of indices generated for each quad
  19. * @out Triangles Output index buffer
  20. */
  21. UFUNCTION(BlueprintCallable, Category = "Components|RuntimeMesh")
  22. static void CreateGridMeshTriangles(int32 NumX, int32 NumY, bool bWinding, TArray<int32>& Triangles);
  23. /** Generate vertex and index buffer for a simple box, given the supplied dimensions. Normals, UVs and tangents are also generated for each vertex. */
  24. UFUNCTION(BlueprintCallable, Category = "Components|RuntimeMesh")
  25. static void CreateBoxMesh(FVector BoxRadius, TArray<FVector>& Vertices, TArray<int32>& Triangles, TArray<FVector>& Normals, TArray<FVector2D>& UVs, TArray<FRuntimeMeshTangent>& Tangents);
  26. /**
  27. * Automatically generate normals and tangent vectors for a mesh
  28. * UVs are required for correct tangent generation.
  29. */
  30. static void CalculateTangentsForMesh(IRuntimeMeshVerticesBuilder* Vertices, const FRuntimeMeshIndicesBuilder* Triangles);
  31. /**
  32. * Automatically generate normals and tangent vectors for a mesh
  33. * UVs are required for correct tangent generation.
  34. */
  35. template <typename VertexType>
  36. static void CalculateTangentsForMesh(TArray<VertexType>& Vertices, const TArray<int32>& Triangles)
  37. {
  38. FRuntimeMeshPackedVerticesBuilder<VertexType> VerticesBuilder(&Vertices);
  39. FRuntimeMeshIndicesBuilder IndicesBuilder(const_cast<TArray<int32>*>(&Triangles));
  40. CalculateTangentsForMesh(&VerticesBuilder, &IndicesBuilder);
  41. }
  42. /**
  43. * Automatically generate normals and tangent vectors for a mesh
  44. * UVs are required for correct tangent generation.
  45. */
  46. template <typename VertexType>
  47. static void CalculateTangentsForMesh(TArray<FVector>& Positions, TArray<VertexType>& Vertices, const TArray<int32>& Triangles)
  48. {
  49. FRuntimeMeshPackedVerticesBuilder<VertexType> VerticesBuilder(&Vertices, &Positions);
  50. FRuntimeMeshIndicesBuilder IndicesBuilder(const_cast<TArray<int32>*>(&Triangles));
  51. CalculateTangentsForMesh(&VerticesBuilder, &IndicesBuilder);
  52. }
  53. /**
  54. * Automatically generate normals and tangent vectors for a mesh
  55. * UVs are required for correct tangent generation.
  56. */
  57. UFUNCTION(BlueprintCallable, Category = "Components|RuntimeMesh", meta = (AutoCreateRefTerm = "UVs"))
  58. static void CalculateTangentsForMesh(const TArray<FVector>& Vertices, const TArray<int32>& Triangles, const TArray<FVector2D>& UVs, TArray<FVector>& Normals, TArray<FRuntimeMeshTangent>& Tangents);
  59. /**
  60. * Generates the tessellation indices needed to support tessellation in materials
  61. */
  62. static void GenerateTessellationIndexBuffer(const IRuntimeMeshVerticesBuilder* Vertices, const FRuntimeMeshIndicesBuilder* Indices, FRuntimeMeshIndicesBuilder* OutTessellationIndices);
  63. /**
  64. * Generates the tessellation indices needed to support tessellation in materials
  65. */
  66. template <typename VertexType>
  67. static void GenerateTessellationIndexBuffer(TArray<VertexType>& Vertices, const TArray<int32>& Triangles, TArray<int32>& OutTessTriangles)
  68. {
  69. FRuntimeMeshPackedVerticesBuilder<VertexType> VerticesBuilder(&Vertices);
  70. FRuntimeMeshIndicesBuilder IndicesBuilder(const_cast<TArray<int32>*>(&Triangles));
  71. FRuntimeMeshIndicesBuilder OutIndicesBuilder(&OutTessTriangles);
  72. GenerateTessellationIndexBuffer(&VerticesBuilder, &IndicesBuilder, &OutIndicesBuilder);
  73. }
  74. /**
  75. * Generates the tessellation indices needed to support tessellation in materials
  76. */
  77. template <typename VertexType>
  78. static void GenerateTessellationIndexBuffer(TArray<FVector>& Positions, TArray<VertexType>& Vertices, const TArray<int32>& Triangles, TArray<int32>& OutTessTriangles)
  79. {
  80. FRuntimeMeshPackedVerticesBuilder<VertexType> VerticesBuilder(&Vertices, &Positions);
  81. FRuntimeMeshIndicesBuilder IndicesBuilder(const_cast<TArray<int32>*>(&Triangles));
  82. FRuntimeMeshIndicesBuilder OutIndicesBuilder(&OutTessTriangles);
  83. GenerateTessellationIndexBuffer(&VerticesBuilder, &IndicesBuilder, &OutIndicesBuilder);
  84. }
  85. /**
  86. * Generates the tessellation indices needed to support tessellation in materials
  87. */
  88. UFUNCTION(BlueprintCallable, Category = "Components|RuntimeMesh", meta = (AutoCreateRefTerm = "UVs"))
  89. static void GenerateTessellationIndexBuffer(const TArray<FVector>& Vertices, const TArray<int32>& Triangles, const TArray<FVector2D>& UVs, TArray<FVector>& Normals, TArray<FRuntimeMeshTangent>& Tangents, TArray<int32>& OutTessTriangles);
  90. /** Grab geometry data from a StaticMesh asset. */
  91. static void GetSectionFromStaticMesh(UStaticMesh* InMesh, int32 LODIndex, int32 SectionIndex,
  92. IRuntimeMeshVerticesBuilder* Vertices, FRuntimeMeshIndicesBuilder* Triangles, FRuntimeMeshIndicesBuilder* AdjacencyTriangles);
  93. /** Grab geometry data from a StaticMesh asset. */
  94. UFUNCTION(BlueprintCallable, Category = "Components|RuntimeMesh")
  95. static void GetSectionFromStaticMesh(UStaticMesh* InMesh, int32 LODIndex, int32 SectionIndex, TArray<FVector>& Vertices, TArray<int32>& Triangles, TArray<FVector>& Normals, TArray<FVector2D>& UVs, TArray<FRuntimeMeshTangent>& Tangents);
  96. /* Copies an entire Static Mesh to a Runtime Mesh. Includes all materials, and sections.*/
  97. UFUNCTION(BlueprintCallable, Category = "Components|RuntimeMesh")
  98. static void CopyRuntimeMeshFromStaticMeshComponent(UStaticMeshComponent* StaticMeshComp, int32 LODIndex, URuntimeMeshComponent* RuntimeMeshComp, bool bShouldCreateCollision);
  99. };