feat(渲染): 添加点形状支持并优化填充形状处理

添加对点形状(ShapeType::Point)的渲染支持,同时优化填充形状的处理逻辑
统一使用形状类型判断填充状态,减少对filled_字段的依赖
This commit is contained in:
ChestnutYueyue 2026-02-19 23:16:38 +08:00
parent 1f2ed0942d
commit d4055333a9
2 changed files with 32 additions and 14 deletions

View File

@ -351,6 +351,11 @@ void ShapeBatcher::draw(const RenderCommand &command) {
const auto &data = std::get<ShapeRenderData>(command.data); const auto &data = std::get<ShapeRenderData>(command.data);
switch (data.shapeType) { 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: case ShapeType::Line:
if (data.points.size() >= 2) { if (data.points.size() >= 2) {
drawLine(data.points[0], data.points[1], data.color, data.lineWidth); drawLine(data.points[0], data.points[1], data.color, data.lineWidth);

View File

@ -284,10 +284,11 @@ void ShapeNode::onDraw(RenderBackend &renderer) {
break; break;
case ShapeType::Rect: case ShapeType::Rect:
case ShapeType::FilledRect:
if (points_.size() >= 4) { if (points_.size() >= 4) {
if (filled_) { Rect rect(points_[0].x, points_[0].y, points_[2].x - points_[0].x,
Rect rect(points_[0].x, points_[0].y, points_[2].x - points_[0].x, points_[2].y - points_[0].y);
points_[2].y - points_[0].y); if (filled_ || shapeType_ == ShapeType::FilledRect) {
renderer.fillRect(rect, color_); renderer.fillRect(rect, color_);
} else { } else {
for (size_t i = 0; i < points_.size(); ++i) { for (size_t i = 0; i < points_.size(); ++i) {
@ -300,9 +301,10 @@ void ShapeNode::onDraw(RenderBackend &renderer) {
break; break;
case ShapeType::Circle: case ShapeType::Circle:
case ShapeType::FilledCircle:
if (points_.size() >= 2) { if (points_.size() >= 2) {
float radius = points_[1].x; float radius = points_[1].x;
if (filled_) { if (filled_ || shapeType_ == ShapeType::FilledCircle) {
renderer.fillCircle(points_[0], radius, color_, segments_); renderer.fillCircle(points_[0], radius, color_, segments_);
} else { } else {
renderer.drawCircle(points_[0], radius, color_, segments_, lineWidth_); renderer.drawCircle(points_[0], radius, color_, segments_, lineWidth_);
@ -311,8 +313,9 @@ void ShapeNode::onDraw(RenderBackend &renderer) {
break; break;
case ShapeType::Triangle: case ShapeType::Triangle:
case ShapeType::FilledTriangle:
if (points_.size() >= 3) { if (points_.size() >= 3) {
if (filled_) { if (filled_ || shapeType_ == ShapeType::FilledTriangle) {
renderer.fillPolygon(points_.data(), 3, color_); renderer.fillPolygon(points_.data(), 3, color_);
} else { } else {
renderer.drawLine(points_[0], points_[1], color_, lineWidth_); renderer.drawLine(points_[0], points_[1], color_, lineWidth_);
@ -323,11 +326,13 @@ void ShapeNode::onDraw(RenderBackend &renderer) {
break; break;
case ShapeType::Polygon: case ShapeType::Polygon:
case ShapeType::FilledPolygon:
if (!points_.empty()) { if (!points_.empty()) {
if (filled_) { if (filled_ || shapeType_ == ShapeType::FilledPolygon) {
renderer.fillPolygon(points_.data(), points_.size(), color_); renderer.fillPolygon(points_.data(), points_.size(), color_);
} else { } else {
renderer.drawPolygon(points_.data(), points_.size(), color_, lineWidth_); renderer.drawPolygon(points_.data(), points_.size(), color_,
lineWidth_);
} }
} }
break; break;
@ -359,37 +364,44 @@ void ShapeNode::generateRenderCommand(std::vector<RenderCommand> &commands,
case ShapeType::Line: case ShapeType::Line:
if (points_.size() >= 2) { if (points_.size() >= 2) {
commands.push_back(RenderCommand::makeLine( commands.push_back(RenderCommand::makeLine(points_[0] + offset,
points_[0] + offset, points_[1] + offset, color_, lineWidth_, zOrder)); points_[1] + offset, color_,
lineWidth_, zOrder));
} }
break; break;
case ShapeType::Rect: case ShapeType::Rect:
case ShapeType::FilledRect:
if (points_.size() >= 4) { if (points_.size() >= 4) {
Rect rect(points_[0].x, points_[0].y, points_[2].x - points_[0].x, Rect rect(points_[0].x, points_[0].y, points_[2].x - points_[0].x,
points_[2].y - points_[0].y); points_[2].y - points_[0].y);
commands.push_back(RenderCommand::makeRect( 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; break;
case ShapeType::Circle: case ShapeType::Circle:
case ShapeType::FilledCircle:
if (points_.size() >= 2) { if (points_.size() >= 2) {
float radius = points_[1].x; float radius = points_[1].x;
commands.push_back(RenderCommand::makeCircle( 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; break;
case ShapeType::Triangle: case ShapeType::Triangle:
case ShapeType::FilledTriangle:
if (points_.size() >= 3) { if (points_.size() >= 3) {
commands.push_back(RenderCommand::makeTriangle( commands.push_back(RenderCommand::makeTriangle(
points_[0] + offset, points_[1] + offset, points_[2] + offset, points_[0] + offset, points_[1] + offset, points_[2] + offset, color_,
color_, filled_, zOrder)); filled_ || shapeType_ == ShapeType::FilledTriangle, zOrder));
} }
break; break;
case ShapeType::Polygon: case ShapeType::Polygon:
case ShapeType::FilledPolygon:
if (!points_.empty()) { if (!points_.empty()) {
std::vector<Vec2> transformedPoints; std::vector<Vec2> transformedPoints;
transformedPoints.reserve(points_.size()); transformedPoints.reserve(points_.size());
@ -397,7 +409,8 @@ void ShapeNode::generateRenderCommand(std::vector<RenderCommand> &commands,
transformedPoints.push_back(p + offset); transformedPoints.push_back(p + offset);
} }
commands.push_back(RenderCommand::makePolygon( commands.push_back(RenderCommand::makePolygon(
transformedPoints, color_, filled_, zOrder)); transformedPoints, color_,
filled_ || shapeType_ == ShapeType::FilledPolygon, zOrder));
} }
break; break;
} }