You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
- add new UModelingObjectsCreationAPI and associated data structures, provides abstract API for creating mesh and texture objects from Tools that is not specifically tied to StaticMesh Actors/Assets - new helper functions in UE::Modeling:: namespace to simplify usage of an implementation of this API registered in a ContextObjectStore - add new UEditorModelingObjectsCreationAPI implementation of above, supports hooks for higher level to provide custom paths - add ModelingModeAssetUtils.h, provides several functions in UE::Modeling:: namespace to be used to implement those hooks (various existing path-determination code is moved here) - ModelingToolsEditorMode now registers an instance of UEditorModelingObjectsCreationAPI in ContextObjectStore and connects up callbacks to these path functions - AssetGenerationUtil functions and ModelingModeAssetAPI deleted - All Tools that previously used IToolsContextAssetAPI updated to use this new system #rb jimmy.andrews #rnx #jira none #preflight 60b7c2ddae46a1000162729b [CL 16538450 by Ryan Schmidt in ue5-main branch]
101 lines
3.9 KiB
C++
101 lines
3.9 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "ProjectToTargetTool.h"
|
|
#include "MeshDescriptionToDynamicMesh.h"
|
|
#include "InteractiveToolManager.h"
|
|
|
|
#include "TargetInterfaces/MaterialProvider.h"
|
|
#include "TargetInterfaces/MeshDescriptionCommitter.h"
|
|
#include "TargetInterfaces/MeshDescriptionProvider.h"
|
|
#include "TargetInterfaces/PrimitiveComponentBackedTarget.h"
|
|
#include "ToolTargetManager.h"
|
|
|
|
#include "ExplicitUseGeometryMathTypes.h" // using UE::Geometry::(math types)
|
|
using namespace UE::Geometry;
|
|
|
|
#define LOCTEXT_NAMESPACE "UProjectToTargetTool"
|
|
|
|
const FToolTargetTypeRequirements& UProjectToTargetToolBuilder::GetTargetRequirements() const
|
|
{
|
|
static FToolTargetTypeRequirements TypeRequirements({
|
|
UMeshDescriptionCommitter::StaticClass(),
|
|
UMeshDescriptionProvider::StaticClass(),
|
|
UPrimitiveComponentBackedTarget::StaticClass(),
|
|
UMaterialProvider::StaticClass()
|
|
});
|
|
return TypeRequirements;
|
|
}
|
|
|
|
bool UProjectToTargetToolBuilder::CanBuildTool(const FToolBuilderState& SceneState) const
|
|
{
|
|
return SceneState.TargetManager->CountSelectedAndTargetable(SceneState, GetTargetRequirements()) == 2;
|
|
}
|
|
|
|
UInteractiveTool* UProjectToTargetToolBuilder::BuildTool(const FToolBuilderState& SceneState) const
|
|
{
|
|
UProjectToTargetTool* NewTool = NewObject<UProjectToTargetTool>(SceneState.ToolManager);
|
|
|
|
TArray<TObjectPtr<UToolTarget>> Targets = SceneState.TargetManager->BuildAllSelectedTargetable(SceneState, GetTargetRequirements());
|
|
NewTool->SetTargets(MoveTemp(Targets));
|
|
NewTool->SetWorld(SceneState.World);
|
|
|
|
return NewTool;
|
|
}
|
|
|
|
void UProjectToTargetTool::Setup()
|
|
{
|
|
// ProjectionTarget and ProjectionTargetSpatial are setup before calling the parent class's Setup
|
|
FMeshDescriptionToDynamicMesh ProjectionConverter;
|
|
check(Targets.Num() == 2);
|
|
ProjectionTarget = MakeUnique<FDynamicMesh3>();
|
|
ProjectionConverter.Convert(TargetMeshProviderInterface(1)->GetMeshDescription(), *ProjectionTarget);
|
|
ProjectionTargetSpatial = MakeUnique<FDynamicMeshAABBTree3>(ProjectionTarget.Get(), true);
|
|
|
|
// Now setup parent RemeshMeshTool class
|
|
URemeshMeshTool::Setup();
|
|
|
|
SetToolDisplayName(LOCTEXT("ProjectToTargetToolName", "Project To Target"));
|
|
GetToolManager()->DisplayMessage(
|
|
LOCTEXT("ProjectToTargetToolDescription", "Incrementally deform the first selected mesh towards the second, while applying Remeshing. This can be used to improve the accuracy of shrink-wrapping strategies."),
|
|
EToolMessageLevel::UserNotification);
|
|
}
|
|
|
|
|
|
TUniquePtr<FDynamicMeshOperator> UProjectToTargetTool::MakeNewOperator()
|
|
{
|
|
UProjectToTargetToolProperties* ProjectProperties = Cast<UProjectToTargetToolProperties>(BasicProperties);
|
|
if (!ensure(ProjectProperties))
|
|
{
|
|
return nullptr;
|
|
}
|
|
|
|
TUniquePtr<FDynamicMeshOperator> Op = URemeshMeshTool::MakeNewOperator();
|
|
|
|
FDynamicMeshOperator* RawOp = Op.Get();
|
|
FRemeshMeshOp* RemeshOp = static_cast<FRemeshMeshOp*>(RawOp);
|
|
check(RemeshOp);
|
|
|
|
RemeshOp->ProjectionTarget = ProjectionTarget.Get();
|
|
RemeshOp->ProjectionTargetSpatial = ProjectionTargetSpatial.Get();
|
|
|
|
RemeshOp->ToolMeshLocalToWorld = FTransform3d(Cast<IPrimitiveComponentBackedTarget>(Targets[0])->GetWorldTransform());
|
|
RemeshOp->TargetMeshLocalToWorld = FTransform3d(Cast<IPrimitiveComponentBackedTarget>(Targets[1])->GetWorldTransform());
|
|
RemeshOp->bUseWorldSpace = ProjectProperties->bWorldSpace;
|
|
RemeshOp->bParallel = ProjectProperties->bParallel;
|
|
|
|
if (ProjectProperties->RemeshType == ERemeshType::NormalFlow)
|
|
{
|
|
RemeshOp->FaceProjectionPassesPerRemeshIteration = ProjectProperties->FaceProjectionPassesPerRemeshIteration;
|
|
RemeshOp->SurfaceProjectionSpeed = ProjectProperties->SurfaceProjectionSpeed;
|
|
RemeshOp->NormalAlignmentSpeed = ProjectProperties->NormalAlignmentSpeed;
|
|
RemeshOp->bSmoothInFillAreas = ProjectProperties->bSmoothInFillAreas;
|
|
RemeshOp->FillAreaDistanceMultiplier = ProjectProperties->FillAreaDistanceMultiplier;
|
|
RemeshOp->FillAreaSmoothMultiplier = ProjectProperties->FillAreaSmoothMultiplier;
|
|
}
|
|
|
|
return Op;
|
|
}
|
|
|
|
|
|
#undef LOCTEXT_NAMESPACE
|