1 module rpui.render.transforms_system;
2 
3 import std.container.array;
4 import std.experimental.allocator.building_blocks.region;
5 
6 import rpui.events;
7 import rpui.render.transforms;
8 import rpui.render.components;
9 import rpui.math;
10 
11 struct QuadTransformsInput {
12     size_t entityId;
13     CameraView cameraView;
14     vec2 position;
15     vec2 size;
16 }
17 
18 struct ChainTransformsInput {
19     size_t entityId;
20     float[ChainPart] widths;
21     CameraView cameraView;
22     vec2 position;
23     vec2 size;
24 }
25 
26 struct QuadTransformsResult {
27     size_t entityId;
28     QuadTransforms transforms;
29 }
30 
31 struct UiTextTransformsInput {
32     CameraView cameraView;
33 }
34 
35 enum RenderType {
36     colorQuad,
37     textureQuad,
38     horizontalChain,
39     verticalChain,
40     text,
41 }
42 
43 union RenderData {
44     TextureQuad textureQuad;
45     TexAtlasTextureQuad texAtlasTextureQuad;
46 }
47 
48 union TransformsData {
49 }
50 
51 struct RenderEntity {
52     size_t id;
53     RenderType renderType;
54     RenderData renderData;
55     TransformsData transforms;
56 }
57 
58 final class NewRenderer {
59     NewTransformsSystem transformsSystem;
60     Array!RenderEntity entities;
61 
62     void onPreRender() {
63         // with (transformsSystem) {
64         //     quadsInput.clear();
65         //     horizontalChainsInput.clear();
66         //     verticalChainsInput.clear();
67         //     textsInput.clear();
68         // }
69     }
70 
71     void queryRenderTextureQuad(QuadTransformsInput input, in TexAtlasTextureQuad quad) {
72         // auto test = Algebraic!(const(TexAtlasTextureQuad))(quad);
73         const RenderData renderData = { texAtlasTextureQuad: quad };
74         const entity = RenderEntity(entities.length, RenderType.textureQuad, renderData);
75 
76         entities.insert(entity);
77         transformsSystem.quadsInput.insert(input);
78     }
79 
80     void onRender() {
81     }
82 }
83 
84 final class NewTransformsSystem {
85     Array!QuadTransformsInput quadsInput;
86     Array!ChainTransformsInput horizontalChainsInput;
87     Array!ChainTransformsInput verticalChainsInput;
88     Array!UiTextTransformsInput textsInput;
89 
90     Array!QuadTransformsResult quadsResult;
91     Array!HorizontalChainTransforms horizontalChainsResult;
92     Array!HorizontalChainTransforms verticalChainsResult;
93     Array!UiTextTransforms textsResult;
94 
95     void onProgress() {
96         quadsResult.length = quadsInput.length;
97         horizontalChainsResult.length = horizontalChainsInput.length;
98         textsResult.length = textsResult.length;
99 
100         for (int i = 0; i < quadsInput.length; ++i) {
101             quadsResult[i].entityId = quadsInput[i].entityId;
102             quadsResult[i].transforms = updateQuadTransforms(
103                 quadsInput[i].cameraView,
104                 quadsInput[i].position,
105                 quadsInput[i].size,
106             );
107         }
108 
109         for (int i = 0; i < horizontalChainsInput.length; ++i) {
110             horizontalChainsResult[i] = updateHorizontalChainTransforms(
111                 horizontalChainsInput[i].widths,
112                 horizontalChainsInput[i].cameraView,
113                 horizontalChainsInput[i].position,
114                 horizontalChainsInput[i].size,
115             );
116         }
117 
118         for (int i = 0; i < verticalChainsInput.length; ++i) {
119             verticalChainsResult[i] = updateVerticalChainTransforms(
120                 verticalChainsInput[i].widths,
121                 verticalChainsInput[i].cameraView,
122                 verticalChainsInput[i].position,
123                 verticalChainsInput[i].size,
124             );
125         }
126 
127         quadsInput.clear();
128     }
129 }