implement heightmap overlay for navigation

This commit is contained in:
2019-01-17 12:02:03 +01:00
parent ca9ed74108
commit a2b2ef52c3
2 changed files with 122 additions and 2 deletions

View File

@@ -44,6 +44,10 @@ void NodePanelGrid::init_controls()
m_hm_preview->SetHeight(0); m_hm_preview->SetHeight(0);
m_hm_plane.create(1, 1, 100); m_hm_plane.create(1, 1, 100);
m_hm_preview_nav = m_hm_preview->add_child<NodeHeightmapOverlay>();
m_hm_preview_nav->SetWidthP(100);
m_hm_preview_nav->SetHeightP(100);
//m_hm_height->on_value_changed = update_hm; //m_hm_height->on_value_changed = update_hm;
m_groud_resolution->on_value_final = [this](Node* target, float v) { m_groud_resolution->on_value_final = [this](Node* target, float v) {
if (m_hm_image.data()) if (m_hm_image.data())
@@ -156,12 +160,14 @@ void NodePanelGrid::draw_heightmap(const glm::mat4& proj, const glm::mat4& camer
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
glClear(GL_DEPTH_BUFFER_BIT); glClear(GL_DEPTH_BUFFER_BIT);
auto nav = -(m_hm_preview_nav->m_value - 0.5f);
auto mvp = proj * camera auto mvp = proj * camera
* glm::translate(glm::vec3(0, get_offset(), 0)); * glm::translate(glm::vec3(0, get_offset(), 0))
* glm::translate(glm::vec3(nav.x, get_offset(), nav.y));
auto light_yaw = m_hm_lyaw->get_value() * glm::pi<float>() * 2.f; auto light_yaw = m_hm_lyaw->get_value() * glm::pi<float>() * 2.f;
auto light_pitch = m_hm_lpitch->get_value() * 5; auto light_pitch = m_hm_lpitch->get_value() * 5;
auto light_pos = glm::vec3(sinf(light_yaw), light_pitch + get_offset(), cosf(light_yaw)); auto light_pos = glm::vec3(sinf(light_yaw) + nav.x, light_pitch + get_offset(), cosf(light_yaw) + nav.y);
auto light_dir = glm::normalize(light_pos); auto light_dir = glm::normalize(light_pos);
// DRAW SUN SPHERE // DRAW SUN SPHERE
@@ -360,3 +366,99 @@ void NodePanelGrid::bake_uvs()
m_texture.create_mipmaps(); m_texture.create_mipmaps();
App::I.async_redraw(); App::I.async_redraw();
} }
///////////////////////////////////////////////////////////////////////////////
Node* NodeHeightmapOverlay::clone_instantiate() const
{
return new NodeHeightmapOverlay();
}
void NodeHeightmapOverlay::clone_finalize(Node* dest) const
{
auto n = (NodeHeightmapOverlay*)dest;
n->m_picker = (NodeBorder*)n->m_children[0].get();
}
void NodeHeightmapOverlay::init()
{
m_picker = new NodeBorder;
m_picker->SetSize({ 10, 10 });
m_picker->SetPositioning(YGPositionTypeAbsolute);
m_picker->SetPosition(0, 0);
m_picker->m_border_color = glm::vec4(0, 0, 0, 1);
m_picker->m_thinkness = 1;
m_picker->m_color = glm::vec4(1, 1, 1, 0.25f);
add_child(m_picker);
}
void NodeHeightmapOverlay::set_value(float x, float y)
{
auto sz = m_size;
auto pos = glm::clamp(glm::vec2(x, y) * sz, { 0, 0 }, sz);
//m_picker->SetPosition(pos - m_picker->GetSize() * .5f);
m_value = pos / glm::max({ 1,1 }, sz); // avoid div0
if (on_value_changed)
on_value_changed(this, m_value);
}
kEventResult NodeHeightmapOverlay::handle_event(Event* e)
{
NodeBorder::handle_event(e);
switch (e->m_type)
{
case kEventType::MouseDownL:
{
m_old_value = m_value;
dragging = true;
mouse_capture();
auto sz = m_size;
auto pos = glm::clamp(((MouseEvent*)e)->m_pos - m_pos, { 0, 0 }, sz);
m_picker->SetPosition(pos - m_picker->GetSize() * .5f);
m_value = pos / glm::max({ 1,1 }, sz); // avoid div0
if (on_value_changed)
on_value_changed(this, m_value);
}
break;
case kEventType::MouseUpL:
mouse_release();
dragging = false;
break;
case kEventType::MouseMove:
if (dragging)
{
auto sz = m_size;
auto pos = glm::clamp(((MouseEvent*)e)->m_pos - m_pos, { 0, 0 }, sz);
m_picker->SetPosition(pos - m_picker->GetSize() * .5f);
m_value = pos / glm::max({ 1,1 }, sz); // avoid div0
if (on_value_changed)
on_value_changed(this, m_value);
}
break;
case kEventType::MouseCancel:
mouse_release();
dragging = false;
m_value = m_old_value;
set_value(m_value.x, m_value.y);
if (on_value_changed)
on_value_changed(this, m_value);
break;
default:
return kEventResult::Available;
break;
}
return kEventResult::Consumed;
}
void NodeHeightmapOverlay::draw()
{
auto sz = m_size;
auto pos = glm::clamp(m_value * sz, { 0, 0 }, sz);
m_picker->SetPosition(pos - m_picker->GetSize() * .5f);
}
void NodeHeightmapOverlay::handle_resize(glm::vec2 old_size, glm::vec2 new_size)
{
NodeBorder::handle_resize(old_size, new_size);
set_value(m_value.x, m_value.y);
}

View File

@@ -14,6 +14,23 @@
#define NANORT_ENABLE_PARALLEL_BUILD #define NANORT_ENABLE_PARALLEL_BUILD
#include "nanort.h" #include "nanort.h"
class NodeHeightmapOverlay : public NodeBorder
{
NodeBorder* m_picker{ nullptr };
bool dragging = false;
public:
glm::vec2 m_value{ 0.5f, 0.5f };
glm::vec2 m_old_value{ 0.f };
std::function<void(Node* target, glm::vec2 value)> on_value_changed;
virtual Node* clone_instantiate() const override;
virtual void clone_finalize(Node* dest) const override;
virtual void init() override;
void set_value(float x, float y);
virtual kEventResult handle_event(Event* e) override;
virtual void draw() override;
virtual void handle_resize(glm::vec2 old_size, glm::vec2 new_size) override;
};
class NodePanelGrid : public Node class NodePanelGrid : public Node
{ {
public: public:
@@ -35,6 +52,7 @@ public:
NodeButton* m_render; NodeButton* m_render;
NodeButton* m_commit; NodeButton* m_commit;
HeightmapPlane m_hm_plane; HeightmapPlane m_hm_plane;
NodeHeightmapOverlay* m_hm_preview_nav;
Sphere m_sphere; Sphere m_sphere;
Image m_hm_image; Image m_hm_image;
Texture2D m_texture; Texture2D m_texture;