From adebbcd4e21172dd34e6ff617da284360f4181f2 Mon Sep 17 00:00:00 2001 From: Sergii Liebodkin Date: Tue, 15 Oct 2024 12:13:17 +0000 Subject: [PATCH] wg_engine: fix miter qdge cases math --- src/renderer/wg_engine/tvgWgCompositor.cpp | 4 ++++ src/renderer/wg_engine/tvgWgGeometry.h | 2 ++ 2 files changed, 6 insertions(+) diff --git a/src/renderer/wg_engine/tvgWgCompositor.cpp b/src/renderer/wg_engine/tvgWgCompositor.cpp index 5fed404e..1bdb967d 100755 --- a/src/renderer/wg_engine/tvgWgCompositor.cpp +++ b/src/renderer/wg_engine/tvgWgCompositor.cpp @@ -376,6 +376,8 @@ void WgCompositor::drawClipPath(WgContext& context, WgRenderDataShape* renderDat assert(renderData); assert(renderPassEncoder); assert(renderData->meshGroupShapes.meshes.count == renderData->meshGroupShapesBBox.meshes.count); + if (renderData->renderSettingsShape.skip) return; + if (renderData->meshGroupShapes.meshes.count == 0) return; if ((renderData->viewport.w <= 0) || (renderData->viewport.h <= 0)) return; wgpuRenderPassEncoderSetScissorRect(renderPassEncoder, renderData->viewport.x, renderData->viewport.y, renderData->viewport.w, renderData->viewport.h); // setup stencil rules @@ -404,6 +406,7 @@ void WgCompositor::drawShape(WgContext& context, WgRenderDataShape* renderData, assert(renderData->meshGroupShapes.meshes.count == renderData->meshGroupShapesBBox.meshes.count); uint32_t blendTypeInd = (uint32_t)blendType; if (renderData->renderSettingsShape.skip) return; + if (renderData->meshGroupShapes.meshes.count == 0) return; if ((renderData->viewport.w <= 0) || (renderData->viewport.h <= 0)) return; wgpuRenderPassEncoderSetScissorRect(renderPassEncoder, renderData->viewport.x, renderData->viewport.y, renderData->viewport.w, renderData->viewport.h); // setup stencil rules @@ -442,6 +445,7 @@ void WgCompositor::drawStrokes(WgContext& context, WgRenderDataShape* renderData assert(renderData->meshGroupStrokes.meshes.count == renderData->meshGroupStrokesBBox.meshes.count); uint32_t blendTypeInd = (uint32_t)blendType; if (renderData->renderSettingsStroke.skip) return; + if (renderData->meshGroupStrokes.meshes.count == 0) return; if ((renderData->viewport.w <= 0) || (renderData->viewport.h <= 0)) return; wgpuRenderPassEncoderSetScissorRect(renderPassEncoder, renderData->viewport.x, renderData->viewport.y, renderData->viewport.w, renderData->viewport.h); // draw strokes to stencil (first pass) diff --git a/src/renderer/wg_engine/tvgWgGeometry.h b/src/renderer/wg_engine/tvgWgGeometry.h index 948c59dd..6e99b1fc 100755 --- a/src/renderer/wg_engine/tvgWgGeometry.h +++ b/src/renderer/wg_engine/tvgWgGeometry.h @@ -335,7 +335,9 @@ struct WgVertexBufferInd { Point offset2 = nrm2 * halfWidth; Point nrm = normalize(nrm1 + nrm2); float cosine = dot(nrm, nrm1); + if (tvg::zero(cosine)) return; float angle = std::acos(dot(nrm1, -nrm2)); + if (tvg::zero(angle) || tvg::equal(angle, M_PI)) return; float miterRatio = 1.0f / (std::sin(angle) * 0.5f); if (miterRatio <= miterLimit) { appendQuad(v1 + nrm * (halfWidth / cosine), v1 + offset2, v1 + offset1, v1);