Render heightmap to layer
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user