#include #include #include #include #include #include #include "sprite_data.hpp" #include "variant4.hpp" namespace BGTU::ComputerGraphicsLabWork::Impl { namespace { constexpr RendererApi::Color::Transparent edge_color{0, 255, 255, 200}; class Triangle : public RendererApi::Sprite { private: const RendererApi::PointF<3> a, b, c; public: constexpr Triangle(RendererApi::PointF<3> a, RendererApi::PointF<3> b, RendererApi::PointF<3> c) : a{a}, b{b}, c{c} {} private: void draw(BGTU::ComputerGraphicsLabWork::Utilities::DefaultVoxelDrawerCache::VoxelPainterImpl *frame, const BGTU::ComputerGraphicsLabWork::Impl::SpriteData *data) const final { RendererApi::PointF<3> ta = data->transform * this->a; RendererApi::PointF<3> tb = data->transform * this->b; RendererApi::PointF<3> tc = data->transform * this->c; Utilities::Shapes::triangle_barycentric_interpolator z_interpolator{ {ta.x, ta.y}, ta.z, {tb.x, tb.y}, tb.z, {tc.x, tc.y}, tc.z }; Utilities::Shapes::iterate_triangle_fill( ta.x, ta.y, tb.x, tb.y, tc.x, tc.y, [&](bool is_edge, RendererApi::PointI<2>::component_t x, RendererApi::PointI<2>::component_t y) { if (is_edge) frame->add_voxel(x, y, z_interpolator.interpolate_point(x, y), edge_color); } ); } }; constexpr RendererApi::PointF<3> angle5(double angle, double len) { return {std::cos(std::numbers::pi_v / 5 * angle) * len, std::sin(std::numbers::pi_v / 5 * angle) * len, 0}; } Triangle triangles[] = { {{0.0, 0.0, 1.0}, angle5(0, 2), angle5(1, 1)}, {{0.0, 0.0, -1.0}, angle5(0, 2), angle5(1, 1)}, {{0.0, 0.0, 1.0}, angle5(2, 2), angle5(1, 1)}, {{0.0, 0.0, -1.0}, angle5(2, 2), angle5(1, 1)}, {{0.0, 0.0, 1.0}, angle5(2, 2), angle5(3, 1)}, {{0.0, 0.0, -1.0}, angle5(2, 2), angle5(3, 1)}, {{0.0, 0.0, 1.0}, angle5(4, 2), angle5(3, 1)}, {{0.0, 0.0, -1.0}, angle5(4, 2), angle5(3, 1)}, {{0.0, 0.0, 1.0}, angle5(4, 2), angle5(5, 1)}, {{0.0, 0.0, -1.0}, angle5(4, 2), angle5(5, 1)}, {{0.0, 0.0, 1.0}, angle5(6, 2), angle5(5, 1)}, {{0.0, 0.0, -1.0}, angle5(6, 2), angle5(5, 1)}, {{0.0, 0.0, 1.0}, angle5(6, 2), angle5(7, 1)}, {{0.0, 0.0, -1.0}, angle5(6, 2), angle5(7, 1)}, {{0.0, 0.0, 1.0}, angle5(8, 2), angle5(7, 1)}, {{0.0, 0.0, -1.0}, angle5(8, 2), angle5(7, 1)}, {{0.0, 0.0, 1.0}, angle5(8, 2), angle5(9, 1)}, {{0.0, 0.0, -1.0}, angle5(8, 2), angle5(9, 1)}, {{0.0, 0.0, 1.0}, angle5(0, 2), angle5(9, 1)}, {{0.0, 0.0, -1.0}, angle5(0, 2), angle5(9, 1)}, }; RendererApi::Sprite *_sprites[]{ &triangles[0], &triangles[1], &triangles[2], &triangles[3], &triangles[4], &triangles[5], &triangles[6], &triangles[7], &triangles[8], &triangles[9], &triangles[10], &triangles[11], &triangles[12], &triangles[13], &triangles[14], &triangles[15], &triangles[16], &triangles[17], &triangles[18], &triangles[19], }; } RendererApi::Sprite **const sprites = _sprites; std::size_t sprites_count = 20; }