void UBlendSpace1D::GetRawSamplesFromBlendInput(const FVector &BlendInput, TArray<FGridBlendSample> & OutBlendSamples) const { FVector NormalizedBlendInput = GetNormalizedBlendInput(BlendInput); float GridIndex = FMath::Trunc(NormalizedBlendInput.X); float Remainder = NormalizedBlendInput.X - GridIndex; const FEditorElement* BeforeElement = GetGridSampleInternal(GridIndex); if (BeforeElement) { FGridBlendSample NewSample; NewSample.GridElement = *BeforeElement; // now calculate weight - GridElement has weights to nearest samples, here we weight the grid element NewSample.BlendWeight = (1.f-Remainder); OutBlendSamples.Add(NewSample); } else { FGridBlendSample NewSample; NewSample.GridElement = FEditorElement(); NewSample.BlendWeight = 0.f; OutBlendSamples.Add(NewSample); } const FEditorElement* AfterElement = GetGridSampleInternal(GridIndex+1); if (AfterElement) { FGridBlendSample NewSample; NewSample.GridElement = *AfterElement; // now calculate weight - GridElement has weights to nearest samples, here we weight the grid element NewSample.BlendWeight = (Remainder); OutBlendSamples.Add(NewSample); } else { FGridBlendSample NewSample; NewSample.GridElement = FEditorElement(); NewSample.BlendWeight = 0.f; OutBlendSamples.Add(NewSample); } }
void UBlendSpace::GetGridSamplesFromBlendInput(const FVector &BlendInput, FGridBlendSample & LeftBottom, FGridBlendSample & RightBottom, FGridBlendSample & LeftTop, FGridBlendSample& RightTop) const { FVector NormalizedBlendInput = GetNormalizedBlendInput(BlendInput); FVector GridIndex; GridIndex.X = FMath::TruncToFloat(NormalizedBlendInput.X); GridIndex.Y = FMath::TruncToFloat(NormalizedBlendInput.Y); GridIndex.Z = 0.f; FVector Remainder = NormalizedBlendInput - GridIndex; // bi-linear very simple interpolation const FEditorElement* EleLT = GetEditorElement(GridIndex.X, GridIndex.Y+1); if (EleLT) { LeftTop.GridElement = *EleLT; // now calculate weight - distance to each corner since input is already normalized within grid, we can just calculate distance LeftTop.BlendWeight = (1.f-Remainder.X)*Remainder.Y; } else { LeftTop.GridElement = FEditorElement(); LeftTop.BlendWeight = 0.f; } const FEditorElement* EleRT = GetEditorElement(GridIndex.X+1, GridIndex.Y+1); if (EleRT) { RightTop.GridElement = *EleRT; RightTop.BlendWeight = Remainder.X*Remainder.Y; } else { RightTop.GridElement = FEditorElement(); RightTop.BlendWeight = 0.f; } const FEditorElement* EleLB = GetEditorElement(GridIndex.X, GridIndex.Y); if (EleLB) { LeftBottom.GridElement = *EleLB; LeftBottom.BlendWeight = (1.f-Remainder.X)*(1.f-Remainder.Y); } else { LeftBottom.GridElement = FEditorElement(); LeftBottom.BlendWeight = 0.f; } const FEditorElement* EleRB = GetEditorElement(GridIndex.X+1, GridIndex.Y); if (EleRB) { RightBottom.GridElement = *EleRB; RightBottom.BlendWeight = Remainder.X*(1.f-Remainder.Y); } else { RightBottom.GridElement = FEditorElement(); RightBottom.BlendWeight = 0.f; } }