Ethan_M

Untitled

Nov 1st, 2025
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.13 KB | None | 0 0
  1. #pragma kernel ClearHeight
  2. #pragma kernel UpdateHeight
  3. #pragma kernel UpdateChunk
  4.  
  5. struct VertexData
  6. {
  7.     float3 Position;
  8.     float3 Normal;
  9.     uint Color;
  10.     float2 UV;
  11.     float neighbours;
  12. };
  13.  
  14. StructuredBuffer<VertexData> VertexBuffer;
  15. RWStructuredBuffer<uint> HeightBuffer;
  16. float ChunkSize;
  17. float3 MeshPositionOffset;
  18. RWTexture2D<float4> MapTexture;
  19.  
  20. bool IsValidQuad(uint3 quadId)
  21. {
  22.     uint length;
  23.     uint stride;
  24.     VertexBuffer.GetDimensions(length, stride);
  25.    
  26.     if (4 * quadId.x + 3 >= length)
  27.     {
  28.         return false;
  29.     }
  30.    
  31.     float3 normal = VertexBuffer[4 * quadId.x].Normal;
  32.  
  33.     if (normal.y != 1)
  34.     {
  35.         return false;
  36.     }
  37.  
  38.     return true;
  39. }
  40.  
  41. float3 GetQuadCenter(uint3 quadId)
  42. {
  43.     return min(VertexBuffer[4 * quadId.x].Position, min(VertexBuffer[4 * quadId.x + 1].Position,
  44.         min(VertexBuffer[4 * quadId.x + 2].Position, VertexBuffer[4 * quadId.x + 3].Position)));
  45. }
  46.  
  47. [numthreads(8,8,1)]
  48. void ClearHeight(uint3 id : SV_DispatchThreadID)
  49. {
  50.     HeightBuffer[id.x * ChunkSize + id.y] = 0;
  51. }
  52.  
  53. [numthreads(16,1,1)]
  54. void UpdateHeight(uint3 quadId : SV_DispatchThreadID)
  55. {
  56.     if (!IsValidQuad(quadId))
  57.     {
  58.         return;
  59.     }
  60.  
  61.     float3 quadCenter = GetQuadCenter(quadId);
  62.     float3 worldPosition = quadCenter + MeshPositionOffset;
  63.  
  64.     if (quadCenter.x >= 0 && quadCenter.x < ChunkSize && quadCenter.z >= 0 && quadCenter.z < ChunkSize)
  65.     {
  66.         InterlockedMax(HeightBuffer[quadCenter.x * ChunkSize + quadCenter.z], (uint)worldPosition.y);
  67.     }
  68. }
  69.  
  70. [numthreads(16,1,1)]
  71. void UpdateChunk(uint3 quadId : SV_DispatchThreadID)
  72. {
  73.     if (!IsValidQuad(quadId))
  74.     {
  75.         return;
  76.     }
  77.    
  78.     float3 quadCenter = GetQuadCenter(quadId);
  79.     float3 worldPosition = quadCenter + MeshPositionOffset;
  80.     const uint encodedColor = VertexBuffer[4 * quadId.x].Color;
  81.  
  82.     if (HeightBuffer[quadCenter.x * ChunkSize + quadCenter.z] == (uint)worldPosition.y)
  83.     {
  84.         MapTexture[worldPosition.xz] = float4((float)(encodedColor & 255) / 256, (float)(encodedColor >> 8 & 255) / 256,
  85.             (float)(encodedColor >> 16 & 255) / 256, 1);
  86.     }
  87. }
Advertisement
Add Comment
Please, Sign In to add comment