LumixEngine/src/renderer/editor/terrain_editor.h
2017-06-17 11:18:51 +02:00

107 lines
2.4 KiB
C++

#pragma once
#include "engine/binary_array.h"
#include "engine/vec.h"
#include "editor/world_editor.h"
#include "editor/utils.h"
namespace Lumix
{
class Material;
class Model;
struct PrefabResource;
class RenderScene;
class Texture;
class TerrainEditor LUMIX_FINAL : public WorldEditor::Plugin
{
public:
enum ActionType
{
RAISE_HEIGHT,
LOWER_HEIGHT,
SMOOTH_HEIGHT,
FLAT_HEIGHT,
LAYER,
ENTITY,
REMOVE_ENTITY,
COLOR,
ADD_GRASS,
REMOVE_GRASS,
NOT_SET
};
TerrainEditor(WorldEditor& editor, class StudioApp& app);
~TerrainEditor();
bool onEntityMouseDown(const WorldEditor::RayHit& hit, int, int) override;
void onMouseMove(int x, int y, int /*rel_x*/, int /*rel_y*/) override;
void onMouseUp(int, int, MouseButton::Value) override;
void onGUI();
void setComponent(ComponentUID cmp) { m_component = cmp; }
private:
void splitSplatmap(const char* dir);
void mergeSplatmap(const char* dir);
void onUniverseDestroyed();
void detectModifiers();
void drawCursor(RenderScene& scene, ComponentHandle cmp, const Vec3& center);
Material* getMaterial();
void paint(const Vec3& hit, TerrainEditor::ActionType action_type, bool new_stroke);
static void getProjections(const Vec3& axis,
const Vec3 vertices[8],
float& min,
float& max);
void removeEntities(const Vec3& hit);
void paintEntities(const Vec3& hit);
void increaseBrushSize();
void decreaseBrushSize();
void nextTerrainTexture();
void prevTerrainTexture();
u16 getHeight(const Vec3& world_pos);
Texture* getHeightmap();
Vec3 getRelativePosition(const Vec3& world_pos) const;
private:
WorldEditor& m_world_editor;
StudioApp& m_app;
ActionType m_action_type;
ComponentUID m_component;
float m_terrain_brush_strength;
float m_terrain_brush_size;
int m_texture_idx;
u16 m_grass_mask;
u16 m_flat_height;
Vec3 m_color;
int m_current_brush;
Array<PrefabResource*> m_selected_prefabs;
Action* m_increase_brush_size;
Action* m_decrease_brush_size;
Action* m_increase_texture_idx;
Action* m_decrease_texture_idx;
Action* m_lower_terrain_action;
Action* m_smooth_terrain_action;
Action* m_remove_entity_action;
Action* m_remove_grass_action;
BinaryArray m_brush_mask;
Texture* m_brush_texture;
Vec2 m_size_spread;
Vec2 m_y_spread;
bool m_is_align_with_normal;
bool m_is_rotate_x;
bool m_is_rotate_y;
bool m_is_rotate_z;
bool m_is_enabled;
Vec2 m_rotate_x_spread;
Vec2 m_rotate_y_spread;
Vec2 m_rotate_z_spread;
};
} // namespace Lumix