add xray_opacity support to projected 3d text

This commit is contained in:
MihailRis 2024-11-23 14:16:58 +03:00
parent 6ec33ab98c
commit bcf920a251

View File

@ -34,12 +34,11 @@ void TextsRenderer::renderNote(
util::sqr(preset.renderDistance / camera.zoom)) { util::sqr(preset.renderDistance / camera.zoom)) {
return; return;
} }
// Projected notes are displayed on the front layer only
if ((preset.displayMode == NoteDisplayMode::PROJECTED) != projected) { if ((preset.displayMode == NoteDisplayMode::PROJECTED) != projected) {
return; return;
} }
float opacity = 1.0f; float opacity = 1.0f;
if (frontLayer && preset.displayMode != NoteDisplayMode::PROJECTED) { if (frontLayer) {
if (preset.xrayOpacity <= 0.0001f) { if (preset.xrayOpacity <= 0.0001f) {
return; return;
} }
@ -81,15 +80,25 @@ void TextsRenderer::renderNote(
scale = scale2 * preset.perspective + scale = scale2 * preset.perspective +
scale * (1.0f - preset.perspective); scale * (1.0f - preset.perspective);
} }
if (frontLayer) {
auto projpos = camera.getProjView() * glm::vec4(pos, 1.0f); auto projpos = camera.getProjView() * glm::vec4(pos, 1.0f);
pos = projpos; pos = projpos;
if (pos.z < 0.0f) { if (pos.z < 0.0f) {
return; return;
} }
pos /= pos.z; pos /= projpos.w;
pos.z = 0; pos.z = 0;
xvec = {2.0f/Window::width*scale, 0, 0}; xvec = {2.0f/Window::width*scale, 0, 0};
yvec = {0, 2.0f/Window::height*scale, 0}; yvec = {0, 2.0f/Window::height*scale, 0};
} else {
auto matrix = camera.getProjView();
auto screenPos = matrix * glm::vec4(pos, 1.0f);
xvec = glm::vec3(2.0f/Window::width*scale, 0, 0);
yvec = glm::vec3(0, 2.0f/Window::height*scale, 0);
pos = screenPos / screenPos.w;
}
} }
auto color = preset.color; auto color = preset.color;
batch.setColor(glm::vec4(color.r, color.g, color.b, color.a * opacity)); batch.setColor(glm::vec4(color.r, color.g, color.b, color.a * opacity));
@ -119,16 +128,11 @@ void TextsRenderer::render(
renderNote(*note, context, camera, settings, hudVisible, frontLayer, false); renderNote(*note, context, camera, settings, hudVisible, frontLayer, false);
} }
batch.flush(); batch.flush();
if (frontLayer) { shader.uniformMatrix("u_projview", glm::mat4(1.0f));
shader.uniformMatrix(
"u_projview",
glm::mat4(1.0f)
);
for (const auto& [_, note] : notes) { for (const auto& [_, note] : notes) {
renderNote(*note, context, camera, settings, hudVisible, true, true); renderNote(*note, context, camera, settings, hudVisible, frontLayer, true);
} }
batch.flush(); batch.flush();
}
} }
u64id_t TextsRenderer::add(std::unique_ptr<TextNote> note) { u64id_t TextsRenderer::add(std::unique_ptr<TextNote> note) {