authority/modules/terrain/terrain_modifier.h

71 lines
1.6 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"
#include <cmath>
class Terrain;
class TerrainModifier : public Marker3D {
GDCLASS(TerrainModifier, Marker3D);
static void _bind_methods();
protected:
void _notification(int what);
float blend(float under, float over);
void push_changed(Rect2 bounds);
public:
virtual float evaluate_at(Vector2 world_coordinate, float before);
private:
float blend_distance{ 10.0 };
Vector3 thread_safe_global_position{};
Terrain *terrain{ nullptr };
Rect2 bounds{ { -INFINITY, -INFINITY }, { INFINITY, INFINITY } };
protected:
GET_SET_FNS(Rect2, bounds);
public:
Vector3 get_thread_safe_global_position() const;
void set_blend_distance(float value);
float get_blend_distance() const;
GET_SET_FNS(Terrain *, terrain);
};
struct SharedMutex {
void lock_shared();
void unlock_shared();
void lock_exclusive();
void unlock_exclusive();
private:
Mutex lock{};
int shared_count{};
};
class TerrainModifierDistance : public TerrainModifier {
GDCLASS(TerrainModifierDistance, TerrainModifier);
static void _bind_methods();
void curves_changed();
bool update_bounds();
protected:
void _notification(int what);
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:
SharedMutex lock{};
Ref<Curve> distance_weight_curve{};
public:
void set_distance_weight_curve(Ref<Curve> curve);
Ref<Curve> get_distance_weight_curve() const;
};