@@ -19,14 +19,50 @@ public class MetaballShape : MeshXShape
1919
2020 private int vertIndex ;
2121
22+ public bool scheduleRangeDatasRecompute ;
23+
24+ private class RangeData
25+ {
26+ public float effectiveRange ;
27+ public float3 position ;
28+ }
29+
30+ private List < RangeData > rangeDatas = new ( ) ;
31+
2232 public MetaballShape ( MeshX mesh ) : base ( mesh )
2333 {
2434 }
2535
36+ private void ComputeRangeData ( )
37+ {
38+ if ( rangeDatas . Count != Points . Count )
39+ {
40+ rangeDatas . Clear ( ) ;
41+ for ( int i = 0 ; i < Points . Count ; i ++ )
42+ rangeDatas . Add ( new RangeData ( ) ) ;
43+ }
44+ int j = 0 ;
45+ foreach ( var point in Points ) // reading from data model here might be bad?
46+ {
47+ var data = rangeDatas [ j ] ;
48+ if ( point == null || point . IsRemoved )
49+ {
50+ data . effectiveRange = 0 ;
51+ }
52+ else
53+ {
54+ data . effectiveRange = point . Radius . Value + point . Strength . Value ; // this formula may need tweaking?
55+ data . position = OriginSlot . GlobalPointToLocal ( point . Slot . GlobalPosition ) ;
56+ }
57+ j ++ ;
58+ }
59+ scheduleRangeDatasRecompute = false ;
60+ }
61+
2662 public float SampleField ( float3 point )
2763 {
2864 float value = 0 ;
29- foreach ( var metaball in Points )
65+ foreach ( var metaball in Points ) // reading from data model here might be bad?
3066 {
3167 if ( metaball == null || metaball . IsRemoved ) continue ;
3268 value += metaball . GetValue ( point , OriginSlot ) ;
@@ -149,6 +185,10 @@ private float3 InterpolateVertex(float3[] corners, float[] values, int edgeIndex
149185
150186 private void Generate ( MeshX mesh )
151187 {
188+ // might be better to do this in PrepareAssetUpdateData?
189+ if ( scheduleRangeDatasRecompute )
190+ ComputeRangeData ( ) ;
191+
152192 float3 step = FieldSize / Resolution ;
153193
154194 for ( int x = 0 ; x < Resolution - 1 ; x ++ )
@@ -158,6 +198,19 @@ private void Generate(MeshX mesh)
158198 for ( int z = 0 ; z < Resolution - 1 ; z ++ )
159199 {
160200 float3 cubePos = new float3 ( x , y , z ) * step - FieldSize * 0.5f ;
201+
202+ bool anyIn = false ;
203+ foreach ( var rangeData in rangeDatas )
204+ {
205+ if ( rangeData . effectiveRange == 0 ) continue ;
206+ if ( MathX . DistanceSqr ( cubePos , rangeData . position ) < MathX . Pow ( rangeData . effectiveRange , 2f ) )
207+ {
208+ anyIn = true ;
209+ break ;
210+ }
211+ }
212+ if ( ! anyIn ) continue ;
213+
161214 MarchCube ( cubePos , step ) ;
162215 }
163216 }
0 commit comments