What happened to USkeletalMesh in UE 4.19?

@MaxPower42 @anonymous_user_80eda73a Have an idea why the crash at runtime?

1)Build succeed;
2)Works at runtime (packaged build);
3)In editor, crash as usual:
Fatal error: [File:D:\Build++UE4+Release-4.19+Compile\Sync\Engine\Source\Runtime\RenderCore\Private\RenderingThread.cpp] [Line: 819]
Rendering thread exception:
Assertion failed: (Index >= 0) & (Index < ArrayNum) [File:D:\Build++UE4+Release 4.19+Compile\Sync\Engine\Source\Runtime\Core\Public\Containers/Array.h] [Line: 610]
Error: Array index out of bounds: 1 from an array of size 1

header file #include:
#include “GameFramework/Pawn.h”
#include “OVR_Avatar.h”
#include “Set.h”
#include “OVR_Plugin.h”
#include “OVR_Microphone.h”
#include “Engine/SkeletalMesh.h”
#include “Components/MeshComponent.h”
#include “Components/ActorComponent.h”
#include “OvrAvatar.generated.h”

.cpp file #include:
#include “OvrAvatar.h”
#include “OvrAvatarPCH.h”
#include “OvrAvatarManager.h”
#include “Private/OvrAvatarHelpers.h”
#include “Components/PoseableMeshComponent.h”
#include “IOculusHMDModule.h”
#include “IOculusInputModule.h”
#include “OVR_Voip_LowLevel.h”
#include “Rendering/SkeletalMeshLODModel.h”
#include “Engine/SkeletalMesh.h”
#include “SkeletalMeshModel.h”
#include “SkeletalMeshRenderData.h”
#include “SkeletalMeshLODRenderData.h”

The function of interest:

