2015-04-13 17:21:38 -04:00
|
|
|
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#pragma once
|
2015-06-15 15:51:40 -04:00
|
|
|
#include "VectorVMDataObject.generated.h"
|
2015-04-13 17:21:38 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Vector VM data object; encapsulates buffers, curves and other data in its derivatives
|
|
|
|
|
* for access by VectorVM kernels;
|
|
|
|
|
*/
|
2015-06-17 10:12:41 -04:00
|
|
|
UCLASS(EditInlineNew, MinimalAPI)
|
2015-06-15 15:51:40 -04:00
|
|
|
class UNiagaraDataObject : public UObject
|
2015-04-13 17:21:38 -04:00
|
|
|
{
|
2015-06-15 15:51:40 -04:00
|
|
|
GENERATED_UCLASS_BODY()
|
2015-04-13 17:21:38 -04:00
|
|
|
public:
|
2015-06-15 15:51:40 -04:00
|
|
|
virtual FVector4 Sample(const FVector4& InCoords) const { return FVector4(0.0f, 0.0f, 0.0f, 0.0f); }
|
|
|
|
|
virtual FVector4 Write(const FVector4& InCoords, const FVector4& InValue) { return FVector4(0.0f, 0.0f, 0.0f, 0.0f); }
|
2015-04-13 17:21:38 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Curve object; encapsulates a curve for the VectorVM
|
|
|
|
|
*/
|
2015-06-17 10:12:41 -04:00
|
|
|
UCLASS(EditInlineNew, MinimalAPI)
|
2015-06-15 15:51:40 -04:00
|
|
|
class UNiagaraCurveDataObject : public UNiagaraDataObject
|
2015-04-13 17:21:38 -04:00
|
|
|
{
|
2015-06-15 15:51:40 -04:00
|
|
|
GENERATED_UCLASS_BODY()
|
2015-06-17 10:12:41 -04:00
|
|
|
|
|
|
|
|
UPROPERTY(EditAnywhere, Category="Curve")
|
2015-04-13 17:21:38 -04:00
|
|
|
class UCurveVector *CurveObj;
|
2015-07-28 16:50:47 -04:00
|
|
|
public:
|
|
|
|
|
UNiagaraCurveDataObject(class UCurveVector *InCurve) : CurveObj(InCurve)
|
|
|
|
|
{
|
|
|
|
|
}
|
2015-04-13 17:21:38 -04:00
|
|
|
|
2015-06-15 17:29:23 -04:00
|
|
|
FVector4 Sample(const FVector4& InCoords) const;
|
2015-04-14 14:09:51 -04:00
|
|
|
virtual FVector4 Write(const FVector4& InCoords, const FVector4& InValue) override
|
2015-04-13 17:21:38 -04:00
|
|
|
{
|
|
|
|
|
return FVector4(1.0f, 0.0f, 0.0f, 1.0f);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UCurveVector *GetCurveObject() { return CurveObj; }
|
|
|
|
|
void SetCurveObject(UCurveVector *InCurve) { CurveObj = InCurve; }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2015-06-15 17:29:23 -04:00
|
|
|
/* Volume data object; encapsulates volumetric data for VectorVM
|
2015-04-13 17:21:38 -04:00
|
|
|
*/
|
2015-06-17 10:12:41 -04:00
|
|
|
UCLASS(EditInlineNew, MinimalAPI, Transient)
|
2015-06-15 15:51:40 -04:00
|
|
|
class UNiagaraSparseVolumeDataObject : public UNiagaraDataObject
|
2015-04-13 17:21:38 -04:00
|
|
|
{
|
2015-06-15 15:51:40 -04:00
|
|
|
GENERATED_UCLASS_BODY()
|
2015-04-13 17:21:38 -04:00
|
|
|
private:
|
|
|
|
|
TArray<FVector4> Data;
|
|
|
|
|
uint64 NumBuckets;
|
|
|
|
|
int32 Size;
|
|
|
|
|
public:
|
2015-04-14 14:09:51 -04:00
|
|
|
uint32 MakeHash(const FVector4& InCoords) const
|
2015-04-13 17:21:38 -04:00
|
|
|
{
|
2015-04-14 14:09:51 -04:00
|
|
|
FVector4 Coords = InCoords;
|
2015-04-13 17:21:38 -04:00
|
|
|
const int64 P1 = 73856093; // some large primes
|
|
|
|
|
const int64 P2 = 19349663;
|
|
|
|
|
const int64 P3 = 83492791;
|
|
|
|
|
Coords *= 0.1f;
|
|
|
|
|
uint64 N = (P1*static_cast<int64>(Coords.X)) ^ (P2*static_cast<int64>(Coords.Y)) ^ (P3*static_cast<int64>(Coords.Z));
|
|
|
|
|
N %= NumBuckets;
|
|
|
|
|
return FMath::Clamp(N, 0ULL, NumBuckets);
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-14 14:09:51 -04:00
|
|
|
virtual FVector4 Sample(const FVector4& InCoords) const override
|
2015-04-13 17:21:38 -04:00
|
|
|
{
|
2015-04-14 14:09:51 -04:00
|
|
|
int32 Index = MakeHash(InCoords);
|
2015-04-13 17:21:38 -04:00
|
|
|
Index = FMath::Clamp(Index, 0, Data.Num() - 1);
|
|
|
|
|
return Data[Index];
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-14 14:09:51 -04:00
|
|
|
virtual FVector4 Write(const FVector4& InCoords, const FVector4& InValue) override
|
2015-04-13 17:21:38 -04:00
|
|
|
{
|
2015-04-14 14:09:51 -04:00
|
|
|
Data[MakeHash(InCoords)] = InValue;
|
|
|
|
|
return InValue;
|
2015-04-13 17:21:38 -04:00
|
|
|
}
|
2015-07-28 16:50:47 -04:00
|
|
|
};
|