diff --git a/GFur.uplugin b/GFur.uplugin index d1e830a..cc16aaa 100644 --- a/GFur.uplugin +++ b/GFur.uplugin @@ -10,7 +10,7 @@ "DocsURL": "gim.studio/animalia/gfur", "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/content/c657e6d3d6c9467db3e96c828529841b", "SupportURL": "gfur@gim.studio", - "EngineVersion": "5.5.0", + "EngineVersion": "5.6.0", "CanContainContent": true, "Installed": true, "Modules": [ diff --git a/Source/GFur/GFur.Build.cs b/Source/GFur/GFur.Build.cs index b7d0f45..e231ba9 100644 --- a/Source/GFur/GFur.Build.cs +++ b/Source/GFur/GFur.Build.cs @@ -1,10 +1,15 @@ // Copyright 2023 GiM s.r.o. All Rights Reserved. +using System.IO; using UnrealBuildTool; public class GFur : ModuleRules { - public GFur(ReadOnlyTargetRules Target) : base(Target) + string EnginePath + { + get { return Path.GetFullPath(Target.RelativeEnginePath); } + } + public GFur(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; MinFilesUsingPrecompiledHeaderOverride = 1; @@ -14,6 +19,8 @@ public GFur(ReadOnlyTargetRules Target) : base(Target) PrivateIncludePaths.Add(ModuleDirectory + "/Private"); PrivateIncludePaths.Add(EngineDirectory + "/Shaders/Shared"); + PrivateIncludePaths.Add(EnginePath + "Source/Runtime/Engine/Private"); + PrivateIncludePaths.Add(EnginePath + "Source/Runtime/Engine/Internal"); PublicDependencyModuleNames.AddRange( new string[] diff --git a/Source/GFur/Private/FurComponent.cpp b/Source/GFur/Private/FurComponent.cpp index 010b860..b4f4455 100644 --- a/Source/GFur/Private/FurComponent.cpp +++ b/Source/GFur/Private/FurComponent.cpp @@ -6,18 +6,18 @@ #include "FurData.h" #include "FurMorphObject.h" #include "Engine/Engine.h" -#include "Runtime/Engine/Classes/PhysicsEngine/BodySetup.h" -#include "Runtime/Engine/Public/DynamicMeshBuilder.h" -#include "Runtime/Engine/Public/GPUSkinVertexFactory.h" -#include "Runtime/Engine/Public/Rendering/SkeletalMeshRenderData.h" -#include "Runtime/Engine/Public/Materials/MaterialRenderProxy.h" -#include "Runtime\Engine\Public\MaterialDomain.h" +#include "PhysicsEngine/BodySetup.h" +#include "DynamicMeshBuilder.h" +#include "GPUSkinVertexFactory.h" +#include "Rendering/SkeletalMeshRenderData.h" +#include "Materials/MaterialRenderProxy.h" +#include "MaterialDomain.h" #include "MaterialShared.h" #include "Engine/SkeletalMesh.h" #include "SceneInterface.h" -#include "Runtime\Engine\Classes\Engine\SkinnedAssetCommon.h" -#include "Runtime/Engine/Classes/Components/SkinnedMeshComponent.h" -#include "Runtime/Engine/Classes/Components/SkeletalMeshComponent.h" +#include "Engine/SkinnedAssetCommon.h" +#include "Components/SkinnedMeshComponent.h" +#include "Components/SkeletalMeshComponent.h" #include "PrimitiveSceneProxy.h" @@ -137,7 +137,7 @@ class FFurSceneProxy : public FPrimitiveSceneProxy #else const int32 LODBias = 0; #endif - NewLodLevel = MasterComp->MeshObject->MinDesiredLODLevel + LODBias; + NewLodLevel = FMath::Max(MasterComp->MeshObject->MinDesiredLODLevel + LODBias, 0); } } else @@ -314,6 +314,9 @@ class FFurSceneProxy : public FPrimitiveSceneProxy virtual bool IsRayTracingRelevant() const override { return true; } virtual void GetDynamicRayTracingInstances(FRayTracingInstanceCollector& Collector) override { + TConstArrayView Views = Collector.GetViews(); + const uint32 VisibilityMap = Collector.GetVisibilityMap(); + const auto& Sections = FurData[0]->GetSections_RenderThread(); auto* RHI = RayTracingGeometry.GetRHI(); if (RHI != nullptr && RHI->IsValid()) @@ -325,7 +328,7 @@ class FFurSceneProxy : public FPrimitiveSceneProxy for (int sectionIdx = 0; sectionIdx < Sections.Num(); sectionIdx++) { const FFurData::FSection& Section = Sections[sectionIdx]; - check(RayTracingGeometry.Initializer.IndexBuffer.IsValid()); + check(RayTracingGeometry.GetInitializer().IndexBuffer.IsValid()); UMaterialInstanceDynamic* material = FurMaterials[Section.MaterialIndex]; auto MaterialProxy = material->GetRenderProxy(); @@ -353,7 +356,15 @@ class FFurSceneProxy : public FPrimitiveSceneProxy //Deprecated //RayTracingInstance.BuildInstanceMaskAndFlags(GetScene().GetFeatureLevel()); - Collector.AddRayTracingInstance(RayTracingInstance); + for (int32 ViewIndex = 0; ViewIndex < Views.Num(); ViewIndex++) + { + if ((VisibilityMap & (1 << ViewIndex)) == 0) + { + continue; + } + + Collector.AddRayTracingInstance(ViewIndex, RayTracingInstance); + } } } #endif @@ -745,7 +756,6 @@ void UGFurComponent::CreateRenderState_Concurrent(FRegisterComponentContext* Con tmp_material = UMaterial::GetDefaultMaterial(MD_Surface); } UMaterialInstanceDynamic* Material = UMaterialInstanceDynamic::Create(tmp_material, this); - Material->AddToRoot(); Material->SetScalarParameterValue(FName(TEXT("FurLength")), FMath::Max(FurLength, 0.001f)); FurMaterials.Add(Material); } @@ -800,21 +810,20 @@ FBoxSphereBounds UGFurComponent::CalcBounds(const FTransform& LocalToWorld) cons if (MasterPoseComponent.IsValid()) { FBoxSphereBounds MasterBounds = MasterPoseComponent->CalcBounds(LocalToWorld); - MasterBounds.ExpandBy(FMath::Max(FurLength, 0.001f)); - return MasterBounds; + return MasterBounds.ExpandBy(FMath::Max(FurLength, 0.001f)); } FBoxSphereBounds DummyBounds = SkeletalGrowMesh->GetBounds(); - DummyBounds.ExpandBy(FMath::Max(FurLength, 0.001f)); + DummyBounds = DummyBounds.ExpandBy(FMath::Max(FurLength, 0.001f)); return DummyBounds.TransformBy(LocalToWorld); } else if (StaticGrowMesh) { FBoxSphereBounds MeshBounds = StaticGrowMesh->GetBounds(); - MeshBounds.ExpandBy(FMath::Max(FurLength, 0.001f)); + MeshBounds = MeshBounds.ExpandBy(FMath::Max(FurLength, 0.001f)); return MeshBounds.TransformBy(LocalToWorld); } FBoxSphereBounds DummyBounds = FBoxSphereBounds(FVector(0, 0, 0), FVector(0, 0, 0), 0); - DummyBounds.ExpandBy(FMath::Max(FurLength, 0.001f)); + DummyBounds = DummyBounds.ExpandBy(FMath::Max(FurLength, 0.001f)); return DummyBounds.TransformBy(LocalToWorld); } diff --git a/Source/GFur/Private/FurData.cpp b/Source/GFur/Private/FurData.cpp index b1d3561..4a70b8c 100644 --- a/Source/GFur/Private/FurData.cpp +++ b/Source/GFur/Private/FurData.cpp @@ -13,12 +13,18 @@ FFurVertexBuffer::~FFurVertexBuffer() void FFurVertexBuffer::InitRHI(FRHICommandListBase& RHICmdList) { +#if (ENGINE_MAJOR_VERSION == 5 && ENGINE_MINOR_VERSION >= 6) + FRHIBufferCreateDesc CreateDesc = FRHIBufferCreateDesc::CreateVertex(TEXT("FurVertexBuffer"), Size).AddUsage(BUF_Static).DetermineInitialState(); + + + VertexBufferRHI = RHICmdList.CreateBuffer(CreateDesc); +#else FRHIResourceCreateInfo CreateInfo(L"FurVertexBuffer"); //VertexBufferRHI = RHICreateVertexBuffer(Size, BUF_Static, CreateInfo); DEPRECATED VertexBufferRHI = RHICmdList.CreateVertexBuffer(Size, BUF_Static, CreateInfo); - +#endif // Copy the vertex data into the vertex buffer. //void* VertexBufferData = RHILockBuffer(VertexBufferRHI, 0, Size, RLM_WriteOnly); DEPRECATED void* VertexBufferData = RHICmdList.LockBuffer(VertexBufferRHI, 0, Size, RLM_WriteOnly); @@ -44,10 +50,15 @@ void FFurVertexBuffer::Unlock() if (Size != VertexBufferRHI->GetSize() || VertexBufferRHI->GetUsage() == BUF_Static) { +#if (ENGINE_MAJOR_VERSION == 5 && ENGINE_MINOR_VERSION >= 6) + FRHIBufferCreateDesc CreateDesc = FRHIBufferCreateDesc::CreateVertex(TEXT("FurVertexBuffer"), Size).AddUsage(BUF_Dynamic).DetermineInitialState(); + + VertexBufferRHI = RHICmdList.CreateBuffer(CreateDesc); +#else FRHIResourceCreateInfo CreateInfo(L"FurVertexBuffer"); //VertexBufferRHI = RHICreateVertexBuffer(Size, BUF_Dynamic, CreateInfo); DEPRECATED VertexBufferRHI = RHICmdList.CreateVertexBuffer(Size, BUF_Dynamic, CreateInfo); - +#endif } // Copy the vertex data into the vertex buffer. @@ -70,8 +81,14 @@ void FFurIndexBuffer::InitRHI(FRHICommandListBase& RHICmdList) if (Indices.Num() == 0) Indices.Add(0); +#if (ENGINE_MAJOR_VERSION == 5 && ENGINE_MINOR_VERSION >= 6) + FRHIBufferCreateDesc CreateDesc = FRHIBufferCreateDesc::CreateIndex(TEXT("FurVertexBuffer"), Indices.Num() * sizeof(int32), sizeof(int32)).AddUsage(BUF_Static).DetermineInitialState(); + + IndexBufferRHI = RHICmdList.CreateBuffer(CreateDesc); +#else FRHIResourceCreateInfo CreateInfo(L"FurVertexBuffer"); IndexBufferRHI = RHICmdList.CreateIndexBuffer(sizeof(int32), Indices.Num() * sizeof(int32), BUF_Static, CreateInfo); +#endif // Write the indices to the index buffer. void* Buffer = RHICmdList.LockBuffer(IndexBufferRHI, 0, Indices.Num() * sizeof(int32), RLM_WriteOnly); FMemory::Memcpy(Buffer, Indices.GetData(), Indices.Num() * sizeof(int32)); @@ -98,8 +115,13 @@ void FFurIndexBuffer::Unlock() uint32 Size = Indices.Num() * sizeof(int32); if (Size != IndexBufferRHI->GetSize() || IndexBufferRHI->GetUsage() == BUF_Static) { +#if (ENGINE_MAJOR_VERSION == 5 && ENGINE_MINOR_VERSION >= 6) + FRHIBufferCreateDesc CreateDesc = FRHIBufferCreateDesc::CreateIndex(TEXT("FurVertexBuffer"), Size, sizeof(int32)).AddUsage(BUF_Dynamic).DetermineInitialState(); + IndexBufferRHI = RHICmdList.CreateBuffer(CreateDesc); +#else FRHIResourceCreateInfo CreateInfo(L"FurVertexBuffer"); IndexBufferRHI = RHICmdList.CreateIndexBuffer(sizeof(int32), Size, BUF_Dynamic, CreateInfo); +#endif } void* Buffer = RHICmdList.LockBuffer(IndexBufferRHI, 0, Indices.Num() * sizeof(int32), RLM_WriteOnly); diff --git a/Source/GFur/Private/FurData.h b/Source/GFur/Private/FurData.h index 49d25f1..7b73c8d 100644 --- a/Source/GFur/Private/FurData.h +++ b/Source/GFur/Private/FurData.h @@ -378,7 +378,7 @@ class FFurDataCleanupTask : public FNonAbandonableTask void DoWork() { - FPlatformProcess::Sleep(1.0f); + FPlatformProcess::Sleep(0.01f); Lambda(); } diff --git a/Source/GFur/Private/FurMorphObject.cpp b/Source/GFur/Private/FurMorphObject.cpp index 6fa8692..227aca0 100644 --- a/Source/GFur/Private/FurMorphObject.cpp +++ b/Source/GFur/Private/FurMorphObject.cpp @@ -2,16 +2,21 @@ #include "FurMorphObject.h" #include "FurSkinData.h" -#include "Runtime/Engine/Public/Rendering/SkeletalMeshRenderData.h" +#include "Rendering/SkeletalMeshRenderData.h" #include "Runtime/Engine/Private/SkeletalRenderGPUSkin.h" -#include "Runtime/Engine/Classes/Components/SkinnedMeshComponent.h" -#include "Runtime/Engine/Classes/Animation/MorphTarget.h" +#include "Components/SkinnedMeshComponent.h" +#include "Animation/MorphTarget.h" #include "ShaderParameterUtils.h" void FFurMorphVertexBuffer::InitRHI(FRHICommandListBase& RHICmdList) { // Create the buffer rendering resource uint32 Size = NumVertices * sizeof(FMorphGPUSkinVertex); +#if (ENGINE_MAJOR_VERSION == 5 && ENGINE_MINOR_VERSION >= 6) + FRHIBufferCreateDesc CreateDesc = FRHIBufferCreateDesc::CreateVertex(TEXT("FurMorphVertexBuffer"), Size).AddUsage(BUF_Dynamic | BUF_ShaderResource).DetermineInitialState(); + + VertexBufferRHI = RHICmdList.CreateBuffer(CreateDesc); +#else FRHIResourceCreateInfo CreateInfo(L"FurMorphVertexBuffer"); EBufferUsageFlags Flags = BUF_Dynamic; @@ -20,6 +25,7 @@ void FFurMorphVertexBuffer::InitRHI(FRHICommandListBase& RHICmdList) Flags = (EBufferUsageFlags)(Flags | BUF_ShaderResource); VertexBufferRHI = RHICmdList.CreateVertexBuffer(Size, Flags, CreateInfo); +#endif // Lock the buffer. void* BufferData = RHICmdList.LockBuffer(VertexBufferRHI, 0, Size, RLM_WriteOnly); @@ -84,8 +90,14 @@ void FFurMorphObject::Update_RenderThread(FRHICommandListImmediate& RHICmdList, //checkSlow(MorphAbsWeight >= MinMorphTargetBlendWeight && MorphAbsWeight <= MaxMorphTargetBlendWeight); // Get deltas - int32 NumDeltas; - const FMorphTargetDelta* Deltas = ActiveMorphTarget->GetMorphTargetDelta(InMeshLod, NumDeltas); + const TArray& LODModels = ActiveMorphTarget->GetMorphLODModels(); + if (!LODModels.IsValidIndex(InMeshLod)) + { + continue; + } + const FMorphTargetLODModel& MorphModel = LODModels[InMeshLod]; + int32 NumDeltas = MorphModel.Vertices.Num(); + const FMorphTargetDelta* Deltas = MorphModel.Vertices.GetData(); // iterate over the vertices that this lod model has changed for (int32 MorphVertIdx = 0; MorphVertIdx < NumDeltas; MorphVertIdx++) diff --git a/Source/GFur/Private/FurSkinData.cpp b/Source/GFur/Private/FurSkinData.cpp index da4a415..80536f6 100644 --- a/Source/GFur/Private/FurSkinData.cpp +++ b/Source/GFur/Private/FurSkinData.cpp @@ -1,9 +1,9 @@ // Copyright 2023 GiM s.r.o. All Rights Reserved. #include "FurSkinData.h" -#include "Runtime/Engine/Public/Rendering/SkeletalMeshRenderData.h" -#include "Runtime/Engine/Private/SkeletalRenderGPUSkin.h" -#include "Runtime/Renderer/Public/MeshMaterialShader.h" +#include "Rendering/SkeletalMeshRenderData.h" +#include "SkeletalRenderGPUSkin.h" +#include "MeshMaterialShader.h" #include "RHICommandList.h" #include "MeshDrawShaderBindings.h" #include "ShaderParameterUtils.h" @@ -676,17 +676,33 @@ void FFurSkinVertexFactoryBase::FShaderD if (!IsValidRef(*CurrentBoneBuffer)) { FVertexBufferAndSRV Buffer; - FRHIResourceCreateInfo CreateInfo(L"FurVertexBuffer"); +#if (ENGINE_MAJOR_VERSION == 5 && ENGINE_MINOR_VERSION >= 6) + FRHIBufferCreateDesc CreateDesc = FRHIBufferCreateDesc::CreateVertex(TEXT("FurVertexBuffer"), VectorArraySize).AddUsage(BUF_Dynamic | BUF_ShaderResource).DetermineInitialState(); //Buffer.VertexBufferRHI = FRHICommandListBase::CreateVertexBuffer(VectorArraySize, (BUF_Dynamic | BUF_ShaderResource), CreateInfo); //Buffer.VertexBufferSRV = RHICreateShaderResourceView(Buffer.VertexBufferRHI, sizeof(FVector4f), PF_A32B32G32R32F); - Buffer.VertexBufferRHI = RHICmdList.CreateVertexBuffer(VectorArraySize, (BUF_Dynamic | BUF_ShaderResource), CreateInfo); + Buffer.VertexBufferRHI = RHICmdList.CreateBuffer(CreateDesc); + Buffer.VertexBufferSRV = RHICmdList.CreateShaderResourceView(Buffer.VertexBufferRHI, FRHIViewDesc::CreateBufferSRV() + .SetType(FRHIViewDesc::EBufferType::Typed) + .SetFormat(PF_A32B32G32R32F)); + + *CurrentBoneBuffer = MoveTemp(Buffer); +#else + FRHIResourceCreateInfo CreateInfo(L"FurVertexBuffer"); + + + + //Buffer.VertexBufferRHI = FRHICommandListBase::CreateVertexBuffer(VectorArraySize, (BUF_Dynamic | BUF_ShaderResource), CreateInfo); + //Buffer.VertexBufferSRV = RHICreateShaderResourceView(Buffer.VertexBufferRHI, sizeof(FVector4f), PF_A32B32G32R32F); + + Buffer.VertexBufferRHI = RHICmdList.CreateVertexBuffer(VectorArraySize, (BUF_Dynamic | BUF_ShaderResource), CreateInfo); Buffer.VertexBufferSRV = RHICmdList.CreateShaderResourceView(Buffer.VertexBufferRHI, sizeof(FVector4f), PF_A32B32G32R32F); *CurrentBoneBuffer = Buffer; +#endif check(IsValidRef(*CurrentBoneBuffer)); } @@ -694,6 +710,18 @@ void FFurSkinVertexFactoryBase::FShaderD if (!IsValidRef(*CurrentBoneFurOffsetsBuffer)) { FVertexBufferAndSRV Buffer; +#if (ENGINE_MAJOR_VERSION == 5 && ENGINE_MINOR_VERSION >= 6) + FRHIBufferCreateDesc CreateDesc = FRHIBufferCreateDesc::CreateVertex(TEXT("FurVertexBuffer"), OffsetArraySize).AddUsage(BUF_Dynamic | BUF_ShaderResource).DetermineInitialState(); + + //Buffer.VertexBufferRHI = RHICreateVertexBuffer(OffsetArraySize, (BUF_Dynamic | BUF_ShaderResource), CreateInfo); + //Buffer.VertexBufferSRV = RHICreateShaderResourceView(Buffer.VertexBufferRHI, sizeof(FVector4f), PF_A32B32G32R32F); + Buffer.VertexBufferRHI = RHICmdList.CreateBuffer(CreateDesc); + Buffer.VertexBufferSRV = RHICmdList.CreateShaderResourceView(Buffer.VertexBufferRHI, FRHIViewDesc::CreateBufferSRV() + .SetType(FRHIViewDesc::EBufferType::Typed) + .SetFormat(PF_A32B32G32R32F)); + + *CurrentBoneFurOffsetsBuffer = MoveTemp(Buffer); +#else FRHIResourceCreateInfo CreateInfo(L"FurVertexBuffer"); //Buffer.VertexBufferRHI = RHICreateVertexBuffer(OffsetArraySize, (BUF_Dynamic | BUF_ShaderResource), CreateInfo); @@ -702,6 +730,7 @@ void FFurSkinVertexFactoryBase::FShaderD Buffer.VertexBufferSRV = RHICmdList.CreateShaderResourceView(Buffer.VertexBufferRHI, sizeof(FVector4f), PF_A32B32G32R32F); *CurrentBoneFurOffsetsBuffer = Buffer; +#endif check(IsValidRef(*CurrentBoneFurOffsetsBuffer)); } @@ -803,15 +832,28 @@ void FFurSkinVertexFactoryBase::FShaderD if (!IsValidRef(*CurrentBoneBuffer)) { FVertexBufferAndSRV Buffer; - FRHIResourceCreateInfo CreateInfo(L"FurVertexBuffer"); +#if (ENGINE_MAJOR_VERSION == 5 && ENGINE_MINOR_VERSION >= 6) + FRHIBufferCreateDesc CreateDesc = FRHIBufferCreateDesc::CreateVertex(TEXT("FurVertexBuffer"), VectorArraySize).AddUsage(BUF_Dynamic | BUF_ShaderResource).DetermineInitialState(); //Buffer.VertexBufferRHI = RHICreateVertexBuffer(VectorArraySize, (BUF_Dynamic | BUF_ShaderResource), CreateInfo); //Buffer.VertexBufferSRV = RHICreateShaderResourceView(Buffer.VertexBufferRHI, sizeof(FVector4f), PF_A32B32G32R32F); + Buffer.VertexBufferRHI = RHICmdList.CreateBuffer(CreateDesc); + Buffer.VertexBufferSRV = RHICmdList.CreateShaderResourceView(Buffer.VertexBufferRHI, FRHIViewDesc::CreateBufferSRV() + .SetType(FRHIViewDesc::EBufferType::Typed) + .SetFormat(PF_A32B32G32R32F)); + + *CurrentBoneBuffer = MoveTemp(Buffer); +#else + FRHIResourceCreateInfo CreateInfo(L"FurVertexBuffer"); + + //Buffer.VertexBufferRHI = RHICreateVertexBuffer(VectorArraySize, (BUF_Dynamic | BUF_ShaderResource), CreateInfo); + //Buffer.VertexBufferSRV = RHICreateShaderResourceView(Buffer.VertexBufferRHI, sizeof(FVector4f), PF_A32B32G32R32F); Buffer.VertexBufferRHI = RHICmdList.CreateVertexBuffer(VectorArraySize, (BUF_Dynamic | BUF_ShaderResource), CreateInfo); Buffer.VertexBufferSRV = RHICmdList.CreateShaderResourceView(Buffer.VertexBufferRHI, sizeof(FVector4f), PF_A32B32G32R32F); *CurrentBoneBuffer = Buffer; +#endif check(IsValidRef(*CurrentBoneBuffer)); } @@ -819,6 +861,18 @@ void FFurSkinVertexFactoryBase::FShaderD if (!IsValidRef(*PreviousBoneBuffer)) { FVertexBufferAndSRV Buffer; +#if (ENGINE_MAJOR_VERSION == 5 && ENGINE_MINOR_VERSION >= 6) + FRHIBufferCreateDesc CreateDesc = FRHIBufferCreateDesc::CreateVertex(TEXT("FurVertexBuffer"), VectorArraySize).AddUsage(BUF_Dynamic | BUF_ShaderResource).DetermineInitialState(); + + //Buffer.VertexBufferRHI = RHICreateVertexBuffer(VectorArraySize, (BUF_Dynamic | BUF_ShaderResource), CreateInfo); + //Buffer.VertexBufferSRV = RHICreateShaderResourceView(Buffer.VertexBufferRHI, sizeof(FVector4f), PF_A32B32G32R32F); + Buffer.VertexBufferRHI = RHICmdList.CreateBuffer(CreateDesc); + Buffer.VertexBufferSRV = RHICmdList.CreateShaderResourceView(Buffer.VertexBufferRHI, FRHIViewDesc::CreateBufferSRV() + .SetType(FRHIViewDesc::EBufferType::Typed) + .SetFormat(PF_A32B32G32R32F)); + + *PreviousBoneBuffer = MoveTemp(Buffer); +#else FRHIResourceCreateInfo CreateInfo(L"FurVertexBuffer"); //Buffer.VertexBufferRHI = RHICreateVertexBuffer(VectorArraySize, (BUF_Dynamic | BUF_ShaderResource), CreateInfo); @@ -827,6 +881,7 @@ void FFurSkinVertexFactoryBase::FShaderD Buffer.VertexBufferSRV = RHICmdList.CreateShaderResourceView(Buffer.VertexBufferRHI, sizeof(FVector4f), PF_A32B32G32R32F); *PreviousBoneBuffer = Buffer; +#endif check(IsValidRef(*PreviousBoneBuffer)); } @@ -834,6 +889,18 @@ void FFurSkinVertexFactoryBase::FShaderD if (!IsValidRef(*CurrentBoneFurOffsetsBuffer)) { FVertexBufferAndSRV Buffer; +#if (ENGINE_MAJOR_VERSION == 5 && ENGINE_MINOR_VERSION >= 6) + FRHIBufferCreateDesc CreateDesc = FRHIBufferCreateDesc::CreateVertex(TEXT("FurVertexBuffer"), OffsetArraySize).AddUsage(BUF_Dynamic | BUF_ShaderResource).DetermineInitialState(); + + //Buffer.VertexBufferRHI = RHICreateVertexBuffer(OffsetArraySize, (BUF_Dynamic | BUF_ShaderResource), CreateInfo); + //Buffer.VertexBufferSRV = RHICreateShaderResourceView(Buffer.VertexBufferRHI, sizeof(FVector4f), PF_A32B32G32R32F); + Buffer.VertexBufferRHI = RHICmdList.CreateBuffer(CreateDesc); + Buffer.VertexBufferSRV = RHICmdList.CreateShaderResourceView(Buffer.VertexBufferRHI, FRHIViewDesc::CreateBufferSRV() + .SetType(FRHIViewDesc::EBufferType::Typed) + .SetFormat(PF_A32B32G32R32F)); + + *CurrentBoneFurOffsetsBuffer = MoveTemp(Buffer); +#else FRHIResourceCreateInfo CreateInfo(L"FurVertexBuffer"); //Buffer.VertexBufferRHI = RHICreateVertexBuffer(OffsetArraySize, (BUF_Dynamic | BUF_ShaderResource), CreateInfo); @@ -842,6 +909,7 @@ void FFurSkinVertexFactoryBase::FShaderD Buffer.VertexBufferSRV = RHICmdList.CreateShaderResourceView(Buffer.VertexBufferRHI, sizeof(FVector4f), PF_A32B32G32R32F); *CurrentBoneFurOffsetsBuffer = Buffer; +#endif check(IsValidRef(*CurrentBoneFurOffsetsBuffer)); } @@ -849,6 +917,18 @@ void FFurSkinVertexFactoryBase::FShaderD if (!IsValidRef(*PreviousBoneFurOffsetsBuffer)) { FVertexBufferAndSRV Buffer; +#if (ENGINE_MAJOR_VERSION == 5 && ENGINE_MINOR_VERSION >= 6) + FRHIBufferCreateDesc CreateDesc = FRHIBufferCreateDesc::CreateVertex(TEXT("FurVertexBuffer"), OffsetArraySize).AddUsage(BUF_Dynamic | BUF_ShaderResource).DetermineInitialState(); + + //Buffer.VertexBufferRHI = RHICreateVertexBuffer(OffsetArraySize, (BUF_Dynamic | BUF_ShaderResource), CreateInfo); + //Buffer.VertexBufferSRV = RHICreateShaderResourceView(Buffer.VertexBufferRHI, sizeof(FVector4f), PF_A32B32G32R32F); + Buffer.VertexBufferRHI = RHICmdList.CreateBuffer(CreateDesc); + Buffer.VertexBufferSRV = RHICmdList.CreateShaderResourceView(Buffer.VertexBufferRHI, FRHIViewDesc::CreateBufferSRV() + .SetType(FRHIViewDesc::EBufferType::Typed) + .SetFormat(PF_A32B32G32R32F)); + + *PreviousBoneFurOffsetsBuffer = MoveTemp(Buffer); +#else FRHIResourceCreateInfo CreateInfo(L"FurVertexBuffer"); //Buffer.VertexBufferRHI = RHICreateVertexBuffer(OffsetArraySize, (BUF_Dynamic | BUF_ShaderResource), CreateInfo); @@ -857,6 +937,7 @@ void FFurSkinVertexFactoryBase::FShaderD Buffer.VertexBufferSRV = RHICmdList.CreateShaderResourceView(Buffer.VertexBufferRHI, sizeof(FVector4f), PF_A32B32G32R32F); *PreviousBoneFurOffsetsBuffer = Buffer; +#endif check(IsValidRef(*PreviousBoneFurOffsetsBuffer)); } } diff --git a/Source/GFur/Private/FurStaticData.cpp b/Source/GFur/Private/FurStaticData.cpp index 5534ba8..ed5def1 100644 --- a/Source/GFur/Private/FurStaticData.cpp +++ b/Source/GFur/Private/FurStaticData.cpp @@ -4,14 +4,12 @@ #include "ShaderParameterUtils.h" #include "FurComponent.h" -#include "Runtime/Renderer/Public/MeshMaterialShader.h" -#include "Runtime\Renderer\Public\MeshDrawShaderBindings.h" +#include "MeshMaterialShader.h" +#include "MeshDrawShaderBindings.h" #include "Engine/SkeletalMesh.h" #include "StaticMeshResources.h" #include "RHICommandList.h" -#include "Runtime/RHI/Public/RHICommandList.h" - static TArray< FFurStaticData* > FurStaticData; static FCriticalSection FurStaticDataCS; diff --git a/Source/GFur/Public/FurComponent.h b/Source/GFur/Public/FurComponent.h index 899477d..3ca6f6a 100644 --- a/Source/GFur/Public/FurComponent.h +++ b/Source/GFur/Public/FurComponent.h @@ -245,6 +245,7 @@ class GFUR_API UGFurComponent : public UMeshComponent TArray AngularVelocities; TArray LinearOffsets; TArray AngularOffsets; + UPROPERTY(Transient) TArray< class UMaterialInstanceDynamic* > FurMaterials; TArray< class FFurData* > FurData; TArray< TArray< int32 > > MorphRemapTables; diff --git a/Source/GFurEditor/Private/FurComb.cpp b/Source/GFurEditor/Private/FurComb.cpp index 7db3148..7925720 100644 --- a/Source/GFurEditor/Private/FurComb.cpp +++ b/Source/GFurEditor/Private/FurComb.cpp @@ -142,6 +142,7 @@ bool FFurComb::Comb(FViewport* Viewport, const FVector& InCameraOrigin, const FV return CombInternal(InCameraOrigin, InRayOrigin, InRayDirection, CombAction, Strength * LastDeltaTime); } +#if 0 bool FFurComb::CombVR(FViewport* Viewport, const FVector& InCameraOrigin, const FVector& InRayOrigin, const FVector& InRayDirection, UVREditorInteractor* VRInteractor) { bool bCombApplied = false; @@ -166,6 +167,7 @@ bool FFurComb::CombVR(FViewport* Viewport, const FVector& InCameraOrigin, const return bCombApplied; } +#endif bool FFurComb::InputKey(FEditorViewportClient* InViewportClient, FViewport* InViewport, FKey InKey, EInputEvent InEvent) { @@ -487,6 +489,7 @@ void FFurComb::RenderInteractors(const FSceneView* View, FViewport* Viewport, FP TArray PaintRays; MeshPaintHelpers::RetrieveViewportPaintRays(View, Viewport, PDI, PaintRays); +#if 0 // Apply paint pressure and start painting (or if not currently painting, draw a preview of where paint will be applied) for (const MeshPaintHelpers::FPaintRay& PaintRay : PaintRays) { @@ -496,6 +499,7 @@ void FFurComb::RenderInteractors(const FSceneView* View, FViewport* Viewport, FP RenderInteractorWidget(PaintRay.RayStart, PaintRay.RayDirection, PDI, DepthGroup); } +#endif } void FFurComb::RenderInteractorWidget(const FVector& InRayOrigin, const FVector& InRayDirection, FPrimitiveDrawInterface* PDI, ESceneDepthPriorityGroup DepthGroup /*= SDPG_World*/) diff --git a/Source/GFurEditor/Private/FurComb.h b/Source/GFurEditor/Private/FurComb.h index e8013ab..8b72b9a 100644 --- a/Source/GFurEditor/Private/FurComb.h +++ b/Source/GFurEditor/Private/FurComb.h @@ -74,8 +74,10 @@ class GFUREDITOR_API FFurComb /** 'Normal' painting functionality, called when the user tries to paint on a mesh using the mouse */ bool Comb(FViewport* Viewport, const FVector& InCameraOrigin, const FVector& InRayOrigin, const FVector& InRayDirection); +#if 0 /** VR painting functionality, called when the user tries to paint on a mesh using a VR controller */ bool CombVR(FViewport* Viewport, const FVector& InCameraOrigin, const FVector& InRayOrigin, const FVector& InRayDirection, UVREditorInteractor* VRInteractor); +#endif /** Allows painter to act on specific key actions */ bool InputKey(FEditorViewportClient* InViewportClient, FViewport* InViewport, FKey InKey, EInputEvent InEvent); diff --git a/Source/GFurEditor/Private/FurCombEdMode.cpp b/Source/GFurEditor/Private/FurCombEdMode.cpp index dfab0cb..4b998f1 100644 --- a/Source/GFurEditor/Private/FurCombEdMode.cpp +++ b/Source/GFurEditor/Private/FurCombEdMode.cpp @@ -95,6 +95,7 @@ void FEdModeFurComb::Enter() // highlight effect distorting the appearance. GEngine->OverrideSelectedMaterialColor(FLinearColor::Black); +#if 0 UEditorWorldExtensionCollection* ExtensionCollection = GEditor->GetEditorWorldExtensionsManager()->GetEditorWorldExtensions(GetWorld()); if (ExtensionCollection != nullptr) { @@ -109,6 +110,7 @@ void FEdModeFurComb::Enter() ViewportWorldInteraction->SetTransformGizmoVisible(false); } } +#endif if (UsesToolkits()) { @@ -136,6 +138,7 @@ void FEdModeFurComb::Exit() FurComb->UnregisterCommands(Toolkit->GetToolkitCommands()); } +#if 0 UEditorWorldExtensionCollection* ExtensionCollection = GEditor->GetEditorWorldExtensionsManager()->GetEditorWorldExtensions(GetWorld()); if (ExtensionCollection != nullptr) { @@ -149,6 +152,7 @@ void FEdModeFurComb::Exit() ViewportWorldInteraction->OnViewportInteractionInputAction().RemoveAll(this); } } +#endif // The user can manipulate the editor selection lock flag in paint mode so we make sure to restore it here GEdSelectionLock = bWasSelectionLockedOnStart; @@ -365,6 +369,7 @@ void FEdModeFurComb::Render(const FSceneView* View, FViewport* Viewport, FPrimit // Flow painting if (FurComb->IsCombing()) { +#if 0 /** If we are currently painting with a VR interactor, apply paint for the current vr interactor state/position */ if (PaintingWithInteractorInVR != nullptr) { @@ -377,7 +382,9 @@ void FEdModeFurComb::Render(const FSceneView* View, FViewport* Viewport, FPrimit FurComb->CombVR(Viewport, VREditorMode->GetHeadTransform().GetLocation(), LaserPointerStart, LaserPointerDirection, VRInteractor); } } - else if (FurComb->GetCurrentFurCombSettings()->bEnableFlow) + else +#endif + if (FurComb->GetCurrentFurCombSettings()->bEnableFlow) { // Make sure the cursor is visible OR we're flood filling. No point drawing a paint cue when there's no cursor. if (Viewport->IsCursorVisible()) @@ -436,6 +443,7 @@ bool FEdModeFurComb::ProcessEditDelete() return false; } +#if 0 void FEdModeFurComb::OnVRAction(class FEditorViewportClient& ViewportClient, UViewportInteractor* Interactor, const FViewportActionKeyInput& Action, bool& bOutIsInputCaptured, bool& bWasHandled) { @@ -516,5 +524,6 @@ void FEdModeFurComb::OnVRAction(class FEditorViewportClient& ViewportClient, UVi } } } +#endif #undef LOCTEXT_NAMESPACE // "FurCombEdMode" diff --git a/Source/GFurEditor/Private/FurCombEdMode.h b/Source/GFurEditor/Private/FurCombEdMode.h index bd0d029..39e316a 100644 --- a/Source/GFurEditor/Private/FurCombEdMode.h +++ b/Source/GFurEditor/Private/FurCombEdMode.h @@ -73,9 +73,11 @@ class GFUREDITOR_API FEdModeFurComb : public FEdMode /** Called when an asset is deleted */ void OnAssetRemoved(const FAssetData& AssetData); +#if 0 /** Called when the user presses a button on their motion controller device */ void OnVRAction( FEditorViewportClient& ViewportClient, class UViewportInteractor* Interactor, const struct FViewportActionKeyInput& Action, bool& bOutIsInputCaptured, bool& bWasHandled ); +#endif /** Called when rerunning a construction script causes objects to be replaced */ void OnObjectsReplaced(const TMap& OldToNewInstanceMap); diff --git a/Source/GFurEditor/Private/FurComponentCustomization.cpp b/Source/GFurEditor/Private/FurComponentCustomization.cpp index 1ed9231..f6a77d3 100644 --- a/Source/GFurEditor/Private/FurComponentCustomization.cpp +++ b/Source/GFurEditor/Private/FurComponentCustomization.cpp @@ -327,7 +327,7 @@ void FFurComponentCustomization::GenerateNewFurSplines(IDetailLayoutBuilder* Det UPackage *Package = CreatePackage(*PackageName); - UFurSplines* FurSplines = FindObject(Package, *ObjectName, true); + UFurSplines* FurSplines = FindObject(Package, *ObjectName, EFindObjectFlags::ExactClass); bool IsNew; if (FurSplines == NULL) {