Render heightmap to layer

This commit is contained in:
2019-01-07 23:07:55 +01:00
parent 352511a920
commit 2b02be77dc
11 changed files with 145 additions and 116 deletions

View File

@@ -38,19 +38,26 @@ void NodePanelGrid::init_controls()
m_hm_lyaw = find<NodeSliderH>("grid-heightmap-lyaw");
m_hm_lpitch = find<NodeSliderH>("grid-heightmap-lpitch");
m_hm_shading = find<NodeComboBox>("grid-heightmap-shading");
m_render = find<NodeButton>("grid-render");
m_hm_preview->SetHeight(0);
m_hm_plane.create(1, 1, 100);
//m_hm_height->on_value_changed = update_hm;
m_groud_resolution->on_value_changed = [this](Node* target, float v) {
m_groud_resolution->on_value_final = [this](Node* target, float v) {
if (m_hm_image.data())
m_hm_plane.create(1, 1, m_hm_image, v * 5.f);
m_hm_plane.create(1, 1, m_hm_image, v * 5.f, get_height());
else
m_hm_plane.create(1, 1, 100 * v * 5.f);
LOG("resolution value %f", v);
};
m_hm_height->on_value_final = [this](Node* target, float v) {
if (m_hm_image.data())
m_hm_plane.create(1, 1, m_hm_image, m_groud_resolution->get_value() * 5.f, get_height());
LOG("height value %f", v);
};
m_hm_shading->on_select = [this](Node*, int index) {
m_shade_mode = (ShadeMode)index;
};
@@ -67,7 +74,8 @@ void NodePanelGrid::init_controls()
m_hm_preview->tex.create_mipmaps();
auto sz = m_hm_preview->tex.size();
m_hm_preview->SetAspectRatio(sz.x / sz.y);
m_hm_plane.create(1, 1, m_hm_image, m_groud_resolution->get_value() * 5.f);
m_hm_plane.create(1, 1, m_hm_image,
m_groud_resolution->get_value() * 5.f, get_height());
m_hm_preview->SetHeight(100);
if (m_groud_opacity->get_value() == 0.f)
m_groud_opacity->set_value(1.f);
@@ -95,8 +103,91 @@ void NodePanelGrid::init_controls()
m_hm_preview->tex.create_mipmaps();
auto sz = m_hm_preview->tex.size();
m_hm_preview->SetAspectRatio(sz.x / sz.y);
m_hm_plane.create(1, 1, m_hm_image, m_groud_resolution->get_value() * 5.f);
m_hm_plane.create(1, 1, m_hm_image,
m_groud_resolution->get_value() * 5.f, m_hm_height->get_value());
m_hm_preview->SetHeight(100);
}
};
m_render->on_click = [this](Node*)
{
gl_state gl;
gl.save();
Canvas::I->draw_objects([this](const glm::mat4& camera, const glm::mat4& proj, int i) {
draw_heightmap(proj, camera);
});
gl.restore();
};
}
float NodePanelGrid::get_height() const
{
return glm::pow(m_hm_height->get_value() - 0.5f, 3.f) * 10.f;
}
float NodePanelGrid::get_offset() const
{
return glm::pow(m_groud_offset->get_value() - 0.5f, 3);
}
void NodePanelGrid::draw_heightmap(const glm::mat4& proj, const glm::mat4& camera) const
{
if (m_groud_opacity->get_value() > 0.f)
{
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glClear(GL_DEPTH_BUFFER_BIT);
auto mvp = proj * camera
* glm::translate(glm::vec3(0, get_offset(), 0))
* glm::scale(glm::vec3(1, get_height(), 1))
* glm::eulerAngleX(glm::radians(90.f));
// DRAW SOLID
if (m_hm_image.m_data)
{
if (m_shade_mode == ShadeMode::Solid)
{
glDisable(GL_BLEND);
ShaderManager::use(kShader::Lambert);
ShaderManager::u_mat4(kShaderUniform::MVP, mvp);
auto light_yaw = m_hm_lyaw->get_value() * glm::pi<float>() * 2.f;
auto light_pitch = m_hm_lpitch->get_value();
auto light_pos = glm::vec3(sinf(light_yaw), cosf(light_yaw), light_pitch);
ShaderManager::u_vec3(kShaderUniform::LightDir, glm::normalize(-light_pos));
m_hm_plane.draw_fill();
}
else if (m_shade_mode == ShadeMode::Flat)
{
ShaderManager::use(kShader::Color);
ShaderManager::u_vec4(kShaderUniform::Col, glm::vec4(
glm::vec3(1.f - m_groud_value->get_value()),
m_groud_opacity->get_value()
));
ShaderManager::u_mat4(kShaderUniform::MVP, mvp);
m_hm_plane.draw_fill();
}
}
// DRAW GRIDS
auto wire_alpha = m_hm_image.m_data ? m_hm_wireframe->get_value() : 1.f;
if (wire_alpha > 0.f)
{
glEnable(GL_BLEND);
ShaderManager::use(kShader::Color);
ShaderManager::u_vec4(kShaderUniform::Col, glm::vec4(
glm::vec3(m_groud_value->get_value()),
m_groud_opacity->get_value() *
wire_alpha
));
ShaderManager::u_mat4(kShaderUniform::MVP, mvp);
if (m_hm_image.m_data && m_shade_mode == ShadeMode::Transparent)
{
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
m_hm_plane.draw_fill();
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
}
m_hm_plane.draw_stroke();
}
}
}