1#pragma once
2
3#include <iostream>
4#include <fstream>
5#include <stdexcept>
6#include <algorithm>
7#include <chrono>
8#include <vector>
9#include <cstring>
10#include <cstdlib>
11#include <cstdint>
12#include <array>
13#include <optional>
14#include <set>
15#include "taichi/ui/utils/utils.h"
16#include "taichi/ui/backends/vulkan/vertex.h"
17
18#include "taichi/ui/backends/vulkan/app_context.h"
19#include "taichi/ui/backends/vulkan/swap_chain.h"
20#include "taichi/ui/backends/vulkan/renderable.h"
21#include "taichi/program/field_info.h"
22#include "taichi/ui/backends/vulkan/scene.h"
23
24namespace taichi::ui {
25
26namespace vulkan {
27
28class SceneLines final : public Renderable {
29 public:
30 SceneLines(AppContext *app_context, VertexAttributes vbo_attrs);
31
32 void update_data(const SceneLinesInfo &info, const Scene &scene);
33
34 void record_prepass_this_frame_commands(
35 taichi::lang::CommandList *command_list) override;
36
37 void record_this_frame_commands(
38 taichi::lang::CommandList *command_list) override;
39
40 private:
41 struct UniformBufferObject {
42 Scene::SceneUniformBuffer scene;
43 alignas(16) glm::vec3 color;
44 float line_width;
45 int per_vertex_color_offset;
46 int vertex_stride;
47 int start_vertex;
48 int start_index;
49 int num_vertices;
50 int is_indexed;
51 float aspect_ratio;
52 };
53
54 void create_graphics_pipeline() final;
55
56 uint64_t lines_count_{0};
57
58 taichi::lang::Pipeline *quad_expand_pipeline_{nullptr};
59
60 std::unique_ptr<taichi::lang::DeviceAllocationGuard> vbo_translated_{nullptr};
61 std::unique_ptr<taichi::lang::DeviceAllocationGuard> ibo_translated_{nullptr};
62};
63
64} // namespace vulkan
65
66} // namespace taichi::ui
67