iPlug2 - C++ Audio Plug-in Framework
Loading...
Searching...
No Matches
TestCustomShaderControl.h
1/*
2 ==============================================================================
3
4 This file is part of the iPlug 2 library. Copyright (C) the iPlug 2 developers.
5
6 See LICENSE.txt for more info.
7
8 ==============================================================================
9*/
10
11#pragma once
12
13#include "IControl.h"
14#if defined IGRAPHICS_NANOVG
15
21#include "IGraphicsNanoVG.h"
22
23using namespace iplug;
24using namespace igraphics;
25
29{
30public:
31 TestCustomShaderControl(const IRECT& bounds, int paramIdx)
32 : IKnobControlBase(bounds, paramIdx)
33 {
34 SetTooltip("TestCustomShaderControl");
35 }
36
37#ifdef IGRAPHICS_GL
39 {
40 if (mFBO)
41 nvgDeleteFramebuffer(mFBO);
42 }
43
44 void Draw(IGraphics& g) override
45 {
46 NVGcontext* vg = static_cast<NVGcontext*>(g.GetDrawContext());
47 int w = static_cast<int>(mRECT.W() * g.GetDrawScale());
48 int h = static_cast<int>(mRECT.H() * g.GetDrawScale());
49
50 if (invalidateFBO)
51 {
52 if (mFBO)
53 nvgDeleteFramebuffer(mFBO);
54
55 mFBO = nvgCreateFramebuffer(vg, w, h, 0);
56
57 invalidateFBO = false;
58 }
59
60 g.DrawDottedRect(COLOR_BLACK, mRECT);
61 g.FillRect(mMouseIsOver ? COLOR_TRANSLUCENT : COLOR_TRANSPARENT, mRECT);
62
63 nvgEndFrame(vg);
64 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &mInitialFBO);
65
66 nvgBindFramebuffer(mFBO);
67 nvgBeginFrame(vg, static_cast<float>(w), static_cast<float>(h), static_cast<float>(g.GetScreenScale()));
68 GLint vp[4];
69 glGetIntegerv(GL_VIEWPORT, vp);
70
71 glViewport(0, 0, w, h);
72
73 glScissor(0, 0, w, h);
74 glClearColor(0.f, 0.f, 0.f, 0.f);
75 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
76
77 // code from emscripten tests
78
79 auto compileShader = [](GLenum shaderType, const char *src) {
80 GLuint shader = glCreateShader(shaderType);
81 glShaderSource(shader, 1, &src, NULL);
82 glCompileShader(shader);
83
84 GLint isCompiled = 0;
85 glGetShaderiv(shader, GL_COMPILE_STATUS, &isCompiled);
86 if (!isCompiled)
87 {
88 GLint maxLength = 0;
89 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
90 char *buf = (char*)malloc(maxLength+1);
91 glGetShaderInfoLog(shader, maxLength, &maxLength, buf);
92 printf("%s\n", buf);
93 free(buf);
94 return GLuint(0);
95 }
96
97 return shader;
98 };
99
100 auto createProgram = [](GLuint vertexShader, GLuint fragmentShader) {
101 GLuint program = glCreateProgram();
102 glAttachShader(program, vertexShader);
103 glAttachShader(program, fragmentShader);
104 glBindAttribLocation(program, 0, "apos");
105 glBindAttribLocation(program, 1, "acolor");
106 glLinkProgram(program);
107 return program;
108 };
109
110 printf("Supported GLSL version is %s.\n", (char *)glGetString(GL_SHADING_LANGUAGE_VERSION));
111
112 #ifdef IGRAPHICS_GL2
113 static const char vs_str[] =
114 "attribute vec4 apos;\n"
115 "attribute vec4 acolor;\n"
116 "varying vec4 color;\n"
117 "void main() {\n"
118 " color = acolor;\n"
119 " gl_Position = apos;\n"
120 "}";
121 #else
122 static const char vs_str[] =
123 "#version 330 core\n"
124 "in vec4 apos;\n"
125 "in vec4 acolor;\n"
126 "out vec4 color;\n"
127 "void main() {\n"
128 " color = acolor;\n"
129 " gl_Position = apos;\n"
130 "}";
131 #endif
132 GLuint vs = compileShader(GL_VERTEX_SHADER, vs_str);
133
134 #ifdef IGRAPHICS_GL2
135 static const char fs_str[] =
136 "varying vec4 color;\n"
137 "uniform vec4 color2;\n"
138 "void main() {\n"
139 " gl_FragColor = color;\n"
140 "}";
141 #else
142 static const char fs_str[] =
143 "#version 330 core\n"
144 "in vec4 color;\n"
145 "out vec4 FragColor;\n"
146 "uniform vec4 color2;\n"
147 "void main() {\n"
148 " FragColor = color;\n"
149 "}";
150 #endif
151 GLuint fs = compileShader(GL_FRAGMENT_SHADER, fs_str);
152
153 GLuint program = createProgram(vs, fs);
154 glUseProgram(program);
155
156 static const float posAndColor[] = {
157 // x, y, r, g, b
158 -0.6f, -0.6f, 1.0f, 0.0f, 0.0f,
159 0.6f, -0.6f, 0.0f, 1.0f, 0.0f,
160 0.f, 0.6f, 0.0f, 0.0f, 1.0f,
161 };
162
163 #ifndef IGRAPHICS_GL2
164 GLuint vao;
165 glGenVertexArrays(1, &vao);
166 glBindVertexArray(vao);
167 #endif
168
169 GLuint vbo;
170 glGenBuffers(1, &vbo);
171 glBindBuffer(GL_ARRAY_BUFFER, vbo);
172 glBufferData(GL_ARRAY_BUFFER, sizeof(posAndColor), posAndColor, GL_STATIC_DRAW);
173
174 #ifdef IGRAPHICS_GL2
175 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), 0);
176 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(2 * sizeof(float)));
177 glEnableVertexAttribArray(0);
178 glEnableVertexAttribArray(1);
179 #else
180 GLint posAttrib = glGetAttribLocation(program, "apos");
181 GLint colorAttrib = glGetAttribLocation(program, "acolor");
182 glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), 0);
183 glVertexAttribPointer(colorAttrib, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(2 * sizeof(float)));
184 glEnableVertexAttribArray(posAttrib);
185 glEnableVertexAttribArray(colorAttrib);
186 #endif
187
188 glDrawArrays(GL_TRIANGLES, 0, 3);
189
190 glViewport(vp[0], vp[1], vp[2], vp[3]);
191
192 nvgEndFrame(vg);
193 glBindFramebuffer(GL_FRAMEBUFFER, mInitialFBO);
194 nvgBeginFrame(vg, static_cast<float>(g.WindowWidth()),
195 static_cast<float>(g.WindowHeight()),
196 static_cast<float>(g.GetScreenScale()));
197
198 APIBitmap apibmp {mFBO->image, w, h, 1, 1.};
199 IBitmap bmp {&apibmp, 1, false};
200
201 g.DrawFittedBitmap(bmp, mRECT);
202 }
203
204 void OnResize() override
205 {
206 invalidateFBO = true;
207 }
208
209 void OnRescale() override
210 {
211 invalidateFBO = true;
212 }
213#elif defined IGRAPHICS_METAL
215
216 void CleanUp();
217
218 void Draw(IGraphics& g) override;
219#endif
220
221private:
222 NVGframebuffer* mFBO = nullptr;
223
224#ifdef IGRAPHICS_METAL
225 void* mRenderPassDescriptor = nullptr;
226 void* mRenderPipeline = nullptr;
227#else
228 int mInitialFBO = 0;
229#endif
230 bool invalidateFBO = true;
231};
232
233#else
236{
237public:
238 TestCustomShaderControl(const IRECT& bounds, int paramIdx)
239 : IControl(bounds)
240 {
241 SetTooltip("TestCustomShaderControl");
242 }
243
244 void Draw(IGraphics& g) override
245 {
246 g.DrawText(mText, "UNSUPPORTED", mRECT);
247 }
248};
249#endif
This file contains the base IControl implementation, along with some base classes for specific types ...
A base class interface for a bitmap abstraction around the different drawing back end bitmap represen...
User-facing bitmap abstraction that you use to manage bitmap data, independant of draw class/platform...
The lowest level base class of an IGraphics control.
Definition: IControl.h:49
virtual void OnResize()
Called when IControl is constructed or resized using SetRect().
Definition: IControl.h:153
bool mMouseIsOver
if mGraphics::mHandleMouseOver = true, this will be true when the mouse is over control.
Definition: IControl.h:565
virtual void OnRescale()
Implement to do something when graphics is scaled globally (e.g.
Definition: IControl.h:150
IControl * SetTooltip(const char *str)
Set a tooltip for the control.
Definition: IControl.h:221
The lowest level base class of an IGraphics context.
Definition: IGraphics.h:86
virtual void DrawFittedBitmap(const IBitmap &bitmap, const IRECT &bounds, const IBlend *pBlend=0)
Draw a bitmap (raster) image to the graphics context, scaling the image to fit the bounds.
Definition: IGraphics.cpp:2785
void DrawText(const IText &text, const char *str, const IRECT &bounds, const IBlend *pBlend=0)
Draw some text to the graphics context in a specific rectangle.
Definition: IGraphics.cpp:678
virtual void * GetDrawContext()=0
Gets a void pointer to underlying drawing context, for the IGraphics backend See draw class implement...
virtual void DrawDottedRect(const IColor &color, const IRECT &bounds, const IBlend *pBlend=0, float thickness=1.f, float dashLen=2.f)
Draw a dotted rectangle to the graphics context.
Definition: IGraphics.cpp:2550
int WindowWidth() const
Gets the width of the graphics context including draw scaling.
Definition: IGraphics.h:1094
virtual void FillRect(const IColor &color, const IRECT &bounds, const IBlend *pBlend=0)
Fill a rectangular region of the graphics context with a color.
Definition: IGraphics.cpp:2580
float GetScreenScale() const
Gets the screen/display scaling factor, e.g.
Definition: IGraphics.h:1110
float GetDrawScale() const
Gets the graphics context scaling factor.
Definition: IGraphics.h:1106
int WindowHeight() const
Gets the height of the graphics context including draw scaling.
Definition: IGraphics.h:1098
A base class for knob/dial controls, to handle mouse action and Sender.
Definition: IControl.h:1373
Control to test IGraphicsNanoVG with Metal Shaders.
void Draw(IGraphics &g) override
Draw the control to the graphics context.
Used to manage a rectangular area, independent of draw class/platform.
float W() const
float H() const