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 static const char vs_str[] =
113 "attribute vec4 apos;"
114 "attribute vec4 acolor;"
115 "varying vec4 color;"
116 "void main() {"
117 "color = acolor;"
118 "gl_Position = apos;"
119 "}";
120 GLuint vs = compileShader(GL_VERTEX_SHADER, vs_str);
121
122 static const char fs_str[] =
123#ifdef OS_WEB
124 "precision lowp float;"
125#endif
126 "varying vec4 color;"
127 "uniform vec4 color2;"
128 "void main() {"
129 "gl_FragColor = color;"
130 "}";
131 GLuint fs = compileShader(GL_FRAGMENT_SHADER, fs_str);
132
133 GLuint program = createProgram(vs, fs);
134 glUseProgram(program);
135
136 static const float posAndColor[] = {
137 // x, y, r, g, b
138 -0.6f, -0.6f, 1.0, 0.0, 0.0,
139 0.6f, -0.6f, 0.0, 1.0, 0.0,
140 0.f, 0.6f, 0.0, 0.0, 1.0,
141 };
142
143 GLuint vbo;
144 glGenBuffers(1, &vbo);
145 glBindBuffer(GL_ARRAY_BUFFER, vbo);
146 glBufferData(GL_ARRAY_BUFFER, sizeof(posAndColor), posAndColor, GL_STATIC_DRAW);
147 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 20, 0);
148 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 20, (void*)8);
149 glEnableVertexAttribArray(0);
150 glEnableVertexAttribArray(1);
151
152 glDrawArrays(GL_TRIANGLES, 0, 3);
153
154 glViewport(vp[0], vp[1], vp[2], vp[3]);
155
156 nvgEndFrame(vg);
157 glBindFramebuffer(GL_FRAMEBUFFER, mInitialFBO);
158 nvgBeginFrame(vg, static_cast<float>(g.WindowWidth()),
159 static_cast<float>(g.WindowHeight()),
160 static_cast<float>(g.GetScreenScale()));
161
162 APIBitmap apibmp {mFBO->image, w, h, 1, 1.};
163 IBitmap bmp {&apibmp, 1, false};
164
165 g.DrawFittedBitmap(bmp, mRECT);
166 }
167
168 void OnResize() override
169 {
170 invalidateFBO = true;
171 }
172
173 void OnRescale() override
174 {
175 invalidateFBO = true;
176 }
177#elif defined IGRAPHICS_METAL
179
180 void CleanUp();
181
182 void Draw(IGraphics& g) override;
183#endif
184
185private:
186 NVGframebuffer* mFBO = nullptr;
187
188#ifdef IGRAPHICS_METAL
189 void* mRenderPassDescriptor = nullptr;
190 void* mRenderPipeline = nullptr;
191#else
192 int mInitialFBO = 0;
193#endif
194 bool invalidateFBO = true;
195};
196
197#else
200{
201public:
202 TestCustomShaderControl(const IRECT& bounds, int paramIdx)
203 : IControl(bounds)
204 {
205 SetTooltip("TestCustomShaderControl");
206 }
207
208 void Draw(IGraphics& g) override
209 {
210 g.DrawText(mText, "UNSUPPORTED", mRECT);
211 }
212};
213#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:560
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:216
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:2774
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:670
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:2539
int WindowWidth() const
Gets the width of the graphics context including draw scaling.
Definition: IGraphics.h:1089
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:2569
float GetScreenScale() const
Gets the screen/display scaling factor, e.g.
Definition: IGraphics.h:1105
float GetDrawScale() const
Gets the graphics context scaling factor.
Definition: IGraphics.h:1101
int WindowHeight() const
Gets the height of the graphics context including draw scaling.
Definition: IGraphics.h:1093
A base class for knob/dial controls, to handle mouse action and Sender.
Definition: IControl.h:1368
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