Wire retained stroke polygon tests to poly2tri
This commit is contained in:
@@ -278,7 +278,12 @@ set_tests_properties(pp_paint_renderer_compositor_tests PROPERTIES
|
|||||||
LABELS "renderer;paint;desktop-fast")
|
LABELS "renderer;paint;desktop-fast")
|
||||||
|
|
||||||
add_executable(pp_paint_renderer_stroke_execution_tests
|
add_executable(pp_paint_renderer_stroke_execution_tests
|
||||||
paint_renderer/stroke_execution_tests.cpp)
|
paint_renderer/stroke_execution_tests.cpp
|
||||||
|
../libs/poly2tri/poly2tri/common/shapes.cc
|
||||||
|
../libs/poly2tri/poly2tri/sweep/advancing_front.cc
|
||||||
|
../libs/poly2tri/poly2tri/sweep/cdt.cc
|
||||||
|
../libs/poly2tri/poly2tri/sweep/sweep.cc
|
||||||
|
../libs/poly2tri/poly2tri/sweep/sweep_context.cc)
|
||||||
target_link_libraries(pp_paint_renderer_stroke_execution_tests PRIVATE
|
target_link_libraries(pp_paint_renderer_stroke_execution_tests PRIVATE
|
||||||
pp_paint_renderer
|
pp_paint_renderer
|
||||||
pp_test_harness)
|
pp_test_harness)
|
||||||
|
|||||||
@@ -19,6 +19,8 @@
|
|||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include <poly2tri.h>
|
||||||
|
|
||||||
#include "legacy_canvas_stroke_execution_services.h"
|
#include "legacy_canvas_stroke_execution_services.h"
|
||||||
#include "legacy_canvas_stroke_preview_services.h"
|
#include "legacy_canvas_stroke_preview_services.h"
|
||||||
#include "test_harness.h"
|
#include "test_harness.h"
|
||||||
@@ -34,6 +36,32 @@ using pp::panopainter::LegacyCanvasStrokeTextureInput;
|
|||||||
using pp::panopainter::LegacyStrokePreviewCopySize;
|
using pp::panopainter::LegacyStrokePreviewCopySize;
|
||||||
using pp::panopainter::LegacyStrokeSampleExecutionRequest;
|
using pp::panopainter::LegacyStrokeSampleExecutionRequest;
|
||||||
|
|
||||||
|
std::vector<vertex_t> triangulate_simple(const std::vector<vertex_t>& vertices)
|
||||||
|
{
|
||||||
|
std::vector<vertex_t> ret;
|
||||||
|
std::vector<p2t::Point> points(vertices.size());
|
||||||
|
std::vector<p2t::Point*> points_ptr(vertices.size());
|
||||||
|
for (std::size_t i = 0; i < vertices.size(); ++i)
|
||||||
|
{
|
||||||
|
points[i] = { vertices[i].pos.x, vertices[i].pos.y };
|
||||||
|
points_ptr[i] = &points[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
auto cdt = std::make_unique<p2t::CDT>(points_ptr);
|
||||||
|
cdt->Triangulate();
|
||||||
|
const auto triangles = cdt->GetTriangles();
|
||||||
|
for (auto* triangle : triangles)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 3; ++i)
|
||||||
|
{
|
||||||
|
const auto index = std::distance(points.data(), triangle->GetPoint(i));
|
||||||
|
ret.push_back(vertices[static_cast<std::size_t>(index)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
bool nearly_equal(float a, float b)
|
bool nearly_equal(float a, float b)
|
||||||
@@ -61,6 +89,16 @@ std::array<pp::paint_renderer::CanvasStrokePoint, 4> make_sample_points()
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<vertex_t> make_polygon_vertices(std::initializer_list<glm::vec2> points)
|
||||||
|
{
|
||||||
|
std::vector<vertex_t> vertices;
|
||||||
|
vertices.reserve(points.size());
|
||||||
|
for (const auto& point : points) {
|
||||||
|
vertices.emplace_back(point);
|
||||||
|
}
|
||||||
|
return vertices;
|
||||||
|
}
|
||||||
|
|
||||||
void retained_stroke_texture_inputs_bind_and_unbind_in_declared_order(pp::tests::Harness& h)
|
void retained_stroke_texture_inputs_bind_and_unbind_in_declared_order(pp::tests::Harness& h)
|
||||||
{
|
{
|
||||||
const std::array<LegacyCanvasStrokeTextureBinding, 4> bindings {
|
const std::array<LegacyCanvasStrokeTextureBinding, 4> bindings {
|
||||||
@@ -281,6 +319,95 @@ void retained_stroke_sample_executor_unbinds_and_skips_draw_when_bounds_are_empt
|
|||||||
PP_EXPECT(h, draw_calls == 0);
|
PP_EXPECT(h, draw_calls == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void retained_stroke_face_sample_polygon_triangulates_and_forwards_face_callbacks(pp::tests::Harness& h)
|
||||||
|
{
|
||||||
|
const auto polygon_vertices = make_polygon_vertices({
|
||||||
|
glm::vec2(10.0F, 10.0F),
|
||||||
|
glm::vec2(30.0F, 10.0F),
|
||||||
|
glm::vec2(35.0F, 20.0F),
|
||||||
|
glm::vec2(20.0F, 35.0F),
|
||||||
|
glm::vec2(5.0F, 20.0F),
|
||||||
|
});
|
||||||
|
|
||||||
|
std::vector<std::string> events;
|
||||||
|
std::vector<vertex_t> uploaded_vertices;
|
||||||
|
std::array<int, 7> copy_args {};
|
||||||
|
int upload_face_index = -1;
|
||||||
|
int draw_face_index = -1;
|
||||||
|
|
||||||
|
const auto result = pp::panopainter::execute_legacy_canvas_stroke_face_sample_polygon(
|
||||||
|
pp::panopainter::LegacyStrokeFaceSamplePolygonExecutionRequest {
|
||||||
|
.context = "test",
|
||||||
|
.target_size = glm::vec2(64.0F, 64.0F),
|
||||||
|
.polygon_vertices = polygon_vertices,
|
||||||
|
.face_index = 4,
|
||||||
|
.copy_stroke_destination = true,
|
||||||
|
.bind_destination_texture = [&](int face_index) {
|
||||||
|
events.emplace_back("bind:" + std::to_string(face_index));
|
||||||
|
},
|
||||||
|
.copy_framebuffer_to_destination_texture =
|
||||||
|
[&](int face_index, int src_x, int src_y, int dst_x, int dst_y, int width, int height) {
|
||||||
|
events.emplace_back("copy:" + std::to_string(face_index));
|
||||||
|
copy_args = { face_index, src_x, src_y, dst_x, dst_y, width, height };
|
||||||
|
},
|
||||||
|
.unbind_destination_texture = [&](int face_index) {
|
||||||
|
events.emplace_back("unbind:" + std::to_string(face_index));
|
||||||
|
},
|
||||||
|
.upload_brush_vertices = [&](int face_index, std::span<const vertex_t> vertices) {
|
||||||
|
events.emplace_back("upload:" + std::to_string(face_index) + ":" + std::to_string(vertices.size()));
|
||||||
|
upload_face_index = face_index;
|
||||||
|
uploaded_vertices.assign(vertices.begin(), vertices.end());
|
||||||
|
},
|
||||||
|
.draw_brush_shape = [&](int face_index) {
|
||||||
|
events.emplace_back("draw:" + std::to_string(face_index));
|
||||||
|
draw_face_index = face_index;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
PP_EXPECT(h, result.ok);
|
||||||
|
PP_EXPECT(h, result.copy_position == glm::ivec2(4, 9));
|
||||||
|
PP_EXPECT(h, result.copy_size == glm::ivec2(32, 27));
|
||||||
|
PP_EXPECT(h, nearly_equal(result.dirty_bounds.x, 4.0F));
|
||||||
|
PP_EXPECT(h, nearly_equal(result.dirty_bounds.y, 9.0F));
|
||||||
|
PP_EXPECT(h, nearly_equal(result.dirty_bounds.z, 36.0F));
|
||||||
|
PP_EXPECT(h, nearly_equal(result.dirty_bounds.w, 36.0F));
|
||||||
|
PP_EXPECT(h, upload_face_index == 4);
|
||||||
|
PP_EXPECT(h, draw_face_index == 4);
|
||||||
|
const std::vector<std::string> expected_events {
|
||||||
|
"bind:4",
|
||||||
|
"copy:4",
|
||||||
|
"upload:4:9",
|
||||||
|
"draw:4",
|
||||||
|
"unbind:4",
|
||||||
|
};
|
||||||
|
PP_EXPECT(h, events == expected_events);
|
||||||
|
PP_EXPECT(h, copy_args[0] == 4);
|
||||||
|
PP_EXPECT(h, copy_args[1] == 4);
|
||||||
|
PP_EXPECT(h, copy_args[2] == 9);
|
||||||
|
PP_EXPECT(h, copy_args[3] == 4);
|
||||||
|
PP_EXPECT(h, copy_args[4] == 9);
|
||||||
|
PP_EXPECT(h, copy_args[5] == 32);
|
||||||
|
PP_EXPECT(h, copy_args[6] == 27);
|
||||||
|
PP_EXPECT(h, uploaded_vertices.size() == 9U);
|
||||||
|
|
||||||
|
const auto expected_triangulated_vertices = make_polygon_vertices({
|
||||||
|
glm::vec2(5.0F, 20.0F),
|
||||||
|
glm::vec2(10.0F, 10.0F),
|
||||||
|
glm::vec2(20.0F, 35.0F),
|
||||||
|
glm::vec2(20.0F, 35.0F),
|
||||||
|
glm::vec2(10.0F, 10.0F),
|
||||||
|
glm::vec2(30.0F, 10.0F),
|
||||||
|
glm::vec2(20.0F, 35.0F),
|
||||||
|
glm::vec2(30.0F, 10.0F),
|
||||||
|
glm::vec2(35.0F, 20.0F),
|
||||||
|
});
|
||||||
|
PP_EXPECT(h, uploaded_vertices.size() == expected_triangulated_vertices.size());
|
||||||
|
for (std::size_t index = 0; index < uploaded_vertices.size(); ++index) {
|
||||||
|
PP_EXPECT(h, nearly_equal(uploaded_vertices[index].pos.x, expected_triangulated_vertices[index].pos.x));
|
||||||
|
PP_EXPECT(h, nearly_equal(uploaded_vertices[index].pos.y, expected_triangulated_vertices[index].pos.y));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct StrokeFrame {
|
struct StrokeFrame {
|
||||||
int id = -1;
|
int id = -1;
|
||||||
std::array<std::vector<vertex_t>, 6> shapes {};
|
std::array<std::vector<vertex_t>, 6> shapes {};
|
||||||
@@ -825,6 +952,9 @@ int main()
|
|||||||
harness.run(
|
harness.run(
|
||||||
"retained_stroke_sample_executor_unbinds_and_skips_draw_when_bounds_are_empty",
|
"retained_stroke_sample_executor_unbinds_and_skips_draw_when_bounds_are_empty",
|
||||||
retained_stroke_sample_executor_unbinds_and_skips_draw_when_bounds_are_empty);
|
retained_stroke_sample_executor_unbinds_and_skips_draw_when_bounds_are_empty);
|
||||||
|
harness.run(
|
||||||
|
"retained_stroke_face_sample_polygon_triangulates_and_forwards_face_callbacks",
|
||||||
|
retained_stroke_face_sample_polygon_triangulates_and_forwards_face_callbacks);
|
||||||
harness.run(
|
harness.run(
|
||||||
"retained_stroke_frame_samples_preserve_frame_face_callback_order",
|
"retained_stroke_frame_samples_preserve_frame_face_callback_order",
|
||||||
retained_stroke_frame_samples_preserve_frame_face_callback_order);
|
retained_stroke_frame_samples_preserve_frame_face_callback_order);
|
||||||
|
|||||||
Reference in New Issue
Block a user