@@ -239,6 +239,24 @@ void URealtimeMeshBasicShapeTools::AppendBoxMesh(FRealtimeMeshStreamSet& StreamS
239
239
BoxVerts[6 ] = BoxTransform.TransformPosition (FVector3f (BoxRadius.X , -BoxRadius.Y , -BoxRadius.Z ));
240
240
BoxVerts[7 ] = BoxTransform.TransformPosition (FVector3f (-BoxRadius.X , -BoxRadius.Y , -BoxRadius.Z ));
241
241
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
+
242
260
// Generate triangles (from quads)
243
261
const int32 StartVertex = Builder.NumVertices ();
244
262
constexpr int32 NumVerts = 24 ; // 6 faces x 4 verts per face
@@ -262,115 +280,157 @@ void URealtimeMeshBasicShapeTools::AppendBoxMesh(FRealtimeMeshStreamSet& StreamS
262
280
}
263
281
};
264
282
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);
269
287
WriteQuad (0 , 1 , 2 , 3 );
270
288
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);
275
293
WriteQuad (4 , 5 , 6 , 7 );
276
294
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);
281
299
WriteQuad (8 , 9 , 10 , 11 );
282
300
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);
287
305
WriteQuad (12 , 13 , 14 , 15 );
288
306
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);
293
311
WriteQuad (16 , 17 , 18 , 19 );
294
312
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);
299
317
WriteQuad (20 , 21 , 22 , 23 );
300
318
}
301
319
302
- FRealtimeMeshStreamSet& URealtimeMeshBasicShapeTools::AppendMesh (FRealtimeMeshStreamSet& TargetMeshData, const FRealtimeMeshStreamSet& MeshDataToAdd, const FTransform & Transform)
320
+ void URealtimeMeshBasicShapeTools::AppendMesh (FRealtimeMeshStreamSet& TargetMeshData, const FRealtimeMeshStreamSet& MeshDataToAdd, const FTransform3f & Transform)
303
321
{
304
-
305
-
306
-
322
+ const FRealtimeMeshStream* SourcePositionStream = MeshDataToAdd.Find (FRealtimeMeshStreams::Position);
323
+ const FRealtimeMeshStream* SourceTriangleStream = MeshDataToAdd.Find (FRealtimeMeshStreams::Triangles);
307
324
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
+ }
308
330
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 ();
311
335
312
- // Skip slower transform logic if transform == identity
313
- if (Transform.Equals(FTransform ::Identity))
336
+ // Append positions.
337
+ if (Transform.Equals (FTransform3f ::Identity))
314
338
{
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);
319
340
}
320
341
else
321
342
{
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)
324
344
{
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
+ });
330
347
}
331
348
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
341
349
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)
347
351
{
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))
357
353
{
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;
359
390
}
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))
362
399
{
363
- TargetMeshData.MaterialIndex.Reserve(NumExistingTriangles + NumTrianglesToAdd);
364
- TargetMeshData.MaterialIndex.SetNumZeroed(NumExistingTriangles);
400
+ TRealtimeMeshStreamBuilder<FRealtimeMeshTangentsHighPrecision, void > TangentBuilder (TargetMeshData.FindChecked (FRealtimeMeshStreams::Tangents));
365
401
366
- for (int32 Index = 0 ; Index < MeshDataToAdd.MaterialIndex.Num() && Index < NumTrianglesToAdd ; Index++)
402
+ for (int32 Index = StartVertex ; Index < StartVertex + NumVerticesToAdd ; Index++)
367
403
{
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;
369
410
}
411
+ }
412
+
413
+ AppendStream (StartVertex, NumVerticesToAdd, FRealtimeMeshStreams::TexCoords, GetRealtimeMeshBufferLayout<FRealtimeMeshTexCoordsNormal>());
414
+ AppendStream (StartVertex, NumVerticesToAdd, FRealtimeMeshStreams::Color, GetRealtimeMeshBufferLayout<FColor>());
370
415
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;
372
431
}
373
- */
374
432
375
- return TargetMeshData;
433
+
434
+
435
+ AppendStream (StartTriangle, NumTrianglesToAdd, FRealtimeMeshStreams::PolyGroups, GetRealtimeMeshBufferLayout<uint16>());
376
436
}
0 commit comments