godot_voxel/editor/voxel_debug.h

84 lines
1.9 KiB
C++

#ifndef VOXEL_DEBUG_H
#define VOXEL_DEBUG_H
#include "../util/godot/direct_multimesh_instance.h"
#include <core/object/ref_counted.h>
#include <vector>
class Mesh;
class World3D;
namespace zylann {
namespace DebugColors {
enum ColorID { //
ID_VOXEL_BOUNDS = 0,
ID_OCTREE_BOUNDS,
ID_VOXEL_GRAPH_DEBUG_BOUNDS,
ID_WHITE,
ID_COUNT
};
} //namespace DebugColors
Ref<Mesh> get_debug_wirecube(DebugColors::ColorID id);
void free_debug_resources();
class DebugMultiMeshRenderer {
public:
DebugMultiMeshRenderer();
~DebugMultiMeshRenderer();
void set_world(World3D *world);
void begin();
void draw_box(const Transform3D &t, Color8 color);
void end();
void clear();
private:
std::vector<DirectMultiMeshInstance::TransformAndColor32> _items;
Ref<MultiMesh> _multimesh;
DirectMultiMeshInstance _multimesh_instance;
// TODO World3D is a reference, do not store it by pointer
World3D *_world = nullptr;
bool _inside_block = false;
PackedFloat32Array _bulk_array;
Ref<StandardMaterial3D> _material;
};
class DebugRendererItem;
class DebugRenderer {
public:
~DebugRenderer();
// This class does not uses nodes. Call this first to choose in which world it renders.
void set_world(World3D *world);
// Call this before issuing drawing commands
void begin();
void draw_box(const Transform3D &t, DebugColors::ColorID color);
// Draws a box wireframe using MultiMesh, allowing to draw much more without slowing down.
// The box's origin is its lower corner. Size is defined by the transform's basis.
void draw_box_mm(const Transform3D &t, Color8 color);
// Call this after issuing all drawing commands
void end();
void clear();
private:
std::vector<DebugRendererItem *> _items;
unsigned int _current = 0;
bool _inside_block = false;
// TODO World3D is a reference, do not store it by pointer
World3D *_world = nullptr;
DebugMultiMeshRenderer _mm_renderer;
};
} //namespace zylann
#endif // VOXEL_DEBUG_H