2020-06-23 18:40:00 -04:00
// Copyright Epic Games, Inc. All Rights Reserved.
# include "AssetUtils/MeshDescriptionUtil.h"
# include "Engine/StaticMesh.h"
# include "Engine/Classes/Components/StaticMeshComponent.h"
# include "StaticMeshAttributes.h"
# include "StaticMeshOperations.h"
void UE : : MeshDescription : : InitializeAutoGeneratedAttributes ( FMeshDescription & Mesh , const FMeshBuildSettings * BuildSettings )
{
check ( BuildSettings ) ;
// if the build settings don't indicate calculated normals/tangents, we will assume they are good
if ( BuildSettings - > bRecomputeNormals | | BuildSettings - > bRecomputeTangents )
{
// check if any are invalid
bool bHasInvalidNormals , bHasInvalidTangents ;
FStaticMeshOperations : : AreNormalsAndTangentsValid ( Mesh , bHasInvalidNormals , bHasInvalidTangents ) ;
// if neither are invalid we are not going to recompute
if ( bHasInvalidNormals | | bHasInvalidTangents )
{
FStaticMeshAttributes Attributes ( Mesh ) ;
if ( ! Attributes . GetTriangleNormals ( ) . IsValid ( ) | | ! Attributes . GetTriangleTangents ( ) . IsValid ( ) )
{
// If these attributes don't exist, create them and compute their values for each triangle
FStaticMeshOperations : : ComputeTriangleTangentsAndNormals ( Mesh ) ;
}
EComputeNTBsFlags ComputeNTBsOptions = EComputeNTBsFlags : : BlendOverlappingNormals ;
ComputeNTBsOptions | = BuildSettings - > bRecomputeNormals ? EComputeNTBsFlags : : Normals : EComputeNTBsFlags : : None ;
ComputeNTBsOptions | = BuildSettings - > bRecomputeTangents ? EComputeNTBsFlags : : Tangents : EComputeNTBsFlags : : None ;
ComputeNTBsOptions | = BuildSettings - > bUseMikkTSpace ? EComputeNTBsFlags : : UseMikkTSpace : EComputeNTBsFlags : : None ;
ComputeNTBsOptions | = BuildSettings - > bComputeWeightedNormals ? EComputeNTBsFlags : : WeightedNTBs : EComputeNTBsFlags : : None ;
ComputeNTBsOptions | = BuildSettings - > bRemoveDegenerates ? EComputeNTBsFlags : : IgnoreDegenerateTriangles : EComputeNTBsFlags : : None ;
FStaticMeshOperations : : ComputeTangentsAndNormals ( Mesh , ComputeNTBsOptions ) ;
}
}
}
void UE : : MeshDescription : : InitializeAutoGeneratedAttributes ( FMeshDescription & Mesh , UStaticMesh * StaticMesh , int32 SourceLOD )
{
# if WITH_EDITOR
if ( ensureMsgf ( SourceLOD < StaticMesh - > GetNumSourceModels ( ) , TEXT ( " InitializeMeshDescription requested LOD index greater than num available in UStaticMesh " ) ) )
{
const FStaticMeshSourceModel & SourceModel = StaticMesh - > GetSourceModel ( SourceLOD ) ;
InitializeAutoGeneratedAttributes ( Mesh , & SourceModel . BuildSettings ) ;
}
# else
ensureMsgf ( false , TEXT ( " InitializeMeshDescription requires Editor-only SourceModel field of UStaticMesh " ) ) ;
# endif
}
void UE : : MeshDescription : : InitializeAutoGeneratedAttributes ( FMeshDescription & Mesh , UActorComponent * StaticMeshComponent , int32 SourceLOD )
{
# if WITH_EDITOR
ModelingTools: add support for creating Volumes directly from DrawPolygon, DrawRevolve, DrawPolyPath, and AddPrimitive, CombineMeshes, CutMeshWithMesh, PlaneCut, BaseCreateFromSelected Tools. Improve support for Editing volumes, eg handling mesh/volume interactions, and add configurable auto-simplification for volumes to avoid painful Editor hangs.
- Move ToolTarget implementations, DynamicMeshToVolume to ModelingComponentsEditorOnly module
- move VolumeToDynamicMesh, DynamicMeshProvider/Commiter interfaces to ModelingComponents module
- Add UCreateMeshObjectTypeProperties property set to expose mesh/volume options
- Add FCreateMeshObjectParams::TypeHintClass to allow AVolume type (or other UClass hints) to be passed to creation APIs
- Add UE::ToolTarget::ConfigureCreateMeshObjectParams() util function in ModelingToolTargetUtil, tries to determine output type in a FCreateMeshObjectParams based on input ToolTarget
- Add UEditorModelingObjectsCreationAPI::CreateVolume() implementation
- Add UEditorModelingObjectsCreationAPI::FilterMaterials() that strips out any internal materials and replaces with WorldGridMaterial. This occurs when (eg) subtracting a Volume from a StaticMesh, because the temporary volume mesh gets assigned internal materials, but the Tools don't know this. Use in EditorModelingObjectsCreationAPI when creating new objects. UStaticMeshComponentToolTarget also does this filtering in ::CommitMaterialSetUpdate().
- Add ::ComponentTypeSupportsCollision() function to ComponentCollisionUtil, use to avoid checks/ensures for Volume targets
- Add support for automatic mesh simplification in DynamicMeshToVolume. Add CVar to VolumeDynamicMeshToolTarget.h to control max triangle count (default 500). Apply auto-simplify when creating or updating an AVolume. This prevents the Editor from blocking for long periods on meshes that are too high-res for volumes (even 500 is quite high).
- DynamicMeshToVolume now emits polygroup-faces that contain holes (ie multiple boundary loops) as a set of triangles, rather than emitting separate overlapping faces for each boundary loop
#rb none
#rnx
#jira none
#preflight 60ba50632c42ea0001cb54c5
[CL 16561742 by Ryan Schmidt in ue5-main branch]
2021-06-04 16:04:03 -04:00
if ( Cast < UStaticMeshComponent > ( StaticMeshComponent ) ! = nullptr )
2020-06-23 18:40:00 -04:00
{
UStaticMesh * StaticMesh = Cast < UStaticMeshComponent > ( StaticMeshComponent ) - > GetStaticMesh ( ) ;
if ( ensure ( StaticMesh ! = nullptr ) )
{
InitializeAutoGeneratedAttributes ( Mesh , StaticMesh , SourceLOD ) ;
}
}
# else
ModelingTools: add support for creating Volumes directly from DrawPolygon, DrawRevolve, DrawPolyPath, and AddPrimitive, CombineMeshes, CutMeshWithMesh, PlaneCut, BaseCreateFromSelected Tools. Improve support for Editing volumes, eg handling mesh/volume interactions, and add configurable auto-simplification for volumes to avoid painful Editor hangs.
- Move ToolTarget implementations, DynamicMeshToVolume to ModelingComponentsEditorOnly module
- move VolumeToDynamicMesh, DynamicMeshProvider/Commiter interfaces to ModelingComponents module
- Add UCreateMeshObjectTypeProperties property set to expose mesh/volume options
- Add FCreateMeshObjectParams::TypeHintClass to allow AVolume type (or other UClass hints) to be passed to creation APIs
- Add UE::ToolTarget::ConfigureCreateMeshObjectParams() util function in ModelingToolTargetUtil, tries to determine output type in a FCreateMeshObjectParams based on input ToolTarget
- Add UEditorModelingObjectsCreationAPI::CreateVolume() implementation
- Add UEditorModelingObjectsCreationAPI::FilterMaterials() that strips out any internal materials and replaces with WorldGridMaterial. This occurs when (eg) subtracting a Volume from a StaticMesh, because the temporary volume mesh gets assigned internal materials, but the Tools don't know this. Use in EditorModelingObjectsCreationAPI when creating new objects. UStaticMeshComponentToolTarget also does this filtering in ::CommitMaterialSetUpdate().
- Add ::ComponentTypeSupportsCollision() function to ComponentCollisionUtil, use to avoid checks/ensures for Volume targets
- Add support for automatic mesh simplification in DynamicMeshToVolume. Add CVar to VolumeDynamicMeshToolTarget.h to control max triangle count (default 500). Apply auto-simplify when creating or updating an AVolume. This prevents the Editor from blocking for long periods on meshes that are too high-res for volumes (even 500 is quite high).
- DynamicMeshToVolume now emits polygroup-faces that contain holes (ie multiple boundary loops) as a set of triangles, rather than emitting separate overlapping faces for each boundary loop
#rb none
#rnx
#jira none
#preflight 60ba50632c42ea0001cb54c5
[CL 16561742 by Ryan Schmidt in ue5-main branch]
2021-06-04 16:04:03 -04:00
//ensureMsgf(false, TEXT("InitializeMeshDescription requires Editor-only SourceModel field of UStaticMesh"));
2020-06-23 18:40:00 -04:00
# endif
}
void UE : : MeshDescription : : ConfigureBuildSettings ( UStaticMesh * StaticMesh , int32 SourceLOD , FStaticMeshBuildSettingChange NewSettings )
{
# if WITH_EDITOR
if ( ensureMsgf ( SourceLOD < StaticMesh - > GetNumSourceModels ( ) , TEXT ( " ConfigureBuildSettings requested LOD index greater than num available in UStaticMesh " ) ) )
{
FStaticMeshSourceModel & SourceModel = StaticMesh - > GetSourceModel ( SourceLOD ) ;
if ( NewSettings . AutoGeneratedNormals ! = EBuildSettingBoolChange : : NoChange )
{
SourceModel . BuildSettings . bRecomputeNormals =
( NewSettings . AutoGeneratedNormals = = EBuildSettingBoolChange : : Disable ) ? false : true ;
}
if ( NewSettings . AutoGeneratedTangents ! = EBuildSettingBoolChange : : NoChange )
{
SourceModel . BuildSettings . bRecomputeTangents =
( NewSettings . AutoGeneratedTangents = = EBuildSettingBoolChange : : Disable ) ? false : true ;
}
if ( NewSettings . UseMikkTSpaceTangents ! = EBuildSettingBoolChange : : NoChange )
{
SourceModel . BuildSettings . bUseMikkTSpace =
( NewSettings . UseMikkTSpaceTangents = = EBuildSettingBoolChange : : Disable ) ? false : true ;
}
}
# else
// just ignore?
# endif
}