1 /**
2 * Copyright: Copyright Auburn Sounds 2015-2017
3 * License:   $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
4 * Authors:   Guillaume Piolat
5 */
6 module gui;
7 
8 import std.math;
9 
10 import gfm.math;
11 import dplug.gui;
12 import dplug.pbrwidgets;
13 import dplug.client;
14 
15 import main;
16 
17 // Plugin GUI, based on PBRBackgroundGUI.
18 // If you don't want to use PBR, you not inherit from it.
19 class DistortGUI : PBRBackgroundGUI!("basecolor.jpg", "emissive.png", "material.png",
20                                      "physical.png", "depth.png", "skybox.jpg",
21 
22                                      // Enter here the absolute path to the gfx directory.
23                                      // This will allow to reload images at debug-time with the press of ENTER.
24                                      `C:\Users\myuser\Products\distort\gfx\`)
25 {
26 public:
27 nothrow:
28 @nogc:
29 
30     DistortClient _client;
31 
32     UISlider inputSlider;
33     UIKnob driveKnob;
34     UISlider outputSlider;
35     UIOnOffSwitch onOffSwitch;
36     UIBargraph inputBargraph, outputBargraph;
37 
38     Font _font;
39 
40     this(DistortClient client)
41     {
42         _client = client;
43         super(620, 330); // size
44 
45 
46         // Note: PBRCompositor default lighting might change in a future version (increase of light to allow white plastics).
47         //       So we keep the value.
48         PBRCompositor comp = cast(PBRCompositor)compositor;
49         comp.light1Color = vec3f(0.26, 0.24, 0.22f) * 0.98f;
50         comp.light2Dir = vec3f(-0.5f, 1.0f, 0.23f).normalized;
51         comp.light2Color = vec3f(0.36, 0.38f, 0.40) * 1.148;
52         comp.light3Dir = vec3f(0.0f, 1.0f, 0.1f).normalized;
53         comp.light3Color = vec3f(0.2f, 0.2f, 0.2f) * 0.84f;
54         comp.ambientLight = 0.042f;
55         comp.skyboxAmount = 0.56f;
56 
57         // Optional global color correction.
58         // Very useful at the end of the UI creating process.
59         {
60             mat3x4f colorCorrectionMatrix = mat3x4f(- 0.07f, 1.0f , 1.15f, 0.03f,
61                                                     + 0.01f, 0.93f, 1.16f, 0.08f,
62                                                     + 0.0f , 1.0f , 1.10f, -0.01f);
63             comp.setLiftGammaGainContrastRGB(colorCorrectionMatrix);
64         }
65 
66         // Sets the number of pixels recomputed around dirtied controls.
67         // This is a tradeoff between Emissive light accuracy and speed.
68         // A typical value is between 15 and 30 pixels.
69         setUpdateMargin(30);
70 
71         // All resources are bundled as a string import.
72         // You can avoid resource compilers that way.
73         // The only cost is that each resource is in each binary, this creates overhead with
74         _font = mallocNew!Font(cast(ubyte[])( import("VeraBd.ttf") ));
75 
76         // Builds the UI hierarchy
77         // Note: when Dplug has resizeable UI, all positionning is going
78         // to move into a reflow() override.
79         // Meanwhile, we hardcode each position.
80 
81         RGBA litTrailDiffuse = RGBA(151, 119, 255, 100);
82         RGBA unlitTrailDiffuse = RGBA(81, 54, 108, 0);
83 
84         // Add knob
85         addChild(driveKnob = mallocNew!UIKnob(context(), cast(FloatParameter) _client.param(paramDrive)));
86         driveKnob.position = box2i.rectangle(250, 140, 120, 120);
87         driveKnob.knobRadius = 0.65f;
88         driveKnob.knobDiffuse = RGBA(255, 255, 238, 0);
89         driveKnob.knobMaterial = RGBA(0, 255, 128, 255);
90         driveKnob.numLEDs = 15;
91         driveKnob.litTrailDiffuse = litTrailDiffuse;
92         driveKnob.unlitTrailDiffuse = unlitTrailDiffuse;
93         driveKnob.LEDDiffuseLit = RGBA(40, 40, 40, 100);
94         driveKnob.LEDDiffuseUnlit = RGBA(40, 40, 40, 0);
95         driveKnob.LEDRadiusMin = 0.06f;
96         driveKnob.LEDRadiusMax = 0.06f;
97 
98         // Add sliders
99         addChild(inputSlider = mallocNew!UISlider(context(), cast(FloatParameter) _client.param(paramInput)));
100         inputSlider.position = box2i.rectangle(190, 132, 30, 130);
101         inputSlider.litTrailDiffuse = litTrailDiffuse;
102         inputSlider.unlitTrailDiffuse = unlitTrailDiffuse;
103 
104         addChild(outputSlider = mallocNew!UISlider(context(), cast(FloatParameter) _client.param(paramOutput)));
105         outputSlider.position = box2i.rectangle(410, 132, 30, 130);
106         outputSlider.litTrailDiffuse = litTrailDiffuse;
107         outputSlider.unlitTrailDiffuse = unlitTrailDiffuse;
108 
109         // Add switch
110         addChild(onOffSwitch = mallocNew!UIOnOffSwitch(context(), cast(BoolParameter) _client.param(paramOnOff)));
111         onOffSwitch.position = box2i.rectangle(90, 177, 30, 40);
112         onOffSwitch.diffuseOn = litTrailDiffuse;
113         onOffSwitch.diffuseOff = unlitTrailDiffuse;
114 
115         // Add bargraphs
116         addChild(inputBargraph = mallocNew!UIBargraph(context(), 2, -80.0f, 6.0f));
117         inputBargraph.position = box2i.rectangle(150, 132, 30, 130);
118         addChild(outputBargraph = mallocNew!UIBargraph(context(), 2, -80.0f, 6.0f));
119         outputBargraph.position = box2i.rectangle(450, 132, 30, 130);
120         static immutable float[2] startValues = [0.0f, 0.0f];
121         inputBargraph.setValues(startValues);
122         outputBargraph.setValues(startValues);
123     }
124 
125     ~this()
126     {
127         _font.destroyFree();
128     }
129 }