You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
1.8 KiB
HLSL

/******************************************************************************/
/*
Project - MudBun
Publisher - Long Bunny Labs
http://LongBunnyLabs.com
Author - Ming-Lun "Allen" Chou
http://AllenChou.net
*/
/******************************************************************************/
#ifndef MUDBUN_VOXEL_CACHE_FUNCS
#define MUDBUN_VOXEL_CACHE_FUNCS
#include "VoxelCacheDefs.cginc"
#include "AllocationDefs.cginc"
#include "BrushFuncs.cginc"
#include "Noise/RandomNoise.cginc"
#define kMaxCacheIterations (4)
uint cache_hash(float3 p)
{
return uint(1e9f * mbn_rand(p));
}
// https://nosferalatu.com/SimpleGPUHashTable.html
float sdf_masked_brushes_cached(float3 p, int iBrushMask, out SdfBrushMaterial mat)
{
float3 fiP = round(p / (0.5f * voxelSize));
uint slot = cache_hash(fiP / voxelSize) % voxelCacheSize;
uint i, s;
// look up cache
i = 0;
s = slot;
while (i++ < kMaxCacheIterations)
{
uint iCache = voxelCacheIdTable[s];
if (iCache != kNullVoxelCacheId && all(voxelCache[iCache].data.xyz == fiP))
{
mat = voxelCache[iCache].material;
//mat.color = pack_rgba(float4(1.0f, 0.0f, 0.0f, 1.0f));
return voxelCache[iCache].data.w;
}
s = (s + 1) % voxelCacheSize;
}
// add cache
int iCache;
InterlockedAdd(aNumAllocation[kNumAllocationsVoxelCache], 1, iCache);
float res = sdf_masked_brushes(p, iBrushMask, voxelCache[iCache].material);
voxelCache[iCache].data = float4(fiP, res);
i = 0;
s = slot;
while (i++ < kMaxCacheIterations)
{
uint prev = kNullVoxelCacheId;
InterlockedCompareExchange(voxelCacheIdTable[s], kNullVoxelCacheId, iCache, prev);
if (prev == kNullVoxelCacheId)
break;
// collision
s = (s + 1) % voxelCacheSize;
}
mat = voxelCache[iCache].material;
return res;
}
#endif