I have a custom mesh class based on the Procedural Mesh Generation
tutorial on the wiki.
I can’t figure out how to get the GeneratedMeshComponent from the Procedural Mesh Generation tutorial to cast and self shadow.
I have a custom mesh class based on the Procedural Mesh Generation
tutorial on the wiki.
I can’t figure out how to get the GeneratedMeshComponent from the Procedural Mesh Generation tutorial to cast and self shadow.
#Code For You
Try settings like these.
I use this for all my custom components.
Just put the function in your .h and run it in your constructor for your custom component
FORCEINLINE void SetupSMComponentsWithCollision(UStaticMeshComponent* Comp)
{
if(!Comp) return;
//~~~~~~~~
Comp->bOwnerNoSee = false;
Comp->bCastDynamicShadow = true;
Comp->CastShadow = true;
Comp->BodyInstance.SetObjectType(ECC_WorldDynamic);
Comp->BodyInstance.SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
Comp->BodyInstance.SetResponseToAllChannels(ECR_Ignore);
Comp->BodyInstance.SetResponseToChannel(ECC_WorldStatic, ECR_Block);
Comp->BodyInstance.SetResponseToChannel(ECC_WorldDynamic, ECR_Block);
Comp->BodyInstance.SetResponseToChannel(ECC_Pawn, ECR_Block);
Comp->SetHiddenInGame(false);
}
This doesn’t work for me.
Can you confirm it works with the Procedural Mesh Generation tutorial?
It will receive a shadow but won’t cast one.
I got my own procedural meshes to cast shadows just fine!
#Picture for Reference
#Movable
Did you set your component to be MOVABLE ??!!
#Set Root Component
Did you set it to be the root component of your Actor that has this component?
#More Code For You
AVictoryWallCanvas3D::AVictoryWallCanvas3D(const class FPostConstructInitializeProperties& PCIP)
: Super(PCIP)
{
//New Root Component!
VMesh = PCIP.CreateDefaultSubobject < UVictoryMeshComponent > (this, TEXT("VictoryMesh"));
RootComponent = VMesh;
//Mobility
VMesh->SetMobility(EComponentMobility::Movable);
//Component Setup
VMesh->CastShadow = true;
VMesh->bCastDynamicShadow = true;
VMesh->BodyInstance.SetObjectType(ECC_WorldDynamic);
VMesh->BodyInstance.SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
//Just in cases
VMesh->SetHiddenInGame(false);
}
Rama
PS: if this resolves your issue please check mark my post so Epic knows the issue is solved
Finally figured it out.
Turns out it was the CalcBounds function.
It was setup like so
FBoxSphereBounds UGeneratedMeshComponent::CalcBounds(const FTransform & LocalToWorld) const
{
FBoxSphereBounds NewBounds;
NewBounds.Origin = FVector::ZeroVector;
NewBounds.BoxExtent = FVector(HALF_WORLD_MAX,HALF_WORLD_MAX,HALF_WORLD_MAX);
NewBounds.SphereRadius = FMath::Sqrt(3.0f * FMath::Square(HALF_WORLD_MAX));
return NewBounds;
}
That turns out to be a very large bounding box and my guess is the shadow rendering code ignores it as if it’s not in the shadow render pass.
To fix it I changed it to represent a more accurate bounding box based on the actual geometry.