Created
May 21, 2014 08:59
-
-
Save mortennobel/2f285bfec2ce995eeb3e to your computer and use it in GitHub Desktop.
MarchingCube
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using UnityEngine; | |
| using System.Collections; | |
| using System.Collections.Generic; | |
| public class TRIANGLE { | |
| public Vector3[] p = {Vector3.zero,Vector3.zero,Vector3.zero}; | |
| } | |
| public class GRIDCELL { | |
| public Vector3[] p = {Vector3.zero,Vector3.zero,Vector3.zero,Vector3.zero,Vector3.zero,Vector3.zero,Vector3.zero,Vector3.zero}; | |
| public float[] val = {0,0,0,0,0,0,0,0}; | |
| } | |
| public class MarchingCube { | |
| public delegate float GetDensityFn(Vec3i pos); | |
| GRIDCELL gc = new GRIDCELL(); | |
| Vector3[] vertlist = new Vector3[12]; | |
| GetDensityFn GetDensity; | |
| int[] edgeTable={ | |
| 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 }; | |
| int[,] triTable = | |
| {{-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}}; | |
| public MarchingCube(Vector3 scale){ | |
| if (scale == null){ | |
| scale = Vector3.one; | |
| } | |
| for (int i=0;i<vertlist.Length;i++){ | |
| vertlist[i] = Vector3.zero; | |
| } | |
| Vector3[] vertexPos = new Vector3[8]; | |
| vertexPos[0] = new Vector3(0,0,0); | |
| vertexPos[1] = new Vector3(1,0,0); | |
| vertexPos[2] = new Vector3(1,0,1); | |
| vertexPos[3] = new Vector3(0,0,1); | |
| vertexPos[4] = new Vector3(0,1,0); | |
| vertexPos[5] = new Vector3(1,1,0); | |
| vertexPos[6] = new Vector3(1,1,1); | |
| vertexPos[7] = new Vector3(0,1,1); | |
| for (int i=0;i<vertexPos.Length;i++){ | |
| vertexPos[i] = Vector3.Scale(vertexPos[i],scale); | |
| } | |
| gc.p = vertexPos; | |
| } | |
| // Based on http://paulbourke.net/geometry/polygonise/ | |
| /* | |
| Given a grid cell and an isolevel, calculate the triangular | |
| facets required to represent the isosurface through the cell. | |
| Return the number of triangular facets, the array "triangles" | |
| will be loaded up with the vertices at most 5 triangular facets. | |
| 0 will be returned if the grid cell is either totally above | |
| of totally below the isolevel. | |
| */ | |
| int Polygonise(GRIDCELL grid,float isolevel, List<Vector3> triangles,List<Vector3> normals, Vector3 offset) | |
| { | |
| int i,ntriang; | |
| int cubeindex; | |
| // | |
| //Determine the index into the edge table which | |
| //tells us which vertices are inside of the surface | |
| /// | |
| cubeindex = 0; | |
| if (grid.val[0] < isolevel) cubeindex |= 1; | |
| if (grid.val[1] < isolevel) cubeindex |= 2; | |
| if (grid.val[2] < isolevel) cubeindex |= 4; | |
| if (grid.val[3] < isolevel) cubeindex |= 8; | |
| if (grid.val[4] < isolevel) cubeindex |= 16; | |
| if (grid.val[5] < isolevel) cubeindex |= 32; | |
| if (grid.val[6] < isolevel) cubeindex |= 64; | |
| if (grid.val[7] < isolevel) cubeindex |= 128; | |
| // Cube is entirely in/out of the surface // | |
| if (edgeTable[cubeindex] == 0) | |
| return(0); | |
| // Find the vertices where the surface intersects the cube // | |
| if ((edgeTable[cubeindex] & 1) != 0) | |
| vertlist[0] = VertexInterp(isolevel,grid.p[0],grid.p[1],grid.val[0],grid.val[1]); | |
| if ((edgeTable[cubeindex] & 2) != 0) | |
| vertlist[1] = VertexInterp(isolevel,grid.p[1],grid.p[2],grid.val[1],grid.val[2]); | |
| if ((edgeTable[cubeindex] & 4) != 0) | |
| vertlist[2] = VertexInterp(isolevel,grid.p[2],grid.p[3],grid.val[2],grid.val[3]); | |
| if ((edgeTable[cubeindex] & 8) != 0) | |
| vertlist[3] = VertexInterp(isolevel,grid.p[3],grid.p[0],grid.val[3],grid.val[0]); | |
| if ((edgeTable[cubeindex] & 16) != 0) | |
| vertlist[4] = VertexInterp(isolevel,grid.p[4],grid.p[5],grid.val[4],grid.val[5]); | |
| if ((edgeTable[cubeindex] & 32) != 0) | |
| vertlist[5] = VertexInterp(isolevel,grid.p[5],grid.p[6],grid.val[5],grid.val[6]); | |
| if ((edgeTable[cubeindex] & 64) != 0) | |
| vertlist[6] = VertexInterp(isolevel,grid.p[6],grid.p[7],grid.val[6],grid.val[7]); | |
| if ((edgeTable[cubeindex] & 128) != 0) | |
| vertlist[7] = VertexInterp(isolevel,grid.p[7],grid.p[4],grid.val[7],grid.val[4]); | |
| if ((edgeTable[cubeindex] & 256) != 0) | |
| vertlist[8] = VertexInterp(isolevel,grid.p[0],grid.p[4],grid.val[0],grid.val[4]); | |
| if ((edgeTable[cubeindex] & 512) != 0) | |
| vertlist[9] = VertexInterp(isolevel,grid.p[1],grid.p[5],grid.val[1],grid.val[5]); | |
| if ((edgeTable[cubeindex] & 1024) != 0) | |
| vertlist[10] = VertexInterp(isolevel,grid.p[2],grid.p[6],grid.val[2],grid.val[6]); | |
| if ((edgeTable[cubeindex] & 2048) != 0) | |
| vertlist[11] = VertexInterp(isolevel,grid.p[3],grid.p[7],grid.val[3],grid.val[7]); | |
| // Create the triangle // | |
| ntriang = 0; | |
| for (i=0;triTable[cubeindex,i]!=-1;i+=3) { | |
| Vector3 p1 = vertlist[triTable[cubeindex,i ]]; | |
| Vector3 p2 = vertlist[triTable[cubeindex,i+2]]; | |
| Vector3 p3 = vertlist[triTable[cubeindex,i+1]]; | |
| float epsilon = 0.00001f; | |
| bool skipNearlyDegenerate = | |
| ((p1-p2).sqrMagnitude < epsilon) || | |
| ((p1-p3).sqrMagnitude < epsilon) || | |
| ((p2-p3).sqrMagnitude < epsilon); | |
| if (skipNearlyDegenerate){ | |
| continue; | |
| } | |
| triangles.Add(offset + p1); | |
| triangles.Add(offset + p2); | |
| triangles.Add(offset + p3); | |
| if (normals != null){ | |
| normals.Add(GetGradient(p1)); | |
| normals.Add(GetGradient(p2)); | |
| normals.Add(GetGradient(p3)); | |
| } | |
| ntriang++; | |
| } | |
| return ntriang; | |
| } | |
| /* | |
| Linearly interpolate the position where an isosurface cuts | |
| an edge between two vertices, each with their own scalar value | |
| */ | |
| Vector3 VertexInterp(float isolevel,Vector3 p1,Vector3 p2,float valp1,float valp2) | |
| { | |
| float mu; | |
| Vector3 p; | |
| if (Mathf.Abs(isolevel-valp1) < 0.00001) | |
| return(p1); | |
| if (Mathf.Abs(isolevel-valp2) < 0.00001) | |
| return(p2); | |
| if (Mathf.Abs(valp1-valp2) < 0.00001) | |
| return(p1); | |
| mu = (isolevel - valp1) / (valp2 - valp1); | |
| p.x = p1.x + mu * (p2.x - p1.x); | |
| p.y = p1.y + mu * (p2.y - p1.y); | |
| p.z = p1.z + mu * (p2.z - p1.z); | |
| // make vertices fixed positions | |
| /* | |
| p.x = Mathf.Round(p.x*1024)/1024; | |
| p.y = Mathf.Round(p.y*1024)/1024; | |
| p.z = Mathf.Round(p.z*1024)/1024; | |
| */ | |
| return p; | |
| } | |
| /*Vector3 GetGradient(Vector3 position){ | |
| float e = 0.01f; | |
| Vector3 gradient = new Vector3(); | |
| gradient.x = GetInterpolatedDensity(position.x + e, position.y, position.z) - GetInterpolatedDensity(position.x - e, position.y, position.z); | |
| gradient.y = GetInterpolatedDensity(position.x, position.y + e, position.z) - GetInterpolatedDensity(position.x, position.y - e, position.z); | |
| gradient.z = GetInterpolatedDensity(position.x, position.y, position.z + e) - GetInterpolatedDensity(position.x, position.y, position.z - e); | |
| if (gradient != Vector3.zero){ | |
| gradient.Normalize(); | |
| } | |
| return gradient*-1; | |
| }*/ | |
| float getLinearInterpolate(float xx, float yy, float zz){ | |
| int x = Mathf.FloorToInt(xx); | |
| int y = Mathf.FloorToInt(yy); | |
| int z = Mathf.FloorToInt(zz); | |
| float x0 = x % 1.0f; | |
| float x1 = 1.0f-x0; | |
| float y0 = y % 1.0f; | |
| float y1 = 1.0f-y0; | |
| float z0 = z % 1.0f; | |
| float z1 = 1.0f-z0; | |
| float x000 = GetDensity(new Vec3i(x,y,z)); | |
| float x001 = GetDensity(new Vec3i(x,y,z+1)); | |
| float x010 = GetDensity(new Vec3i(x,y+1,z)); | |
| float x011 = GetDensity(new Vec3i(x,y+1,z+1)); | |
| float x100 = GetDensity(new Vec3i(x,y,z)); | |
| float x101 = GetDensity(new Vec3i(x,y,z+1)); | |
| float x110 = GetDensity(new Vec3i(x,y+1,z)); | |
| float x111 = GetDensity(new Vec3i(x,y+1,z+1)); | |
| return ((x000*z0+x001*z1)*y0+(x010*z0+x011*z1)*y1)*x0+ | |
| ((x100*z0+x101*z1)*y0+(x110*z0+x111*z1)*y1)*x1; | |
| } | |
| Vector3 GetGradient(Vector3 pos){ | |
| // get values | |
| float x = pos[0]; | |
| float y = pos[1]; | |
| float z = pos[2]; | |
| float l = 0.5f; | |
| // get values between 0 and 2) here we assume that pos is at position 1. | |
| float value000 = getLinearInterpolate(x-l, y-l, z-l), | |
| value001 = getLinearInterpolate(x-l, y-l, z ), | |
| value002 = getLinearInterpolate(x-l, y-l, z+l), | |
| value100 = getLinearInterpolate(x , y-l, z-l), | |
| value101 = getLinearInterpolate(x , y-l, z ), | |
| value102 = getLinearInterpolate(x , y-l, z+l), | |
| value200 = getLinearInterpolate(x+l, y-l, z-l), | |
| value201 = getLinearInterpolate(x+l, y-l, z ), | |
| value202 = getLinearInterpolate(x+l, y-l, z+l), | |
| value010 = getLinearInterpolate(x-l, y , z-l), | |
| value011 = getLinearInterpolate(x-l, y , z ), | |
| value012 = getLinearInterpolate(x-l, y , z+l), | |
| value110 = getLinearInterpolate(x , y , z-l), | |
| // value111 = getLinearInterpolate({{x , y , z }}), // unused | |
| value112 = getLinearInterpolate(x , y , z+l), | |
| value210 = getLinearInterpolate(x+l, y , z-l), | |
| value211 = getLinearInterpolate(x+l, y , z ), | |
| value212 = getLinearInterpolate(x+l, y , z+l), | |
| value020 = getLinearInterpolate(x-l, y+l, z-l), | |
| value021 = getLinearInterpolate(x-l, y+l, z ), | |
| value022 = getLinearInterpolate(x-l, y+l, z+l), | |
| value120 = getLinearInterpolate(x , y+l, z-l), | |
| value121 = getLinearInterpolate(x , y+l, z ), | |
| value122 = getLinearInterpolate(x , y+l, z+l), | |
| value220 = getLinearInterpolate(x+l, y+l, z-l), | |
| value221 = getLinearInterpolate(x+l, y+l, z ), | |
| value222 = getLinearInterpolate(x+l, y+l, z+l); | |
| var res = new Vector3(value000+2*value001+value002+ | |
| 2*value010+4*value011+2*value012+ | |
| value020+2*value021+value022+ | |
| -value200-2*value201-value202+ | |
| -2*value210-4*value211-2*value212+ | |
| -value220-2*value221-value222, | |
| value000+2*value001 +value002+ | |
| 2*value100+4*value101+2*value102+ | |
| value200+2*value201 +value202+ | |
| -value020-2*value021 -value022+ | |
| -2*value120-4*value121-2*value122+ | |
| -value220-2*value221 -value222, | |
| value000+2*value010 +value020+ | |
| 2*value100+4*value110+2*value120+ | |
| value200+2*value210 +value220+ | |
| -value002-2*value012 -value022+ | |
| -2*value102-4*value112-2*value122+ | |
| -value202-2*value212 -value222 | |
| ); | |
| if (res[0] != 0 && res[1] != 0 && res[2] != 0){ | |
| res = res.normalized; | |
| } | |
| return res; | |
| } | |
| /*Vector3 GetGradient(Vector3 position){ | |
| float x = position.x; | |
| float y = position.y; | |
| float z = position.z; | |
| Vector3 res = new Vector3(); | |
| float dist = 0.5f; | |
| // x | |
| int xi = (int)(x + dist); | |
| float xf = x + dist - xi; | |
| float xd0 = GetDensity(xi - 1, (int)y, (int)z); | |
| float xd1 = GetDensity(xi, (int)y, (int)z); | |
| float xd2 = GetDensity(xi + 1, (int)y, (int)z); | |
| res.x = (xd1 - xd0) * (1.0f - xf) + (xd2 - xd1) * xf; // lerp | |
| // y | |
| int yi = (int)(y + dist); | |
| float yf = y + dist - yi; | |
| float yd0 = GetDensity((int)x, yi - 1, (int)z); | |
| float yd1 = GetDensity((int)x, yi, (int)z); | |
| float yd2 = GetDensity((int)x, yi + 1, (int)z); | |
| res.y = (yd1 - yd0) * (dist - yf) + (yd2 - yd1) * yf; // lerp | |
| // z | |
| int zi = (int)(z + dist); | |
| float zf = z + dist - zi; | |
| float zd0 = GetDensity((int)x, (int)y, zi - 1); | |
| float zd1 = GetDensity((int)x, (int)y, zi); | |
| float zd2 = GetDensity((int)x, (int)y, zi + 1); | |
| res.z = (zd1 - zd0) * (1.0f - zf) + (zd2 - zd1) * zf; // lerp | |
| if (res != Vector3.zero){ | |
| res.Normalize(); | |
| res = -res; | |
| } | |
| return res; | |
| }*/ | |
| float GetInterpolatedDensity(float x, float y, float z){ | |
| int xFloor = Mathf.FloorToInt(x); | |
| int yFloor = Mathf.FloorToInt(y); | |
| int zFloor = Mathf.FloorToInt(z); | |
| int xCeil = xFloor + 1; | |
| int yCeil = yFloor + 1; | |
| int zCeil = zFloor + 1; | |
| float V000 = GetDensity(new Vec3i(xFloor,yFloor,zFloor)); | |
| float V100 = GetDensity(new Vec3i(xCeil,yFloor,zFloor)); | |
| float V010 = GetDensity(new Vec3i(xFloor,yCeil,zFloor)); | |
| float V001 = GetDensity(new Vec3i(xFloor,yFloor,zCeil)); | |
| float V101 = GetDensity(new Vec3i(xCeil,yFloor,zCeil)); | |
| float V011 = GetDensity(new Vec3i(xFloor,yCeil,zCeil)); | |
| float V110 = GetDensity(new Vec3i(xCeil,yCeil,zFloor)); | |
| float V111 = GetDensity(new Vec3i(xCeil,yCeil,zCeil)); | |
| return TrilinearInterpolation(V000, V100, V010, V001, V101, V011, V110, V111, new Vector3(x-xFloor, y-yFloor,z-zFloor)); | |
| } | |
| // based on http://paulbourke.net/miscellaneous/interpolation/ | |
| float TrilinearInterpolation(float V000, float V100, float V010, float V001, float V101, float V011, float V110, float V111, Vector3 value){ | |
| return V000 * (1 - value.x) * (1 - value.y) * (1 - value.z) + | |
| V100 * (1 - value.y) * (1 - value.z) + | |
| V010 * (1 - value.x) * value.y * (1 - value.z) + | |
| V001 * (1 - value.x) * (1 - value.y) * value.z + | |
| V101 * value.x * (1 - value.y) * value.z + | |
| V011 * (1 - value.x) * value.y * value.z + | |
| V110 * value.x * value.y * (1 - value.z) + | |
| V111 * value.x * value.y * value.z; | |
| } | |
| public int March(GetDensityFn GetDensity, float isolevel, List<Vector3> vertexPositions, List<Vector3> normals, Vec3i position, Vector3 offset){ | |
| int x = position.x; | |
| int y = position.y; | |
| int z = position.z; | |
| this.GetDensity = GetDensity; | |
| float f000 = GetDensity(new Vec3i(x+0, y+0, z+0)); | |
| float f001 = GetDensity(new Vec3i(x+0, y+0, z+1)); | |
| float f010 = GetDensity(new Vec3i(x+0, y+1, z+0)); | |
| float f011 = GetDensity(new Vec3i(x+0, y+1, z+1)); | |
| float f100 = GetDensity(new Vec3i(x+1, y+0, z+0)); | |
| float f101 = GetDensity(new Vec3i(x+1, y+0, z+1)); | |
| float f110 = GetDensity(new Vec3i(x+1, y+1, z+0)); | |
| float f111 = GetDensity(new Vec3i(x+1, y+1, z+1)); | |
| gc.val[0] = f000; | |
| gc.val[1] = f100; | |
| gc.val[2] = f101; | |
| gc.val[3] = f001; | |
| gc.val[4] = f010; | |
| gc.val[5] = f110; | |
| gc.val[6] = f111; | |
| gc.val[7] = f011; | |
| return Polygonise(gc, isolevel, vertexPositions, normals, position + offset); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment