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 }