Program Listing for File honeycomb_honey.h

Return to documentation for file (src/honeycomb/honeycomb_honey.h)

#pragma once

#include <limits>   // for numeric_limits
#include <memory>   // for unique_ptr
#include <utility>  // for pair

#include "core/general_utility.h"  // for MeshProcessor
#include "core/hex_mesh.h"         // for HexMesh, HexMeshParams
#include "core/tile_mesh.h"        // for TileMesh
#include "misc/types.h"            // for GroupedMeshVertices
#include "tal/noise.h"             // for FastNoiseLite
#include "tal/reference.h"         // for Ref

namespace sota {
class Hexagon;

struct HoneycombHoneyMeshParams {
  HexMeshParams hex_mesh_params;
  Ref<FastNoiseLite> noise{nullptr};
  int max_level{0};
  float fill_delta{0};
  float min_offset{0.0};
};

class HoneycombHoney : public TileMesh {
  GDCLASS(HoneycombHoney, TileMesh)

 public:
  HoneycombHoney() = default;  // existence is 'must' for Godot
  HoneycombHoney(const HoneycombHoney& other) = delete;
  HoneycombHoney(HoneycombHoney&& other) = delete;
  // copying operator= defined inside GDCLASS
  HoneycombHoney& operator=(HoneycombHoney&& rhs) = delete;

  // getters
  std::pair<float, float> get_min_max_height() const { return {_min_y, _max_y}; }

  // setters
  void set_noise(Ref<FastNoiseLite> noise);
  void set_min_offset(float p_offset);
  void set_max_level(float p_max_level);

  void set_fill_delta(float d);
  void set_level(int p_level);
  void fill();
  void clear();
  int get_level() const;

  void calculate_initial_heights();
  void calculate_heights();

  void set_shift_compress(float y_shift, float y_compress);

  void lock() { _locked = true; }
  void unlock() { _locked = false; }
  bool is_locked() const { return _locked; }
  bool is_full() const;
  bool is_empty() const;

  HexMesh* inner_mesh() const override { return _hex_mesh.ptr(); }
  int get_id() override { return _hex_mesh->get_id(); }

  HoneycombHoney(Hexagon hex, HoneycombHoneyMeshParams params);

 protected:
  static void _bind_methods();

 private:
  Ref<FastNoiseLite> _noise;
  int _level{0};
  int _max_level{0};
  float _fill_delta{0};
  float _min_offset{0.0};
  bool _locked{false};
  std::unique_ptr<MeshProcessor> _processor;

  Ref<HexMesh> _hex_mesh;

  void recalculate_vertices_update(float surplus);

  float _min_y = std::numeric_limits<float>::max();
  float _max_y = std::numeric_limits<float>::min();
  float _y_shift = 0.0f;     // no shift
  float _y_compress = 1.0f;  // no compress
};

}  // namespace sota