// Copyright Epic Games, Inc. All Rights Reserved. #include "DatasmithFacadeVariant.h" #include "DatasmithFacadeMaterial.h" #include "Math/Transform.h" FDatasmithFacadePropertyCapture::FDatasmithFacadePropertyCapture() : FDatasmithFacadeElement(FDatasmithSceneFactory::CreatePropertyCapture()) { } FDatasmithFacadePropertyCapture::FDatasmithFacadePropertyCapture( const TSharedRef& InInternalPropertyCapture ) : FDatasmithFacadeElement( InInternalPropertyCapture ) { } void FDatasmithFacadePropertyCapture::SetPropertyPath(const TCHAR* Path) { GetDatasmithPropertyCapture()->SetPropertyPath(Path); } const TCHAR* FDatasmithFacadePropertyCapture::GetPropertyPath() { return *GetDatasmithPropertyCapture()->GetPropertyPath(); } EDatasmithFacadePropertyCategory FDatasmithFacadePropertyCapture::GetCategory() const { return static_cast(GetDatasmithPropertyCapture()->GetCategory()); } TSharedRef FDatasmithFacadePropertyCapture::GetDatasmithPropertyCapture() const { return StaticCastSharedRef( InternalDatasmithElement ); } FDatasmithFacadeActorBinding::FDatasmithFacadeActorBinding( FDatasmithFacadeActor* InActorPtr ) : FDatasmithFacadeElement(FDatasmithSceneFactory::CreateActorBinding()) { GetDatasmithActorBinding()->SetActor(InActorPtr->GetDatasmithActorElement()); } FDatasmithFacadeActorBinding::FDatasmithFacadeActorBinding( const TSharedRef& InInternalActorBinding ) : FDatasmithFacadeElement( InInternalActorBinding ) { } TSharedRef FDatasmithFacadeActorBinding::GetDatasmithActorBinding() const { return StaticCastSharedRef( InternalDatasmithElement ); } void FDatasmithFacadeActorBinding::AddRelativeLocationCapture( double X, double Y, double Z ) { FVector Location(X, Y, Z); TSharedRef LocationProperty = FDatasmithSceneFactory::CreatePropertyCapture(); LocationProperty->SetCategory(EDatasmithPropertyCategory::RelativeLocation); LocationProperty->SetRecordedData((uint8*)&Location, sizeof(FVector)); GetDatasmithActorBinding()->AddPropertyCapture(LocationProperty); } void FDatasmithFacadeActorBinding::AddRelativeRotationCapture( double Pitch, double Yaw, double Roll ) { FRotator Rotation(Pitch, Yaw, Roll); TSharedRef RotationProperty = FDatasmithSceneFactory::CreatePropertyCapture(); RotationProperty->SetCategory(EDatasmithPropertyCategory::RelativeRotation); RotationProperty->SetRecordedData((uint8*)&Rotation, sizeof(FRotator)); GetDatasmithActorBinding()->AddPropertyCapture(RotationProperty); } void FDatasmithFacadeActorBinding::AddRelativeRotationCapture( double X, double Y, double Z, double W ) { FRotator Rotation(FQuat(X, Y, Z, W)); TSharedRef RotationProperty = FDatasmithSceneFactory::CreatePropertyCapture(); RotationProperty->SetCategory(EDatasmithPropertyCategory::RelativeRotation); RotationProperty->SetRecordedData((uint8*)&Rotation, sizeof(FRotator)); GetDatasmithActorBinding()->AddPropertyCapture(RotationProperty); } void FDatasmithFacadeActorBinding::AddRelativeScaleCapture( double X, double Y, double Z ) { FVector Scale(X, Y, Z); TSharedRef ScaleProperty = FDatasmithSceneFactory::CreatePropertyCapture(); ScaleProperty->SetCategory(EDatasmithPropertyCategory::RelativeScale3D); ScaleProperty->SetRecordedData((uint8*)&Scale, sizeof(FVector)); GetDatasmithActorBinding()->AddPropertyCapture(ScaleProperty); } void FDatasmithFacadeActorBinding::AddRelativeTransformCapture( const double InMatrix[16], bool bRowMajor ) { TSharedPtr Actor = GetDatasmithActorBinding()->GetActor(); FDatasmithFacadeActor FacadeActor(Actor.ToSharedRef()); //todo: probably could reuse existing actor reference, or make ConvertTransform static // Decompose matrix to FTransform with use of FDatasmithFacadeActor::ConvertTransform() FTransform Transform = FacadeActor.ConvertTransform(InMatrix, bRowMajor); //todo: can inline these functions FVector Scale = Transform.GetScale3D(); FVector Location = Transform.GetTranslation(); FQuat Rotation = Transform.GetRotation(); AddRelativeScaleCapture(Scale.X, Scale.Y, Scale.Z); AddRelativeLocationCapture(Location.X, Location.Y, Location.Z); AddRelativeRotationCapture(Rotation.X, Rotation.Y, Rotation.Z, Rotation.W); } void FDatasmithFacadeActorBinding::AddVisibilityCapture( bool bInVisibility ) { TSharedRef VisibilityProperty = FDatasmithSceneFactory::CreatePropertyCapture(); VisibilityProperty->SetCategory(EDatasmithPropertyCategory::Visibility); VisibilityProperty->SetRecordedData((uint8*)&bInVisibility, sizeof(bool)); GetDatasmithActorBinding()->AddPropertyCapture(VisibilityProperty); } void FDatasmithFacadeActorBinding::AddMaterialCapture( FDatasmithFacadeBaseMaterial* InMaterialPtr ) { TSharedRef MaterialProperty = FDatasmithSceneFactory::CreateObjectPropertyCapture(); MaterialProperty->SetCategory(EDatasmithPropertyCategory::Material); MaterialProperty->SetRecordedObject(InMaterialPtr->GetDatasmithBaseMaterial()); GetDatasmithActorBinding()->AddPropertyCapture(MaterialProperty); } void FDatasmithFacadeActorBinding::AddPropertyCapture( FDatasmithFacadePropertyCapture* InPropertyCapturePtr ) { if (InPropertyCapturePtr) { GetDatasmithActorBinding()->AddPropertyCapture(InPropertyCapturePtr->GetDatasmithPropertyCapture()); } } int32 FDatasmithFacadeActorBinding::GetPropertyCapturesCount() const { return GetDatasmithActorBinding()->GetPropertyCapturesCount(); } FDatasmithFacadePropertyCapture* FDatasmithFacadeActorBinding::GetNewPropertyCapture( int32 PropertyCaptureIndex ) { if (TSharedPtr PropertyCaptureElement = GetDatasmithActorBinding()->GetPropertyCapture(PropertyCaptureIndex)) { return new FDatasmithFacadePropertyCapture(PropertyCaptureElement.ToSharedRef()); } return nullptr; } void FDatasmithFacadeActorBinding::RemovePropertyCapture( FDatasmithFacadePropertyCapture* InPropertyCapturePtr ) { GetDatasmithActorBinding()->RemovePropertyCapture(InPropertyCapturePtr->GetDatasmithPropertyCapture()); } FDatasmithFacadeVariant::FDatasmithFacadeVariant( const TCHAR* InElementName ) : FDatasmithFacadeElement(FDatasmithSceneFactory::CreateVariant(InElementName)) { } FDatasmithFacadeVariant::FDatasmithFacadeVariant( const TSharedRef& InInternalVariant ) : FDatasmithFacadeElement( InInternalVariant ) { } TSharedRef FDatasmithFacadeVariant::GetDatasmithVariant() const { return StaticCastSharedRef( InternalDatasmithElement ); } void FDatasmithFacadeVariant::AddActorBinding( FDatasmithFacadeActorBinding* InActorBindingPtr ) { if (InActorBindingPtr) { GetDatasmithVariant()->AddActorBinding(InActorBindingPtr->GetDatasmithActorBinding()); } } int32 FDatasmithFacadeVariant::GetActorBindingsCount() const { return GetDatasmithVariant()->GetActorBindingsCount(); } FDatasmithFacadeActorBinding* FDatasmithFacadeVariant::GetNewActorBinding( int32 ActorBindingIndex ) { if (TSharedPtr ActorBindingElement = GetDatasmithVariant()->GetActorBinding(ActorBindingIndex)) { return new FDatasmithFacadeActorBinding(ActorBindingElement.ToSharedRef()); } return nullptr; } void FDatasmithFacadeVariant::RemoveActorBinding( FDatasmithFacadeActorBinding* InActorBindingPtr ) { GetDatasmithVariant()->RemoveActorBinding(InActorBindingPtr->GetDatasmithActorBinding()); } FDatasmithFacadeVariantSet::FDatasmithFacadeVariantSet( const TCHAR* InElementName ) : FDatasmithFacadeElement(FDatasmithSceneFactory::CreateVariantSet(InElementName)) { } FDatasmithFacadeVariantSet::FDatasmithFacadeVariantSet( const TSharedRef& InInternalVariantSet ) : FDatasmithFacadeElement( InInternalVariantSet ) { } TSharedRef FDatasmithFacadeVariantSet::GetDatasmithVariantSet() const { return StaticCastSharedRef( InternalDatasmithElement ); } void FDatasmithFacadeVariantSet::AddVariant( FDatasmithFacadeVariant* InVariantPtr ) { if (InVariantPtr) { GetDatasmithVariantSet()->AddVariant(InVariantPtr->GetDatasmithVariant()); } } int32 FDatasmithFacadeVariantSet::GetVariantsCount() const { return GetDatasmithVariantSet()->GetVariantsCount(); } FDatasmithFacadeVariant* FDatasmithFacadeVariantSet::GetNewVariant( int32 VariantIndex ) { if (TSharedPtr VariantElement = GetDatasmithVariantSet()->GetVariant(VariantIndex)) { return new FDatasmithFacadeVariant(VariantElement.ToSharedRef()); } return nullptr; } void FDatasmithFacadeVariantSet::RemoveVariant( FDatasmithFacadeVariant* InVariantPtr ) { GetDatasmithVariantSet()->RemoveVariant(InVariantPtr->GetDatasmithVariant()); } FDatasmithFacadeLevelVariantSets::FDatasmithFacadeLevelVariantSets( const TCHAR* InElementName ) : FDatasmithFacadeElement(FDatasmithSceneFactory::CreateLevelVariantSets(InElementName)) { } FDatasmithFacadeLevelVariantSets::FDatasmithFacadeLevelVariantSets( const TSharedRef& InInternalLevelVariantsSet ) : FDatasmithFacadeElement( InInternalLevelVariantsSet ) { } TSharedRef FDatasmithFacadeLevelVariantSets::GetDatasmithLevelVariantSets() const { return StaticCastSharedRef( InternalDatasmithElement ); } void FDatasmithFacadeLevelVariantSets::AddVariantSet( FDatasmithFacadeVariantSet* InVariantSetPtr ) { if (InVariantSetPtr) { GetDatasmithLevelVariantSets()->AddVariantSet(InVariantSetPtr->GetDatasmithVariantSet()); } } int32 FDatasmithFacadeLevelVariantSets::GetVariantSetsCount() const { return GetDatasmithLevelVariantSets()->GetVariantSetsCount(); } FDatasmithFacadeVariantSet* FDatasmithFacadeLevelVariantSets::GetNewVariantSet( int32 VariantSetIndex ) { if (TSharedPtr VariantSetElement = GetDatasmithLevelVariantSets()->GetVariantSet(VariantSetIndex)) { return new FDatasmithFacadeVariantSet(VariantSetElement.ToSharedRef()); } return nullptr; } void FDatasmithFacadeLevelVariantSets::RemoveVariantSet( FDatasmithFacadeVariantSet* InVariantSetPtr ) { GetDatasmithLevelVariantSets()->RemoveVariantSet(InVariantSetPtr->GetDatasmithVariantSet()); }