Skip to content

Commit a6083e8

Browse files
committed
Fixed some issues with operators on the mesh Builder.
Added utility to append mesh with streamsets.
1 parent 1bfdb96 commit a6083e8

File tree

5 files changed

+178
-120
lines changed

5 files changed

+178
-120
lines changed

Source/RealtimeMeshComponent/Private/Mesh/RealtimeMeshBasicShapeTools.cpp

Lines changed: 136 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,24 @@ void URealtimeMeshBasicShapeTools::AppendBoxMesh(FRealtimeMeshStreamSet& StreamS
239239
BoxVerts[6] = BoxTransform.TransformPosition(FVector3f(BoxRadius.X, -BoxRadius.Y, -BoxRadius.Z));
240240
BoxVerts[7] = BoxTransform.TransformPosition(FVector3f(-BoxRadius.X, -BoxRadius.Y, -BoxRadius.Z));
241241

242+
243+
FVector3f BoxNormals[6];
244+
BoxNormals[0] = BoxTransform.TransformVector(FVector3f(0.0f, 0.0f, 1.0f));
245+
BoxNormals[1] = BoxTransform.TransformVector(FVector3f(-1.0f, 0.0f, 0.0f));
246+
BoxNormals[2] = BoxTransform.TransformVector(FVector3f(0.0f, 1.0f, 0.0f));
247+
BoxNormals[3] = BoxTransform.TransformVector(FVector3f(1.0f, 0.0f, 0.0f));
248+
BoxNormals[4] = BoxTransform.TransformVector(FVector3f(0.0f, -1.0f, 0.0f));
249+
BoxNormals[5] = BoxTransform.TransformVector(FVector3f(0.0f, 0.0f, -1.0f));
250+
251+
FVector3f BoxTangents[6];
252+
BoxTangents[0] = BoxTransform.TransformVector(FVector3f(0.0f, -1.0f, 0.0f));
253+
BoxTangents[1] = BoxTransform.TransformVector(FVector3f(0.0f, -1.0f, 0.0f));
254+
BoxTangents[2] = BoxTransform.TransformVector(FVector3f(-1.0f, 0.0f, 0.0f));
255+
BoxTangents[3] = BoxTransform.TransformVector(FVector3f(0.0f, 1.0f, 0.0f));
256+
BoxTangents[4] = BoxTransform.TransformVector(FVector3f(1.0f, 0.0f, 0.0f));
257+
BoxTangents[5] = BoxTransform.TransformVector(FVector3f(0.0f, 1.0f, 0.0f));
258+
259+
242260
// Generate triangles (from quads)
243261
const int32 StartVertex = Builder.NumVertices();
244262
constexpr int32 NumVerts = 24; // 6 faces x 4 verts per face
@@ -262,115 +280,157 @@ void URealtimeMeshBasicShapeTools::AppendBoxMesh(FRealtimeMeshStreamSet& StreamS
262280
}
263281
};
264282

