1 module rpui.theme;
2
3 import std.path;
4 import std.file;
5
6 import rpdl;
7
8 import gapi.font;
9 import gapi.texture;
10 import gapi.shader;
11
12 import rpui.paths;
13
14 struct Theme {
15 string name;
16 RpdlTree tree;
17 Texture2D skin;
18 Font regularFont;
19 int regularFontSize;
20 ThemeShaders shaders;
21 }
22
23 struct ThemeShaders {
24 ShaderProgram textureAtlasShader;
25 ShaderProgram textShader;
26 ShaderProgram transformShader;
27 ShaderProgram colorShader;
28 }
29
30 Theme createThemeByName(in string theme) {
31 const paths = createPathes();
32 const dir = buildPath(paths.resources, "ui", "themes", theme);
33
34 auto tree = new RpdlTree(dir);
35 tree.load("theme.rdl");
36
37 const skinPath = buildPath(dir, "controls.png");
38 const skin = createTexture2DFromFile(skinPath);
39
40 const regularFontFileName = tree.data.getString("General.regularFont.0");
41 const regularFontSize = tree.data.getInteger("General.regularFont.1");
42 Font font = createFontFromFile(buildPath(paths.resources, "fonts", regularFontFileName));
43
44 return Theme(theme, tree, skin, font, regularFontSize, createThemeShaders());
45 }
46
47 private ThemeShaders createThemeShaders() {
48 return ThemeShaders(
49 createSimpleShader("tex atlas", "transform_vertex.glsl", "texture_atlas_fragment.glsl"),
50 createSimpleShader("text", "transform_vertex.glsl", "text_fragment.glsl"),
51 createSimpleShader("transform", "transform_vertex.glsl", "texture_fragment.glsl"),
52 createSimpleShader("color", "transform_vertex.glsl", "color_fragment.glsl"),
53 );
54 }
55
56 private ShaderProgram createSimpleShader(in string name, in string vertex, in string fragment) {
57 const vertexSource = readText(buildPath("res", "shaders", vertex));
58 const vertexShader = createShader(vertex, ShaderType.vertex, vertexSource);
59
60 const fragmentSource = readText(buildPath("res", "shaders", fragment));
61 const fragmentShader = createShader(fragment, ShaderType.fragment, fragmentSource);
62
63 return createShaderProgram(name ~ " shader program", [vertexShader, fragmentShader]);
64 }