using Godot; using System; using Rokojori.Extensions; namespace Rokojori { /** How a HeightMapGeneratorLayer combines with what is already in the map. All three are native BlitMaterial blend modes, so a layer costs one content blit into a scratch buffer plus one hardware-blended blit onto the map - no ping-pong buffer and no accumulation read anywhere. The int values are passed to HeightMapShape.gdshader as shape_blend_mode, which decides whether the falloff goes into RGB (Add/Subtract, premultiplied so the hardware just sums it) or into alpha (Replace, so Mix crossfades to the layer's height across the falloff). Do not renumber without updating the shader. */ public enum HeightMapBlendMode { /** Adds the layer's height on top of what is underneath. The default, and the one that makes a stack of layers read as constructive. */ Add = 0, /** Subtracts it - craters, trenches, cut-outs. */ Subtract = 1, /** Overwrites with the layer's height, fading back to what is underneath across the falloff. The layer's height value is an absolute world height here, not a delta - plateaus and flattened build sites. */ Replace = 2 } public static class HeightMapBlendModeX { public static BlitMaterial.BlendModeEnum ToBlitBlendMode( this HeightMapBlendMode mode ) { switch ( mode ) { case HeightMapBlendMode.Add: return BlitMaterial.BlendModeEnum.Add; case HeightMapBlendMode.Subtract: return BlitMaterial.BlendModeEnum.Sub; case HeightMapBlendMode.Replace: return BlitMaterial.BlendModeEnum.Mix; } return BlitMaterial.BlendModeEnum.Add; } /** True when the layer's height value means "this world height", false when it means "this much height on top of what is there". */ public static bool IsAbsolute( this HeightMapBlendMode mode ) { return mode == HeightMapBlendMode.Replace; } } }