265-
Builder.AddVertex(BoxVerts[0]).SetNormalAndTangent(FVector3f(0.0f, 0.0f, 1.0f), FVector3f(0.0f, -1.0f, 0.0f)).SetTexCoord(FVector2f(0.0f, 0.0f)).SetColor(Color);
266-
Builder.AddVertex(BoxVerts[1]).SetNormalAndTangent(FVector3f(0.0f, 0.0f, 1.0f), FVector3f(0.0f, -1.0f, 0.0f)).SetTexCoord(FVector2f(0.0f, 1.0f)).SetColor(Color);
267-
Builder.AddVertex(BoxVerts[2]).SetNormalAndTangent(FVector3f(0.0f, 0.0f, 1.0f), FVector3f(0.0f, -1.0f, 0.0f)).SetTexCoord(FVector2f(1.0f, 1.0f)).SetColor(Color);
268-
Builder.AddVertex(BoxVerts[3]).SetNormalAndTangent(FVector3f(0.0f, 0.0f, 1.0f), FVector3f(0.0f, -1.0f, 0.0f)).SetTexCoord(FVector2f(1.0f, 0.0f)).SetColor(Color);
283+
Builder.AddVertex(BoxVerts[0]).SetNormalAndTangent(BoxNormals[0], BoxTangents[0]).SetTexCoord(FVector2f(0.0f, 0.0f)).SetColor(Color);
284+
Builder.AddVertex(BoxVerts[1]).SetNormalAndTangent(BoxNormals[0], BoxTangents[0]).SetTexCoord(FVector2f(0.0f, 1.0f)).SetColor(Color);
285+
Builder.AddVertex(BoxVerts[2]).SetNormalAndTangent(BoxNormals[0], BoxTangents[0]).SetTexCoord(FVector2f(1.0f, 1.0f)).SetColor(Color);
286+
Builder.AddVertex(BoxVerts[3]).SetNormalAndTangent(BoxNormals[0], BoxTangents[0]).SetTexCoord(FVector2f(1.0f, 0.0f)).SetColor(Color);
269287
WriteQuad(0, 1, 2, 3);
270288

271-
Builder.AddVertex(BoxVerts[4]).SetNormalAndTangent(FVector3f(-1.0f, 0.0f, 0.0f), FVector3f(0.0f, -1.0f, 0.0f)).SetTexCoord(FVector2f(0.0f, 0.0f)).SetColor(Color);
272-
Builder.AddVertex(BoxVerts[0]).SetNormalAndTangent(FVector3f(-1.0f, 0.0f, 0.0f), FVector3f(0.0f, -1.0f, 0.0f)).SetTexCoord(FVector2f(0.0f, 1.0f)).SetColor(Color);
273-
Builder.AddVertex(BoxVerts[3]).SetNormalAndTangent(FVector3f(-1.0f, 0.0f, 0.0f), FVector3f(0.0f, -1.0f, 0.0f)).SetTexCoord(FVector2f(1.0f, 1.0f)).SetColor(Color);
274-
Builder.AddVertex(BoxVerts[7]).SetNormalAndTangent(FVector3f(-1.0f, 0.0f, 0.0f), FVector3f(0.0f, -1.0f, 0.0f)).SetTexCoord(FVector2f(1.0f, 0.0f)).SetColor(Color);
289+
Builder.AddVertex(BoxVerts[4]).SetNormalAndTangent(BoxNormals[1], BoxTangents[1]).SetTexCoord(FVector2f(0.0f, 0.0f)).SetColor(Color);
290+
Builder.AddVertex(BoxVerts[0]).SetNormalAndTangent(BoxNormals[1], BoxTangents[1]).SetTexCoord(FVector2f(0.0f, 1.0f)).SetColor(Color);
291+
Builder.AddVertex(BoxVerts[3]).SetNormalAndTangent(BoxNormals[1], BoxTangents[1]).SetTexCoord(FVector2f(1.0f, 1.0f)).SetColor(Color);
292+
Builder.AddVertex(BoxVerts[7]).SetNormalAndTangent(BoxNormals[1], BoxTangents[1]).SetTexCoord(FVector2f(1.0f, 0.0f)).SetColor(Color);
275293
WriteQuad(4, 5, 6, 7);
276294