void UOvrAvatar::LoadMesh(USkeletalMesh* SkeletalMesh, const ovrAvatarMeshAssetData* data)
{
UE_LOG(LogAvatars, Warning, TEXT("[Avatars] Loaded Mesh."));

#if WITH_EDITOR
FSkeletalMeshLODModel* LodModel = new FSkeletalMeshLODModel();
SkeletalMesh->GetImportedModel()->LODModels.Add(LodModel);
#else
FSkeletalMeshLODRenderData* LodRenderData = new FSkeletalMeshLODRenderData();
SkeletalMesh->AllocateResourceForRendering();
SkeletalMesh->GetResourceForRendering()->LODRenderData.Add(LodRenderData);
#endif

#if WITH_EDITOR
new(LodModel->Sections) FSkelMeshSection();
LodModel->Sections[0].MaterialIndex = 0;
LodModel->Sections[0].BaseIndex = 0;
LodModel->Sections[0].NumTriangles = 0;
#else
new(LodRenderData->RenderSections) FSkelMeshRenderSection();
LodRenderData->RenderSections[0].MaterialIndex = 0;
LodRenderData->RenderSections[0].BaseIndex = 0;
LodRenderData->RenderSections[0].NumTriangles = 0;
#endif

SkeletalMesh-&gt;LODInfo.Add(FSkeletalMeshLODInfo());
FSkeletalMeshLODInfo& LodInfo = SkeletalMesh-&gt;LODInfo[0];

LodInfo.ScreenSize = 0.3f;
LodInfo.LODHysteresis = 0.2f;

//LodInfo.TriangleSortSettings.Add(FTriangleSortSettings());
LodInfo.LODMaterialMap.Add(0);

SkeletalMesh-&gt;Materials.Add(UMaterial::GetDefaultMaterial(MD_Surface));
//SkeletalMesh-&gt;RefSkeleton.Allocate(data-&gt;skinnedBindPose.jointCount);

SkeletalMesh-&gt;bUseFullPrecisionUVs = true;
SkeletalMesh-&gt;bHasBeenSimplified = false;
SkeletalMesh-&gt;bHasVertexColors = false;
SkeletalMesh-&gt;Materials[0].UVChannelData.bInitialized = true;

for (int BoneIndex = 0; BoneIndex &lt; (int)data-&gt;skinnedBindPose.jointCount; BoneIndex++)
{

#if WITH_EDITOR
LodModel->RequiredBones.Add(BoneIndex);
LodModel->ActiveBoneIndices.Add(BoneIndex);
LodModel->Sections[0].BoneMap.Add(BoneIndex);
#else
LodRenderData->RequiredBones.Add(BoneIndex);
LodRenderData->ActiveBoneIndices.Add(BoneIndex);
LodRenderData->RenderSections[0].BoneMap.Add(BoneIndex);
#endif

    FString BoneString = data-&gt;skinnedBindPose.jointNames[BoneIndex];
    FName BoneName = FName(*BoneString);

    FTransform Transform = FTransform::Identity;
    OvrAvatarHelpers::ConvertTransform(data-&gt;skinnedBindPose.jointTransform[BoneIndex], Transform);

    FReferenceSkeletonModifier Modifier = FReferenceSkeletonModifier(SkeletalMesh-&gt;RefSkeleton, nullptr);
    Modifier.Add(FMeshBoneInfo(BoneName, BoneString, data-&gt;skinnedBindPose.jointParents[BoneIndex]), Transform);
}

check(data-&gt;indexCount % 3 == 0);
check(data-&gt;vertexCount &gt; 0);

#if WITH_EDITOR
auto& MeshSection = LodModel->Sections[0];
MeshSection.BaseIndex = 0;
MeshSection.NumTriangles = data->indexCount / 3;
MeshSection.BaseVertexIndex = 0;
MeshSection.NumVertices = data->vertexCount;
MeshSection.MaxBoneInfluences = 4;
#else
auto& RenderMeshSection = LodRenderData->RenderSections[0];
RenderMeshSection.BaseIndex = 0;
RenderMeshSection.NumTriangles = data->indexCount / 3;
RenderMeshSection.BaseVertexIndex = 0;
RenderMeshSection.NumVertices = data->vertexCount;
RenderMeshSection.MaxBoneInfluences = 4;
#endif

const ovrAvatarMeshVertex* SourceVertex = data-&gt;vertexBuffer;
const uint32_t NumBlendWeights = 4;

FBox BoundBox = FBox();
BoundBox.Init();

#if WITH_EDITOR
MeshSection.SoftVertices.SetNumUninitialized(data->vertexCount);
FSoftSkinVertex* DestVertex = MeshSection.SoftVertices.GetData();

for (uint32_t VertIndex = 0; VertIndex &lt; data-&gt;vertexCount; VertIndex++, SourceVertex++, DestVertex++)
{
    DestVertex-&gt;Position = 100.0f * FVector(-SourceVertex-&gt;z, SourceVertex-&gt;x, SourceVertex-&gt;y);

    BoundBox += DestVertex-&gt;Position;

    FVector n = FVector(-SourceVertex-&gt;nz, SourceVertex-&gt;nx, SourceVertex-&gt;ny);
    FVector t = FVector(-SourceVertex-&gt;tz, SourceVertex-&gt;tx, SourceVertex-&gt;ty);
    FVector bt = FVector::CrossProduct(t, n) * FMath::Sign(SourceVertex-&gt;tw);
    DestVertex-&gt;TangentX = FPackedNormal(t);
    DestVertex-&gt;TangentY = FPackedNormal(bt);
    DestVertex-&gt;TangentZ = FPackedNormal(n);
    DestVertex-&gt;UVs[0] = FVector2D(SourceVertex-&gt;u, SourceVertex-&gt;v);

    for (uint32_t BlendIndex = 0; BlendIndex &lt; MAX_TOTAL_INFLUENCES; BlendIndex++)
    {
        DestVertex-&gt;InfluenceWeights[BlendIndex] = BlendIndex &lt; NumBlendWeights ? (uint8_t)(255.0f*SourceVertex-&gt;blendWeights[BlendIndex]) : 0;
        DestVertex-&gt;InfluenceBones[BlendIndex] = BlendIndex &lt; NumBlendWeights ? SourceVertex-&gt;blendIndices[BlendIndex] : 0;
    }
}

#else
LodRenderData->StaticVertexBuffers.PositionVertexBuffer.Init(data->vertexCount);
LodRenderData->StaticVertexBuffers.ColorVertexBuffer.Init(data->vertexCount);
LodRenderData->StaticVertexBuffers.StaticMeshVertexBuffer.Init(data->vertexCount, 1);

TArray&lt;TSkinWeightInfo&lt;true&gt;&gt; InWeights;
InWeights.AddUninitialized(data-&gt;vertexCount);
TMap&lt;int32, TArray&lt;int32&gt;&gt; OverlappingVertices;

for (uint32_t VertIndex = 0; VertIndex &lt; data-&gt;vertexCount; VertIndex++, SourceVertex++)
{
    FModelVertex ModelVertex;
    ModelVertex.Position = 100.0f * FVector(-SourceVertex-&gt;z, SourceVertex-&gt;x, SourceVertex-&gt;y);
    BoundBox += ModelVertex.Position;

    FVector n = FVector(-SourceVertex-&gt;nz, SourceVertex-&gt;nx, SourceVertex-&gt;ny);
    FVector t = FVector(-SourceVertex-&gt;tz, SourceVertex-&gt;tx, SourceVertex-&gt;ty);
    FVector bt = FVector::CrossProduct(t, n) * FMath::Sign(SourceVertex-&gt;tw);
    ModelVertex.TangentX = FPackedNormal(t);
    ModelVertex.TangentZ = FPackedNormal(n);
    ModelVertex.TexCoord = FVector2D(SourceVertex-&gt;u, SourceVertex-&gt;v);

    LodRenderData-&gt;StaticVertexBuffers.PositionVertexBuffer.VertexPosition(VertIndex) = ModelVertex.Position;
    LodRenderData-&gt;StaticVertexBuffers.StaticMeshVertexBuffer.SetVertexTangents(VertIndex, ModelVertex.TangentX, ModelVertex.GetTangentY(), ModelVertex.TangentZ);
    LodRenderData-&gt;StaticVertexBuffers.StaticMeshVertexBuffer.SetVertexUV(VertIndex, 0, ModelVertex.TexCoord);
    TArray&lt;int32&gt; Vertices;

    for (uint32_t BlendIndex = 0; BlendIndex &lt; MAX_TOTAL_INFLUENCES; BlendIndex++)
    {
        InWeights[VertIndex].InfluenceWeights[BlendIndex] = BlendIndex &lt; NumBlendWeights ? (uint8_t)(255.0f*SourceVertex-&gt;blendWeights[BlendIndex]) : 0;
        InWeights[VertIndex].InfluenceBones[BlendIndex] = BlendIndex &lt; NumBlendWeights ? SourceVertex-&gt;blendIndices[BlendIndex] : 0;
        Vertices.Add(BlendIndex &lt; NumBlendWeights ? SourceVertex-&gt;blendIndices[BlendIndex] : 0);
    }
    OverlappingVertices.Add(VertIndex, Vertices);
}
//    LodRenderData-&gt;SkinWeightVertexBuffer.SetNeedsCPUAccess(true);
LodRenderData-&gt;SkinWeightVertexBuffer.SetHasExtraBoneInfluences(true);
LodRenderData-&gt;SkinWeightVertexBuffer = InWeights;
RenderMeshSection.DuplicatedVerticesBuffer.Init(data-&gt;vertexCount, OverlappingVertices);
LodRenderData-&gt;StaticVertexBuffers.ColorVertexBuffer.InitFromSingleColor(FColor::Blue, data-&gt;vertexCount);

#endif

#if WITH_EDITOR
LodModel->NumVertices = data->vertexCount;
LodModel->NumTexCoords = 1;
#else
LodRenderData->MultiSizeIndexContainer.CreateIndexBuffer(sizeof(uint16_t));
#endif

for (uint32_t index = 0; index &lt; data-&gt;indexCount; index++)
{

#if WITH_EDITOR
LodModel->IndexBuffer.Add(data->indexBuffer[index]);
#else
LodRenderData->MultiSizeIndexContainer.GetIndexBuffer()->AddItem(data->indexBuffer[index]);
#endif
}

FBoxSphereBounds Bounds(BoundBox);
Bounds = Bounds.ExpandBy(100000.0f);
SkeletalMesh-&gt;SetImportedBounds(Bounds);

//const uint32 vert_flags = ESkeletalMeshVertexFlags::None | ESkeletalMeshVertexFlags::UseFullPrecisionUVs;
//LodModel-&gt;BuildVertexBuffers(vert_flags);

SkeletalMesh-&gt;ReleaseResources();
SkeletalMesh-&gt;InitResources();

SkeletalMesh-&gt;Skeleton = NewObject&lt;USkeleton&gt;();
SkeletalMesh-&gt;Skeleton-&gt;MergeAllBonesToBoneTree(SkeletalMesh);
SkeletalMesh-&gt;PostLoad();

}