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);
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);

View File

@ -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);
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<RenderCommand> &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<Vec2> transformedPoints;
transformedPoints.reserve(points_.size());
@ -397,7 +409,8 @@ void ShapeNode::generateRenderCommand(std::vector<RenderCommand> &commands,
transformedPoints.push_back(p + offset);
}
commands.push_back(RenderCommand::makePolygon(
transformedPoints, color_, filled_, zOrder));
transformedPoints, color_,
filled_ || shapeType_ == ShapeType::FilledPolygon, zOrder));
}
break;
}