277-
Builder.AddVertex(BoxVerts[5]).SetNormalAndTangent(FVector3f(0.0f, 1.0f, 0.0f), FVector3f(-1.0f, 0.0f, 0.0f)).SetTexCoord(FVector2f(0.0f, 0.0f)).SetColor(Color);
278-
Builder.AddVertex(BoxVerts[1]).SetNormalAndTangent(FVector3f(0.0f, 1.0f, 0.0f), FVector3f(-1.0f, 0.0f, 0.0f)).SetTexCoord(FVector2f(0.0f, 1.0f)).SetColor(Color);
279-
Builder.AddVertex(BoxVerts[0]).SetNormalAndTangent(FVector3f(0.0f, 1.0f, 0.0f), FVector3f(-1.0f, 0.0f, 0.0f)).SetTexCoord(FVector2f(1.0f, 1.0f)).SetColor(Color);
280-
Builder.AddVertex(BoxVerts[4]).SetNormalAndTangent(FVector3f(0.0f, 1.0f, 0.0f), FVector3f(-1.0f, 0.0f, 0.0f)).SetTexCoord(FVector2f(1.0f, 0.0f)).SetColor(Color);
295+
Builder.AddVertex(BoxVerts[5]).SetNormalAndTangent(BoxNormals[2], BoxTangents[2]).SetTexCoord(FVector2f(0.0f, 0.0f)).SetColor(Color);
296+
Builder.AddVertex(BoxVerts[1]).SetNormalAndTangent(BoxNormals[2], BoxTangents[2]).SetTexCoord(FVector2f(0.0f, 1.0f)).SetColor(Color);
297+
Builder.AddVertex(BoxVerts[0]).SetNormalAndTangent(BoxNormals[2], BoxTangents[2]).SetTexCoord(FVector2f(1.0f, 1.0f)).SetColor(Color);
298+
Builder.AddVertex(BoxVerts[4]).SetNormalAndTangent(BoxNormals[2], BoxTangents[2]).SetTexCoord(FVector2f(1.0f, 0.0f)).SetColor(Color);
281299
WriteQuad(8, 9, 10, 11);
282300

283-
Builder.AddVertex(BoxVerts[6]).SetNormalAndTangent(FVector3f(1.0f, 0.0f, 0.0f), FVector3f(0.0f, 1.0f, 0.0f)).SetTexCoord(FVector2f(0.0f, 0.0f)).SetColor(Color);
284-
Builder.AddVertex(BoxVerts[2]).SetNormalAndTangent(FVector3f(1.0f, 0.0f, 0.0f), FVector3f(0.0f, 1.0f, 0.0f)).SetTexCoord(FVector2f(0.0f, 1.0f)).SetColor(Color);
285-
Builder.AddVertex(BoxVerts[1]).SetNormalAndTangent(FVector3f(1.0f, 0.0f, 0.0f), FVector3f(0.0f, 1.0f, 0.0f)).SetTexCoord(FVector2f(1.0f, 1.0f)).SetColor(Color);
286-
Builder.AddVertex(BoxVerts[5]).SetNormalAndTangent(FVector3f(1.0f, 0.0f, 0.0f), FVector3f(0.0f, 1.0f, 0.0f)).SetTexCoord(FVector2f(1.0f, 0.0f)).SetColor(Color);
301+
Builder.AddVertex(BoxVerts[6]).SetNormalAndTangent(BoxNormals[3], BoxTangents[3]).SetTexCoord(FVector2f(0.0f, 0.0f)).SetColor(Color);
302+
Builder.AddVertex(BoxVerts[2]).SetNormalAndTangent(BoxNormals[3], BoxTangents[3]).SetTexCoord(FVector2f(0.0f, 1.0f)).SetColor(Color);
303+
Builder.AddVertex(BoxVerts[1]).SetNormalAndTangent(BoxNormals[3], BoxTangents[3]).SetTexCoord(FVector2f(1.0f, 1.0f)).SetColor(Color);
304+
Builder.AddVertex(BoxVerts[5]).SetNormalAndTangent(BoxNormals[3], BoxTangents[3]).SetTexCoord(FVector2f(1.0f, 0.0f)).SetColor(Color);
287305
WriteQuad(12, 13, 14, 15);
288306

