Init
This commit is contained in:
34
Assets/Script/Buffers.cs
Normal file
34
Assets/Script/Buffers.cs
Normal file
@@ -0,0 +1,34 @@
|
||||
using UnityEngine;
|
||||
|
||||
public static class Buffers
|
||||
{
|
||||
public static ComputeBuffer pointsBuffer;
|
||||
public static ComputeBuffer triangleBuffer;
|
||||
public static ComputeBuffer triCountBuffer;
|
||||
|
||||
public static void Create(int numPointsPerAxis)
|
||||
{
|
||||
Release();
|
||||
int numPoints = numPointsPerAxis * numPointsPerAxis * numPointsPerAxis;
|
||||
int numVoxelsPerAxis = numPointsPerAxis - 1;
|
||||
int numVoxels = numVoxelsPerAxis * numVoxelsPerAxis * numVoxelsPerAxis;
|
||||
int maxTriangleCount = numVoxels * 5;
|
||||
|
||||
|
||||
triangleBuffer = new ComputeBuffer (maxTriangleCount, sizeof (float) * 3 * 3, ComputeBufferType.Append);
|
||||
pointsBuffer = new ComputeBuffer (numPoints, sizeof (float) * 4);
|
||||
triCountBuffer = new ComputeBuffer (1, sizeof (int), ComputeBufferType.Raw);
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static void Release()
|
||||
{
|
||||
if (triangleBuffer != null)
|
||||
{
|
||||
triangleBuffer.Release();
|
||||
pointsBuffer.Release();
|
||||
triCountBuffer.Release();
|
||||
}
|
||||
}
|
||||
}
|
||||
3
Assets/Script/Buffers.cs.meta
Normal file
3
Assets/Script/Buffers.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: acc3fa30348347ecb3a1fa4804b37406
|
||||
timeCreated: 1677583897
|
||||
42
Assets/Script/Chunk.cs
Normal file
42
Assets/Script/Chunk.cs
Normal file
@@ -0,0 +1,42 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer), typeof(MeshCollider))]
|
||||
public class Chunk : MonoBehaviour
|
||||
{
|
||||
[HideInInspector]
|
||||
public Vector3Int position;
|
||||
[HideInInspector]
|
||||
public Mesh mesh;
|
||||
|
||||
|
||||
private MeshFilter _meshFilter;
|
||||
private MeshRenderer _meshRenderer;
|
||||
private MeshCollider _meshCollider;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
_meshFilter = GetComponent<MeshFilter>();
|
||||
_meshCollider = GetComponent<MeshCollider>();
|
||||
_meshRenderer = GetComponent<MeshRenderer>();
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
mesh.Clear();
|
||||
}
|
||||
|
||||
public void Init(Vector3 offset, Mesh mesh, Material mat)
|
||||
{
|
||||
transform.position = offset;
|
||||
this.mesh = mesh;
|
||||
|
||||
_meshFilter.sharedMesh = mesh;
|
||||
|
||||
_meshCollider.sharedMesh = mesh;
|
||||
_meshCollider.enabled = false;
|
||||
_meshCollider.enabled = true;
|
||||
|
||||
_meshRenderer.material = mat;
|
||||
}
|
||||
}
|
||||
11
Assets/Script/Chunk.cs.meta
Normal file
11
Assets/Script/Chunk.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 09868688a70636bf9940735efdd5c6d3
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
64
Assets/Script/ChunkManager.cs
Normal file
64
Assets/Script/ChunkManager.cs
Normal file
@@ -0,0 +1,64 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.InputSystem;
|
||||
|
||||
public class ChunkManager : MonoBehaviour
|
||||
{
|
||||
private List<Chunk> activeChunks = new List<Chunk>();
|
||||
private Camera viewer;
|
||||
[SerializeField] private MeshGeneration _meshGeneration;
|
||||
|
||||
public Material material;
|
||||
public int viewableChunks = 3;
|
||||
public int chunkSize = 20;
|
||||
public float isoLevel = 0.4f;
|
||||
|
||||
public InputAction action;
|
||||
// Start is called before the first frame update
|
||||
void Start()
|
||||
{
|
||||
viewer = Camera.main;
|
||||
action.Enable();
|
||||
action.performed += _ => Generate();
|
||||
|
||||
Generate();
|
||||
}
|
||||
|
||||
private void Generate()
|
||||
{
|
||||
foreach (var c in activeChunks)
|
||||
{
|
||||
Destroy(c);
|
||||
}
|
||||
activeChunks.Clear();
|
||||
|
||||
for (int i = 0; i < viewableChunks; i++)
|
||||
{
|
||||
for (int j = 0; j < viewableChunks; j++)
|
||||
{
|
||||
for (int k = 0; k < viewableChunks; k++)
|
||||
{
|
||||
CreateChunks(new Vector3(i, j, k) * (chunkSize - 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void CreateChunks(Vector3 offset)
|
||||
{
|
||||
var mesh = _meshGeneration.March(chunkSize, offset, isoLevel);
|
||||
|
||||
GameObject chunkContainer = new GameObject($"chunk {offset.x} {offset.y} {offset.z}");
|
||||
var chunk = chunkContainer.AddComponent<Chunk>();
|
||||
chunk.Init(offset, mesh, material);
|
||||
|
||||
activeChunks.Add(chunk);
|
||||
}
|
||||
}
|
||||
11
Assets/Script/ChunkManager.cs.meta
Normal file
11
Assets/Script/ChunkManager.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 487d0a4639a47eb6cb4e8742f785d58c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/Script/Compute.meta
Normal file
8
Assets/Script/Compute.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 468edb7f4821ff39cb4ab7207f060304
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
79
Assets/Script/Compute/March.compute
Normal file
79
Assets/Script/Compute/March.compute
Normal file
@@ -0,0 +1,79 @@
|
||||
// Each #kernel tells which function to compile; you can have many kernels
|
||||
#pragma kernel March
|
||||
#include "MarchTable.compute"
|
||||
|
||||
struct Triangle {
|
||||
float3 vertexC;
|
||||
float3 vertexB;
|
||||
float3 vertexA;
|
||||
};
|
||||
|
||||
AppendStructuredBuffer<Triangle> triangles;
|
||||
RWStructuredBuffer<float4> points;
|
||||
|
||||
int numPointsPerAxis;
|
||||
float isoLevel;
|
||||
|
||||
float3 interpolateVerts(float4 v1, float4 v2) {
|
||||
float t = (isoLevel - v1.w) / (v2.w - v1.w);
|
||||
return v1.xyz + t * (v2.xyz-v1.xyz);
|
||||
}
|
||||
|
||||
int indexFromCoord(int x, int y, int z) {
|
||||
return z * numPointsPerAxis * numPointsPerAxis + y * numPointsPerAxis + x;
|
||||
}
|
||||
|
||||
[numthreads(8,8,8)]
|
||||
void March (int3 id : SV_DispatchThreadID)
|
||||
{
|
||||
// Stop one point before the end because voxel includes neighbouring points
|
||||
if (id.x >= numPointsPerAxis-1 || id.y >= numPointsPerAxis-1 || id.z >= numPointsPerAxis-1) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 8 corners of the current cube
|
||||
float4 cubeCorners[8] = {
|
||||
points[indexFromCoord(id.x, id.y, id.z)],
|
||||
points[indexFromCoord(id.x + 1, id.y, id.z)],
|
||||
points[indexFromCoord(id.x + 1, id.y, id.z + 1)],
|
||||
points[indexFromCoord(id.x, id.y, id.z + 1)],
|
||||
points[indexFromCoord(id.x, id.y + 1, id.z)],
|
||||
points[indexFromCoord(id.x + 1, id.y + 1, id.z)],
|
||||
points[indexFromCoord(id.x + 1, id.y + 1, id.z + 1)],
|
||||
points[indexFromCoord(id.x, id.y + 1, id.z + 1)]
|
||||
};
|
||||
|
||||
// Calculate unique index for each cube configuration.
|
||||
// There are 256 possible values
|
||||
// A value of 0 means cube is entirely inside surface; 255 entirely outside.
|
||||
// The value is used to look up the edge table, which indicates which edges of the cube are cut by the isosurface.
|
||||
int cubeIndex = 0;
|
||||
|
||||
for(int j = 0; j < 8; j++)
|
||||
{
|
||||
if (cubeCorners[j].w < isoLevel)
|
||||
{
|
||||
cubeIndex |= 1 << j;
|
||||
}
|
||||
}
|
||||
|
||||
// Create triangles for current cube configuration
|
||||
for (int i = 0; triangulation[cubeIndex][i] != -1; i +=3) {
|
||||
// Get indices of corner points A and B for each of the three edges
|
||||
// of the cube that need to be joined to form the triangle.
|
||||
int a0 = cornerIndexAFromEdge[triangulation[cubeIndex][i]];
|
||||
int b0 = cornerIndexBFromEdge[triangulation[cubeIndex][i]];
|
||||
|
||||
int a1 = cornerIndexAFromEdge[triangulation[cubeIndex][i+1]];
|
||||
int b1 = cornerIndexBFromEdge[triangulation[cubeIndex][i+1]];
|
||||
|
||||
int a2 = cornerIndexAFromEdge[triangulation[cubeIndex][i+2]];
|
||||
int b2 = cornerIndexBFromEdge[triangulation[cubeIndex][i+2]];
|
||||
|
||||
Triangle tri;
|
||||
tri.vertexA = interpolateVerts(cubeCorners[a0], cubeCorners[b0]);
|
||||
tri.vertexB = interpolateVerts(cubeCorners[a1], cubeCorners[b1]);
|
||||
tri.vertexC = interpolateVerts(cubeCorners[a2], cubeCorners[b2]);
|
||||
triangles.Append(tri);
|
||||
}
|
||||
}
|
||||
8
Assets/Script/Compute/March.compute.meta
Normal file
8
Assets/Script/Compute/March.compute.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 63d88b36c773dfa9fa3e0364624089c6
|
||||
ComputeShaderImporter:
|
||||
externalObjects: {}
|
||||
preprocessorOverride: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
549
Assets/Script/Compute/MarchTable.compute
Normal file
549
Assets/Script/Compute/MarchTable.compute
Normal file
@@ -0,0 +1,549 @@
|
||||
// Values from http://paulbourke.net/geometry/polygonise/
|
||||
|
||||
static const int edges[256] = {
|
||||
0x0,
|
||||
0x109,
|
||||
0x203,
|
||||
0x30a,
|
||||
0x406,
|
||||
0x50f,
|
||||
0x605,
|
||||
0x70c,
|
||||
0x80c,
|
||||
0x905,
|
||||
0xa0f,
|
||||
0xb06,
|
||||
0xc0a,
|
||||
0xd03,
|
||||
0xe09,
|
||||
0xf00,
|
||||
0x190,
|
||||
0x99,
|
||||
0x393,
|
||||
0x29a,
|
||||
0x596,
|
||||
0x49f,
|
||||
0x795,
|
||||
0x69c,
|
||||
0x99c,
|
||||
0x895,
|
||||
0xb9f,
|
||||
0xa96,
|
||||
0xd9a,
|
||||
0xc93,
|
||||
0xf99,
|
||||
0xe90,
|
||||
0x230,
|
||||
0x339,
|
||||
0x33,
|
||||
0x13a,
|
||||
0x636,
|
||||
0x73f,
|
||||
0x435,
|
||||
0x53c,
|
||||
0xa3c,
|
||||
0xb35,
|
||||
0x83f,
|
||||
0x936,
|
||||
0xe3a,
|
||||
0xf33,
|
||||
0xc39,
|
||||
0xd30,
|
||||
0x3a0,
|
||||
0x2a9,
|
||||
0x1a3,
|
||||
0xaa,
|
||||
0x7a6,
|
||||
0x6af,
|
||||
0x5a5,
|
||||
0x4ac,
|
||||
0xbac,
|
||||
0xaa5,
|
||||
0x9af,
|
||||
0x8a6,
|
||||
0xfaa,
|
||||
0xea3,
|
||||
0xda9,
|
||||
0xca0,
|
||||
0x460,
|
||||
0x569,
|
||||
0x663,
|
||||
0x76a,
|
||||
0x66,
|
||||
0x16f,
|
||||
0x265,
|
||||
0x36c,
|
||||
0xc6c,
|
||||
0xd65,
|
||||
0xe6f,
|
||||
0xf66,
|
||||
0x86a,
|
||||
0x963,
|
||||
0xa69,
|
||||
0xb60,
|
||||
0x5f0,
|
||||
0x4f9,
|
||||
0x7f3,
|
||||
0x6fa,
|
||||
0x1f6,
|
||||
0xff,
|
||||
0x3f5,
|
||||
0x2fc,
|
||||
0xdfc,
|
||||
0xcf5,
|
||||
0xfff,
|
||||
0xef6,
|
||||
0x9fa,
|
||||
0x8f3,
|
||||
0xbf9,
|
||||
0xaf0,
|
||||
0x650,
|
||||
0x759,
|
||||
0x453,
|
||||
0x55a,
|
||||
0x256,
|
||||
0x35f,
|
||||
0x55,
|
||||
0x15c,
|
||||
0xe5c,
|
||||
0xf55,
|
||||
0xc5f,
|
||||
0xd56,
|
||||
0xa5a,
|
||||
0xb53,
|
||||
0x859,
|
||||
0x950,
|
||||
0x7c0,
|
||||
0x6c9,
|
||||
0x5c3,
|
||||
0x4ca,
|
||||
0x3c6,
|
||||
0x2cf,
|
||||
0x1c5,
|
||||
0xcc,
|
||||
0xfcc,
|
||||
0xec5,
|
||||
0xdcf,
|
||||
0xcc6,
|
||||
0xbca,
|
||||
0xac3,
|
||||
0x9c9,
|
||||
0x8c0,
|
||||
0x8c0,
|
||||
0x9c9,
|
||||
0xac3,
|
||||
0xbca,
|
||||
0xcc6,
|
||||
0xdcf,
|
||||
0xec5,
|
||||
0xfcc,
|
||||
0xcc,
|
||||
0x1c5,
|
||||
0x2cf,
|
||||
0x3c6,
|
||||
0x4ca,
|
||||
0x5c3,
|
||||
0x6c9,
|
||||
0x7c0,
|
||||
0x950,
|
||||
0x859,
|
||||
0xb53,
|
||||
0xa5a,
|
||||
0xd56,
|
||||
0xc5f,
|
||||
0xf55,
|
||||
0xe5c,
|
||||
0x15c,
|
||||
0x55,
|
||||
0x35f,
|
||||
0x256,
|
||||
0x55a,
|
||||
0x453,
|
||||
0x759,
|
||||
0x650,
|
||||
0xaf0,
|
||||
0xbf9,
|
||||
0x8f3,
|
||||
0x9fa,
|
||||
0xef6,
|
||||
0xfff,
|
||||
0xcf5,
|
||||
0xdfc,
|
||||
0x2fc,
|
||||
0x3f5,
|
||||
0xff,
|
||||
0x1f6,
|
||||
0x6fa,
|
||||
0x7f3,
|
||||
0x4f9,
|
||||
0x5f0,
|
||||
0xb60,
|
||||
0xa69,
|
||||
0x963,
|
||||
0x86a,
|
||||
0xf66,
|
||||
0xe6f,
|
||||
0xd65,
|
||||
0xc6c,
|
||||
0x36c,
|
||||
0x265,
|
||||
0x16f,
|
||||
0x66,
|
||||
0x76a,
|
||||
0x663,
|
||||
0x569,
|
||||
0x460,
|
||||
0xca0,
|
||||
0xda9,
|
||||
0xea3,
|
||||
0xfaa,
|
||||
0x8a6,
|
||||
0x9af,
|
||||
0xaa5,
|
||||
0xbac,
|
||||
0x4ac,
|
||||
0x5a5,
|
||||
0x6af,
|
||||
0x7a6,
|
||||
0xaa,
|
||||
0x1a3,
|
||||
0x2a9,
|
||||
0x3a0,
|
||||
0xd30,
|
||||
0xc39,
|
||||
0xf33,
|
||||
0xe3a,
|
||||
0x936,
|
||||
0x83f,
|
||||
0xb35,
|
||||
0xa3c,
|
||||
0x53c,
|
||||
0x435,
|
||||
0x73f,
|
||||
0x636,
|
||||
0x13a,
|
||||
0x33,
|
||||
0x339,
|
||||
0x230,
|
||||
0xe90,
|
||||
0xf99,
|
||||
0xc93,
|
||||
0xd9a,
|
||||
0xa96,
|
||||
0xb9f,
|
||||
0x895,
|
||||
0x99c,
|
||||
0x69c,
|
||||
0x795,
|
||||
0x49f,
|
||||
0x596,
|
||||
0x29a,
|
||||
0x393,
|
||||
0x99,
|
||||
0x190,
|
||||
0xf00,
|
||||
0xe09,
|
||||
0xd03,
|
||||
0xc0a,
|
||||
0xb06,
|
||||
0xa0f,
|
||||
0x905,
|
||||
0x80c,
|
||||
0x70c,
|
||||
0x605,
|
||||
0x50f,
|
||||
0x406,
|
||||
0x30a,
|
||||
0x203,
|
||||
0x109,
|
||||
0x0
|
||||
};
|
||||
|
||||
static const int triangulation[256][16] = {
|
||||
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1 },
|
||||
{ 8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1 },
|
||||
{ 3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1 },
|
||||
{ 4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1 },
|
||||
{ 4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1 },
|
||||
{ 9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1 },
|
||||
{ 10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1 },
|
||||
{ 5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1 },
|
||||
{ 5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1 },
|
||||
{ 8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1 },
|
||||
{ 2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1 },
|
||||
{ 2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1 },
|
||||
{ 11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1 },
|
||||
{ 5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1 },
|
||||
{ 11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1 },
|
||||
{ 11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1 },
|
||||
{ 2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1 },
|
||||
{ 6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1 },
|
||||
{ 3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1 },
|
||||
{ 6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1 },
|
||||
{ 6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1 },
|
||||
{ 8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1 },
|
||||
{ 7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1 },
|
||||
{ 3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1 },
|
||||
{ 0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1 },
|
||||
{ 9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1 },
|
||||
{ 8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1 },
|
||||
{ 5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1 },
|
||||
{ 0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1 },
|
||||
{ 6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1 },
|
||||
{ 10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1 },
|
||||
{ 1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1 },
|
||||
{ 0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1 },
|
||||
{ 3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1 },
|
||||
{ 6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1 },
|
||||
{ 9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1 },
|
||||
{ 8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1 },
|
||||
{ 3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1 },
|
||||
{ 10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1 },
|
||||
{ 10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1 },
|
||||
{ 2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1 },
|
||||
{ 7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1 },
|
||||
{ 2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1 },
|
||||
{ 1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1 },
|
||||
{ 11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1 },
|
||||
{ 8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1 },
|
||||
{ 0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1 },
|
||||
{ 7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1 },
|
||||
{ 7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1 },
|
||||
{ 10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1 },
|
||||
{ 0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1 },
|
||||
{ 7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1 },
|
||||
{ 6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1 },
|
||||
{ 4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1 },
|
||||
{ 10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1 },
|
||||
{ 8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1 },
|
||||
{ 1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1 },
|
||||
{ 10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1 },
|
||||
{ 10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1 },
|
||||
{ 9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1 },
|
||||
{ 7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1 },
|
||||
{ 3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1 },
|
||||
{ 7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1 },
|
||||
{ 3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1 },
|
||||
{ 6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1 },
|
||||
{ 9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1 },
|
||||
{ 1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1 },
|
||||
{ 4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1 },
|
||||
{ 7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1 },
|
||||
{ 6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1 },
|
||||
{ 0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1 },
|
||||
{ 6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1 },
|
||||
{ 0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1 },
|
||||
{ 11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1 },
|
||||
{ 6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1 },
|
||||
{ 5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1 },
|
||||
{ 9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1 },
|
||||
{ 1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1 },
|
||||
{ 10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1 },
|
||||
{ 0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1 },
|
||||
{ 11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1 },
|
||||
{ 9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1 },
|
||||
{ 7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1 },
|
||||
{ 2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1 },
|
||||
{ 9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1 },
|
||||
{ 9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1 },
|
||||
{ 1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1 },
|
||||
{ 0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1 },
|
||||
{ 10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1 },
|
||||
{ 2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1 },
|
||||
{ 0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1 },
|
||||
{ 0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1 },
|
||||
{ 9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1 },
|
||||
{ 5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1 },
|
||||
{ 5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1 },
|
||||
{ 8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1 },
|
||||
{ 9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1 },
|
||||
{ 1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1 },
|
||||
{ 3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1 },
|
||||
{ 4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1 },
|
||||
{ 9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1 },
|
||||
{ 11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1 },
|
||||
{ 2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1 },
|
||||
{ 9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1 },
|
||||
{ 3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1 },
|
||||
{ 1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1 },
|
||||
{ 4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1 },
|
||||
{ 0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1 },
|
||||
{ 1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }
|
||||
};
|
||||
|
||||
static const int cornerIndexAFromEdge[12] = {
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3
|
||||
};
|
||||
|
||||
static const int cornerIndexBFromEdge[12] = {
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
0,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
4,
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7
|
||||
};
|
||||
8
Assets/Script/Compute/MarchTable.compute.meta
Normal file
8
Assets/Script/Compute/MarchTable.compute.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 611412b53e5c9226bab3c8afa7480fd8
|
||||
ComputeShaderImporter:
|
||||
externalObjects: {}
|
||||
preprocessorOverride: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
43
Assets/Script/Compute/Noise.compute
Normal file
43
Assets/Script/Compute/Noise.compute
Normal file
@@ -0,0 +1,43 @@
|
||||
// Each #kernel tells which function to compile; you can have many kernels
|
||||
#pragma kernel Noise
|
||||
#include "Noises/SimplexNoise.compute"
|
||||
|
||||
|
||||
RWStructuredBuffer<float4> points;
|
||||
int numPointsPerAxis;
|
||||
|
||||
int octaves;
|
||||
float frequency;
|
||||
float persistence;
|
||||
float amplitude;
|
||||
float4 offset;
|
||||
|
||||
int indexFromCoord(int x, int y, int z) {
|
||||
return z * numPointsPerAxis * numPointsPerAxis + y * numPointsPerAxis + x;
|
||||
}
|
||||
[numthreads(8,8,8)]
|
||||
void Noise (int3 id : SV_DispatchThreadID)
|
||||
{
|
||||
if (id.x >= numPointsPerAxis || id.y >= numPointsPerAxis || id.z >= numPointsPerAxis) {
|
||||
return;
|
||||
}
|
||||
|
||||
float maxAmp = 0;
|
||||
float noise = 0;
|
||||
|
||||
for(int i = 0; i < octaves; i++)
|
||||
{
|
||||
float3 new_id = (id + offset.xyz)* frequency;
|
||||
noise += snoise(new_id) * amplitude;
|
||||
maxAmp += amplitude;
|
||||
amplitude *= persistence;
|
||||
frequency *= 2;
|
||||
}
|
||||
noise /= maxAmp;
|
||||
|
||||
|
||||
int index = indexFromCoord(id.x,id.y,id.z);
|
||||
points[index] = float4(id, noise);
|
||||
}
|
||||
|
||||
|
||||
8
Assets/Script/Compute/Noise.compute.meta
Normal file
8
Assets/Script/Compute/Noise.compute.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: af5a07e5dfe33ebe3a93bb7ccd695b56
|
||||
ComputeShaderImporter:
|
||||
externalObjects: {}
|
||||
preprocessorOverride: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/Script/Compute/Noises.meta
Normal file
8
Assets/Script/Compute/Noises.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 07d6636867b4dc1c99f490ca41b6bafa
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
191
Assets/Script/Compute/Noises/SimplexNoise.compute
Normal file
191
Assets/Script/Compute/Noises/SimplexNoise.compute
Normal file
@@ -0,0 +1,191 @@
|
||||
// Noise Shader Library for Unity - https://github.com/keijiro/NoiseShader
|
||||
//
|
||||
// Original work (webgl-noise) Copyright (C) 2011 Ashima Arts.
|
||||
// Translation and modification was made by Keijiro Takahashi.
|
||||
//
|
||||
// This shader is based on the webgl-noise GLSL shader. For further details
|
||||
// of the original shader, please see the following description from the
|
||||
// original source code.
|
||||
//
|
||||
|
||||
//
|
||||
// Description : Array and textureless GLSL 2D/3D/4D simplex
|
||||
// noise functions.
|
||||
// Author : Ian McEwan, Ashima Arts.
|
||||
// Maintainer : ijm
|
||||
// Lastmod : 20110822 (ijm)
|
||||
// License : Copyright (C) 2011 Ashima Arts. All rights reserved.
|
||||
// Distributed under the MIT License. See LICENSE file.
|
||||
// https://github.com/ashima/webgl-noise
|
||||
//
|
||||
|
||||
float3 mod289(float3 x)
|
||||
{
|
||||
return x - floor(x / 289.0) * 289.0;
|
||||
}
|
||||
|
||||
float4 mod289(float4 x)
|
||||
{
|
||||
return x - floor(x / 289.0) * 289.0;
|
||||
}
|
||||
|
||||
float4 permute(float4 x)
|
||||
{
|
||||
return mod289((x * 34.0 + 1.0) * x);
|
||||
}
|
||||
|
||||
float4 taylorInvSqrt(float4 r)
|
||||
{
|
||||
return 1.79284291400159 - r * 0.85373472095314;
|
||||
}
|
||||
|
||||
float snoise(float3 v)
|
||||
{
|
||||
const float2 C = float2(1.0 / 6.0, 1.0 / 3.0);
|
||||
|
||||
// First corner
|
||||
float3 i = floor(v + dot(v, C.yyy));
|
||||
float3 x0 = v - i + dot(i, C.xxx);
|
||||
|
||||
// Other corners
|
||||
float3 g = step(x0.yzx, x0.xyz);
|
||||
float3 l = 1.0 - g;
|
||||
float3 i1 = min(g.xyz, l.zxy);
|
||||
float3 i2 = max(g.xyz, l.zxy);
|
||||
|
||||
// x1 = x0 - i1 + 1.0 * C.xxx;
|
||||
// x2 = x0 - i2 + 2.0 * C.xxx;
|
||||
// x3 = x0 - 1.0 + 3.0 * C.xxx;
|
||||
float3 x1 = x0 - i1 + C.xxx;
|
||||
float3 x2 = x0 - i2 + C.yyy;
|
||||
float3 x3 = x0 - 0.5;
|
||||
|
||||
// Permutations
|
||||
i = mod289(i); // Avoid truncation effects in permutation
|
||||
float4 p =
|
||||
permute(permute(permute(i.z + float4(0.0, i1.z, i2.z, 1.0))
|
||||
+ i.y + float4(0.0, i1.y, i2.y, 1.0))
|
||||
+ i.x + float4(0.0, i1.x, i2.x, 1.0));
|
||||
|
||||
// Gradients: 7x7 points over a square, mapped onto an octahedron.
|
||||
// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)
|
||||
float4 j = p - 49.0 * floor(p / 49.0); // mod(p,7*7)
|
||||
|
||||
float4 x_ = floor(j / 7.0);
|
||||
float4 y_ = floor(j - 7.0 * x_); // mod(j,N)
|
||||
|
||||
float4 x = (x_ * 2.0 + 0.5) / 7.0 - 1.0;
|
||||
float4 y = (y_ * 2.0 + 0.5) / 7.0 - 1.0;
|
||||
|
||||
float4 h = 1.0 - abs(x) - abs(y);
|
||||
|
||||
float4 b0 = float4(x.xy, y.xy);
|
||||
float4 b1 = float4(x.zw, y.zw);
|
||||
|
||||
//float4 s0 = float4(lessThan(b0, 0.0)) * 2.0 - 1.0;
|
||||
//float4 s1 = float4(lessThan(b1, 0.0)) * 2.0 - 1.0;
|
||||
float4 s0 = floor(b0) * 2.0 + 1.0;
|
||||
float4 s1 = floor(b1) * 2.0 + 1.0;
|
||||
float4 sh = -step(h, 0.0);
|
||||
|
||||
float4 a0 = b0.xzyw + s0.xzyw * sh.xxyy;
|
||||
float4 a1 = b1.xzyw + s1.xzyw * sh.zzww;
|
||||
|
||||
float3 g0 = float3(a0.xy, h.x);
|
||||
float3 g1 = float3(a0.zw, h.y);
|
||||
float3 g2 = float3(a1.xy, h.z);
|
||||
float3 g3 = float3(a1.zw, h.w);
|
||||
|
||||
// Normalise gradients
|
||||
float4 norm = taylorInvSqrt(float4(dot(g0, g0), dot(g1, g1), dot(g2, g2), dot(g3, g3)));
|
||||
g0 *= norm.x;
|
||||
g1 *= norm.y;
|
||||
g2 *= norm.z;
|
||||
g3 *= norm.w;
|
||||
|
||||
// Mix final noise value
|
||||
float4 m = max(0.6 - float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0);
|
||||
m = m * m;
|
||||
m = m * m;
|
||||
|
||||
float4 px = float4(dot(x0, g0), dot(x1, g1), dot(x2, g2), dot(x3, g3));
|
||||
return 42.0 * dot(m, px);
|
||||
}
|
||||
|
||||
float4 snoise_grad(float3 v)
|
||||
{
|
||||
const float2 C = float2(1.0 / 6.0, 1.0 / 3.0);
|
||||
|
||||
// First corner
|
||||
float3 i = floor(v + dot(v, C.yyy));
|
||||
float3 x0 = v - i + dot(i, C.xxx);
|
||||
|
||||
// Other corners
|
||||
float3 g = step(x0.yzx, x0.xyz);
|
||||
float3 l = 1.0 - g;
|
||||
float3 i1 = min(g.xyz, l.zxy);
|
||||
float3 i2 = max(g.xyz, l.zxy);
|
||||
|
||||
// x1 = x0 - i1 + 1.0 * C.xxx;
|
||||
// x2 = x0 - i2 + 2.0 * C.xxx;
|
||||
// x3 = x0 - 1.0 + 3.0 * C.xxx;
|
||||
float3 x1 = x0 - i1 + C.xxx;
|
||||
float3 x2 = x0 - i2 + C.yyy;
|
||||
float3 x3 = x0 - 0.5;
|
||||
|
||||
// Permutations
|
||||
i = mod289(i); // Avoid truncation effects in permutation
|
||||
float4 p =
|
||||
permute(permute(permute(i.z + float4(0.0, i1.z, i2.z, 1.0))
|
||||
+ i.y + float4(0.0, i1.y, i2.y, 1.0))
|
||||
+ i.x + float4(0.0, i1.x, i2.x, 1.0));
|
||||
|
||||
// Gradients: 7x7 points over a square, mapped onto an octahedron.
|
||||
// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)
|
||||
float4 j = p - 49.0 * floor(p / 49.0); // mod(p,7*7)
|
||||
|
||||
float4 x_ = floor(j / 7.0);
|
||||
float4 y_ = floor(j - 7.0 * x_); // mod(j,N)
|
||||
|
||||
float4 x = (x_ * 2.0 + 0.5) / 7.0 - 1.0;
|
||||
float4 y = (y_ * 2.0 + 0.5) / 7.0 - 1.0;
|
||||
|
||||
float4 h = 1.0 - abs(x) - abs(y);
|
||||
|
||||
float4 b0 = float4(x.xy, y.xy);
|
||||
float4 b1 = float4(x.zw, y.zw);
|
||||
|
||||
//float4 s0 = float4(lessThan(b0, 0.0)) * 2.0 - 1.0;
|
||||
//float4 s1 = float4(lessThan(b1, 0.0)) * 2.0 - 1.0;
|
||||
float4 s0 = floor(b0) * 2.0 + 1.0;
|
||||
float4 s1 = floor(b1) * 2.0 + 1.0;
|
||||
float4 sh = -step(h, 0.0);
|
||||
|
||||
float4 a0 = b0.xzyw + s0.xzyw * sh.xxyy;
|
||||
float4 a1 = b1.xzyw + s1.xzyw * sh.zzww;
|
||||
|
||||
float3 g0 = float3(a0.xy, h.x);
|
||||
float3 g1 = float3(a0.zw, h.y);
|
||||
float3 g2 = float3(a1.xy, h.z);
|
||||
float3 g3 = float3(a1.zw, h.w);
|
||||
|
||||
// Normalise gradients
|
||||
float4 norm = taylorInvSqrt(float4(dot(g0, g0), dot(g1, g1), dot(g2, g2), dot(g3, g3)));
|
||||
g0 *= norm.x;
|
||||
g1 *= norm.y;
|
||||
g2 *= norm.z;
|
||||
g3 *= norm.w;
|
||||
|
||||
// Compute noise and gradient at P
|
||||
float4 m = max(0.6 - float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0);
|
||||
float4 m2 = m * m;
|
||||
float4 m3 = m2 * m;
|
||||
float4 m4 = m2 * m2;
|
||||
float3 grad =
|
||||
-6.0 * m3.x * x0 * dot(x0, g0) + m4.x * g0 +
|
||||
-6.0 * m3.y * x1 * dot(x1, g1) + m4.y * g1 +
|
||||
-6.0 * m3.z * x2 * dot(x2, g2) + m4.z * g2 +
|
||||
-6.0 * m3.w * x3 * dot(x3, g3) + m4.w * g3;
|
||||
float4 px = float4(dot(x0, g0), dot(x1, g1), dot(x2, g2), dot(x3, g3));
|
||||
return 42.0 * float4(grad, dot(m4, px));
|
||||
}
|
||||
8
Assets/Script/Compute/Noises/SimplexNoise.compute.meta
Normal file
8
Assets/Script/Compute/Noises/SimplexNoise.compute.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 89f76d50b324ae8d18e1fc3f9d429737
|
||||
ComputeShaderImporter:
|
||||
externalObjects: {}
|
||||
preprocessorOverride: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
76
Assets/Script/MeshGeneration.cs
Normal file
76
Assets/Script/MeshGeneration.cs
Normal file
@@ -0,0 +1,76 @@
|
||||
using System;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine;
|
||||
|
||||
|
||||
public class MeshGeneration : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private Noise noise;
|
||||
[SerializeField] private ComputeShader marchShader;
|
||||
|
||||
public Mesh March(int numPointsPerAxis, Vector3 offset, float isoLevel)
|
||||
{
|
||||
Buffers.Create(numPointsPerAxis);
|
||||
int numVoxelsPerAxis = numPointsPerAxis - 1;
|
||||
int numThreadsPerAxis = Mathf.CeilToInt (numVoxelsPerAxis / (float) 8);
|
||||
noise.Generate(numPointsPerAxis, numThreadsPerAxis, offset);
|
||||
|
||||
marchShader.SetBuffer(0, "points", Buffers.pointsBuffer);
|
||||
marchShader.SetBuffer(0, "triangles", Buffers.triangleBuffer);
|
||||
marchShader.SetInt("numPointsPerAxis", numPointsPerAxis);
|
||||
marchShader.SetFloat("isoLevel", isoLevel);
|
||||
|
||||
marchShader.Dispatch(0, numThreadsPerAxis,numThreadsPerAxis,numThreadsPerAxis);
|
||||
|
||||
ComputeBuffer.CopyCount(Buffers.triangleBuffer, Buffers.triCountBuffer, 0);
|
||||
int[] triCountArray = { 0 };
|
||||
Buffers.triCountBuffer.GetData(triCountArray);
|
||||
int numTris = triCountArray[0];
|
||||
|
||||
Triangle[] tris = new Triangle[numTris];
|
||||
Buffers.triangleBuffer.GetData(tris, 0,0, numTris);
|
||||
|
||||
Mesh mesh = new Mesh();
|
||||
mesh.Clear();
|
||||
|
||||
var vertices = new Vector3[numTris * 3];
|
||||
var meshTriangles = new int[numTris * 3];
|
||||
|
||||
for (int i = 0; i < numTris; i++) {
|
||||
for (int j = 0; j < 3; j++) {
|
||||
meshTriangles[i * 3 + j] = i * 3 + j;
|
||||
vertices[i * 3 + j] = tris[i][j];
|
||||
}
|
||||
}
|
||||
mesh.vertices = vertices;
|
||||
mesh.triangles = meshTriangles;
|
||||
|
||||
mesh.RecalculateNormals();
|
||||
return mesh;
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
Buffers.Release();
|
||||
}
|
||||
|
||||
struct Triangle
|
||||
{
|
||||
public Vector3 a;
|
||||
public Vector3 b;
|
||||
public Vector3 c;
|
||||
|
||||
public Vector3 this [int i] {
|
||||
get {
|
||||
switch (i) {
|
||||
case 0:
|
||||
return a;
|
||||
case 1:
|
||||
return b;
|
||||
default:
|
||||
return c;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
3
Assets/Script/MeshGeneration.cs.meta
Normal file
3
Assets/Script/MeshGeneration.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1aeb840455c742adbf657d8381979714
|
||||
timeCreated: 1677585621
|
||||
51
Assets/Script/Noise.cs
Normal file
51
Assets/Script/Noise.cs
Normal file
@@ -0,0 +1,51 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.InputSystem;
|
||||
|
||||
public class Noise : MonoBehaviour
|
||||
{
|
||||
[SerializeField]
|
||||
private ComputeShader noiseShader;
|
||||
[Space(15)]
|
||||
public float frequency = 0.001f;
|
||||
public float amplitude = 1;
|
||||
public int octaves = 4;
|
||||
public float persistence = 0.5f;
|
||||
|
||||
|
||||
public void Generate(int numPointsPerAxis, int numThreadsPerAxis, Vector3 offset)
|
||||
{
|
||||
var pointsBuffer = Buffers.pointsBuffer;
|
||||
|
||||
noiseShader.SetBuffer(0, "points", pointsBuffer);
|
||||
noiseShader.SetInt("numPointsPerAxis", numPointsPerAxis);
|
||||
|
||||
noiseShader.SetFloat("frequency", frequency);
|
||||
noiseShader.SetInt("octaves", octaves);
|
||||
noiseShader.SetFloat("amplitude", amplitude);
|
||||
noiseShader.SetFloat("persistence", persistence);
|
||||
|
||||
var vec4 = new Vector4(offset.x, offset.y, offset.z, 0);
|
||||
|
||||
noiseShader.SetVector("offset", vec4);
|
||||
|
||||
|
||||
noiseShader.Dispatch(0, numThreadsPerAxis,numThreadsPerAxis,numThreadsPerAxis);
|
||||
|
||||
#if UNITY_EDITOR
|
||||
Vector4[] arr = new Vector4[pointsBuffer.count];
|
||||
Buffers.pointsBuffer.GetData(arr,0,0, pointsBuffer.count);
|
||||
|
||||
var min = arr[0].w;
|
||||
var max = min;
|
||||
foreach (var p in arr)
|
||||
{
|
||||
if (min > p.w)
|
||||
min = p.w;
|
||||
if (max < p.w)
|
||||
max = p.w;
|
||||
}
|
||||
|
||||
Debug.Log($"{min} || {max}");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
11
Assets/Script/Noise.cs.meta
Normal file
11
Assets/Script/Noise.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c858543467caca971b7482447c1ce444
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user