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);
|
||||
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -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<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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue