From 426dd88d29c953f0fc8a6c632f254017f1f8da7b Mon Sep 17 00:00:00 2001 From: unknown <> Date: Thu, 20 Jul 2023 10:46:01 -0400 Subject: [PATCH] Fix degenerate normals --- src/main/java/electrosphere/FluidSim.java | 2 +- src/main/java/electrosphere/Main.java | 2 +- src/main/java/electrosphere/render/Mesh.java | 1095 +++++++++++++++++- 3 files changed, 1095 insertions(+), 4 deletions(-) diff --git a/src/main/java/electrosphere/FluidSim.java b/src/main/java/electrosphere/FluidSim.java index e5feb9a..c5a1b1c 100644 --- a/src/main/java/electrosphere/FluidSim.java +++ b/src/main/java/electrosphere/FluidSim.java @@ -79,7 +79,7 @@ public class FluidSim { for(int k = 0; k < DIM; k++){ if( Math.abs(16 - i) < 4 && - Math.abs(8 - j) < 4 && + Math.abs(j) < 4 && Math.abs(10 - k) < 4 ){ xf.put(1); diff --git a/src/main/java/electrosphere/Main.java b/src/main/java/electrosphere/Main.java index b269164..150ab15 100644 --- a/src/main/java/electrosphere/Main.java +++ b/src/main/java/electrosphere/Main.java @@ -32,7 +32,7 @@ public class Main { lastTime = System.currentTimeMillis(); sim.simulate(i,0.001f); time = time + (System.currentTimeMillis() - lastTime); - Mesh.remesh(sim); + Mesh.remesh(sim,i); GLFWContext.redraw(); i++; if(i == 1000){ diff --git a/src/main/java/electrosphere/render/Mesh.java b/src/main/java/electrosphere/render/Mesh.java index bda1c20..fe0ec27 100644 --- a/src/main/java/electrosphere/render/Mesh.java +++ b/src/main/java/electrosphere/render/Mesh.java @@ -198,10 +198,1031 @@ public class Mesh { GL45.glUniformMatrix4fv(GL45.glGetUniformLocation(shaderProgram, "model"), false, model.get(new float[16])); } - public static void remesh(FluidSim sim){ + static final double[] badFloats = new double[]{ + -0.018000, +-0.167732, +-0.034520, +-0.268217, +-0.404129, +-0.329857, +-0.175737, +-0.145785, +-0.149072, +-0.038037, +0.000000, +0.000000, +0.038791, +0.005947, +0.054136, +0.131334, +0.041070, +0.219556, +0.013012, +-0.000474, +-0.003495, +-0.007041, +-0.011935, +-0.019575, +-0.196675, +-0.034183, +-0.275531, +0.073701, +0.000000, +0.131132, +0.173321, +0.366712, +-0.443129, +-0.297482, +-0.133390, +-0.133561, +-0.133382, +-0.092817, +0.000000, +0.076602, +0.332903, +0.344484, +0.024823, +0.010065, +0.001889, +-0.001913, +-0.006263, +-0.009909, +-0.014340, +-0.022077, +-0.219929, +-0.037611, +-0.328364, +0.000000, +0.155105, +0.239719, +0.312616, +0.364682, +-0.407077, +-0.225081, +-0.181973, +0.189571, +0.000000, +-0.098907, +0.000000, +0.072802, +0.326937, +0.024930, +0.010063, +0.002380, +-0.003024, +-0.006717, +-0.008438, +-0.010542, +-0.015266, +-0.024102, +-0.212639, +-0.035003, +-0.277600, +0.368061, +0.432556, +0.436311, +-0.380157, +-0.119563, +-0.111123, +0.000000, +0.000000, +0.213821, +0.000000, +0.413332, +0.053989, +0.324272, +0.021295, +0.008637, +0.000263, +-0.004780, +-0.006487, +-0.007215, +-0.007749, +-0.009837, +-0.016093, +-0.026589, +-0.253034, +0.512641, +0.488769, +-0.480608, +-0.198494, +0.000000, +0.225807, +0.000000, +0.436726, +0.043122, +0.271077, +0.017983, +0.005864, +-0.002037, +-0.005304, +-0.005656, +-0.006245, +-0.006233, +-0.006318, +-0.010326, +-0.019034, +-0.231762, +-0.033760, +-0.344924, +0.571839, +0.470798, +-0.300783, +0.000000, +0.191491, +0.000000, +0.459070, +0.068636, +0.408031, +0.368998, +0.030833, +0.015313, +0.003982, +-0.002728, +-0.004762, +-0.005201, +-0.005699, +-0.005469, +-0.004502, +-0.007140, +-0.014826, +-0.031157, +-0.301593, +0.533975, +0.533483, +0.469790, +-0.290873, +0.000000, +0.283629, +0.000000, +0.076956, +0.357002, +0.029194, +0.013023, +0.004027, +-0.002150, +-0.004331, +-0.004951, +-0.005318, +-0.005488, +-0.003910, +-0.005899, +-0.013239, +-0.029597, +-0.309455, +0.579415, +0.536260, +-0.291285, +0.000000, +0.251015, +0.000000, +0.072413, +0.357138, +0.025313, +0.011642, +0.004667, +-0.001054, +-0.003693, +-0.004300, +-0.004821, +-0.005949, +-0.004510, +-0.006221, +-0.014187, +-0.029782, +-0.305493, +0.581444, +0.536346, +-0.282511, +0.000000, +0.252069, +0.000000, +0.068788, +0.355483, +0.022685, +0.010894, +0.005060, +0.000040, +-0.002243, +-0.003605, +-0.004750, +-0.006146, +-0.005269, +-0.007333, +-0.015962, +-0.030888, +-0.296169, +0.582632, +0.536954, +-0.274567, +0.000000, +0.252103, +0.000000, +0.066128, +0.352637, +0.021578, +0.010707, +0.005483, +0.000911, +-0.001477, +-0.003854, +-0.004975, +-0.006008, +-0.005478, +-0.007961, +-0.017182, +-0.032008, +-0.290503, +0.583358, +0.537797, +-0.271735, +0.000000, +0.251796, +0.000000, +0.064248, +0.350713, +0.021487, +0.011018, +0.005796, +0.001492, +-0.001446, +-0.004609, +-0.005432, +-0.005788, +-0.005414, +-0.008082, +-0.017619, +-0.032598, +-0.289137, +0.583433, +0.538447, +-0.271427, +0.000000, +0.251606, +0.000000, +0.075279, +0.351757, +0.023928, +0.012115, +0.006575, +0.002317, +-0.001037, +-0.004058, +-0.006023, +-0.005324, +-0.005906, +-0.006663, +-0.015873, +-0.029480, +-0.288718, +0.583416, +0.538438, +-0.270202, +0.000000, +0.251179, +0.000000, +-0.707107, +-0.609691, +-0.534279, +-0.312016, +-0.314372, +-0.202355, +-0.168835, +-0.148586, +-0.035095, +-0.060746, +-0.018168, +-0.003235, +-0.006578, +-0.015891, +-0.175989, +-0.058824, +-0.243817, +-0.314923, +-0.373025, +-0.234019, +-0.341931, +-0.278721, +-0.108869, +-0.169309, +0.000000, +0.000000, +-0.464408, +-0.417410, +-0.382316, +-0.402162, +-0.301695, +-0.316724, +-0.169985, +-0.202919, +-0.119212, +-0.138991, +-0.395962, +-0.316815, +-0.280960, +-0.296943, +-0.204948, +-0.125533, +-0.069137, +-0.022660, +-0.033534, +-0.020315, +-0.087644, +-0.258042, +-0.231446, +-0.121655, +-0.082574, +-0.055176, +-0.037919, +-0.104150, +-0.080524, +-0.129350, +-0.168287, +-0.157452, +-0.052999, +0.000000, +-0.126392, +-0.139212, +-0.175566, +-0.148839, +-0.084813, +0.000000, +-0.406294, +-0.338302, +-0.423234, +-0.444802, +-0.331531, +-0.293501, +-0.363346, +-0.283406, +-0.272504, +-0.240522, +-0.107328, +-0.114170, +-0.064533, +-0.053806, +-0.123257, +-0.113460, +-0.109624, +-0.214561, +-0.199608, +-0.172652, +-0.134810, +-0.142858, +-0.094800, +-0.114297, +-0.042854, +0.000000, +-0.086405, +0.000000, +-0.142424, +-0.098170, +0.000000, +0.000000, +-0.337920, +-0.303188, +-0.031983, +0.000000, +-0.137537, +-0.249734, +-0.314415, +-0.159726, +-0.223788, +-0.099384, +-0.100844, +-0.038531, +-0.017544, +-0.014326, +-0.019552, +-0.118278, +-0.032677, +-0.184731, +-0.340128, +-0.304856, +-0.198917, +-0.117018, +-0.113405, +-0.134894, +-0.135819, +-0.026373, +0.000000, +0.000000, +-0.067051, +-0.014953, +0.000000, +-0.005772, +-0.081030, +-0.003931, +0.010439, +0.009098, +-0.000979, +-0.005016, +-0.009917, +-0.018029, +-0.167774, +-0.034455, +-0.268567, +-0.403480, +-0.329246, +-0.175508, +-0.144101, +-0.146419, +-0.035732, +0.000000, +0.000000, +0.039687, +0.006877, +0.050828, +0.126469, +0.042130, +0.220615, +0.013450, +-0.000186, +-0.003363, +-0.007046, +-0.011998, +-0.019600, +-0.196217, +-0.034000, +-0.274693, +0.074873, +0.000000, +0.134010, +0.178279, +0.366220, +-0.442187, +-0.297784, +-0.132200, +-0.129306, +-0.131791, +-0.065941, +0.000000, +0.077162, +0.333899, +0.345473, +0.025300, +0.010401, +0.002052, +-0.001914, +-0.006312, +-0.009951, +-0.014327, +-0.021974, +-0.219037, +-0.037170, +-0.327182, +0.000000, +0.158362, +0.243386, +0.318651, +0.367928, +-0.406799, +-0.234304, +-0.070347, +-0.064678, +0.000000, +0.000000, +0.190637, +0.000000, +0.073120, +0.327314, +0.025301, +0.010217, +0.002395, +-0.003101, +-0.006745, +-0.008437, +-0.010496, +-0.015130, +-0.023873, +-0.211788, +-0.034571, +-0.276605, +0.372852, +0.435053, +0.438724, +-0.380379, +-0.130109, +0.000000, +0.212506, +0.000000, +0.414904, +0.054096, +0.324428, +0.021488, +0.008659, +0.000204, +-0.004802, +-0.006475, +-0.007195, +-0.007710, +-0.009715, +-0.015899, +-0.026305, +-0.252293, +0.514157, +0.488563, +-0.480304, +-0.199191, +0.000000, +0.225044, +0.000000, +0.435370, +0.043128, +0.271094, +0.018051, +0.005853, +-0.002042, +-0.005285, +-0.005645, +-0.006221, +-0.006185, +-0.006225, +-0.010188, +-0.018857, +-0.231048, +-0.033315, +-0.343979, +0.571701, +0.470073, +-0.300500, +0.000000, +0.191295, +0.000000, +0.458156, +0.068252, +0.407288, +0.368600, +0.030782, +0.015324, +0.004006, +-0.002667, +-0.004743, +-0.005224, +-0.005676, +-0.005404, +-0.004409, +-0.007053, +-0.014733, +-0.030762, +-0.300654, +0.533487, +0.532563, +0.469294, +-0.290191, +0.000000, +0.283314, +0.000000, +0.076314, +0.356186, +0.029119, +0.013034, +0.004092, +-0.002090, +-0.004340, +-0.004990, +-0.005304, +-0.005416, +-0.003794, +-0.005818, +-0.013189, +-0.029233, +-0.308485, +0.578557, +0.535070, +-0.290566, +0.000000, +0.250595, +0.000000, +0.071724, +0.356216, +0.025229, +0.011682, +0.004711, +-0.001034, +-0.003721, +-0.004322, +-0.004814, +-0.005894, +-0.004365, +-0.006112, +-0.014126, +-0.029403, +-0.304434, +0.580369, +0.535021, +-0.281689, +0.000000, +0.251640, +0.000000, +0.068082, +0.354468, +0.022613, +0.010923, +0.005074, +0.000030, +-0.002260, +-0.003605, +-0.004739, +-0.006114, +-0.005116, +-0.007192, +-0.015868, +-0.030476, +-0.294994, +0.581370, +0.535521, +-0.273698, +0.000000, +0.251675, +0.000000, +0.065422, +0.351571, +0.021509, +0.010705, +0.005483, +0.000905, +-0.001480, +-0.003842, +-0.004963, +-0.005983, +-0.005327, +-0.007796, +-0.017061, +-0.031572, +-0.289325, +0.581952, +0.536315, +-0.270927, +0.000000, +0.251368, +0.000000, +0.063545, +0.349628, +0.021416, +0.011001, +0.005782, +0.001492, +-0.001442, +-0.004588, +-0.005417, +-0.005767, +-0.005262, +-0.007906, +-0.017484, +-0.032150, +-0.288028, +0.581958, +0.536956, +-0.270671, +0.000000, +0.251179, +0.000000, +0.074384, +0.350675, +0.023842, +0.012093, +0.006561, +0.002312, +-0.001032, +-0.004042, +-0.005998, +-0.005313, +-0.005789, +-0.006460, +-0.015749, +-0.029120, +-0.287637, +0.581927, +0.536948, +-0.269457, +0.000000, +0.250755, +0.000000, +-0.707107, +-0.609337, +-0.534763, +-0.312394, +-0.310026, +-0.202502, +-0.164767, +-0.144594, +-0.036986, +-0.060648, +-0.022643, +-0.006009, +-0.016546, +-0.020663, +-0.189685, +-0.067713, +-0.253065, +-0.325253, +-0.365646, +-0.237307, +-0.320501, +-0.262711, +-0.101391, +-0.158928, +0.000000, +0.000000, +-0.453941, +-0.405876, +-0.381332, +-0.401496, +-0.289610, +-0.307137, +-0.165874, +-0.197375, +-0.119796, +-0.139635, +-0.387245, +-0.306199, +-0.281258, +-0.289695, +-0.197717, +-0.124005, +-0.067851, +-0.022977, +-0.035196, +-0.022723, +-0.096255, +-0.255117, +-0.221126, +-0.116896, +-0.080584, +-0.055462, +-0.038972, +-0.108726, +-0.084312, +-0.127447, +-0.167202, +-0.150169, +-0.051255, +0.000000, +-0.132815, +-0.138552, +-0.167928, +-0.140004, +-0.079981, +0.000000, +-0.447442, +-0.405145, +-0.279765, +-0.308282, +-0.376103, +-0.361096, +-0.354694, +-0.320337, +-0.292019, +-0.353734, +-0.282068, +-0.266847, +-0.233328, +-0.102188, +-0.109615, +-0.062030, +-0.052969, +-0.124319, +-0.113367, +-0.114000, +-0.214698, +-0.201925, +-0.173516, +-0.135534, +-0.139440, +-0.090348, +-0.108313, +-0.040526, +0.000000, +-0.081942, +0.000000, +-0.135002, +-0.075693, +0.000000, +0.000000, +-0.029055, +0.000000, +-0.132175, +-0.271183, +-0.278238, +-0.161898, +-0.174536, +-0.091563, +-0.094251, +-0.034464, +-0.015814, +-0.013873, +-0.019339, +-0.117407, +-0.032349, +-0.183659, +-0.340039, +-0.304628, +-0.198892, +-0.115657, +-0.111445, +-0.130273, +-0.131076, +-0.023190, +0.000000, +0.000000, +-0.068200, +-0.015742, +0.000000, +-0.051728, +-0.080379, +-0.027413, +0.003106, +0.030335, +0.013485, +0.010201, +-0.000268, +-0.004873, +-0.009897, +-0.018058, +-0.167773, +-0.034387, +-0.268859, +0.035122, +-0.402769, +-0.328637, +-0.175268, +-0.142379, +-0.143912, +-0.033652, +0.000000, +0.000000, +0.040424, +-0.030352, +0.131556, +0.043146, +0.221579, +0.013864, +0.000099, +-0.003237, +-0.007053, +-0.012060, +-0.019620, +-0.195744, +-0.033813, +-0.273835, +0.075811, +0.000000, +0.106391, +0.247250, +0.326729, +-0.441240, +-0.298083, +-0.131033, +-0.129604, +-0.130252, +-0.064848, +0.000000, +0.077673, +0.334831, +0.346395, +0.025768, +0.010729, +0.002209, +-0.001918, +-0.006362, +-0.009990, +-0.014309, +-0.021865, +-0.218143, +-0.036733, +-0.326005, +0.000000, +0.161321, +0.246712, +0.324331, +0.370975, +-0.406531, +-0.235363, +-0.069792, +-0.064842, +0.000000, +0.000000, +0.191568, +0.000000, +0.073410, +0.327666, +0.025660, +0.010364, +0.002406, +-0.003175, +-0.006769, +-0.008434, +-0.010449, +-0.014992, +-0.023643, +-0.210956, +-0.034148, +-0.275636, +0.377321, +0.437392, +0.440900, +-0.380594, +-0.130717, +0.000000, +0.211201, +0.000000, +0.416237, +0.054188, +0.324561, +0.021670, +0.008676, +0.000147, +-0.004820, +-0.006461, +-0.007175, +-0.007668, +-0.009593, +-0.015704, +-0.026026, +-0.251562, +0.515534, +0.488259, +-0.479980, +-0.199870, +0.000000, +0.224329, +0.000000, +0.434004, +0.043120, +0.271094, +0.018113, +0.005844, +-0.002043, +-0.005263, +-0.005634, +-0.006195, +-0.006134, +-0.006132, +-0.010051, +-0.018686, +-0.230334, +-0.032878, +-0.343021, +0.571528, +0.469342, +-0.300201, +0.000000, +0.191107, +0.000000, +0.457260, +0.067854, +0.406533, +0.368184, +0.030725, +0.015331, +0.004031, +-0.002604, +-0.004723, +-0.005248, +-0.005650, +-0.005336, +-0.004315, +-0.006969, +-0.014643, +-0.030376, +-0.299708, +0.532971, +0.531598, +0.468777, +-0.289499, +0.000000, +0.282992, +0.000000, +0.075661, +0.355358, +0.029038, +0.013043, +0.004154, +-0.002031, +-0.004346, +-0.005028, +-0.005287, +-0.005341, +-0.003678, +-0.005737, +-0.013142, +-0.028877, +-0.307512 + }; + + public static void remesh(FluidSim sim, long frame){ //generate verts TerrainChunkData data = generateTerrainChunkData(sim.getData()); + // for(int i = 0; i < data.normals.size(); i+=3){ + // // if(i > 100 && data.normals.get(i+1) < 0.7){ + // data.normals.set(i+1, 1f); + // data.normals.set(i+2, 0f); + // System.out.printf("%.2f %.2f %.2f,\n",data.normals.get(i+0),data.normals.get(i+1),data.normals.get(i+2)); + // // } + // } + // //Buffer data to GPU @@ -612,6 +1633,37 @@ public class Mesh { (byte)0x13 }; + //allows reverse lookup where vertList index returns the points that vert is concerned with + static final int[][] vertIndexInverseTable = new int[][]{ + {0,1}, + {1,2}, + {2,3}, + {3,0}, + {4,5}, + {5,6}, + {6,7}, + {7,4}, + {0,4}, + {1,5}, + {2,6}, + {3,7}, + }; + + //Lookup for the direction vectors for every vertex pair + static final Vector3f[] indexVectorLookupTable = new Vector3f[]{ + new Vector3f(0,0,1), + new Vector3f(1,0,0), + new Vector3f(0,0,-1), + new Vector3f(-1,0,0), + new Vector3f(0,0,1), + new Vector3f(1,0,0), + new Vector3f(0,0,-1), + new Vector3f(-1,0,0), + new Vector3f(0,1,0), + new Vector3f(0,1,0), + new Vector3f(0,1,0), + new Vector3f(0,1,0), + }; protected static int polygonize( @@ -721,6 +1773,36 @@ public class Mesh { Vector3f v = verts.get(index2).sub(verts.get(index1), new Vector3f()); Vector3f n = new Vector3f(u.y * v.z - u.z * v.y, u.z * v.x - u.x * v.z, u.x * v.y - u.y * v.x).normalize(); + // Vector3f alignmentVector = new Vector3f(); + + // for(int j = 0; j < 3; j++){ + // int[] points = vertIndexInverseTable[triTable[cubeIndex][i+j]]; + // float factor = 1.0f / Math.abs(points[1] - points[0]); + // //if point two is greater than point one, flip vector + // if(points[0] < points[1]){ + // alignmentVector.add( + // -indexVectorLookupTable[triTable[cubeIndex][i+j]].x * factor, + // -indexVectorLookupTable[triTable[cubeIndex][i+j]].y * factor, + // -indexVectorLookupTable[triTable[cubeIndex][i+j]].z * factor + // ); + // } else { + // alignmentVector.add( + // indexVectorLookupTable[triTable[cubeIndex][i+j]].z * factor, + // indexVectorLookupTable[triTable[cubeIndex][i+j]].y * factor, + // indexVectorLookupTable[triTable[cubeIndex][i+j]].z * factor + // ); + // } + // } + // n.x = 0; + // n.y = 1; + // // n.z = 0; + // n.normalize(); + // // n.set(alignmentVector.normalize().mul(-1)); + // // if(n.dot(alignmentVector.normalize()) >= 0){ + // // n.add(alignmentVector.normalize()).div(2.0f); + // // } + + //for each vertex, average the new normal with the normals that are already there @@ -889,7 +1971,16 @@ public class Mesh { private static Vector3f averageNormals(Vector3f normal0, float proportion0, Vector3f normal1, float proportion1){ Vector3f rVal = new Vector3f(normal0); - rVal = rVal.mul(proportion0).add(new Vector3f(normal1).mul(proportion1)); + rVal = rVal.mul(proportion0).add(new Vector3f(normal1).mul(proportion1)).normalize(); + if(Float.isNaN(rVal.x)){ + rVal.x = 0; + } + if(Float.isNaN(rVal.y)){ + rVal.y = 0; + } + if(Float.isNaN(rVal.z)){ + rVal.z = 0; + } return rVal; }