feat(渲染): 添加点形状支持并优化填充形状处理
添加对点形状(ShapeType::Point)的渲染支持,同时优化填充形状的处理逻辑 统一使用形状类型判断填充状态,减少对filled_字段的依赖
This commit is contained in:
parent
1f2ed0942d
commit
d4055333a9
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue