@@ -224,17 +224,19 @@ void ALocalSimulationVolume::UpdateMeshVisuals()
224
224
LocalPhysics::FActorHandle& Handle = *MeshData->InHandle ;
225
225
// FTransform HandleTransform = Handle.GetWorldTransform();
226
226
// HandleTransform.SetScale3D(Mesh.GetComponentTransform().GetScale3D());
227
+ // const FTransform& BodyTransform = LocalSpace->GetComponentTransform().GetRelativeTransformReverse(Handle.GetWorldTransform());;
228
+ const FTransform& BodyTransform = Handle .GetWorldTransform () * LocalSpace->GetComponentTransform ();
229
+ // UE_LOG(LocalSimulationLog, Warning, L"New transform: %s is %s", *Mesh.GetStaticMesh()->GetName(), *BodyTransform.ToHumanReadableString());
227
230
228
- const FTransform& BodyTransform = (Handle .GetWorldTransform () * LocalSpace->ComponentToWorld );
229
-
230
231
switch (MeshData->InBodyType )
231
232
{
232
233
case ELocalPhysicsBodyType::Static:
233
234
case ELocalPhysicsBodyType::Dynamic:
234
235
{
235
236
// update meshes back in 'world' space
236
- Mesh.SetWorldLocation (BodyTransform.GetLocation (), false , nullptr , ETeleportType::TeleportPhysics);
237
- Mesh.SetWorldRotation (BodyTransform.GetRotation ().Rotator (), false , nullptr , ETeleportType::TeleportPhysics);
237
+ Mesh.SetWorldTransform (BodyTransform, false , nullptr , ETeleportType::TeleportPhysics);
238
+ // Mesh.SetWorldLocation(BodyTransform.GetLocation(), false, nullptr, ETeleportType::TeleportPhysics);
239
+ // Mesh.SetWorldRotation(BodyTransform.GetRotation().Rotator(), false, nullptr, ETeleportType::TeleportPhysics);
238
240
}
239
241
break ;
240
242
case ELocalPhysicsBodyType::Kinematic:
@@ -247,9 +249,9 @@ void ALocalSimulationVolume::UpdateMeshVisuals()
247
249
248
250
// let's show everything in simulation.
249
251
if (bShowDebugPhyics)
250
- {
251
- const FTransform& DebugTransform = (bDebugInWorldSpace ? BodyTransform : Handle .GetWorldTransform ());
252
- UKismetSystemLibrary::DrawDebugBox (GetWorld (), DebugTransform.GetLocation (), Mesh.GetStaticMesh ()->GetBounds ().BoxExtent * Mesh. GetComponentTransform (). GetScale3D () , DebugSimulatedColor, DebugTransform.Rotator (), DebugTick, DebugThickness);
252
+ { // temporary fix to show local transforms correctly.
253
+ const FTransform& DebugTransform = (bDebugInWorldSpace ? FTransform ( BodyTransform. Rotator (), Mesh. Bounds . Origin , BodyTransform. GetScale3D ()) : FTransform ( Handle .GetWorldTransform (). Rotator (), FTransform (BodyTransform. Rotator (), Mesh. Bounds . Origin , BodyTransform. GetScale3D ()). GetRelativeTransform (LocalSpace-> ComponentToWorld ). GetLocation (), Handle . GetWorldTransform (). GetScale3D () ));
254
+ UKismetSystemLibrary::DrawDebugBox (GetWorld (), DebugTransform.GetLocation (), Mesh.GetStaticMesh ()->GetBounds ().BoxExtent * Handle . ActorScale3D , DebugSimulatedColor, DebugTransform.Rotator (), DebugTick, DebugThickness);
253
255
}
254
256
}
255
257
}
@@ -296,19 +298,19 @@ void ALocalSimulationVolume::TransformUpdated(USceneComponent* InRootComponent,
296
298
if (LocalPhysicData* MeshData = GetDataForStaticMesh (&Mesh))
297
299
{
298
300
// create easy reference for later
299
- LocalPhysics::FActorHandle* Handle = MeshData->InHandle ;
301
+ LocalPhysics::FActorHandle& Handle = * MeshData->InHandle ;
300
302
301
303
const FTransform& WorldBodyTransform = Mesh.GetComponentTransform ();
302
304
303
305
// Kinematic update for our physics in 'local' space
304
- Handle -> SetWorldTransform (WorldBodyTransform.GetRelativeTransform (LocalSpace->ComponentToWorld ));
306
+ Handle . SetWorldTransform (WorldBodyTransform.GetRelativeTransform (LocalSpace->ComponentToWorld ));
305
307
306
308
// let's show everything in simulation.
307
309
if (bShowDebugPhyics)
308
310
{
309
- const FTransform& BodyTransform = bDebugInWorldSpace ? WorldBodyTransform : Handle -> GetWorldTransform ();
311
+ const FTransform& BodyTransform = bDebugInWorldSpace ? WorldBodyTransform : Handle . GetWorldTransform ();
310
312
311
- UKismetSystemLibrary::DrawDebugBox (GetWorld (), BodyTransform.GetLocation (), Mesh.GetStaticMesh ()->GetBounds ().BoxExtent * WorldBodyTransform. GetScale3D () , DebugKinematicColor, BodyTransform.Rotator (), DebugTick, DebugKinematicThickness);
313
+ UKismetSystemLibrary::DrawDebugBox (GetWorld (), BodyTransform.GetLocation (), Mesh.GetStaticMesh ()->GetBounds ().BoxExtent * Handle . ActorScale3D , DebugKinematicColor, BodyTransform.Rotator (), DebugTick, DebugKinematicThickness);
312
314
}
313
315
}
314
316
}
@@ -379,9 +381,11 @@ bool ALocalSimulationVolume::AddStaticMeshToSimulation(UStaticMeshComponent* Mes
379
381
// if we don't find this mesh in Simulated or Kinematic arrays
380
382
if (IsInSimulation (Mesh) == false )
381
383
{
384
+ // UE_LOG(LocalSimulationLog, Warning, L"Current transform: %s is %s", *Mesh->GetStaticMesh()->GetName(), *Mesh->GetComponentTransform().ToHumanReadableString());
382
385
/*
383
386
* messy check for static, kinematic, dynamic
384
387
*/
388
+
385
389
FPhysScene* PhysScene = GetWorld ()->GetPhysicsScene ();
386
390
if (PhysScene == nullptr )
387
391
{
@@ -392,10 +396,12 @@ bool ALocalSimulationVolume::AddStaticMeshToSimulation(UStaticMeshComponent* Mes
392
396
PxScene* SyncScene = PhysScene->GetPhysXScene (PST_Sync);
393
397
SCOPED_SCENE_WRITE_LOCK (SyncScene); // SCOPED_SCENE_WRITE_LOCK or SCOPED_SCENE_READ_LOCK if you only need to read
394
398
395
- // default is Dynamic, other checks will override this default if they're true.
399
+ // default is Dynamic, other checks will override this default if they're true.
396
400
ELocalPhysicsBodyType typeOfAdd = ELocalPhysicsBodyType::Dynamic;
401
+
397
402
// check if Kinematic by Component Mobility == Movable && Physics active
398
- typeOfAdd = Mesh->Mobility .GetValue () == EComponentMobility::Movable && (Mesh->IsSimulatingPhysics () == false ) ? ELocalPhysicsBodyType::Kinematic : typeOfAdd;
403
+ typeOfAdd = (Mesh->Mobility .GetValue () == EComponentMobility::Movable) && (Mesh->IsSimulatingPhysics () == false ) ? ELocalPhysicsBodyType::Kinematic : typeOfAdd;
404
+
399
405
// check if Static by Component Mobility == Static
400
406
typeOfAdd = Mesh->Mobility .GetValue () == EComponentMobility::Static ? ELocalPhysicsBodyType::Static : typeOfAdd;
401
407
@@ -406,7 +412,13 @@ bool ALocalSimulationVolume::AddStaticMeshToSimulation(UStaticMeshComponent* Mes
406
412
FBodyInstance& BodyInstance = Mesh->BodyInstance ;
407
413
408
414
// create copy of new relative transform
409
- FTransform BodyTransform = Mesh->GetComponentTransform ().GetRelativeTransform (LocalSpace->GetComponentTransform ());
415
+ FTransform BodyTransform = BodyInstance.GetUnrealWorldTransform_AssumesLocked (false ).GetRelativeTransform (LocalSpace->GetComponentTransform ());
416
+ // BodyTransform.SetScale3D(Mesh->GetComponentTransform().GetScale3D());
417
+ // FTransform BodyTransform = FTransform(Mesh->GetComponentTransform().Rotator(), Mesh->Bounds.Origin, Mesh->GetComponentTransform().GetScale3D()).GetRelativeTransform(LocalSpace->GetComponentTransform());
418
+ // FTransform BodyTransform = Mesh->GetComponentTransform();
419
+ // BodyTransform.SetScale3D(FVector(1.f));
420
+ // BodyTransform = BodyTransform.GetRelativeTransform(LocalSpace->GetComponentTransform());
421
+
410
422
411
423
UStaticMeshComponent* DynamicMesh = NewMeshData->InPhysicsMesh ;
412
424
if (ShouldExistInBothScenes)
@@ -491,6 +503,9 @@ bool ALocalSimulationVolume::AddStaticMeshToSimulation(UStaticMeshComponent* Mes
491
503
BodyInstance.TermBody ();
492
504
}
493
505
506
+ // store scale so that Unreal component gets returned the correct scale / debug looks percise.
507
+ NewMeshData->InHandle ->ActorScale3D = Mesh->GetComponentTransform ().GetScale3D ();
508
+
494
509
// create new pair in kinematic meshses array (we don't update on tick)
495
510
haveWeAddedMesh = (SimulatedActors.Add (NewMeshData) > -1 );
496
511
}
@@ -518,7 +533,7 @@ bool ALocalSimulationVolume::AddConstraintToStaticMeshes(UStaticMeshComponent* M
518
533
519
534
LocalPhysics::LocalPhysicJointData* newData = new LocalPhysicJointData (*LocalSimulation, { MeshDataOne, MeshDataTwo }, nullptr , { MeshDataOne->InBodyType , MeshDataTwo->InBodyType });
520
535
521
- PxD6Joint* PD6Joint = PxD6JointCreate (*GPhysXSDK, nullptr , PxTransform (PxIdentity), nullptr , U2PTransform (ActorTwo->GetWorldTransform ().GetRelativeTransform (ActorOne->GetWorldTransform ())));
536
+ PxD6Joint* PD6Joint = PxD6JointCreate (*GPhysXSDK, nullptr , PxTransform (PxIdentity), nullptr , U2PTransform (ActorTwo->GetBodyTransform ().GetRelativeTransform (ActorOne->GetBodyTransform ())));
522
537
523
538
if (PD6Joint)
524
539
{
0 commit comments