QmlMaterial 0.1.0
Loading...
Searching...
No Matches
nine_patch.hpp
1#pragma once
2
3#include <QVector2D>
4#include <QVector4D>
5
6#include "qml_material/scenegraph/mesh/quad.hpp"
7
8namespace qml_material::sg::mesh
9{
10
35template<class Vertex, class CornerFillFn>
36void build_nine_patch(Vertex* v, QVector2D size, QVector4D radius, CornerFillFn corner_fill) {
37 constexpr int u = 6;
38
39 struct cell {
40 QVector2D origin;
41 QVector2D size;
42 };
43 const cell corners[4] = {
44 { { 0.0f, 0.0f }, { radius[0], radius[0] } },
45 { { size.x() - radius[1], 0.0f }, { radius[1], radius[1] } },
46 { { 0.0f, size.y() - radius[2] }, { radius[2], radius[2] } },
47 { { size.x() - radius[3], size.y() - radius[3] }, { radius[3], radius[3] } },
48 };
49
50 for (int i = 0; i < 4; ++i) {
51 corner_fill(v + u * i, i, corners[i].origin, corners[i].size);
52 }
53
54 // Edge and center cells: stitched by copying corner vertices.
55 // See ASCII diagram in docs; vertex indices hand-verified against the pre-refactor
56 // src/scenegraph/geometry.cpp::update_rectangle_geometry.
57 quad(v + u * 4, v[5], v[u + 0], v[4], v[u + 2]); // Top
58 quad(v + u * 5, v[u * 2 + 1], v[u * 3 + 0], v[u * 2 + 4], v[u * 3 + 2]); // Bottom
59 quad(v + u * 6, v[3], v[4], v[u * 2 + 0], v[u * 2 + 1]); // Left
60 quad(v + u * 7, v[u + 2], v[u + 4], v[u * 3 + 0], v[u * 3 + 1]); // Right
61 quad(v + u * 8, v[4], v[u + 2], v[u * 2 + 1], v[u * 3 + 0]); // Center
62}
63
64} // namespace qml_material::sg::mesh