You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
ModelingTools: Add MeshSurfacePointMeshEditingToolBuilder with common mesh editing requirements. Update MeshSurfacePointTool modeling tools to use MeshSurfacePointMeshEditingToolBuilder #rb semion.piskarev #rnx #jira none #preflight 6196d1bbb22f9e02b57b7438 #ROBOMERGE-AUTHOR: lonnie.li #ROBOMERGE-SOURCE: CL 18269233 in //UE5/Release-5.0/... via CL 18269267 #ROBOMERGE-BOT: STARSHIP (Release-Engine-Staging -> Release-Engine-Test) (v895-18170469) [CL 18269272 by lonnie li in ue5-release-engine-test branch]
173 lines
4.4 KiB
C++
173 lines
4.4 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "BaseTools/MeshSurfacePointMeshEditingTool.h"
|
|
#include "Properties/MeshMaterialProperties.h"
|
|
#include "Components/DynamicMeshComponent.h"
|
|
#include "DynamicMesh/DynamicMeshAABBTree3.h"
|
|
#include "ToolDataVisualizer.h"
|
|
#include "Changes/MeshVertexChange.h"
|
|
#include "GroupTopology.h"
|
|
#include "Selection/GroupTopologySelector.h"
|
|
#include "ModelingOperators/Public/ModelingTaskTypes.h"
|
|
#include "Transforms/MultiTransformer.h"
|
|
#include "Selection/PolygonSelectionMechanic.h"
|
|
#include "EditUVIslandsTool.generated.h"
|
|
|
|
class FMeshVertexChangeBuilder;
|
|
using UE::Geometry::FDynamicMeshUVOverlay;
|
|
|
|
/**
|
|
* ToolBuilder
|
|
*/
|
|
UCLASS()
|
|
class MESHMODELINGTOOLSEXP_API UEditUVIslandsToolBuilder : public UMeshSurfacePointMeshEditingToolBuilder
|
|
{
|
|
GENERATED_BODY()
|
|
public:
|
|
virtual UMeshSurfacePointTool* CreateNewTool(const FToolBuilderState& SceneState) const override;
|
|
};
|
|
|
|
|
|
|
|
|
|
class MESHMODELINGTOOLSEXP_API FUVGroupTopology : public FGroupTopology
|
|
{
|
|
public:
|
|
TArray<int32> TriIslandGroups;
|
|
const FDynamicMeshUVOverlay* UVOverlay;
|
|
|
|
FUVGroupTopology() {}
|
|
FUVGroupTopology(const UE::Geometry::FDynamicMesh3* Mesh, uint32 UVLayerIndex, bool bAutoBuild = false);
|
|
|
|
void CalculateIslandGroups();
|
|
|
|
virtual int GetGroupID(int32 TriangleID) const override
|
|
{
|
|
return TriIslandGroups[TriangleID];
|
|
}
|
|
|
|
UE::Geometry::FFrame3d GetIslandFrame(int32 GroupID, UE::Geometry::FDynamicMeshAABBTree3& AABBTree);
|
|
};
|
|
|
|
|
|
/**
|
|
*
|
|
*/
|
|
UCLASS()
|
|
class MESHMODELINGTOOLSEXP_API UEditUVIslandsTool : public UMeshSurfacePointTool
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
public:
|
|
UEditUVIslandsTool();
|
|
|
|
virtual void RegisterActions(FInteractiveToolActionSet& ActionSet) override;
|
|
|
|
virtual void SetWorld(UWorld* World)
|
|
{
|
|
TargetWorld = World;
|
|
}
|
|
|
|
virtual void Setup() override;
|
|
virtual void Shutdown(EToolShutdownType ShutdownType) override;
|
|
|
|
virtual void OnTick(float DeltaTime) override;
|
|
virtual void Render(IToolsContextRenderAPI* RenderAPI) override;
|
|
|
|
virtual bool HasCancel() const override { return true; }
|
|
virtual bool HasAccept() const override { return true; }
|
|
|
|
// UMeshSurfacePointTool API
|
|
virtual bool HitTest(const FRay& Ray, FHitResult& OutHit) override;
|
|
virtual void OnBeginDrag(const FRay& Ray) override;
|
|
virtual void OnUpdateDrag(const FRay& Ray) override;
|
|
virtual void OnEndDrag(const FRay& Ray) override;
|
|
virtual bool OnUpdateHover(const FInputDeviceRay& DevicePos) override;
|
|
virtual void OnEndHover() override;
|
|
|
|
// IClickDragBehaviorTarget API
|
|
virtual FInputRayHit CanBeginClickDragSequence(const FInputDeviceRay& PressPos) override;
|
|
|
|
|
|
public:
|
|
UPROPERTY()
|
|
TObjectPtr<UExistingMeshMaterialProperties> MaterialSettings = nullptr;
|
|
|
|
UPROPERTY()
|
|
TObjectPtr<UMaterialInstanceDynamic> CheckerMaterial = nullptr;
|
|
|
|
protected:
|
|
|
|
UPROPERTY()
|
|
TObjectPtr<UWorld> TargetWorld = nullptr;
|
|
|
|
UPROPERTY()
|
|
TObjectPtr<AInternalToolFrameworkActor> PreviewMeshActor = nullptr;
|
|
|
|
UPROPERTY()
|
|
TObjectPtr<UDynamicMeshComponent> DynamicMeshComponent = nullptr;
|
|
|
|
UPROPERTY()
|
|
TObjectPtr<UPolygonSelectionMechanic> SelectionMechanic;
|
|
|
|
bool bSelectionStateDirty = false;
|
|
void OnSelectionModifiedEvent();
|
|
|
|
UPROPERTY()
|
|
TObjectPtr<UMultiTransformer> MultiTransformer = nullptr;
|
|
|
|
void OnMultiTransformerTransformBegin();
|
|
void OnMultiTransformerTransformUpdate();
|
|
void OnMultiTransformerTransformEnd();
|
|
|
|
// realtime visualization
|
|
void OnDynamicMeshComponentChanged();
|
|
FDelegateHandle OnDynamicMeshComponentChangedHandle;
|
|
|
|
// camera state at last render
|
|
UE::Geometry::FTransform3d WorldTransform;
|
|
FViewCameraState CameraState;
|
|
|
|
// True for the duration of UI click+drag
|
|
bool bInDrag;
|
|
|
|
double UVTranslateScale;
|
|
UE::Geometry::FFrame3d InitialGizmoFrame;
|
|
FVector3d InitialGizmoScale;
|
|
void ComputeUpdate_Gizmo();
|
|
|
|
FUVGroupTopology Topology;
|
|
void PrecomputeTopology();
|
|
|
|
FDynamicMeshAABBTree3 MeshSpatial;
|
|
FDynamicMeshAABBTree3& GetSpatial();
|
|
bool bSpatialDirty;
|
|
|
|
|
|
//
|
|
// data for current drag
|
|
//
|
|
struct FEditIsland
|
|
{
|
|
UE::Geometry::FFrame3d LocalFrame;
|
|
TArray<int32> Triangles;
|
|
TArray<int32> UVs;
|
|
UE::Geometry::FAxisAlignedBox2d UVBounds;
|
|
FVector2d UVOrigin;
|
|
TArray<FVector2f> InitialPositions;
|
|
};
|
|
TArray<FEditIsland> ActiveIslands;
|
|
void UpdateUVTransformFromSelection(const FGroupTopologySelection& Selection);
|
|
|
|
FMeshVertexChangeBuilder* ActiveVertexChange;
|
|
void BeginChange();
|
|
void EndChange();
|
|
void UpdateChangeFromROI(bool bFinal);
|
|
|
|
void OnMaterialSettingsChanged();
|
|
};
|
|
|