#include "pch.h" #include "app.h" void App::vr_draw(const glm::mat4& proj, const glm::mat4& camera) { using namespace ui; //glm::mat4 ortho_proj = glm::ortho(0.f, box.z, 0.f, box.w, -1000.f, 1000.f); //glm::mat4 proj = glm::perspective(glm::radians(m_canvas->m_cam_fov), box.z / box.w, 0.01f, 1000.f); //glm::mat4 camera = glm::eulerAngleXY(m_canvas->m_cam_rot.y, m_canvas->m_cam_rot.x) * // glm::translate(m_canvas->m_cam_pos); // auto plane_mvp = proj * camera * transform * // glm::scale(glm::vec3(sz, 1)); //glm::extractEulerAngleXYZ(camera, vr_rot.y, vr_rot.x, vr_rot.z); vr_rot = camera; sampler.bind(0); sampler.bind(1); sampler.bind(2); sampler_stencil.bind(3); auto blend = glIsEnabled(GL_BLEND); auto depth = glIsEnabled(GL_DEPTH_TEST); glDisable(GL_BLEND); glDisable(GL_DEPTH_TEST); glClear(GL_DEPTH_BUFFER_BIT); for (int plane_index = 0; plane_index < 6; plane_index++) { auto plane_mvp = proj * camera * glm::scale(glm::vec3(canvas->m_canvas->m_order.size() + 500)) * canvas->m_canvas->m_plane_transform[plane_index] * glm::translate(glm::vec3(0, 0, -1)); ui::ShaderManager::use(kShader::Checkerboard); ui::ShaderManager::u_mat4(kShaderUniform::MVP, plane_mvp); m_face_plane.draw_fill(); } glEnable(GL_BLEND); glEnable(GL_DEPTH_TEST); glClear(GL_DEPTH_BUFFER_BIT); for (size_t i = 0; i < canvas->m_canvas->m_order.size(); i++) { auto layer_index = canvas->m_canvas->m_order[i]; for (int plane_index = 0; plane_index < 6; plane_index++) { if (canvas->m_canvas->m_layers[layer_index].m_opacity == .0f) continue; int z = (int)(canvas->m_canvas->m_order.size() - i); auto plane_mvp_z = proj * camera * glm::scale(glm::vec3(z + 1) * 100.f) * //glm::eulerAngleYXZ(yaw, pitch, roll) * canvas->m_canvas->m_plane_transform[plane_index] * glm::translate(glm::vec3(0, 0, -1)); if (canvas->m_canvas->m_state == ui::Canvas::kCanvasMode::Erase && canvas->m_canvas->m_show_tmp && canvas->m_canvas->m_current_layer_idx == layer_index) { sampler.bind(0); ui::ShaderManager::use(kShader::CompErase); ui::ShaderManager::u_int(kShaderUniform::Tex, 0); ui::ShaderManager::u_int(kShaderUniform::TexStroke, 1); //ui::ShaderManager::u_int(kShaderUniform::TexMask, 2); ui::ShaderManager::u_float(kShaderUniform::Alpha, canvas->m_canvas->m_current_stroke->m_brush.m_tip_opacity); //ui::ShaderManager::u_int(kShaderUniform::Lock, m_canvas->m_layers[layer_index].m_alpha_locked); //ui::ShaderManager::u_int(kShaderUniform::Mask, m_canvas->m_smask_active); ui::ShaderManager::u_mat4(kShaderUniform::MVP, plane_mvp_z); glActiveTexture(GL_TEXTURE0); canvas->m_canvas->m_layers[layer_index].m_rtt[plane_index].bindTexture(); glActiveTexture(GL_TEXTURE1); canvas->m_canvas->m_tmp[plane_index].bindTexture(); glActiveTexture(GL_TEXTURE2); canvas->m_canvas->m_smask.m_rtt[plane_index].bindTexture(); m_face_plane.draw_fill(); canvas->m_canvas->m_smask.m_rtt[plane_index].unbindTexture(); glActiveTexture(GL_TEXTURE1); canvas->m_canvas->m_tmp[plane_index].unbindTexture(); glActiveTexture(GL_TEXTURE0); canvas->m_canvas->m_layers[layer_index].m_rtt[plane_index].unbindTexture(); } else if (canvas->m_canvas->m_show_tmp && canvas->m_canvas->m_current_layer_idx == layer_index) { sampler.bind(0); auto& paper = TextureManager::get(const_hash("data/paper.jpg")); ui::ShaderManager::use(kShader::CompDraw); ui::ShaderManager::u_int(kShaderUniform::Tex, 0); ui::ShaderManager::u_int(kShaderUniform::TexStroke, 1); ui::ShaderManager::u_int(kShaderUniform::TexMask, 2); //ui::ShaderManager::u_int(kShaderUniform::TexStencil, 3); ui::ShaderManager::u_float(kShaderUniform::Alpha, canvas->m_canvas->m_current_stroke->m_brush.m_tip_opacity); ui::ShaderManager::u_int(kShaderUniform::Lock, canvas->m_canvas->m_layers[layer_index].m_alpha_locked); ui::ShaderManager::u_int(kShaderUniform::Mask, canvas->m_canvas->m_smask_active); ui::ShaderManager::u_int(kShaderUniform::BlendMode, canvas->m_canvas->m_current_stroke->m_brush.m_blend_mode); ui::ShaderManager::u_mat4(kShaderUniform::MVP, plane_mvp_z); glActiveTexture(GL_TEXTURE0); canvas->m_canvas->m_layers[layer_index].m_rtt[plane_index].bindTexture(); glActiveTexture(GL_TEXTURE1); canvas->m_canvas->m_tmp[plane_index].bindTexture(); glActiveTexture(GL_TEXTURE2); canvas->m_canvas->m_smask.m_rtt[plane_index].bindTexture(); glActiveTexture(GL_TEXTURE3); paper.bind(); m_face_plane.draw_fill(); paper.unbind(); glActiveTexture(GL_TEXTURE2); canvas->m_canvas->m_smask.m_rtt[plane_index].unbindTexture(); glActiveTexture(GL_TEXTURE1); canvas->m_canvas->m_tmp[plane_index].unbindTexture(); glActiveTexture(GL_TEXTURE0); canvas->m_canvas->m_layers[layer_index].m_rtt[plane_index].unbindTexture(); } else { sampler.bind(0); sampler_linear.bind(1); ui::ShaderManager::use(kShader::TextureAlphaSep); ui::ShaderManager::u_int(kShaderUniform::Tex, 0); ui::ShaderManager::u_int(kShaderUniform::TexA, 1); ui::ShaderManager::u_float(kShaderUniform::Alpha, canvas->m_canvas->m_layers[layer_index].m_opacity); ui::ShaderManager::u_int(kShaderUniform::Highlight, canvas->m_canvas->m_layers[layer_index].m_hightlight); ui::ShaderManager::u_mat4(kShaderUniform::MVP, plane_mvp_z); glActiveTexture(GL_TEXTURE0); canvas->m_canvas->m_layers[layer_index].m_rtt[plane_index].bindTexture(); glActiveTexture(GL_TEXTURE1); canvas->m_canvas->m_layers[layer_index].m_rtt[plane_index].bindTexture(); m_face_plane.draw_fill(); glActiveTexture(GL_TEXTURE1); canvas->m_canvas->m_layers[layer_index].m_rtt[plane_index].unbindTexture(); glActiveTexture(GL_TEXTURE0); canvas->m_canvas->m_layers[layer_index].m_rtt[plane_index].unbindTexture(); } } } float tan_fov = glm::tan(glm::radians(canvas->m_canvas->m_cam_fov / 2.f)); glm::vec3 aspect = { (float)uirtt.getWidth() / (float)uirtt.getHeight(), 1.f, 1.f }; // draw the 2D UI { auto plane_mvp_z = proj * camera * glm::scale(glm::vec3(100)) * //glm::eulerAngleYXZ(yaw, pitch, roll) * //canvas->m_canvas->m_plane_transform[plane_index] * glm::transpose(canvas->m_canvas->m_cam_rot) * glm::translate(glm::vec3(0, 0, -1)) * glm::scale(aspect * tan_fov); sampler.bind(0); ui::ShaderManager::use(kShader::Texture); ui::ShaderManager::u_int(kShaderUniform::Tex, 0); ui::ShaderManager::u_mat4(kShaderUniform::MVP, plane_mvp_z); glActiveTexture(GL_TEXTURE0); uirtt.bindTexture(); m_face_plane.draw_fill(); uirtt.unbindTexture(); } // draw the cursor { auto cur = (glm::vec2(cursor.x / width, 1.f - cursor.y / height) - 0.5f) * 2.f; auto mvp = proj * camera * glm::scale(glm::vec3(100)) * //glm::eulerAngleYXZ(yaw, pitch, roll) * //canvas->m_canvas->m_plane_transform[plane_index] * glm::transpose(canvas->m_canvas->m_cam_rot) * glm::translate(glm::vec3(cur * glm::vec2(aspect * tan_fov), -1)) * glm::scale(glm::vec3(.01)); ui::ShaderManager::use(kShader::Color); ui::ShaderManager::u_vec4(kShaderUniform::Col, { 0, 0, 0, 1 }); ui::ShaderManager::u_mat4(kShaderUniform::MVP, mvp); m_face_plane.draw_fill(); } /* for (auto& mode : *m_canvas->m_mode) mode->on_Draw(ortho_proj, proj, camera); glDisable(GL_DEPTH_TEST); if (m_canvas->m_smask_active) { m_canvas->modes[(int)Canvas::kCanvasMode::MaskFree][0]->on_Draw(ortho_proj, proj, camera); m_canvas->modes[(int)Canvas::kCanvasMode::MaskLine][0]->on_Draw(ortho_proj, proj, camera); } // keep drawing the grids if (m_canvas->m_state != ui::Canvas::kCanvasMode::Grid) for (auto& mode : ui::Canvas::modes[(int)ui::Canvas::kCanvasMode::Grid]) mode->on_Draw(ortho_proj, proj, camera); */ blend ? glEnable(GL_BLEND) : glDisable(GL_BLEND); depth ? glEnable(GL_DEPTH_TEST) : glDisable(GL_DEPTH_TEST); sampler.unbind(); }