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.

80 lines
2.1 KiB
Plaintext

/******************************************************************************/
/*
Project - MudBun
Publisher - Long Bunny Labs
http://LongBunnyLabs.com
Author - Ming-Lun "Allen" Chou
http://AllenChou.net
*/
/******************************************************************************/
#pragma kernel update_ray_traced_voxel_indirect_dispatch_args
#pragma kernel compute_ray_traced_voxel_gen_points
#pragma kernel compute_ray_traced_voxel_gen_points_with_normals
#include "../../Shader/ComputeCommon.cginc"
#include "../../Shader/AabbTreeFuncs.cginc"
#include "../../Shader/AutoSmoothDefs.cginc"
#include "../../Shader/BrushFuncs.cginc"
#include "../../Shader/GenPointDefs.cginc"
#include "../../Shader/IndirectArgsDefs.cginc"
#include "../../Shader/Math/MathConst.cginc"
#include "../../Shader/VoxelFuncs.cginc"
[numthreads(1, 1, 1)]
void update_ray_traced_voxel_indirect_dispatch_args(int3 id : SV_DispatchThreadID)
{
indirectDispatchArgs[0] =
max
(
1,
uint
(
aNumNodesAllocated[0]
+ kThreadGroupSize - 1
) / kThreadGroupSize
);
}
void fill_gen_points_basic(int iNode)
{
int iBrushMask = get_brush_mask_index(iNode);
SdfBrushMaterial mat;
sdf_masked_brushes(nodePool[iNode].center, iBrushMask, mat);
aGenPoint[iNode].material = pack_material(mat);
aGenPoint[iNode].iBrushMask = iBrushMask;
}
void fill_gen_points_normal(int iNode)
{
float3 n;
SDF_NORMAL(n, nodePool[iNode].center, sdf_masked_brushes, nodePool[iNode].iBrushMask, 1e-2f * voxelNodeSizes[3]);
aGenPoint[iNode].posNorm.w = pack_normal(n);
}
[numthreads(kThreadGroupSize, 1, 1)]
void compute_ray_traced_voxel_gen_points(uint3 id : SV_DispatchThreadID)
{
int iNode = id.x;
if (iNode >= aNumNodesAllocated[0])
return;
fill_gen_points_basic(iNode);
}
[numthreads(kThreadGroupSize, 1, 1)]
void compute_ray_traced_voxel_gen_points_with_normals(uint3 id : SV_DispatchThreadID)
{
int iNode = id.x;
if (iNode >= aNumNodesAllocated[0])
return;
fill_gen_points_basic(iNode);
fill_gen_points_normal(iNode);
}