     water_height = ground_height;
     velocity = max(velocity,vec4(0));
   }
+
+
+    float biome = heightmap.b;
+
+
+    
+
+
+
+
+        //char to dirt [0,1] // very slowly fades to dirt over time
+    //dry dirt to wet dirt[1,2] //fades to dry over time
+    //light grass to heavy grass[2,3] //grows fairly quickly, spreads only into wet dirt > 1.5f
+    //3-4 left blank for boundary
+    //light fire to heavy fire[4,5] //
+    //heavy fire to char [5,6]
+
+    //dirt values control color
+    //grass values control grass coverage/color
+    //grass slowly grows from 1 to 2 by default
+    //if a dirt pixel is adjacent to a grass pixel, dirt will slowly progress from .5 to 1 and become grass itself
+
+    //progress to catching fire needs to be stored somehow...
+    //maybe once a pixel is within fire range, it slowly rng progresses from 3 to 4    
+    //grass tile will only catch fire if fire is > 3.5 on the other pixel
+
+    //currently we are limited only to grass growing if the soil is 'very wet'
+    //and as we are in the recieve seeds range, the soil gets wetter automatically and only shows grass once it passes the 2.f threshold
+    
+    
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    //used to mask biome iteration steps
+    float is_char_to_dirt = in_range(biome,0.f,1.f);
+    float is_soil = in_range(biome,1.f,2.f);
+    float is_very_wet_soil = in_range(biome,1.5f,2.f);
+    float is_grass = in_range(biome,2.f,3.f);
+    float is_heavy_grass = in_range(biome,2.25f,3.f);
+    float on_fire = in_range(biome,4.f,5.f);
+    float fire_is_fading = in_range(biome,5.f,6.f);
+  float low_chance_true = float(random(vec2(time))<0.001f);
 
   //left
   ivec2 sample_pixel = ivec2(p.x-1,p.y);

    return step(x,min_edge)*step(0,-(max_edge-x));
}

vec4 calc_contribution2(vec4 this_pixel,vec4 other_pixel, float velocity_into_this_pixel)
{
    float water_height = this_pixel.r;
