From d4055333a981b5ba448213e3769810c3bdd101c3 Mon Sep 17 00:00:00 2001 From: ChestnutYueyue <952134128@qq.com> Date: Thu, 19 Feb 2026 23:16:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=B8=B2=E6=9F=93):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=82=B9=E5=BD=A2=E7=8A=B6=E6=94=AF=E6=8C=81=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=A1=AB=E5=85=85=E5=BD=A2=E7=8A=B6=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加对点形状(ShapeType::Point)的渲染支持,同时优化填充形状的处理逻辑 统一使用形状类型判断填充状态,减少对filled_字段的依赖 --- Extra2D/src/render/batch/shape_batcher.cpp | 5 +++ Extra2D/src/scene/shape_node.cpp | 41 ++++++++++++++-------- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/Extra2D/src/render/batch/shape_batcher.cpp b/Extra2D/src/render/batch/shape_batcher.cpp index aeb2e11..1ec3df6 100644 --- a/Extra2D/src/render/batch/shape_batcher.cpp +++ b/Extra2D/src/render/batch/shape_batcher.cpp @@ -351,6 +351,11 @@ void ShapeBatcher::draw(const RenderCommand &command) { const auto &data = std::get(command.data); switch (data.shapeType) { + case ShapeType::Point: + if (data.points.size() >= 1) { + drawFilledCircle(data.points[0], data.lineWidth * 0.5f, data.color, 8); + } + break; case ShapeType::Line: if (data.points.size() >= 2) { drawLine(data.points[0], data.points[1], data.color, data.lineWidth); diff --git a/Extra2D/src/scene/shape_node.cpp b/Extra2D/src/scene/shape_node.cpp index 8c6da0e..14f4282 100644 --- a/Extra2D/src/scene/shape_node.cpp +++ b/Extra2D/src/scene/shape_node.cpp @@ -284,10 +284,11 @@ void ShapeNode::onDraw(RenderBackend &renderer) { break; case ShapeType::Rect: + case ShapeType::FilledRect: if (points_.size() >= 4) { - if (filled_) { - Rect rect(points_[0].x, points_[0].y, points_[2].x - points_[0].x, - points_[2].y - points_[0].y); + Rect rect(points_[0].x, points_[0].y, points_[2].x - points_[0].x, + points_[2].y - points_[0].y); + if (filled_ || shapeType_ == ShapeType::FilledRect) { renderer.fillRect(rect, color_); } else { for (size_t i = 0; i < points_.size(); ++i) { @@ -300,9 +301,10 @@ void ShapeNode::onDraw(RenderBackend &renderer) { break; case ShapeType::Circle: + case ShapeType::FilledCircle: if (points_.size() >= 2) { float radius = points_[1].x; - if (filled_) { + if (filled_ || shapeType_ == ShapeType::FilledCircle) { renderer.fillCircle(points_[0], radius, color_, segments_); } else { renderer.drawCircle(points_[0], radius, color_, segments_, lineWidth_); @@ -311,8 +313,9 @@ void ShapeNode::onDraw(RenderBackend &renderer) { break; case ShapeType::Triangle: + case ShapeType::FilledTriangle: if (points_.size() >= 3) { - if (filled_) { + if (filled_ || shapeType_ == ShapeType::FilledTriangle) { renderer.fillPolygon(points_.data(), 3, color_); } else { renderer.drawLine(points_[0], points_[1], color_, lineWidth_); @@ -323,11 +326,13 @@ void ShapeNode::onDraw(RenderBackend &renderer) { break; case ShapeType::Polygon: + case ShapeType::FilledPolygon: if (!points_.empty()) { - if (filled_) { + if (filled_ || shapeType_ == ShapeType::FilledPolygon) { renderer.fillPolygon(points_.data(), points_.size(), color_); } else { - renderer.drawPolygon(points_.data(), points_.size(), color_, lineWidth_); + renderer.drawPolygon(points_.data(), points_.size(), color_, + lineWidth_); } } break; @@ -359,37 +364,44 @@ void ShapeNode::generateRenderCommand(std::vector &commands, case ShapeType::Line: if (points_.size() >= 2) { - commands.push_back(RenderCommand::makeLine( - points_[0] + offset, points_[1] + offset, color_, lineWidth_, zOrder)); + commands.push_back(RenderCommand::makeLine(points_[0] + offset, + points_[1] + offset, color_, + lineWidth_, zOrder)); } break; case ShapeType::Rect: + case ShapeType::FilledRect: if (points_.size() >= 4) { Rect rect(points_[0].x, points_[0].y, points_[2].x - points_[0].x, points_[2].y - points_[0].y); commands.push_back(RenderCommand::makeRect( - Rect(rect.origin + offset, rect.size), color_, lineWidth_, filled_, zOrder)); + Rect(rect.origin + offset, rect.size), color_, lineWidth_, + filled_ || shapeType_ == ShapeType::FilledRect, zOrder)); } break; case ShapeType::Circle: + case ShapeType::FilledCircle: if (points_.size() >= 2) { float radius = points_[1].x; commands.push_back(RenderCommand::makeCircle( - points_[0] + offset, radius, color_, segments_, filled_, zOrder)); + points_[0] + offset, radius, color_, segments_, + filled_ || shapeType_ == ShapeType::FilledCircle, zOrder)); } break; case ShapeType::Triangle: + case ShapeType::FilledTriangle: if (points_.size() >= 3) { commands.push_back(RenderCommand::makeTriangle( - points_[0] + offset, points_[1] + offset, points_[2] + offset, - color_, filled_, zOrder)); + points_[0] + offset, points_[1] + offset, points_[2] + offset, color_, + filled_ || shapeType_ == ShapeType::FilledTriangle, zOrder)); } break; case ShapeType::Polygon: + case ShapeType::FilledPolygon: if (!points_.empty()) { std::vector transformedPoints; transformedPoints.reserve(points_.size()); @@ -397,7 +409,8 @@ void ShapeNode::generateRenderCommand(std::vector &commands, transformedPoints.push_back(p + offset); } commands.push_back(RenderCommand::makePolygon( - transformedPoints, color_, filled_, zOrder)); + transformedPoints, color_, + filled_ || shapeType_ == ShapeType::FilledPolygon, zOrder)); } break; }