289-
Builder.AddVertex(BoxVerts[7]).SetNormalAndTangent(FVector3f(0.0f, -1.0f, 0.0f), FVector3f(1.0f, 0.0f, 0.0f)).SetTexCoord(FVector2f(0.0f, 0.0f)).SetColor(Color);
290-
Builder.AddVertex(BoxVerts[3]).SetNormalAndTangent(FVector3f(0.0f, -1.0f, 0.0f), FVector3f(1.0f, 0.0f, 0.0f)).SetTexCoord(FVector2f(0.0f, 1.0f)).SetColor(Color);
291-
Builder.AddVertex(BoxVerts[2]).SetNormalAndTangent(FVector3f(0.0f, -1.0f, 0.0f), FVector3f(1.0f, 0.0f, 0.0f)).SetTexCoord(FVector2f(1.0f, 1.0f)).SetColor(Color);
292-
Builder.AddVertex(BoxVerts[6]).SetNormalAndTangent(FVector3f(0.0f, -1.0f, 0.0f), FVector3f(1.0f, 0.0f, 0.0f)).SetTexCoord(FVector2f(1.0f, 0.0f)).SetColor(Color);
307+
Builder.AddVertex(BoxVerts[7]).SetNormalAndTangent(BoxNormals[4], BoxTangents[4]).SetTexCoord(FVector2f(0.0f, 0.0f)).SetColor(Color);
308+
Builder.AddVertex(BoxVerts[3]).SetNormalAndTangent(BoxNormals[4], BoxTangents[4]).SetTexCoord(FVector2f(0.0f, 1.0f)).SetColor(Color);
309+
Builder.AddVertex(BoxVerts[2]).SetNormalAndTangent(BoxNormals[4], BoxTangents[4]).SetTexCoord(FVector2f(1.0f, 1.0f)).SetColor(Color);
310+
Builder.AddVertex(BoxVerts[6]).SetNormalAndTangent(BoxNormals[4], BoxTangents[4]).SetTexCoord(FVector2f(1.0f, 0.0f)).SetColor(Color);
293311
WriteQuad(16, 17, 18, 19);
294312

295-
Builder.AddVertex(BoxVerts[7]).SetNormalAndTangent(FVector3f(0.0f, 0.0f, -1.0f), FVector3f(0.0f, 1.0f, 0.0f)).SetTexCoord(FVector2f(0.0f, 0.0f)).SetColor(Color);
296-
Builder.AddVertex(BoxVerts[6]).SetNormalAndTangent(FVector3f(0.0f, 0.0f, -1.0f), FVector3f(0.0f, 1.0f, 0.0f)).SetTexCoord(FVector2f(0.0f, 1.0f)).SetColor(Color);
297-
Builder.AddVertex(BoxVerts[5]).SetNormalAndTangent(FVector3f(0.0f, 0.0f, -1.0f), FVector3f(0.0f, 1.0f, 0.0f)).SetTexCoord(FVector2f(1.0f, 1.0f)).SetColor(Color);
298-
Builder.AddVertex(BoxVerts[4]).SetNormalAndTangent(FVector3f(0.0f, 0.0f, -1.0f), FVector3f(0.0f, 1.0f, 0.0f)).SetTexCoord(FVector2f(1.0f, 0.0f)).SetColor(Color);
313+
Builder.AddVertex(BoxVerts[7]).SetNormalAndTangent(BoxNormals[5], BoxTangents[5]).SetTexCoord(FVector2f(0.0f, 0.0f)).SetColor(Color);
314+
Builder.AddVertex(BoxVerts[6]).SetNormalAndTangent(BoxNormals[5], BoxTangents[5]).SetTexCoord(FVector2f(0.0f, 1.0f)).SetColor(Color);
315+
Builder.AddVertex(BoxVerts[5]).SetNormalAndTangent(BoxNormals[5], BoxTangents[5]).SetTexCoord(FVector2f(1.0f, 1.0f)).SetColor(Color);
316+
Builder.AddVertex(BoxVerts[4]).SetNormalAndTangent(BoxNormals[5], BoxTangents[5]).SetTexCoord(FVector2f(1.0f, 0.0f)).SetColor(Color);
299317
WriteQuad(20, 21, 22, 23);
300318
}
301319

