diff --git a/README.md b/README.md new file mode 100644 index 0000000..0f82b6d --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ + +校验补丁 +git apply --check ue_can_runtime_build_df_meshcard.patch + +打入补丁 + +git apply ue_can_runtime_build_df_meshcard.patch + +参考 diff --git a/ue_can_runtime_build_df_meshcard.patch b/ue_can_runtime_build_df_meshcard.patch new file mode 100644 index 0000000..10f0090 --- /dev/null +++ b/ue_can_runtime_build_df_meshcard.patch @@ -0,0 +1,605 @@ +From 86a2067b4936b1abfbf87ced4de8e83c4578900b Mon Sep 17 00:00:00 2001 +From: FishOrBear +Date: Thu, 1 Jul 2021 11:03:50 +0800 +Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BC=95=E6=93=8E=E4=BB=A5?= + =?UTF-8?q?=E4=BE=BF=E6=94=AF=E6=8C=81=E8=BF=90=E8=A1=8C=E6=97=B6=E6=9E=84?= + =?UTF-8?q?=E5=BB=BA=E8=B7=9D=E7=A6=BB=E5=9C=BA=E9=98=B4=E5=BD=B1=E5=92=8C?= + =?UTF-8?q?MeshCard?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +--- + .../Engine/Classes/Engine/StaticMesh.h | 4 +- + .../Runtime/Engine/Private/StaticMesh.cpp | 11 +- + .../Engine/Public/DerivedMeshDataTaskUtils.h | 4 +- + .../Engine/Public/MeshCardRepresentation.h | 18 ++-- + .../Engine/Public/ObjectCacheContext.h | 12 +-- + .../Engine/Public/StaticMeshResources.h | 100 +++++++++--------- + .../Private/DistanceFieldStreaming.cpp | 11 ++ + 7 files changed, 86 insertions(+), 74 deletions(-) + +diff --git a/Engine/Source/Runtime/Engine/Classes/Engine/StaticMesh.h b/Engine/Source/Runtime/Engine/Classes/Engine/StaticMesh.h +index 54259bf..769277b 100644 +--- a/Engine/Source/Runtime/Engine/Classes/Engine/StaticMesh.h ++++ b/Engine/Source/Runtime/Engine/Classes/Engine/StaticMesh.h +@@ -1377,7 +1377,7 @@ public: + /** + * Builds static mesh render buffers from a list of MeshDescriptions, one per LOD. + */ +- ENGINE_API bool BuildFromMeshDescriptions(const TArray& MeshDescriptions, const FBuildMeshDescriptionsParams& Params = FBuildMeshDescriptionsParams()); ++ ENGINE_API bool BuildFromMeshDescriptions(const TArray& MeshDescriptions, const FBuildMeshDescriptionsParams& Params = FBuildMeshDescriptionsParams(), bool InNeedsCPUAccess = false); + + /** Builds a LOD resource from a MeshDescription */ + ENGINE_API void BuildFromMeshDescription(const FMeshDescription& MeshDescription, FStaticMeshLODResources& LODResources); +@@ -1861,4 +1861,4 @@ class FStaticMeshBuildContext : public FStaticMeshCompilationContext + { + public: + bool bHasRenderDataChanged = false; +-}; +\ No newline at end of file ++}; +diff --git a/Engine/Source/Runtime/Engine/Private/StaticMesh.cpp b/Engine/Source/Runtime/Engine/Private/StaticMesh.cpp +index 8d00c60..330c7f5 100644 +--- a/Engine/Source/Runtime/Engine/Private/StaticMesh.cpp ++++ b/Engine/Source/Runtime/Engine/Private/StaticMesh.cpp +@@ -1154,7 +1154,7 @@ void FStaticMeshVertexBuffers::InitFromDynamicVertex(FLocalVertexFactory* Vertex + }); + }; + +-FStaticMeshLODResources::FStaticMeshLODResources(bool bAddRef) ++FStaticMeshLODResources::FStaticMeshLODResources(bool bAddRef, bool InNeedsCPUAccess) + : CardRepresentationData(nullptr) + , MaxDeviation(0.0f) + , bHasDepthOnlyIndices(false) +@@ -1170,6 +1170,7 @@ FStaticMeshLODResources::FStaticMeshLODResources(bool bAddRef) + #if STATS + , StaticMeshIndexMemory(0) + #endif ++ , IndexBuffer(InNeedsCPUAccess) + { + if (bAddRef) + { +@@ -1744,14 +1745,14 @@ void FStaticMeshRenderData::ReleaseResources() + NaniteResources.ReleaseResources(); + } + +-void FStaticMeshRenderData::AllocateLODResources(int32 NumLODs) ++void FStaticMeshRenderData::AllocateLODResources(int32 NumLODs, bool InNeedsCPUAccess) + { + check(LODResources.Num() == 0); + LODResources.Reserve(NumLODs); + LODVertexFactories.Reserve(NumLODs); + while (LODResources.Num() < NumLODs) + { +- LODResources.Add(new FStaticMeshLODResources); ++ LODResources.Add(new FStaticMeshLODResources(true, InNeedsCPUAccess)); + new (LODVertexFactories) FStaticMeshVertexFactories(GMaxRHIFeatureLevel); + } + } +@@ -5729,7 +5730,7 @@ void UStaticMesh::BuildFromStaticMeshDescriptions(const TArray& MeshDescriptions, const FBuildMeshDescriptionsParams& Params) ++bool UStaticMesh::BuildFromMeshDescriptions(const TArray& MeshDescriptions, const FBuildMeshDescriptionsParams& Params, bool InNeedsCPUAccess) + { + // Set up + NeverStream = true; +@@ -5775,7 +5776,7 @@ bool UStaticMesh::BuildFromMeshDescriptions(const TArray()); +- GetRenderData()->AllocateLODResources(MeshDescriptions.Num()); ++ GetRenderData()->AllocateLODResources(MeshDescriptions.Num(), InNeedsCPUAccess); + + // Build render data from each mesh description + +diff --git a/Engine/Source/Runtime/Engine/Public/DerivedMeshDataTaskUtils.h b/Engine/Source/Runtime/Engine/Public/DerivedMeshDataTaskUtils.h +index c10353b..1145a58 100644 +--- a/Engine/Source/Runtime/Engine/Public/DerivedMeshDataTaskUtils.h ++++ b/Engine/Source/Runtime/Engine/Public/DerivedMeshDataTaskUtils.h +@@ -10,7 +10,7 @@ + #include "StaticMeshResources.h" + + /** Source mesh data. Valid only in specific cases, when StaticMesh doesn't contain original data anymore (e.g. it's replaced by the Nanite coarse mesh representation) */ +-class FSourceMeshDataForDerivedDataTask ++class ENGINE_API FSourceMeshDataForDerivedDataTask + { + public: + TArray TriangleIndices; +@@ -30,4 +30,4 @@ public: + { + return TriangleIndices.Num() > 0; + } +-}; +\ No newline at end of file ++}; +diff --git a/Engine/Source/Runtime/Engine/Public/MeshCardRepresentation.h b/Engine/Source/Runtime/Engine/Public/MeshCardRepresentation.h +index 1e1ec80..074373e 100644 +--- a/Engine/Source/Runtime/Engine/Public/MeshCardRepresentation.h ++++ b/Engine/Source/Runtime/Engine/Public/MeshCardRepresentation.h +@@ -9,9 +9,9 @@ + #include "CoreMinimal.h" + #include "Containers/LockFreeList.h" + #include "ProfilingDebugging/ResourceSize.h" +-#include "Engine/EngineTypes.h" ++// #include "Engine/EngineTypes.h" + #include "UObject/GCObject.h" +-#include "RenderResource.h" ++// #include "RenderResource.h" + #include "RenderingThread.h" + #include "Templates/UniquePtr.h" + #include "DerivedMeshDataTaskUtils.h" +@@ -20,7 +20,7 @@ + template class TLockFreePointerListLIFO; + class FSignedDistanceFieldBuildMaterialData; + +-class FLumenCardBuildData ++class ENGINE_API FLumenCardBuildData + { + public: + FVector Center; +@@ -57,7 +57,7 @@ public: + } + }; + +-class FLumenCardBuildDebugPoint ++class ENGINE_API FLumenCardBuildDebugPoint + { + public: + FVector Origin; +@@ -65,7 +65,7 @@ public: + bool bValid; + }; + +-class FLumenCardBuildDebugLine ++class ENGINE_API FLumenCardBuildDebugLine + { + public: + FVector Origin; +@@ -73,7 +73,7 @@ public: + int32 Orientation; + }; + +-class FMeshCardsBuildData ++class ENGINE_API FMeshCardsBuildData + { + public: + FBox Bounds; +@@ -95,7 +95,7 @@ public: + }; + + // Unique id per card representation data instance. +-class FCardRepresentationDataId ++class ENGINE_API FCardRepresentationDataId + { + public: + uint32 Value = 0; +@@ -117,7 +117,7 @@ public: + }; + + /** Card representation payload and output of the mesh build process. */ +-class FCardRepresentationData : public FDeferredCleanupInterface ++class ENGINE_API FCardRepresentationData : public FDeferredCleanupInterface + { + public: + +@@ -276,4 +276,4 @@ extern ENGINE_API FCardRepresentationAsyncQueue* GCardRepresentationAsyncQueue; + + extern ENGINE_API FString BuildCardRepresentationDerivedDataKey(const FString& InMeshKey); + +-extern ENGINE_API void BeginCacheMeshCardRepresentation(const ITargetPlatform* TargetPlatform, UStaticMesh* StaticMeshAsset, class FStaticMeshRenderData& RenderData, const FString& DistanceFieldKey, FSourceMeshDataForDerivedDataTask* OptionalSourceMeshData); +\ No newline at end of file ++extern ENGINE_API void BeginCacheMeshCardRepresentation(const ITargetPlatform* TargetPlatform, UStaticMesh* StaticMeshAsset, class FStaticMeshRenderData& RenderData, const FString& DistanceFieldKey, FSourceMeshDataForDerivedDataTask* OptionalSourceMeshData); +diff --git a/Engine/Source/Runtime/Engine/Public/ObjectCacheContext.h b/Engine/Source/Runtime/Engine/Public/ObjectCacheContext.h +index 16e2ef1..0963fb9 100644 +--- a/Engine/Source/Runtime/Engine/Public/ObjectCacheContext.h ++++ b/Engine/Source/Runtime/Engine/Public/ObjectCacheContext.h +@@ -21,7 +21,7 @@ class USkeletalMesh; + * Class to abstract implementation details of the containers used inside the + * object cache so they can be changed later if needed without API changes. + */ +-template< class T > class TObjectCacheIterator ++template< class T > class ENGINE_API TObjectCacheIterator + { + public: + /** +@@ -62,7 +62,7 @@ protected: + * reverse lookup tables that can be used during heavy scene updates + * of async asset compilation. + */ +-class FObjectCacheContext ++class ENGINE_API FObjectCacheContext + { + public: + TObjectCacheIterator GetPrimitiveComponents(); +@@ -95,12 +95,12 @@ private: + * is destroyed. Should only be used during short periods when there is no new + * objects created and no object dependency changes. (i.e. Scene update after asset compilation). + */ +-class FObjectCacheContextScope ++class ENGINE_API FObjectCacheContextScope + { + public: +- ENGINE_API FObjectCacheContextScope(); +- ENGINE_API ~FObjectCacheContextScope(); +- ENGINE_API FObjectCacheContext& GetContext(); ++ FObjectCacheContextScope(); ++ ~FObjectCacheContextScope(); ++ FObjectCacheContext& GetContext(); + private: + // Scopes can be stacked over one another, but only the outermost will + // own the actual context and destroy it at the end, all inner scopes +diff --git a/Engine/Source/Runtime/Engine/Public/StaticMeshResources.h b/Engine/Source/Runtime/Engine/Public/StaticMeshResources.h +index 29c41f6..040e72d 100644 +--- a/Engine/Source/Runtime/Engine/Public/StaticMeshResources.h ++++ b/Engine/Source/Runtime/Engine/Public/StaticMeshResources.h +@@ -349,12 +349,12 @@ struct TIsContiguousContainer : TIsContiguousContainer< + }; + //using FStaticMeshSectionArray = TArray>; + +-/** ++/** + * Rendering resources needed to render an individual static mesh LOD. + * This structure is ref counted to allow the LOD streamer to evaluate the number of readers to it (readers that could access the CPU data). + * Because the stream out clears the CPU readable data, CPU code that samples it must ensure to only reference LODs above CurrentFirstLODIdx. + */ +-struct FStaticMeshLODResources : public FRefCountBase ++struct ENGINE_API FStaticMeshLODResources : public FRefCountBase + { + public: + +@@ -362,7 +362,7 @@ public: + FStaticMeshSectionArray Sections; + + /** Distance field data associated with this mesh, null if not present. */ +- class FDistanceFieldVolumeData* DistanceFieldData = nullptr; ++ class FDistanceFieldVolumeData* DistanceFieldData = nullptr; + + /** Card Representation data associated with this mesh, null if not present. */ + class FCardRepresentationData* CardRepresentationData; +@@ -431,11 +431,11 @@ public: + FStaticMeshSectionAreaWeightedTriangleSamplerArray AreaWeightedSectionSamplers; + /** Allows uniform random selection of triangles on GPU. It is not cooked and serialised but created at runtime from AreaWeightedSectionSamplers when it is available and static mesh bSupportGpuUniformlyDistributedSampling=true*/ + FStaticMeshSectionAreaWeightedTriangleSamplerBuffer AreaWeightedSectionSamplersBuffer; +- ++ + /** Default constructor. Add a reference if not stored with a TRefCountPtr */ +- ENGINE_API FStaticMeshLODResources(bool bAddRef = true); ++ FStaticMeshLODResources(bool bAddRef = true, bool InNeedsCPUAccess = false); + +- ENGINE_API ~FStaticMeshLODResources(); ++ ~FStaticMeshLODResources(); + + template + void ReleaseRHIForStreaming(TBatcher& Batcher) +@@ -467,12 +467,12 @@ public: + void GetResourceSizeEx(FResourceSizeEx& CumulativeResourceSize) const; + + /** Return the triangle count of this LOD. */ +- ENGINE_API int32 GetNumTriangles() const; ++ int32 GetNumTriangles() const; + + /** Return the number of vertices in this LOD. */ +- ENGINE_API int32 GetNumVertices() const; ++ int32 GetNumVertices() const; + +- ENGINE_API int32 GetNumTexCoords() const; ++ int32 GetNumTexCoords() const; + + private: + enum EClassDataStripFlag : uint8 +@@ -610,13 +610,13 @@ using FStaticMeshVertexFactoriesArray = TArray; + /** + * FStaticMeshRenderData - All data needed to render a static mesh. + */ +-class FStaticMeshRenderData ++class ENGINE_API FStaticMeshRenderData + { + public: + + /** Default constructor. */ +- ENGINE_API FStaticMeshRenderData(); +- ENGINE_API ~FStaticMeshRenderData(); ++ FStaticMeshRenderData(); ++ ~FStaticMeshRenderData(); + + /** + * Per-LOD resources. For compatibility reasons, the FStaticMeshLODResources array are not referenced through TRefCountPtr. +@@ -672,7 +672,7 @@ public: + * Cache derived renderable data for the static mesh with the provided + * level of detail settings. + */ +- ENGINE_API void Cache(const ITargetPlatform* TargetPlatform, UStaticMesh* Owner, const FStaticMeshLODSettings& LODSettings); ++ void Cache(const ITargetPlatform* TargetPlatform, UStaticMesh* Owner, const FStaticMeshLODSettings& LODSettings); + #endif // #if WITH_EDITORONLY_DATA + + /** Count the number of LODs that are inlined and not streamable. Starting from the last LOD and stopping at the first non inlined LOD. */ +@@ -690,13 +690,13 @@ public: + void InitResources(ERHIFeatureLevel::Type InFeatureLevel, UStaticMesh* Owner); + + /** Releases the render resources. */ +- ENGINE_API void ReleaseResources(); ++ void ReleaseResources(); + + /** Compute the size of this resource. */ + void GetResourceSizeEx(FResourceSizeEx& CumulativeResourceSize) const; + + /** Allocate LOD resources. */ +- ENGINE_API void AllocateLODResources(int32 NumLODs); ++ void AllocateLODResources(int32 NumLODs, bool InNeedsCPUAccess = false); + + /** Update LOD-SECTION uv densities. */ + void ComputeUVDensities(); +@@ -705,11 +705,11 @@ public: + + #if WITH_EDITOR + /** Resolve all per-section settings. */ +- ENGINE_API void ResolveSectionInfo(UStaticMesh* Owner); ++ void ResolveSectionInfo(UStaticMesh* Owner); + #endif // #if WITH_EDITORONLY_DATA + + /** Return first valid LOD index starting at MinLODIdx. */ +- ENGINE_API int32 GetFirstValidLODIdx(int32 MinLODIdx) const; ++ int32 GetFirstValidLODIdx(int32 MinLODIdx) const; + + /** Return the current first LODIdx that can be used. */ + FORCEINLINE int32 GetCurrentFirstLODIdx(int32 MinLODIdx) const +@@ -717,9 +717,9 @@ public: + return GetFirstValidLODIdx(FMath::Max(CurrentFirstLODIdx, MinLODIdx)); + } + +- /** ++ /** + * Return the current first LOD that can be used for rendering starting at MinLODIdx. +- * This takes into account the streaming status from CurrentFirstLODIdx, ++ * This takes into account the streaming status from CurrentFirstLODIdx, + * and MinLODIdx is expected to be UStaticMesh::MinLOD, which is platform specific. + */ + FORCEINLINE const FStaticMeshLODResources* GetCurrentFirstLOD(int32 MinLODIdx) const +@@ -755,7 +755,7 @@ public: + }; + + /** +- * FStaticMeshComponentRecreateRenderStateContext - Destroys render state for all StaticMeshComponents using a given StaticMesh and ++ * FStaticMeshComponentRecreateRenderStateContext - Destroys render state for all StaticMeshComponents using a given StaticMesh and + * recreates them when it goes out of scope. Used to ensure stale rendering data isn't kept around in the components when importing + * over or rebuilding an existing static mesh. + */ +@@ -895,10 +895,10 @@ public: + + /** Sets up a FMeshBatch for a specific LOD and element. */ + virtual bool GetMeshElement( +- int32 LODIndex, +- int32 BatchIndex, +- int32 ElementIndex, +- uint8 InDepthPriorityGroup, ++ int32 LODIndex, ++ int32 BatchIndex, ++ int32 ElementIndex, ++ uint8 InDepthPriorityGroup, + bool bUseSelectionOutline, + bool bAllowPreCulledIndices, + FMeshBatch& OutMeshBatch) const; +@@ -982,8 +982,8 @@ public: + #if RHI_RAYTRACING + virtual void GetDynamicRayTracingInstances(FRayTracingMaterialGatheringContext& Context, TArray& OutRayTracingInstances) override; + virtual bool IsRayTracingRelevant() const override { return true; } +- virtual bool IsRayTracingStaticRelevant() const override +- { ++ virtual bool IsRayTracingStaticRelevant() const override ++ { + const bool bAllowStaticLighting = FReadOnlyCVARCache::Get().bAllowStaticLighting; + const bool bIsStaticInstance = !bDynamicRayTracingGeometry; + return bIsStaticInstance && !HasViewDependentDPG() && !(bAllowStaticLighting && HasStaticLighting() && !HasValidSettingsForStaticLighting()); +@@ -1073,8 +1073,8 @@ protected: + + TArray LODs; + +- const FDistanceFieldVolumeData* DistanceFieldData; +- const FCardRepresentationData* CardRepresentationData; ++ const FDistanceFieldVolumeData* DistanceFieldData; ++ const FCardRepresentationData* CardRepresentationData; + + #if RHI_RAYTRACING + bool bSupportRayTracing; +@@ -1233,7 +1233,7 @@ public: + } + + void Serialize(FArchive& Ar); +- ++ + void AllocateInstances(int32 InNumInstances, int32 InNumCustomDataFloats, EResizeBufferFlags BufferFlags, bool DestroyExistingInstances) + { + NumInstances = InNumInstances; +@@ -1300,7 +1300,7 @@ public: + Transform.M[3][0] = Origin.X; + Transform.M[3][1] = Origin.Y; + Transform.M[3][2] = Origin.Z; +-#if 1 ++#if 1 + // GPUCULL_TODO: This causes problems when using this as a normal real proper matrix and concatenating! + Transform.M[3][3] = 0.f; + #else +@@ -1354,7 +1354,7 @@ public: + SetInstanceCustomDataInternal(InstanceIndex, i, 0); + } + } +- ++ + FORCEINLINE_DEBUGGABLE void SetInstance(int32 InstanceIndex, const FMatrix& Transform, float RandomInstanceID, const FVector2D& LightmapUVBias, const FVector2D& ShadowmapUVBias) + { + FVector4 Origin(Transform.M[3][0], Transform.M[3][1], Transform.M[3][2], RandomInstanceID); +@@ -1416,12 +1416,12 @@ public: + { + SetInstanceLightMapDataInternal(InstanceIndex, FVector4(LightmapUVBias.X, LightmapUVBias.Y, ShadowmapUVBias.X, ShadowmapUVBias.Y)); + } +- ++ + FORCEINLINE void SetInstanceCustomData(int32 InstanceIndex, int32 Index, float CustomData) + { + SetInstanceCustomDataInternal(InstanceIndex, Index, CustomData); + } +- ++ + FORCEINLINE_DEBUGGABLE void NullifyInstance(int32 InstanceIndex) + { + SetInstanceOriginInternal(InstanceIndex, FVector4(0, 0, 0, 0)); +@@ -1513,7 +1513,7 @@ public: + check((void*)((&ElementData[Index1]) + 0) >= (void*)(InstanceTransformDataPtr)); + check((void*)((&ElementData[Index2]) + 1) <= (void*)(InstanceTransformDataPtr + CurrentSize)); + check((void*)((&ElementData[Index2]) + 0) >= (void*)(InstanceTransformDataPtr)); +- ++ + FInstanceTransformMatrix TempStore = ElementData[Index1]; + ElementData[Index1] = ElementData[Index2]; + ElementData[Index2] = TempStore; +@@ -1538,7 +1538,7 @@ public: + check((void*)((&ElementData[Index1]) + 0) >= (void*)(InstanceLightmapDataPtr)); + check((void*)((&ElementData[Index2]) + 1) <= (void*)(InstanceLightmapDataPtr + CurrentSize)); + check((void*)((&ElementData[Index2]) + 0) >= (void*)(InstanceLightmapDataPtr)); +- ++ + FInstanceLightMapVector TempStore = ElementData[Index1]; + ElementData[Index1] = ElementData[Index2]; + ElementData[Index2] = TempStore; +@@ -1641,8 +1641,8 @@ public: + + FORCEINLINE_DEBUGGABLE SIZE_T GetResourceSize() const + { +- return InstanceOriginData->GetResourceSize() + +- InstanceTransformData->GetResourceSize() + ++ return InstanceOriginData->GetResourceSize() + ++ InstanceTransformData->GetResourceSize() + + InstanceLightmapData->GetResourceSize() + + InstanceCustomData->GetResourceSize(); + } +@@ -1655,17 +1655,17 @@ private: + uint32 CurrentSize = InstanceTransformData->Num() * InstanceTransformData->GetStride(); + check((void*)((&ElementData[InstanceIndex]) + 1) <= (void*)(InstanceTransformDataPtr + CurrentSize)); + check((void*)((&ElementData[InstanceIndex]) + 0) >= (void*)(InstanceTransformDataPtr)); +- ++ + Transform[0][0] = ElementData[InstanceIndex].InstanceTransform1[0]; + Transform[0][1] = ElementData[InstanceIndex].InstanceTransform1[1]; + Transform[0][2] = ElementData[InstanceIndex].InstanceTransform1[2]; + Transform[0][3] = ElementData[InstanceIndex].InstanceTransform1[3]; +- ++ + Transform[1][0] = ElementData[InstanceIndex].InstanceTransform2[0]; + Transform[1][1] = ElementData[InstanceIndex].InstanceTransform2[1]; + Transform[1][2] = ElementData[InstanceIndex].InstanceTransform2[2]; + Transform[1][3] = ElementData[InstanceIndex].InstanceTransform2[3]; +- ++ + Transform[2][0] = ElementData[InstanceIndex].InstanceTransform3[0]; + Transform[2][1] = ElementData[InstanceIndex].InstanceTransform3[1]; + Transform[2][2] = ElementData[InstanceIndex].InstanceTransform3[2]; +@@ -1691,7 +1691,7 @@ private: + + LightmapData = FVector4 + ( +- float(ElementData[InstanceIndex].InstanceLightmapAndShadowMapUVBias[0]) / 32767.0f, ++ float(ElementData[InstanceIndex].InstanceLightmapAndShadowMapUVBias[0]) / 32767.0f, + float(ElementData[InstanceIndex].InstanceLightmapAndShadowMapUVBias[1]) / 32767.0f, + float(ElementData[InstanceIndex].InstanceLightmapAndShadowMapUVBias[2]) / 32767.0f, + float(ElementData[InstanceIndex].InstanceLightmapAndShadowMapUVBias[3]) / 32767.0f +@@ -1708,7 +1708,7 @@ private: + for (int32 i = 0; i < NumCustomDataFloats; ++i) + { + int32 CustomDataIndex = NumCustomDataFloats * InstanceIndex + i; +- ++ + check((void*)((&ElementData[CustomDataIndex]) + 1) <= (void*)(InstanceCustomDataPtr + CurrentSize)); + check((void*)((&ElementData[CustomDataIndex]) + 0) >= (void*)(InstanceCustomDataPtr)); + +@@ -1785,16 +1785,16 @@ private: + { + delete InstanceOriginData; + InstanceOriginDataPtr = nullptr; +- ++ + delete InstanceTransformData; + InstanceTransformDataPtr = nullptr; +- ++ + delete InstanceLightmapData; + InstanceLightmapDataPtr = nullptr; +- ++ + delete InstanceCustomData; + InstanceCustomData = nullptr; +- ++ + InstanceOriginData = new TStaticMeshVertexData(); + InstanceOriginData->ResizeBuffer(InNumInstances, BufferFlags); + InstanceLightmapData = new TStaticMeshVertexData(); +@@ -1808,7 +1808,7 @@ private: + InstanceTransformData = new TStaticMeshVertexData>(); + } + InstanceTransformData->ResizeBuffer(InNumInstances, BufferFlags); +- ++ + InstanceCustomData = new TStaticMeshVertexData(); + InstanceCustomData->ResizeBuffer(NumCustomDataFloats * InNumInstances, BufferFlags); + } +@@ -1820,7 +1820,7 @@ private: + uint8* InstanceTransformDataPtr = nullptr; + + FStaticMeshVertexDataInterface* InstanceLightmapData = nullptr; +- uint8* InstanceLightmapDataPtr = nullptr; ++ uint8* InstanceLightmapDataPtr = nullptr; + + FStaticMeshVertexDataInterface* InstanceCustomData = nullptr; + uint8* InstanceCustomDataPtr = nullptr; +@@ -1829,7 +1829,7 @@ private: + int32 NumCustomDataFloats = 0; + bool bUseHalfFloat = false; + }; +- ++ + #if WITH_EDITOR + /** + * Remaps painted vertex colors when the renderable mesh has changed. +@@ -1844,7 +1844,7 @@ ENGINE_API void RemapPaintedVertexColors( + const FColorVertexBuffer* InOverrideColors, + const FPositionVertexBuffer& OldPositions, + const FStaticMeshVertexBuffer& OldVertexBuffer, +- const FPositionVertexBuffer& NewPositions, ++ const FPositionVertexBuffer& NewPositions, + const FStaticMeshVertexBuffer* OptionalVertexBuffer, + TArray& OutOverrideColors + ); +diff --git a/Engine/Source/Runtime/Renderer/Private/DistanceFieldStreaming.cpp b/Engine/Source/Runtime/Renderer/Private/DistanceFieldStreaming.cpp +index 384e77c..2b92ff9 100644 +--- a/Engine/Source/Runtime/Renderer/Private/DistanceFieldStreaming.cpp ++++ b/Engine/Source/Runtime/Renderer/Private/DistanceFieldStreaming.cpp +@@ -334,6 +334,12 @@ void FDistanceFieldSceneData::AsyncUpdate(FDistanceFieldAsyncUpdateParameters Up + check(ReadRequest.BulkData->IsBulkDataLoaded() && ReadRequest.BulkData->GetBulkDataSize() > 0); + BulkDataReadPtr = (const uint8*)ReadRequest.BulkData->LockReadOnly() + ReadRequest.BulkOffset; + } ++#else ++ if (ReadRequest.BulkData && ReadRequest.BulkData->GetBulkDataFlags() == 1024) ++ { ++ check(ReadRequest.BulkData->IsBulkDataLoaded() && ReadRequest.BulkData->GetBulkDataSize() > 0); ++ BulkDataReadPtr = (const uint8*)ReadRequest.BulkData->LockReadOnly() + ReadRequest.BulkOffset; ++ } + #endif + const int32 NumIndirectionEntries = MipBuiltData.IndirectionDimensions.X * MipBuiltData.IndirectionDimensions.Y * MipBuiltData.IndirectionDimensions.Z; + const uint32 ExpectedBulkSize = NumIndirectionEntries * sizeof(uint32) + ReadRequest.NumDistanceFieldBricks * BrickSizeBytes; +@@ -386,6 +392,11 @@ void FDistanceFieldSceneData::AsyncUpdate(FDistanceFieldAsyncUpdateParameters Up + { + ReadRequest.BulkData->Unlock(); + } ++#else ++ if (ReadRequest.BulkData && ReadRequest.BulkData->GetBulkDataFlags() == 1024) ++ { ++ ReadRequest.BulkData->Unlock(); ++ } + #endif + + BrickUploadIndex += MipState.NumBricks; +-- +2.32.0.windows.1 + diff --git a/修改引擎.md b/修改引擎.md deleted file mode 100644 index 92b6755..0000000 --- a/修改引擎.md +++ /dev/null @@ -1,12 +0,0 @@ -class ENGINE_API FStaticMeshRenderData -struct ENGINE_API FStaticMeshLODResources : public FRefCountBase - FStaticMeshLODResources(bool bAddRef = true); - ~FStaticMeshLODResources(); - -class ENGINE_API FObjectCacheContext - - -暴露这两个类后,对他们的方法都要取消暴露 - - -索引类改成cpu可访问