| 795 | } |
| 796 | |
| 797 | void ScriptingObjects::ScriptShader::compileRawCode(const String& code) |
| 798 | { |
| 799 | compiledCode = code; |
| 800 | |
| 801 | shaderCode = {}; |
| 802 | |
| 803 | for (auto& p : preprocessors) |
| 804 | { |
| 805 | shaderCode << "#define " << p.name << " " << p.value.toString() << "\n"; |
| 806 | } |
| 807 | |
| 808 | shaderCode << getHeader(); |
| 809 | |
| 810 | shaderCode << compiledCode; |
| 811 | |
| 812 | shader = new OpenGLGraphicsContextCustomShader(shaderCode); |
| 813 | |
| 814 | WeakReference<ScriptShader> safeShader(this); |
| 815 | |
| 816 | iTime = Time::getMillisecondCounterHiRes(); |
| 817 | |
| 818 | shader->onShaderActivated = [safeShader](juce::OpenGLShaderProgram& pr) |
| 819 | { |
| 820 | if (safeShader == nullptr) |
| 821 | return; |
| 822 | |
| 823 | auto thisTime = (float)(Time::getMillisecondCounterHiRes() - safeShader->iTime) * 0.001f; |
| 824 | |
| 825 | auto lr = safeShader->localRect; |
| 826 | auto gr = safeShader->globalRect; |
| 827 | |
| 828 | auto scale = safeShader->scaleFactor; |
| 829 | |
| 830 | auto makeArray = [](var v1, var v2, var v3 = {}) |
| 831 | { |
| 832 | Array<var> l; |
| 833 | l.add(v1); |
| 834 | l.add(v2); |
| 835 | if (!v3.isVoid()) |
| 836 | l.add(v3); |
| 837 | |
| 838 | return var(l); |
| 839 | }; |
| 840 | |
| 841 | safeShader->uniformData.set("iTime", thisTime); |
| 842 | safeShader->uniformData.set("uOffset", makeArray(gr.getX() - lr.getX() * scale, gr.getY() - lr.getY() * scale)); |
| 843 | safeShader->uniformData.set("iResolution", makeArray(lr.getWidth(), lr.getHeight(), 1.0f)); |
| 844 | safeShader->uniformData.set("uScale", scale); |
| 845 | |
| 846 | for (const auto& p : safeShader->uniformData) |
| 847 | { |
| 848 | const auto& v = p.value; |
| 849 | |
| 850 | auto name = p.name.toString().getCharPointer().getAddress(); |
| 851 | |
| 852 | if (v.isArray()) |
| 853 | { |
| 854 | if (v.getArray()->size() == 2) // vec2 |
nothing calls this directly
no test coverage detected