302-
FRealtimeMeshStreamSet& URealtimeMeshBasicShapeTools::AppendMesh(FRealtimeMeshStreamSet& TargetMeshData, const FRealtimeMeshStreamSet& MeshDataToAdd, const FTransform& Transform)
320+
void URealtimeMeshBasicShapeTools::AppendMesh(FRealtimeMeshStreamSet& TargetMeshData, const FRealtimeMeshStreamSet& MeshDataToAdd, const FTransform3f& Transform)
303321
{
304-
305-
306-
322+
const FRealtimeMeshStream* SourcePositionStream = MeshDataToAdd.Find(FRealtimeMeshStreams::Position);
323+
const FRealtimeMeshStream* SourceTriangleStream = MeshDataToAdd.Find(FRealtimeMeshStreams::Triangles);
307324

325+
if (!SourcePositionStream || !SourceTriangleStream)
326+
{
327+
UE_LOG(RealtimeMeshLog, Warning, TEXT("Unable to AppendMesh, MeshDataToAdd does not contain a position and triangle stream"));
328+
return;
329+
}
308330

309-
/*
310-
const int32 StartVertex = TargetMeshData.Positions.Num();
331+
FRealtimeMeshStream& TargetPositionStream = TargetMeshData.FindOrAdd(FRealtimeMeshStreams::Position, SourcePositionStream->GetLayout());
332+
333+
const int32 NumVerticesToAdd = SourcePositionStream->Num();
334+
const int32 StartVertex = TargetPositionStream.Num();
311335

312-
// Skip slower transform logic if transform == identity
313-
if (Transform.Equals(FTransform::Identity))
336+
// Append positions.
337+
if (Transform.Equals(FTransform3f::Identity))
314338
{
315-
TargetMeshData.Positions.Append(MeshDataToAdd.Positions);
316-
AppendVertexArrayIfContains(TargetMeshData.Normals, MeshDataToAdd.Normals, StartVertex, TargetMeshData.Positions.Num());
317-
AppendVertexArrayIfContains(TargetMeshData.Binormals, MeshDataToAdd.Binormals, StartVertex, TargetMeshData.Positions.Num());
318-
AppendVertexArrayIfContains(TargetMeshData.Tangents, MeshDataToAdd.Tangents, StartVertex, TargetMeshData.Positions.Num());
339+
TargetPositionStream.Append(*SourcePositionStream);
319340
}
320341
else
321342
{
322-
TargetMeshData.Positions.Reserve(TargetMeshData.Positions.Num() + MeshDataToAdd.Positions.Num());
323-
for (int32 Index = 0; Index < MeshDataToAdd.Positions.Num(); Index++)
343+
TargetPositionStream.AppendGenerated<FVector3f>(NumVerticesToAdd, [&](int32 Index)
324344
{
325-
TargetMeshData.Positions.Add(Transform.TransformPosition(MeshDataToAdd.Positions[Index]));
326-
}
327-
AppendTransformedTangentArray(TargetMeshData.Normals, MeshDataToAdd.Normals, StartVertex, TargetMeshData.Positions.Num(), Transform);
328-
AppendTransformedTangentArray(TargetMeshData.Binormals, MeshDataToAdd.Binormals, StartVertex, TargetMeshData.Positions.Num(), Transform);
329-
AppendTransformedTangentArray(TargetMeshData.Tangents, MeshDataToAdd.Tangents, StartVertex, TargetMeshData.Positions.Num(), Transform);
345+
return Transform.TransformPosition(*SourcePositionStream->GetDataAtVertex<FVector3f>(Index));
346+
});
330347
}
331348

332-
AppendVertexArrayIfContains(TargetMeshData.Colors, MeshDataToAdd.Colors, StartVertex, TargetMeshData.Positions.Num());
333-
AppendVertexArrayIfContains(TargetMeshData.LinearColors, MeshDataToAdd.LinearColors, StartVertex, TargetMeshData.Positions.Num());
334-
335-
AppendVertexArrayIfContains(TargetMeshData.UV0, MeshDataToAdd.UV0, StartVertex, TargetMeshData.Positions.Num());
336-
AppendVertexArrayIfContains(TargetMeshData.UV1, MeshDataToAdd.UV1, StartVertex, TargetMeshData.Positions.Num());
337-
AppendVertexArrayIfContains(TargetMeshData.UV2, MeshDataToAdd.UV2, StartVertex, TargetMeshData.Positions.Num());
338-
AppendVertexArrayIfContains(TargetMeshData.UV3, MeshDataToAdd.UV3, StartVertex, TargetMeshData.Positions.Num());
339-
340-
// Copy Triangles
341349

342-
const int32 NumExistingTriangles = (TargetMeshData.Triangles.Num()) / 3;
343-
const int32 NumTrianglesToAdd = MeshDataToAdd.Triangles.Num() / 3;
344-
345-
TargetMeshData.Triangles.Reserve(TargetMeshData.Triangles.Num() + MeshDataToAdd.Triangles.Num());
346-
for (int32 Index = 0; Index < MeshDataToAdd.Triangles.Num(); Index++)
350+
auto AppendStream = [&TargetMeshData, &MeshDataToAdd](int32 StartIndex, int32 NumToAdd, const FRealtimeMeshStreamKey& StreamKey, const FRealtimeMeshBufferLayout& DefaultLayout)
347351
{
348-
TargetMeshData.Triangles.Add(MeshDataToAdd.Triangles[Index] + StartVertex);
349-
}
350-
351-
if (NewMaterialGroup != 0)
352-
{
353-
TargetMeshData.MaterialIndex.Reserve(NumExistingTriangles + NumTrianglesToAdd);
354-
TargetMeshData.MaterialIndex.SetNumZeroed(NumExistingTriangles);
355-
356-
for (int32 Index = 0; Index < NumTrianglesToAdd; Index++)
352+
if (MeshDataToAdd.Contains(StreamKey) || TargetMeshData.Contains(StreamKey))
357353
{
358-
TargetMeshData.MaterialIndex.Add(NewMaterialGroup);
354+
const FRealtimeMeshStream* SourceStream = MeshDataToAdd.Find(StreamKey);
355+
const FRealtimeMeshBufferLayout Layout = SourceStream? SourceStream->GetLayout() : DefaultLayout;
356+
FRealtimeMeshStream& TargetStream = TargetMeshData.FindOrAdd(StreamKey, Layout);
357+
358+
// Reserve the size if it's not already big enough
359+
if (TargetStream.Num() < StartIndex + NumToAdd)
360+
{
361+
TargetStream.Reserve(StartIndex + NumToAdd);
362+
}
363+
364+
// Make sure the stream is at least to this point
365+
if (TargetStream.Num() < StartIndex)
366+
{
367+
TargetStream.SetNumZeroed(StartIndex);
368+
}
369+
370+
// Make sure the stream is big enough for all the n ew elements
371+
if (TargetStream.Num() < StartIndex + NumToAdd)
372+
{
373+
TargetStream.SetNumUninitialized(StartIndex + NumToAdd);
374+
}
375+
376+
// Copy any existing data
377+
const int32 NumToCopy = FMath::Min(NumToAdd, SourceStream? SourceStream->Num() : 0);
378+
if (NumToCopy > 0)
379+
{
380+
TargetStream.SetRange(StartIndex, SourceStream->GetLayout(), SourceStream->GetData(), NumToCopy);
381+
}
382+
383+
// Zero remaining elements
384+
if (NumToCopy < NumToAdd)
385+
{
386+
TargetStream.ZeroRange(StartIndex + NumToCopy, NumToAdd - NumToCopy);
387+
}
388+
389+
return NumToCopy;
359390
}
360-
}
361-
else if (MeshDataToAdd.MaterialIndex.Num())
391+
return 0;
392+
};
393+
394+
// Append secondary streams
395+
const int32 NumCopiedTangents = AppendStream(StartVertex, NumVerticesToAdd, FRealtimeMeshStreams::Tangents, GetRealtimeMeshBufferLayout<FRealtimeMeshTangentsNormalPrecision>());
396+
397+
// If we have a transform transform the new tangents
398+
if (NumCopiedTangents > 0 && Transform.Equals(FTransform3f::Identity))
362399
{
363-
TargetMeshData.MaterialIndex.Reserve(NumExistingTriangles + NumTrianglesToAdd);
364-
TargetMeshData.MaterialIndex.SetNumZeroed(NumExistingTriangles);
400+
TRealtimeMeshStreamBuilder<FRealtimeMeshTangentsHighPrecision, void> TangentBuilder(TargetMeshData.FindChecked(FRealtimeMeshStreams::Tangents));
365401

366-
for (int32 Index = 0; Index < MeshDataToAdd.MaterialIndex.Num() && Index < NumTrianglesToAdd; Index++)
402+
for (int32 Index = StartVertex; Index < StartVertex + NumVerticesToAdd; Index++)
367403
{
368-
TargetMeshData.MaterialIndex.Add(MeshDataToAdd.MaterialIndex[Index]);
404+
FRealtimeMeshTangentsHighPrecision Tangent = TangentBuilder[Index];
405+
406+
Tangent.SetNormal(Transform.TransformVector(Tangent.GetNormal()));
407+
Tangent.SetTangent(Transform.TransformVector(Tangent.GetTangent()));
408+
409+
TangentBuilder[Index] = Tangent;
369410
}
411+
}
412+
413+
AppendStream(StartVertex, NumVerticesToAdd, FRealtimeMeshStreams::TexCoords, GetRealtimeMeshBufferLayout<FRealtimeMeshTexCoordsNormal>());
414+
AppendStream(StartVertex, NumVerticesToAdd, FRealtimeMeshStreams::Color, GetRealtimeMeshBufferLayout<FColor>());
370415

371-
TargetMeshData.MaterialIndex.SetNumZeroed(NumExistingTriangles + NumTrianglesToAdd);
416+
417+
FRealtimeMeshStream& TargetTriangleStream = TargetMeshData.FindOrAdd(FRealtimeMeshStreams::Triangles, SourceTriangleStream->GetLayout());
418+
419+
const int32 NumTrianglesToAdd = SourceTriangleStream->Num();
420+
const int32 StartTriangle = TargetTriangleStream.Num();
421+
const int32 NumTrianglesCopied = AppendStream(StartTriangle, NumTrianglesToAdd, FRealtimeMeshStreams::Triangles, GetRealtimeMeshBufferLayout<TIndex3<uint32>>());
422+
423+
TRealtimeMeshStreamBuilder<TIndex3<uint32>, void> TriangleBuilder(TargetTriangleStream);
424+
for (int32 Index = StartTriangle; Index < StartTriangle + NumTrianglesCopied; Index++)
425+
{
426+
TIndex3<uint32> Triangle = TriangleBuilder[Index];
427+
Triangle.V0 += StartVertex;
428+
Triangle.V1 += StartVertex;
429+
Triangle.V2 += StartVertex;
430+
TriangleBuilder[Index] = Triangle;
372431
}
373-
*/
374432

375-
return TargetMeshData;
433+
434+
435+
AppendStream(StartTriangle, NumTrianglesToAdd, FRealtimeMeshStreams::PolyGroups, GetRealtimeMeshBufferLayout<uint16>());
376436
}

