authority/modules/terrain/terrain_modifier.h

68 lines
1.7 KiB
C++

#pragma once
#include "core/object/object.h"
#include "core/variant/variant.h"
#include "macros.h"
#include "scene/3d/marker_3d.h"
#include "scene/resources/curve.h"
class TerrainModifier : public Marker3D {
GDCLASS(TerrainModifier, Marker3D);
static void _bind_methods();
public:
GDENUM(BlendMode, Add, Subtract, Override);
protected:
void _notification(int what);
void changed();
void changed_deferred();
float blend(float under, float over);
public:
virtual float evaluate_at(Vector2 world_coordinate, float before);
private:
float blend_distance{ 10.0 };
BlendMode blend_mode{ Add };
Vector3 thread_safe_global_position{};
public:
Vector3 get_thread_safe_global_position() const;
void set_blend_distance(float value);
float get_blend_distance() const;
void set_blend_mode(BlendMode mode);
BlendMode get_blend_mode() const;
static String const sig_changed;
};
MAKE_TYPE_INFO(TerrainModifier::BlendMode, Variant::INT);
class TerrainModifierDistance : public TerrainModifier {
GDCLASS(TerrainModifierDistance, TerrainModifier);
static void _bind_methods();
void curves_changed();
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:
Mutex mtx{};
Ref<Curve> distance_weight_curve{};
Ref<Curve> distance_height_curve{};
bool safe_curves_dirty{ false };
Ref<Curve> safe_weight_curve{};
Ref<Curve> safe_height_curve{};
public:
void set_distance_weight_curve(Ref<Curve> curve);
Ref<Curve> get_distance_weight_curve() const;
void set_distance_height_curve(Ref<Curve> curve);
Ref<Curve> get_distance_height_curve() const;
};