#pragma once #include "core/object/object.h" #include "core/variant/variant.h" #include "macros.h" #include "scene/3d/node_3d.h" #include "scene/resources/curve.h" class TerrainModifier : public Node3D { GDCLASS(TerrainModifier, Node3D); static void _bind_methods(); public: GDENUM(BlendMode, Add, Subtract, Override); protected: float blend(float under, float over, float weight); public: virtual float evaluate_at(Vector2 world_coordinate, float before); private: float blend_distance{ 1.0 }; BlendMode blend_mode{ Add }; public: GET_SET_FNS(float, blend_distance); GET_SET_FNS(BlendMode, blend_mode); }; MAKE_TYPE_INFO(TerrainModifier::BlendMode, Variant::INT); class TerrainModifierDistance : public TerrainModifier { GDCLASS(TerrainModifierDistance, TerrainModifier); static void _bind_methods(); protected: virtual float distance_at(Vector2 const &world_coordinate); public: float evaluate_at(Vector2 world_coordinate, float before) override; PackedStringArray get_configuration_warnings() const override; private: Ref distance_weight_curve{}; Ref distance_height_curve{}; public: GET_SET_FNS_EX(Ref, distance_weight_curve, update_configuration_warnings()); GET_SET_FNS_EX(Ref, distance_height_curve, update_configuration_warnings()); };