Source/RealtimeMeshComponent/Public/Mesh/RealtimeMeshBasicShapeTools.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,6 @@ class REALTIMEMESHCOMPONENT_API URealtimeMeshBasicShapeTools : public UBlueprint
3434

3535
static void AppendBoxMesh(FRealtimeMeshStreamSet& StreamSet, FVector3f BoxRadius, FTransform3f BoxTransform, int32 NewMaterialGroup = 0, FColor Color = FColor::White);
3636

37-
static FRealtimeMeshStreamSet& AppendMesh(FRealtimeMeshStreamSet& TargetMeshData, const FRealtimeMeshStreamSet& MeshDataToAdd, const FTransform& Transform);
37+
static void AppendMesh(FRealtimeMeshStreamSet& TargetMeshData, const FRealtimeMeshStreamSet& MeshDataToAdd, const FTransform3f& Transform);
3838

3939
};

Source/RealtimeMeshComponent/Public/Mesh/RealtimeMeshBuilder.h

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -653,21 +653,21 @@ namespace RealtimeMesh
653653
DEFINE_BINARY_OPERATOR_VARIATIONS(AccessType, >>)
654654
#undef DEFINE_BINARY_OPERATOR_VARIATIONS
655655

656-
#define DEFINE_BINARY_OPERATOR_VARIATIONS(op) \
656+
#define DEFINE_BINARY_OPERATOR_VARIATIONS(op, simpleop) \
657657
template <typename U = AccessType> \
658-
FORCEINLINE TEnableIfWritable<TRealtimeMeshIndexedBufferAccessor&, U> operator op(const AccessType& Right) { Set(Get() op Right); return *this; } \
658+
FORCEINLINE TEnableIfWritable<TRealtimeMeshIndexedBufferAccessor&, U> operator op(const AccessType& Right) { Set(Get() simpleop Right); return *this; } \
659659
template <typename U = AccessType> \
660-
FORCEINLINE TEnableIfWritable<TRealtimeMeshIndexedBufferAccessor&, U> operator op(const TRealtimeMeshIndexedBufferAccessor& Right) { Set(Get() op Right.Get()); return *this; }
661-
DEFINE_BINARY_OPERATOR_VARIATIONS(+=)
662-
DEFINE_BINARY_OPERATOR_VARIATIONS(-=)
663-
DEFINE_BINARY_OPERATOR_VARIATIONS(*=)
664-
DEFINE_BINARY_OPERATOR_VARIATIONS(/=)
665-
DEFINE_BINARY_OPERATOR_VARIATIONS(%=)
666-
DEFINE_BINARY_OPERATOR_VARIATIONS(&=)
667-
DEFINE_BINARY_OPERATOR_VARIATIONS(|=)
668-
DEFINE_BINARY_OPERATOR_VARIATIONS(^=)
669-
DEFINE_BINARY_OPERATOR_VARIATIONS(<<=)
670-
DEFINE_BINARY_OPERATOR_VARIATIONS(>>=)
660+
FORCEINLINE TEnableIfWritable<TRealtimeMeshIndexedBufferAccessor&, U> operator op(const TRealtimeMeshIndexedBufferAccessor& Right) { Set(Get() simpleop Right.Get()); return *this; }
661+
DEFINE_BINARY_OPERATOR_VARIATIONS(+=, +)
662+
DEFINE_BINARY_OPERATOR_VARIATIONS(-=, -)
663+
DEFINE_BINARY_OPERATOR_VARIATIONS(*=, *)
664+
DEFINE_BINARY_OPERATOR_VARIATIONS(/=, /)
665+
DEFINE_BINARY_OPERATOR_VARIATIONS(%=, %)
666+
DEFINE_BINARY_OPERATOR_VARIATIONS(&=, &)
667+
DEFINE_BINARY_OPERATOR_VARIATIONS(|=, |)
668+
DEFINE_BINARY_OPERATOR_VARIATIONS(^=, ^)
669+
DEFINE_BINARY_OPERATOR_VARIATIONS(<<=, <<)
670+
DEFINE_BINARY_OPERATOR_VARIATIONS(>>=, >>)
671671
#undef DEFINE_BINARY_OPERATOR_VARIATIONS
672672
};
673673

0 commit comments

Comments
 (0)