captured a little fly through video for y'all. i can seriously just fly around this one chunk for 10-15 mins at a time enjoying the aesthetics :D
debating what i wanna do with grass in my engine. atm i have a block shader, and a model shader. i feel like i could efficiently implement shell textured grass by making a shell texturing shader, but i also don't want to balloon the number of different shaders i need to render all my terrain 🤔
i could just use the model shader, but it becomes a pain in the ass to implement shell textured terrain then
i could try and combine it with the block shader but they both do really different things
hmm if i want to add bits to the shell texturing so it doesn't look bad viewed side-on i kinda have to go the model route
though i figured out i can get away with only 6 variations to get all the edge transitions 🤔 that could be doable if a bit annoying
i'm overthinking the grass thing so i've made the textures required to make the shells for a 16-tile transition and i'll just generate the model for each of those 16 and implement them in the engine and move on so i don't wind up blocked by choice paralysis
if i want i can always just change it later
here it is compared to my style guide image. how did i do, chat?
i probably wanna pull the grass away from the edge a bit more because it obscures the outlines, but i'm pretty happy with this overall
chunks connect properly now! with bonus shot of the sprawling cave systems beneath the surface
i made a staged chunk generation system where chunks can request their neighbors be generated but only up to a certain stage, which keeps the generation from going infinitely in all directions, because the requested stage must always be lower than the chunk's current stage of generation
@eniko Another headache appears when you allow voxels to be mutated (i.e: breaking/adding blocks). Now a mutation can invalidate meshing work that's currently in-flight, leading to a 'missed' block change that's not reflect in the mesh. We solved this by incrementing a per-chunk counter every time a mutation occurs. If the result of the generator's work doesn't match the most recent counter, we spawn another generator to ensure we dont miss the change.
It's a proper distributed systems problem!
@jsbarretto it's interesting how aligned we are in our approaches because i was thinking of doing that XD
honestly makes me feel like doing all this by my lonesome a bit of a fool's errand but... :')