mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
More openGL refactoring, completion of all-shader graphic pipeline.
This commit is contained in:
parent
7c486b83d8
commit
b65b34ad40
31 changed files with 461 additions and 217 deletions
|
|
@ -384,6 +384,7 @@
|
|||
5741A7FD2C785C3F65377A45 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_AudioCDReader.cpp"; path = "../../../../modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
574BCE46C31D810F694B0651 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileChooserDialogBox.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
575587359A2F65312CE97AC4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_graphics.mm"; path = "../../../../modules/juce_graphics/juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
|
||||
5786364EC4C531CDE41BDCEA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLContext.cpp"; path = "../../../../modules/juce_opengl/opengl/juce_OpenGLContext.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
579D22DA6ECC930E19B7104A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = "SOURCE_ROOT"; };
|
||||
58061ADC1867C814A334D49D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileInputStream.cpp"; path = "../../../../modules/juce_core/files/juce_FileInputStream.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
58864C3D7F369EBE01E42C5C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLShaderProgram.cpp"; path = "../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
|
|
@ -1897,6 +1898,7 @@
|
|||
87FB016388B49E97FCCBE69B,
|
||||
4F802BD98072EA49F7F4FE4A,
|
||||
D6D0F076F54C7D669A9717C9,
|
||||
5786364EC4C531CDE41BDCEA,
|
||||
8878426C7F58CB22969E7133,
|
||||
AC3EFDDC80761A45E8BE0624,
|
||||
43E4604C39E9A992216F6B98,
|
||||
|
|
|
|||
|
|
@ -4265,6 +4265,16 @@
|
|||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLComponent.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLContext.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
<Tool Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration Name="Release|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
<Tool Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLContext.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLFrameBuffer.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
|
|
|
|||
|
|
@ -4265,6 +4265,16 @@
|
|||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLComponent.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLContext.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
<Tool Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration Name="Release|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
<Tool Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLContext.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLFrameBuffer.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
|
|
|
|||
|
|
@ -1145,6 +1145,9 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLComponent.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLContext.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLFrameBuffer.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
|
|
|
|||
|
|
@ -1498,6 +1498,9 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLComponent.cpp">
|
||||
<Filter>Juce Modules\juce_opengl\opengl</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLContext.cpp">
|
||||
<Filter>Juce Modules\juce_opengl\opengl</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLFrameBuffer.cpp">
|
||||
<Filter>Juce Modules\juce_opengl\opengl</Filter>
|
||||
</ClCompile>
|
||||
|
|
|
|||
|
|
@ -378,6 +378,7 @@
|
|||
5741A7FD2C785C3F65377A45 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_AudioCDReader.cpp"; path = "../../../../modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
574BCE46C31D810F694B0651 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileChooserDialogBox.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
575587359A2F65312CE97AC4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_graphics.mm"; path = "../../../../modules/juce_graphics/juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
|
||||
5786364EC4C531CDE41BDCEA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLContext.cpp"; path = "../../../../modules/juce_opengl/opengl/juce_OpenGLContext.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
579D22DA6ECC930E19B7104A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = "SOURCE_ROOT"; };
|
||||
58061ADC1867C814A334D49D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileInputStream.cpp"; path = "../../../../modules/juce_core/files/juce_FileInputStream.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
58864C3D7F369EBE01E42C5C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLShaderProgram.cpp"; path = "../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
|
|
@ -1889,6 +1890,7 @@
|
|||
87FB016388B49E97FCCBE69B,
|
||||
4F802BD98072EA49F7F4FE4A,
|
||||
D6D0F076F54C7D669A9717C9,
|
||||
5786364EC4C531CDE41BDCEA,
|
||||
8878426C7F58CB22969E7133,
|
||||
AC3EFDDC80761A45E8BE0624,
|
||||
43E4604C39E9A992216F6B98,
|
||||
|
|
|
|||
|
|
@ -102,6 +102,7 @@ public:
|
|||
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glEnable (GL_TEXTURE_2D);
|
||||
|
||||
#if JUCE_USE_OPENGL_FIXED_FUNCTION
|
||||
OpenGLHelpers::prepareFor2D (getWidth(), getHeight());
|
||||
OpenGLHelpers::setPerspective (45.0, getWidth() / (double) getHeight(), 0.1, 100.0);
|
||||
|
||||
|
|
@ -123,6 +124,7 @@ public:
|
|||
tex2->draw3D (-1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, Colours::white);
|
||||
tex2->draw3D ( 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, Colours::white);
|
||||
tex2->draw3D (-1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, Colours::white);
|
||||
#endif
|
||||
}
|
||||
|
||||
void updateTextureImage()
|
||||
|
|
|
|||
|
|
@ -531,6 +531,7 @@
|
|||
94B22D21E4DE9259A3F385A3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DropShadowEffect.h"; path = "../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
94B986F221A8369B8DE3D986 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WeakReference.h"; path = "../../../../modules/juce_core/memory/juce_WeakReference.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
94D27CA81B1481621186F4D5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RenderingHelpers.h"; path = "../../../../modules/juce_graphics/native/juce_RenderingHelpers.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
9512FB5C9D667ED59CFC0FF4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLContext.cpp"; path = "../../../../modules/juce_opengl/opengl/juce_OpenGLContext.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
956BE0B32D5B1410E43A3C58 = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../../../modules/juce_data_structures/juce_module_info"; sourceTree = "SOURCE_ROOT"; };
|
||||
957428BC0CD90C37ED1EB7E1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringArray.h"; path = "../../../../modules/juce_core/text/juce_StringArray.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
9647232A743A0C7BFE819385 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextPropertyComponent.h"; path = "../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
|
|
@ -1819,6 +1820,7 @@
|
|||
483527FCBD7F07A7AF4743CC,
|
||||
CD96180DDD8610A155629CE1,
|
||||
E89669EB797637247F52D30F,
|
||||
9512FB5C9D667ED59CFC0FF4,
|
||||
BE0231D93CBB02BBC2704D1D,
|
||||
43D23C18695F24F9A3DFA7B4,
|
||||
438CA87567F47F9AF39788D1,
|
||||
|
|
|
|||
|
|
@ -4188,6 +4188,16 @@
|
|||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLComponent.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLContext.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
<Tool Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration Name="Release|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
<Tool Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLContext.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLFrameBuffer.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
|
|
|
|||
|
|
@ -4188,6 +4188,16 @@
|
|||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLComponent.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLContext.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
<Tool Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration Name="Release|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
<Tool Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLContext.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLFrameBuffer.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
|
|
|
|||
|
|
@ -763,6 +763,7 @@
|
|||
EAE0B8FF746C48C9DABAED77 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableImage.h"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
EAE67BB8B131F061CB7E700A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MessageManager.h"; path = "../../../../modules/juce_events/messages/juce_MessageManager.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
EB008019C93FB5EBC6E7C6AF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SVGParser.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
EB41509899310297C8F7AC64 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLContext.cpp"; path = "../../../../modules/juce_opengl/opengl/juce_OpenGLContext.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
EB4779567474C91D748C88F3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageButton.h"; path = "../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
EB54BA5F65E57F090589BA49 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageFileFormat.cpp"; path = "../../../../modules/juce_graphics/images/juce_ImageFileFormat.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
EC1624FD38473AA2FF8ECE1A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MenuBarModel.cpp"; path = "../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
|
|
@ -1738,6 +1739,7 @@
|
|||
0B41301E2279379BE7955E65,
|
||||
1227115BD17EB8F0667DB117,
|
||||
DC76043392FDF3B5BD7D2554,
|
||||
EB41509899310297C8F7AC64,
|
||||
6096E343983724F254B268C3,
|
||||
73C6ABF23C4B143DB2BC7226,
|
||||
9D4FC9BEE122256B2557D088,
|
||||
|
|
|
|||
|
|
@ -4079,6 +4079,16 @@
|
|||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLComponent.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLContext.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
<Tool Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration Name="Release|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
<Tool Name="VCCLCompilerTool"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLContext.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLFrameBuffer.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
|
|
|
|||
|
|
@ -1108,6 +1108,9 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLComponent.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLContext.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLFrameBuffer.cpp">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
|
|
|
|||
|
|
@ -1384,6 +1384,9 @@
|
|||
<ClCompile Include="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLComponent.cpp">
|
||||
<Filter>Juce Modules\juce_opengl\opengl</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLContext.cpp">
|
||||
<Filter>Juce Modules\juce_opengl\opengl</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\..\modules\juce_opengl\opengl\juce_OpenGLFrameBuffer.cpp">
|
||||
<Filter>Juce Modules\juce_opengl\opengl</Filter>
|
||||
</ClCompile>
|
||||
|
|
|
|||
|
|
@ -376,7 +376,7 @@ public:
|
|||
public:
|
||||
//==============================================================================
|
||||
Iterator (const HashMap& hashMapToIterate)
|
||||
: hashMap (hashMapToIterate), entry (0), index (0)
|
||||
: hashMap (hashMapToIterate), entry (nullptr), index (0)
|
||||
{}
|
||||
|
||||
/** Moves to the next item, if one is available.
|
||||
|
|
|
|||
|
|
@ -147,6 +147,7 @@ void OpenGLExtensionFunctions::initialise()
|
|||
//==============================================================================
|
||||
// START_AUTOINCLUDE opengl/*.cpp
|
||||
#include "opengl/juce_OpenGLComponent.cpp"
|
||||
#include "opengl/juce_OpenGLContext.cpp"
|
||||
#include "opengl/juce_OpenGLFrameBuffer.cpp"
|
||||
#include "opengl/juce_OpenGLGraphicsContext.cpp"
|
||||
#include "opengl/juce_OpenGLHelpers.cpp"
|
||||
|
|
|
|||
|
|
@ -76,7 +76,6 @@
|
|||
|
||||
//=============================================================================
|
||||
BEGIN_JUCE_NAMESPACE
|
||||
#include "opengl/juce_OpenGLRenderingTarget.h"
|
||||
#include "opengl/juce_OpenGLHelpers.h"
|
||||
|
||||
// START_AUTOINCLUDE opengl
|
||||
|
|
|
|||
|
|
@ -74,20 +74,16 @@ public:
|
|||
|
||||
~GLESContext()
|
||||
{
|
||||
deleteContext();
|
||||
properties.clear(); // to release any stored programs, etc that may be held in properties.
|
||||
makeInactive();
|
||||
[context release];
|
||||
context = nil;
|
||||
|
||||
[view removeFromSuperview];
|
||||
[view release];
|
||||
freeGLBuffers();
|
||||
}
|
||||
|
||||
void deleteContext()
|
||||
{
|
||||
makeInactive();
|
||||
[context release];
|
||||
context = nil;
|
||||
}
|
||||
|
||||
bool makeActive() const noexcept
|
||||
{
|
||||
jassert (context != nil);
|
||||
|
|
@ -116,6 +112,9 @@ public:
|
|||
void* getRawContext() const noexcept { return glLayer; }
|
||||
unsigned int getFrameBufferID() const { return (unsigned int) frameBufferHandle; }
|
||||
|
||||
int getWidth() const { return lastWidth; }
|
||||
int getHeight() const { return lastHeight; }
|
||||
|
||||
void updateWindowPosition (const Rectangle<int>& bounds)
|
||||
{
|
||||
// For some strange reason, the view seems to fail unless its width is a multiple of 8...
|
||||
|
|
|
|||
|
|
@ -103,14 +103,8 @@ public:
|
|||
~WindowedGLContext()
|
||||
{
|
||||
ScopedXLock xlock;
|
||||
deleteContext();
|
||||
|
||||
XUnmapWindow (display, embeddedWindow);
|
||||
XDestroyWindow (display, embeddedWindow);
|
||||
}
|
||||
|
||||
void deleteContext()
|
||||
{
|
||||
properties.clear(); // to release any stored programs, etc that may be held in properties.
|
||||
makeInactive();
|
||||
|
||||
if (renderContext != 0)
|
||||
|
|
@ -119,6 +113,9 @@ public:
|
|||
glXDestroyContext (display, renderContext);
|
||||
renderContext = nullptr;
|
||||
}
|
||||
|
||||
XUnmapWindow (display, embeddedWindow);
|
||||
XDestroyWindow (display, embeddedWindow);
|
||||
}
|
||||
|
||||
bool makeActive() const noexcept
|
||||
|
|
@ -142,14 +139,19 @@ public:
|
|||
return glXGetCurrentContext() == renderContext;
|
||||
}
|
||||
|
||||
void* getRawContext() const noexcept
|
||||
{
|
||||
return renderContext;
|
||||
}
|
||||
unsigned int getFrameBufferID() const { return 0; }
|
||||
void* getRawContext() const noexcept { return renderContext; }
|
||||
|
||||
unsigned int getFrameBufferID() const
|
||||
int getWidth() const { return bounds.getWidth(); }
|
||||
int getHeight() const { return bounds.getHeight(); }
|
||||
|
||||
void updateWindowPosition (const Rectangle<int>& newBounds)
|
||||
{
|
||||
return 0;
|
||||
bounds = newBounds;
|
||||
|
||||
ScopedXLock xlock;
|
||||
XMoveResizeWindow (display, embeddedWindow,
|
||||
bounds.getX(), bounds.getY(), jmax (1, bounds.getWidth()), jmax (1, bounds.getHeight()));
|
||||
}
|
||||
|
||||
void swapBuffers()
|
||||
|
|
@ -183,6 +185,7 @@ public:
|
|||
|
||||
private:
|
||||
int swapInterval;
|
||||
Rectangle<int> bounds;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WindowedGLContext);
|
||||
};
|
||||
|
|
@ -201,13 +204,7 @@ void OpenGLComponent::updateEmbeddedPosition (const Rectangle<int>& bounds)
|
|||
const ScopedLock sl (contextLock);
|
||||
|
||||
if (context != nullptr)
|
||||
{
|
||||
Window embeddedWindow = static_cast<WindowedGLContext*> (context.get())->embeddedWindow;
|
||||
|
||||
ScopedXLock xlock;
|
||||
XMoveResizeWindow (display, embeddedWindow,
|
||||
bounds.getX(), bounds.getY(), jmax (1, bounds.getWidth()), jmax (1, bounds.getHeight()));
|
||||
}
|
||||
static_cast<WindowedGLContext*> (context.get())->updateWindowPosition (bounds);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
|
|
@ -160,11 +160,8 @@ public:
|
|||
|
||||
~WindowedGLContext()
|
||||
{
|
||||
deleteContext();
|
||||
}
|
||||
properties.clear(); // to release any stored programs, etc that may be held in properties.
|
||||
|
||||
void deleteContext()
|
||||
{
|
||||
makeInactive();
|
||||
[renderContext clearDrawable];
|
||||
[renderContext setView: nil];
|
||||
|
|
@ -197,6 +194,9 @@ public:
|
|||
void* getRawContext() const noexcept { return renderContext; }
|
||||
unsigned int getFrameBufferID() const { return 0; }
|
||||
|
||||
int getWidth() const { return [view frame].size.width; }
|
||||
int getHeight() const { return [view frame].size.height; }
|
||||
|
||||
void swapBuffers()
|
||||
{
|
||||
[renderContext flushBuffer];
|
||||
|
|
|
|||
|
|
@ -64,13 +64,7 @@ public:
|
|||
|
||||
~WindowedGLContext()
|
||||
{
|
||||
deleteContext();
|
||||
ReleaseDC ((HWND) nativeWindow->getNativeHandle(), dc);
|
||||
nativeWindow = nullptr;
|
||||
}
|
||||
|
||||
void deleteContext()
|
||||
{
|
||||
properties.clear(); // to release any stored programs, etc that may be held in properties.
|
||||
makeInactive();
|
||||
|
||||
if (renderContext != 0)
|
||||
|
|
@ -78,6 +72,9 @@ public:
|
|||
wglDeleteContext (renderContext);
|
||||
renderContext = 0;
|
||||
}
|
||||
|
||||
ReleaseDC ((HWND) nativeWindow->getNativeHandle(), dc);
|
||||
nativeWindow = nullptr;
|
||||
}
|
||||
|
||||
bool makeActive() const noexcept
|
||||
|
|
@ -96,15 +93,11 @@ public:
|
|||
return wglGetCurrentContext() == renderContext;
|
||||
}
|
||||
|
||||
void* getRawContext() const noexcept
|
||||
{
|
||||
return renderContext;
|
||||
}
|
||||
void* getRawContext() const noexcept { return renderContext; }
|
||||
unsigned int getFrameBufferID() const { return 0; }
|
||||
|
||||
unsigned int getFrameBufferID() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int getWidth() const { return component->getWidth(); }
|
||||
int getHeight() const { return component->getHeight(); }
|
||||
|
||||
bool setPixelFormat (const OpenGLPixelFormat& pixelFormat)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -23,98 +23,6 @@
|
|||
==============================================================================
|
||||
*/
|
||||
|
||||
//==============================================================================
|
||||
OpenGLPixelFormat::OpenGLPixelFormat (const int bitsPerRGBComponent,
|
||||
const int alphaBits_,
|
||||
const int depthBufferBits_,
|
||||
const int stencilBufferBits_) noexcept
|
||||
: redBits (bitsPerRGBComponent),
|
||||
greenBits (bitsPerRGBComponent),
|
||||
blueBits (bitsPerRGBComponent),
|
||||
alphaBits (alphaBits_),
|
||||
depthBufferBits (depthBufferBits_),
|
||||
stencilBufferBits (stencilBufferBits_),
|
||||
accumulationBufferRedBits (0),
|
||||
accumulationBufferGreenBits (0),
|
||||
accumulationBufferBlueBits (0),
|
||||
accumulationBufferAlphaBits (0),
|
||||
multisamplingLevel (0)
|
||||
{
|
||||
}
|
||||
|
||||
OpenGLPixelFormat::OpenGLPixelFormat (const OpenGLPixelFormat& other) noexcept
|
||||
: redBits (other.redBits),
|
||||
greenBits (other.greenBits),
|
||||
blueBits (other.blueBits),
|
||||
alphaBits (other.alphaBits),
|
||||
depthBufferBits (other.depthBufferBits),
|
||||
stencilBufferBits (other.stencilBufferBits),
|
||||
accumulationBufferRedBits (other.accumulationBufferRedBits),
|
||||
accumulationBufferGreenBits (other.accumulationBufferGreenBits),
|
||||
accumulationBufferBlueBits (other.accumulationBufferBlueBits),
|
||||
accumulationBufferAlphaBits (other.accumulationBufferAlphaBits),
|
||||
multisamplingLevel (other.multisamplingLevel)
|
||||
{
|
||||
}
|
||||
|
||||
OpenGLPixelFormat& OpenGLPixelFormat::operator= (const OpenGLPixelFormat& other) noexcept
|
||||
{
|
||||
redBits = other.redBits;
|
||||
greenBits = other.greenBits;
|
||||
blueBits = other.blueBits;
|
||||
alphaBits = other.alphaBits;
|
||||
depthBufferBits = other.depthBufferBits;
|
||||
stencilBufferBits = other.stencilBufferBits;
|
||||
accumulationBufferRedBits = other.accumulationBufferRedBits;
|
||||
accumulationBufferGreenBits = other.accumulationBufferGreenBits;
|
||||
accumulationBufferBlueBits = other.accumulationBufferBlueBits;
|
||||
accumulationBufferAlphaBits = other.accumulationBufferAlphaBits;
|
||||
multisamplingLevel = other.multisamplingLevel;
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool OpenGLPixelFormat::operator== (const OpenGLPixelFormat& other) const noexcept
|
||||
{
|
||||
return redBits == other.redBits
|
||||
&& greenBits == other.greenBits
|
||||
&& blueBits == other.blueBits
|
||||
&& alphaBits == other.alphaBits
|
||||
&& depthBufferBits == other.depthBufferBits
|
||||
&& stencilBufferBits == other.stencilBufferBits
|
||||
&& accumulationBufferRedBits == other.accumulationBufferRedBits
|
||||
&& accumulationBufferGreenBits == other.accumulationBufferGreenBits
|
||||
&& accumulationBufferBlueBits == other.accumulationBufferBlueBits
|
||||
&& accumulationBufferAlphaBits == other.accumulationBufferAlphaBits
|
||||
&& multisamplingLevel == other.multisamplingLevel;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
static Array<OpenGLContext*> knownContexts;
|
||||
|
||||
OpenGLContext::OpenGLContext() noexcept
|
||||
{
|
||||
knownContexts.add (this);
|
||||
}
|
||||
|
||||
OpenGLContext::~OpenGLContext()
|
||||
{
|
||||
knownContexts.removeValue (this);
|
||||
}
|
||||
|
||||
OpenGLContext* OpenGLContext::getCurrentContext()
|
||||
{
|
||||
for (int i = knownContexts.size(); --i >= 0;)
|
||||
{
|
||||
OpenGLContext* const oglc = knownContexts.getUnchecked(i);
|
||||
|
||||
if (oglc->isActive())
|
||||
return oglc;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
class OpenGLComponent::OpenGLCachedComponentImage : public CachedComponentImage,
|
||||
public Timer // N.B. using a Timer rather than an AsyncUpdater
|
||||
// to avoid scheduling problems on Windows
|
||||
|
|
@ -122,8 +30,7 @@ class OpenGLComponent::OpenGLCachedComponentImage : public CachedComponentImage
|
|||
public:
|
||||
OpenGLCachedComponentImage (OpenGLComponent& owner_)
|
||||
: owner (owner_)
|
||||
{
|
||||
}
|
||||
{}
|
||||
|
||||
void paint (Graphics&)
|
||||
{
|
||||
|
|
@ -533,11 +440,15 @@ bool OpenGLComponent::performRender()
|
|||
}
|
||||
}
|
||||
|
||||
OpenGLHelpers::prepareFor2D (bounds.getWidth(), bounds.getHeight());
|
||||
glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glEnable (GL_BLEND);
|
||||
glColor4f (1.0f, 1.0f, 1.0f, getAlpha());
|
||||
frameBuffer.drawAt (0, (float) (bounds.getHeight() - frameBuffer.getHeight()));
|
||||
glEnable (GL_TEXTURE_2D);
|
||||
glActiveTexture (GL_TEXTURE0);
|
||||
glBindTexture (GL_TEXTURE_2D, frameBuffer.getTextureID());
|
||||
|
||||
context->copyTexture (getLocalBounds(),
|
||||
Rectangle<int> (frameBuffer.getWidth(), frameBuffer.getHeight()),
|
||||
getAlpha());
|
||||
|
||||
glBindTexture (GL_TEXTURE_2D, 0);
|
||||
}
|
||||
|
||||
swapBuffers();
|
||||
|
|
|
|||
256
modules/juce_opengl/opengl/juce_OpenGLContext.cpp
Normal file
256
modules/juce_opengl/opengl/juce_OpenGLContext.cpp
Normal file
|
|
@ -0,0 +1,256 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||
Copyright 2004-11 by Raw Material Software Ltd.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
JUCE can be redistributed and/or modified under the terms of the GNU General
|
||||
Public License (Version 2), as published by the Free Software Foundation.
|
||||
A copy of the license is included in the JUCE distribution, or can be found
|
||||
online at www.gnu.org/licenses.
|
||||
|
||||
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
To release a closed-source product which uses JUCE, commercial licenses are
|
||||
available: visit www.rawmaterialsoftware.com/juce for more information.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
OpenGLPixelFormat::OpenGLPixelFormat (const int bitsPerRGBComponent,
|
||||
const int alphaBits_,
|
||||
const int depthBufferBits_,
|
||||
const int stencilBufferBits_) noexcept
|
||||
: redBits (bitsPerRGBComponent),
|
||||
greenBits (bitsPerRGBComponent),
|
||||
blueBits (bitsPerRGBComponent),
|
||||
alphaBits (alphaBits_),
|
||||
depthBufferBits (depthBufferBits_),
|
||||
stencilBufferBits (stencilBufferBits_),
|
||||
accumulationBufferRedBits (0),
|
||||
accumulationBufferGreenBits (0),
|
||||
accumulationBufferBlueBits (0),
|
||||
accumulationBufferAlphaBits (0),
|
||||
multisamplingLevel (0)
|
||||
{
|
||||
}
|
||||
|
||||
OpenGLPixelFormat::OpenGLPixelFormat (const OpenGLPixelFormat& other) noexcept
|
||||
: redBits (other.redBits),
|
||||
greenBits (other.greenBits),
|
||||
blueBits (other.blueBits),
|
||||
alphaBits (other.alphaBits),
|
||||
depthBufferBits (other.depthBufferBits),
|
||||
stencilBufferBits (other.stencilBufferBits),
|
||||
accumulationBufferRedBits (other.accumulationBufferRedBits),
|
||||
accumulationBufferGreenBits (other.accumulationBufferGreenBits),
|
||||
accumulationBufferBlueBits (other.accumulationBufferBlueBits),
|
||||
accumulationBufferAlphaBits (other.accumulationBufferAlphaBits),
|
||||
multisamplingLevel (other.multisamplingLevel)
|
||||
{
|
||||
}
|
||||
|
||||
OpenGLPixelFormat& OpenGLPixelFormat::operator= (const OpenGLPixelFormat& other) noexcept
|
||||
{
|
||||
redBits = other.redBits;
|
||||
greenBits = other.greenBits;
|
||||
blueBits = other.blueBits;
|
||||
alphaBits = other.alphaBits;
|
||||
depthBufferBits = other.depthBufferBits;
|
||||
stencilBufferBits = other.stencilBufferBits;
|
||||
accumulationBufferRedBits = other.accumulationBufferRedBits;
|
||||
accumulationBufferGreenBits = other.accumulationBufferGreenBits;
|
||||
accumulationBufferBlueBits = other.accumulationBufferBlueBits;
|
||||
accumulationBufferAlphaBits = other.accumulationBufferAlphaBits;
|
||||
multisamplingLevel = other.multisamplingLevel;
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool OpenGLPixelFormat::operator== (const OpenGLPixelFormat& other) const noexcept
|
||||
{
|
||||
return redBits == other.redBits
|
||||
&& greenBits == other.greenBits
|
||||
&& blueBits == other.blueBits
|
||||
&& alphaBits == other.alphaBits
|
||||
&& depthBufferBits == other.depthBufferBits
|
||||
&& stencilBufferBits == other.stencilBufferBits
|
||||
&& accumulationBufferRedBits == other.accumulationBufferRedBits
|
||||
&& accumulationBufferGreenBits == other.accumulationBufferGreenBits
|
||||
&& accumulationBufferBlueBits == other.accumulationBufferBlueBits
|
||||
&& accumulationBufferAlphaBits == other.accumulationBufferAlphaBits
|
||||
&& multisamplingLevel == other.multisamplingLevel;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
static Array<OpenGLContext*> knownContexts;
|
||||
|
||||
OpenGLContext::OpenGLContext() noexcept
|
||||
: shaderLanguageVersion (0)
|
||||
{
|
||||
knownContexts.add (this);
|
||||
}
|
||||
|
||||
OpenGLContext::~OpenGLContext()
|
||||
{
|
||||
knownContexts.removeValue (this);
|
||||
}
|
||||
|
||||
OpenGLContext* OpenGLContext::getCurrentContext()
|
||||
{
|
||||
for (int i = knownContexts.size(); --i >= 0;)
|
||||
{
|
||||
OpenGLContext* const oglc = knownContexts.getUnchecked(i);
|
||||
|
||||
if (oglc->isActive())
|
||||
return oglc;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
#if JUCE_USE_OPENGL_SHADERS
|
||||
double OpenGLContext::getShaderLanguageVersion()
|
||||
{
|
||||
if (shaderLanguageVersion == 0)
|
||||
shaderLanguageVersion = OpenGLShaderProgram::getLanguageVersion();
|
||||
|
||||
return shaderLanguageVersion;
|
||||
}
|
||||
#endif
|
||||
|
||||
void OpenGLContext::copyTexture (const Rectangle<int>& targetClipArea,
|
||||
const Rectangle<int>& anchorPosAndTextureSize,
|
||||
float alpha)
|
||||
{
|
||||
glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glEnable (GL_BLEND);
|
||||
glColor4f (1.0f, 1.0f, 1.0f, alpha);
|
||||
|
||||
const GLshort y = (GLshort) (getHeight() - anchorPosAndTextureSize.getHeight());
|
||||
const GLshort width = (GLshort) anchorPosAndTextureSize.getWidth();
|
||||
const GLshort bottom = (GLshort) (y + anchorPosAndTextureSize.getHeight());
|
||||
const GLshort vertices[] = { 0, y, width, y, 0, bottom, width, bottom };
|
||||
|
||||
#if JUCE_USE_OPENGL_SHADERS
|
||||
if (getShaderLanguageVersion() > 1.199)
|
||||
{
|
||||
struct OverlayShaderProgram : public ReferenceCountedObject
|
||||
{
|
||||
OverlayShaderProgram (OpenGLContext& context)
|
||||
: program (context),
|
||||
builder (program),
|
||||
params (program)
|
||||
{}
|
||||
|
||||
static const OverlayShaderProgram& select (OpenGLContext& context)
|
||||
{
|
||||
static const Identifier programValueID ("juceGLComponentOverlayShader");
|
||||
OverlayShaderProgram* program = dynamic_cast <OverlayShaderProgram*> (context.properties [programValueID].getObject());
|
||||
|
||||
if (program == nullptr)
|
||||
{
|
||||
program = new OverlayShaderProgram (context);
|
||||
context.properties.set (programValueID, var (program));
|
||||
}
|
||||
|
||||
program->program.use();
|
||||
return *program;
|
||||
}
|
||||
|
||||
struct ProgramBuilder
|
||||
{
|
||||
ProgramBuilder (OpenGLShaderProgram& program)
|
||||
{
|
||||
program.addShader ("attribute vec2 position;"
|
||||
"uniform vec2 screenSize;"
|
||||
"void main()"
|
||||
"{"
|
||||
" vec2 scaled = position / (0.5 * screenSize.xy);"
|
||||
" gl_Position = vec4 (scaled.x - 1.0, 1.0 - scaled.y, 0, 1.0);"
|
||||
"}",
|
||||
GL_VERTEX_SHADER);
|
||||
|
||||
program.addShader ("#version 120\n"
|
||||
"uniform sampler2D imageTexture;"
|
||||
"uniform float matrix[6];"
|
||||
"void main()"
|
||||
"{"
|
||||
"vec2 texturePos = mat2 (matrix[0], matrix[3], matrix[1], matrix[4]) * gl_FragCoord.xy"
|
||||
" + vec2 (matrix[2], matrix[5]);"
|
||||
"gl_FragColor = gl_Color.a * texture2D (imageTexture, vec2 (texturePos.x, 1.0 - texturePos.y));"
|
||||
"}",
|
||||
GL_FRAGMENT_SHADER);
|
||||
program.link();
|
||||
}
|
||||
};
|
||||
|
||||
struct Params
|
||||
{
|
||||
Params (OpenGLShaderProgram& program)
|
||||
: positionAttribute (program, "position"),
|
||||
screenSize (program, "screenSize"),
|
||||
imageTexture (program, "imageTexture"),
|
||||
matrix (program, "matrix")
|
||||
{}
|
||||
|
||||
void set (const int targetWidth, const int targetHeight, const Rectangle<float>& anchorPosAndTextureSize) const
|
||||
{
|
||||
const AffineTransform t (AffineTransform::translation (-anchorPosAndTextureSize.getX(),
|
||||
-anchorPosAndTextureSize.getY())
|
||||
.followedBy (AffineTransform::verticalFlip (targetHeight))
|
||||
.inverted().scaled (1.0f / anchorPosAndTextureSize.getWidth(),
|
||||
1.0f / anchorPosAndTextureSize.getHeight()));
|
||||
|
||||
const GLfloat m[] = { t.mat00, t.mat01, t.mat02, t.mat10, t.mat11, t.mat12 };
|
||||
matrix.set (m, 6);
|
||||
imageTexture.set (0);
|
||||
screenSize.set (targetWidth, targetHeight);
|
||||
}
|
||||
|
||||
OpenGLShaderProgram::Attribute positionAttribute;
|
||||
OpenGLShaderProgram::Uniform screenSize, imageTexture, matrix;
|
||||
};
|
||||
|
||||
OpenGLShaderProgram program;
|
||||
ProgramBuilder builder;
|
||||
Params params;
|
||||
};
|
||||
|
||||
const OverlayShaderProgram& program = OverlayShaderProgram::select (*this);
|
||||
program.params.set (getWidth(), getHeight(), anchorPosAndTextureSize.toFloat());
|
||||
|
||||
extensions.glVertexAttribPointer (program.params.positionAttribute.attributeID, 2, GL_SHORT, GL_FALSE, 4, vertices);
|
||||
extensions.glEnableVertexAttribArray (program.params.positionAttribute.attributeID);
|
||||
|
||||
glDrawArrays (GL_TRIANGLE_STRIP, 0, 4);
|
||||
|
||||
extensions.glUseProgram (0);
|
||||
}
|
||||
#if JUCE_USE_OPENGL_FIXED_FUNCTION
|
||||
else
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if JUCE_USE_OPENGL_FIXED_FUNCTION
|
||||
{
|
||||
OpenGLHelpers::prepareFor2D (getWidth(), getHeight());
|
||||
|
||||
glDisableClientState (GL_COLOR_ARRAY);
|
||||
glDisableClientState (GL_NORMAL_ARRAY);
|
||||
glEnableClientState (GL_VERTEX_ARRAY);
|
||||
glEnableClientState (GL_TEXTURE_COORD_ARRAY);
|
||||
|
||||
const GLfloat textureCoords[] = { 0, 0, 1.0f, 0, 0, 1.0f, 1.0f, 1.0f };
|
||||
glTexCoordPointer (2, GL_FLOAT, 0, textureCoords);
|
||||
glVertexPointer (2, GL_SHORT, 0, vertices);
|
||||
|
||||
glDrawArrays (GL_TRIANGLE_STRIP, 0, 4);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
@ -77,15 +77,10 @@ public:
|
|||
*/
|
||||
virtual void* getRawContext() const noexcept = 0;
|
||||
|
||||
/** Deletes the context.
|
||||
|
||||
This must only be called on the message thread, or will deadlock.
|
||||
On background threads, call getCurrentContext()->deleteContext(), but be careful not
|
||||
to call any other OpenGL function afterwards.
|
||||
This doesn't touch other resources, such as window handles, etc.
|
||||
You'll probably never have to call this method directly.
|
||||
*/
|
||||
virtual void deleteContext() = 0;
|
||||
/** Returns the width of this context */
|
||||
virtual int getWidth() const = 0;
|
||||
/** Returns the height of this context */
|
||||
virtual int getHeight() const = 0;
|
||||
|
||||
/** If this context is backed by a frame buffer, this returns its ID number, or
|
||||
0 if the context has no accessible framebuffer.
|
||||
|
|
@ -108,11 +103,26 @@ public:
|
|||
/** This structure holds a set of dynamically loaded GL functions for use on this context. */
|
||||
OpenGLExtensionFunctions extensions;
|
||||
|
||||
//==============================================================================
|
||||
/** Draws the currently selected texture into this context at its original size.
|
||||
@param targetClipArea the target area to draw into (in top-left origin coords)
|
||||
@param anchorPosAndTextureSize the position of this rectangle is the texture's top-left
|
||||
anchor position in the target space, and the size must be
|
||||
the total size of the texture.
|
||||
*/
|
||||
void copyTexture (const Rectangle<int>& targetClipArea,
|
||||
const Rectangle<int>& anchorPosAndTextureSize,
|
||||
float alpha);
|
||||
|
||||
protected:
|
||||
//==============================================================================
|
||||
OpenGLContext() noexcept;
|
||||
|
||||
private:
|
||||
double shaderLanguageVersion;
|
||||
|
||||
double getShaderLanguageVersion();
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenGLContext);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
class OpenGLFrameBuffer::Pimpl
|
||||
{
|
||||
public:
|
||||
Pimpl (const OpenGLContext& context_, const int width_, const int height_,
|
||||
Pimpl (OpenGLContext& context_, const int width_, const int height_,
|
||||
const bool wantsDepthBuffer, const bool wantsStencilBuffer)
|
||||
: context (context_),
|
||||
width (width_),
|
||||
|
|
@ -106,7 +106,7 @@ public:
|
|||
void bind() { context.extensions.glBindFramebuffer (GL_FRAMEBUFFER, frameBufferHandle); }
|
||||
void unbind() { context.extensions.glBindFramebuffer (GL_FRAMEBUFFER, 0); }
|
||||
|
||||
const OpenGLContext& context;
|
||||
OpenGLContext& context;
|
||||
const int width, height;
|
||||
GLuint textureID, frameBufferHandle, depthOrStencilBuffer;
|
||||
bool hasDepthBuffer, hasStencilBuffer, ok;
|
||||
|
|
@ -134,7 +134,7 @@ public:
|
|||
buffer.readPixels (data, Rectangle<int> (w, h));
|
||||
}
|
||||
|
||||
bool restore (const OpenGLContext& context, OpenGLFrameBuffer& buffer)
|
||||
bool restore (OpenGLContext& context, OpenGLFrameBuffer& buffer)
|
||||
{
|
||||
if (buffer.initialise (context, width, height))
|
||||
{
|
||||
|
|
@ -156,7 +156,7 @@ private:
|
|||
OpenGLFrameBuffer::OpenGLFrameBuffer() {}
|
||||
OpenGLFrameBuffer::~OpenGLFrameBuffer() {}
|
||||
|
||||
bool OpenGLFrameBuffer::initialise (const OpenGLContext& context, int width, int height)
|
||||
bool OpenGLFrameBuffer::initialise (OpenGLContext& context, int width, int height)
|
||||
{
|
||||
jassert (context.isActive()); // The context must be active when creating a framebuffer!
|
||||
|
||||
|
|
@ -169,7 +169,7 @@ bool OpenGLFrameBuffer::initialise (const OpenGLContext& context, int width, int
|
|||
return pimpl != nullptr;
|
||||
}
|
||||
|
||||
bool OpenGLFrameBuffer::initialise (const OpenGLContext& context, const Image& image)
|
||||
bool OpenGLFrameBuffer::initialise (OpenGLContext& context, const Image& image)
|
||||
{
|
||||
if (! image.isARGB())
|
||||
return initialise (context, image.convertedToFormat (Image::ARGB));
|
||||
|
|
@ -180,7 +180,7 @@ bool OpenGLFrameBuffer::initialise (const OpenGLContext& context, const Image& i
|
|||
&& writePixels ((const PixelARGB*) bitmap.data, image.getBounds());
|
||||
}
|
||||
|
||||
bool OpenGLFrameBuffer::initialise (const OpenGLFrameBuffer& other)
|
||||
bool OpenGLFrameBuffer::initialise (OpenGLFrameBuffer& other)
|
||||
{
|
||||
const Pimpl* const p = other.pimpl;
|
||||
|
||||
|
|
@ -190,15 +190,18 @@ bool OpenGLFrameBuffer::initialise (const OpenGLFrameBuffer& other)
|
|||
return true;
|
||||
}
|
||||
|
||||
if (initialise (p->context, p->width, p->height))
|
||||
const Rectangle<int> area (pimpl->width, pimpl->height);
|
||||
|
||||
if (initialise (p->context, area.getWidth(), area.getHeight()))
|
||||
{
|
||||
pimpl->bind();
|
||||
OpenGLHelpers::prepareFor2D (p->width, p->height);
|
||||
glDisable (GL_BLEND);
|
||||
glColor4f (1.0f, 1.0f, 1.0f, 1.0f);
|
||||
other.drawAt (0, 0);
|
||||
pimpl->unbind();
|
||||
|
||||
glEnable (GL_TEXTURE_2D);
|
||||
glBindTexture (GL_TEXTURE_2D, p->textureID);
|
||||
pimpl->context.copyTexture (area, area, 1.0f);
|
||||
glBindTexture (GL_TEXTURE_2D, 0);
|
||||
|
||||
pimpl->unbind();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -220,7 +223,7 @@ void OpenGLFrameBuffer::saveAndRelease()
|
|||
}
|
||||
}
|
||||
|
||||
bool OpenGLFrameBuffer::reloadSavedCopy (const OpenGLContext& context)
|
||||
bool OpenGLFrameBuffer::reloadSavedCopy (OpenGLContext& context)
|
||||
{
|
||||
if (savedState != nullptr)
|
||||
{
|
||||
|
|
@ -300,15 +303,14 @@ bool OpenGLFrameBuffer::writePixels (const PixelARGB* data, const Rectangle<int>
|
|||
if (! makeCurrentRenderingTarget())
|
||||
return false;
|
||||
|
||||
OpenGLHelpers::prepareFor2D (pimpl->width, pimpl->height);
|
||||
glDisable (GL_DEPTH_TEST);
|
||||
glDisable (GL_BLEND);
|
||||
|
||||
OpenGLTexture tex;
|
||||
tex.loadARGBFlipped (data, area.getWidth(), area.getHeight());
|
||||
const int texH = tex.getHeight();
|
||||
|
||||
#if JUCE_OPENGL_ES
|
||||
const int texH = tex.getHeight();
|
||||
tex.bind();
|
||||
const GLint cropRect[4] = { 0, texH - area.getHeight(), area.getWidth(), area.getHeight() };
|
||||
glTexParameteriv (GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, cropRect);
|
||||
|
|
@ -317,28 +319,14 @@ bool OpenGLFrameBuffer::writePixels (const PixelARGB* data, const Rectangle<int>
|
|||
glDrawTexiOES (area.getX(), area.getY(), 1, area.getWidth(), area.getHeight());
|
||||
glBindTexture (GL_TEXTURE_2D, 0);
|
||||
#else
|
||||
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glColor4f (1.0f, 1.0f, 1.0f, 1.0f);
|
||||
|
||||
const int x = area.getX();
|
||||
const int y = area.getY() - (texH - area.getHeight());
|
||||
const GLfloat x1 = (GLfloat) x;
|
||||
const GLfloat y1 = (GLfloat) y;
|
||||
const GLfloat x2 = (GLfloat) (x + tex.getWidth());
|
||||
const GLfloat y2 = (GLfloat) (y + texH);
|
||||
const GLfloat vertices[] = { x1, y1, x2, y1, x1, y2, x2, y2 };
|
||||
const GLfloat textureCoords[] = { 0, 0, 1.0f, 0, 0, 1.0f, 1.0f, 1.0f };
|
||||
|
||||
OpenGLHelpers::drawTriangleStrip (vertices, textureCoords, 4, tex.getTextureID());
|
||||
pimpl->context.copyTexture (area, area, 1.0f);
|
||||
#endif
|
||||
|
||||
pimpl->context.extensions.glBindFramebuffer (GL_FRAMEBUFFER, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
#if JUCE_USE_OPENGL_FIXED_FUNCTION
|
||||
void OpenGLFrameBuffer::draw2D (float x1, float y1,
|
||||
float x2, float y2,
|
||||
float x3, float y3,
|
||||
|
|
@ -394,3 +382,4 @@ void OpenGLFrameBuffer::drawAt (float x1, float y1) const
|
|||
glBindTexture (GL_TEXTURE_2D, 0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -47,17 +47,17 @@ public:
|
|||
Note that a valid openGL context must be selected when you call this method,
|
||||
or it will fail.
|
||||
*/
|
||||
bool initialise (const OpenGLContext& context, int width, int height);
|
||||
bool initialise (OpenGLContext& context, int width, int height);
|
||||
|
||||
/** Tries to allocates a buffer containing a copy of a given image.
|
||||
Note that a valid openGL context must be selected when you call this method,
|
||||
or it will fail.
|
||||
*/
|
||||
bool initialise (const OpenGLContext& context, const Image& content);
|
||||
bool initialise (OpenGLContext& context, const Image& content);
|
||||
|
||||
/** Tries to allocate a copy of another framebuffer.
|
||||
*/
|
||||
bool initialise (const OpenGLFrameBuffer& other);
|
||||
bool initialise (OpenGLFrameBuffer& other);
|
||||
|
||||
/** Releases the buffer, if one has been allocated.
|
||||
Any saved state that was created with saveAndRelease() will also be freed by this call.
|
||||
|
|
@ -73,7 +73,7 @@ public:
|
|||
/** Restores the framebuffer content that was previously saved using saveAndRelease().
|
||||
After saving to main memory, the original state can be restored by calling restoreToGPUMemory().
|
||||
*/
|
||||
bool reloadSavedCopy (const OpenGLContext& context);
|
||||
bool reloadSavedCopy (OpenGLContext& context);
|
||||
|
||||
//==============================================================================
|
||||
/** Returns true if a valid buffer has been allocated. */
|
||||
|
|
@ -104,6 +104,7 @@ public:
|
|||
/** Selects the framebuffer as the current target, and clears it to transparent. */
|
||||
void makeCurrentAndClear();
|
||||
|
||||
#if JUCE_USE_OPENGL_FIXED_FUNCTION
|
||||
/** Draws this framebuffer onto the current context, with the specified corner positions. */
|
||||
void draw2D (float x1, float y1,
|
||||
float x2, float y2,
|
||||
|
|
@ -120,6 +121,7 @@ public:
|
|||
|
||||
/** Draws the framebuffer at a given position. */
|
||||
void drawAt (float x1, float y1) const;
|
||||
#endif
|
||||
|
||||
/** Reads an area of pixels from the framebuffer into a 32-bit ARGB pixel array.
|
||||
The lineStride is measured as a number of pixels, not bytes - pass a stride
|
||||
|
|
|
|||
|
|
@ -199,7 +199,7 @@ private:
|
|||
class ShaderPrograms : public ReferenceCountedObject
|
||||
{
|
||||
public:
|
||||
ShaderPrograms (const OpenGLContext& context)
|
||||
ShaderPrograms (OpenGLContext& context)
|
||||
: solidColourProgram (context),
|
||||
solidColourMasked (context),
|
||||
radialGradient (context),
|
||||
|
|
@ -221,7 +221,7 @@ public:
|
|||
//==============================================================================
|
||||
struct ShaderProgramHolder
|
||||
{
|
||||
ShaderProgramHolder (const OpenGLContext& context, const char* fragmentShader)
|
||||
ShaderProgramHolder (OpenGLContext& context, const char* fragmentShader)
|
||||
: program (context)
|
||||
{
|
||||
program.addShader ("attribute vec2 position;"
|
||||
|
|
@ -243,7 +243,7 @@ public:
|
|||
|
||||
struct ShaderBase : public ShaderProgramHolder
|
||||
{
|
||||
ShaderBase (const OpenGLContext& context, const char* fragmentShader)
|
||||
ShaderBase (OpenGLContext& context, const char* fragmentShader)
|
||||
: ShaderProgramHolder (context, fragmentShader),
|
||||
positionAttribute (program, "position"),
|
||||
colourAttribute (program, "colour"),
|
||||
|
|
@ -255,7 +255,7 @@ public:
|
|||
screenBounds.set (bounds.getX(), bounds.getY(), 0.5f * bounds.getWidth(), 0.5f * bounds.getHeight());
|
||||
}
|
||||
|
||||
void bindAttributes (const OpenGLContext& context)
|
||||
void bindAttributes (OpenGLContext& context)
|
||||
{
|
||||
context.extensions.glVertexAttribPointer (positionAttribute.attributeID, 2, GL_SHORT, GL_FALSE, 8, (void*) 0);
|
||||
context.extensions.glVertexAttribPointer (colourAttribute.attributeID, 4, GL_UNSIGNED_BYTE, GL_TRUE, 8, (void*) 4);
|
||||
|
|
@ -271,7 +271,7 @@ public:
|
|||
|
||||
struct MaskedShaderParams
|
||||
{
|
||||
MaskedShaderParams (const OpenGLShaderProgram& program)
|
||||
MaskedShaderParams (OpenGLShaderProgram& program)
|
||||
: maskTexture (program, "maskTexture"),
|
||||
maskBounds (program, "maskBounds")
|
||||
{}
|
||||
|
|
@ -290,7 +290,7 @@ public:
|
|||
//==============================================================================
|
||||
struct SolidColourProgram : public ShaderBase
|
||||
{
|
||||
SolidColourProgram (const OpenGLContext& context)
|
||||
SolidColourProgram (OpenGLContext& context)
|
||||
: ShaderBase (context, "void main()"
|
||||
"{"
|
||||
" gl_FragColor = gl_Color;"
|
||||
|
|
@ -307,7 +307,7 @@ public:
|
|||
|
||||
struct SolidColourMaskedProgram : public ShaderBase
|
||||
{
|
||||
SolidColourMaskedProgram (const OpenGLContext& context)
|
||||
SolidColourMaskedProgram (OpenGLContext& context)
|
||||
: ShaderBase (context, JUCE_DECLARE_SHADER_VERSION
|
||||
JUCE_DECLARE_MASK_UNIFORMS
|
||||
"void main()"
|
||||
|
|
@ -323,7 +323,7 @@ public:
|
|||
//==============================================================================
|
||||
struct RadialGradientParams
|
||||
{
|
||||
RadialGradientParams (const OpenGLShaderProgram& program)
|
||||
RadialGradientParams (OpenGLShaderProgram& program)
|
||||
: gradientTexture (program, "gradientTexture"),
|
||||
matrix (program, "matrix")
|
||||
{}
|
||||
|
|
@ -342,14 +342,13 @@ public:
|
|||
|
||||
#define JUCE_DECLARE_MATRIX_UNIFORM "uniform float matrix[6];"
|
||||
#define JUCE_DECLARE_RADIAL_UNIFORMS "uniform sampler2D gradientTexture;" JUCE_DECLARE_MATRIX_UNIFORM
|
||||
#define JUCE_MATRIX_TIMES_FRAGCOORD "(vec2 (matrix[0], matrix[3]) * gl_FragCoord.x" \
|
||||
" + vec2 (matrix[1], matrix[4]) * gl_FragCoord.y " \
|
||||
#define JUCE_MATRIX_TIMES_FRAGCOORD "(mat2 (matrix[0], matrix[3], matrix[1], matrix[4]) * gl_FragCoord.xy" \
|
||||
" + vec2 (matrix[2], matrix[5]))"
|
||||
#define JUCE_GET_TEXTURE_COLOUR "(gl_Color.a * texture2D (gradientTexture, vec2 (gradientPos, 0.5)))"
|
||||
|
||||
struct RadialGradientProgram : public ShaderBase
|
||||
{
|
||||
RadialGradientProgram (const OpenGLContext& context)
|
||||
RadialGradientProgram (OpenGLContext& context)
|
||||
: ShaderBase (context, JUCE_DECLARE_SHADER_VERSION
|
||||
JUCE_DECLARE_RADIAL_UNIFORMS
|
||||
"void main()"
|
||||
|
|
@ -365,7 +364,7 @@ public:
|
|||
|
||||
struct RadialGradientMaskedProgram : public ShaderBase
|
||||
{
|
||||
RadialGradientMaskedProgram (const OpenGLContext& context)
|
||||
RadialGradientMaskedProgram (OpenGLContext& context)
|
||||
: ShaderBase (context, JUCE_DECLARE_SHADER_VERSION
|
||||
JUCE_DECLARE_RADIAL_UNIFORMS
|
||||
JUCE_DECLARE_MASK_UNIFORMS
|
||||
|
|
@ -385,7 +384,7 @@ public:
|
|||
//==============================================================================
|
||||
struct LinearGradientParams
|
||||
{
|
||||
LinearGradientParams (const OpenGLShaderProgram& program)
|
||||
LinearGradientParams (OpenGLShaderProgram& program)
|
||||
: gradientTexture (program, "gradientTexture"),
|
||||
gradientInfo (program, "gradientInfo")
|
||||
{}
|
||||
|
|
@ -400,7 +399,7 @@ public:
|
|||
|
||||
struct LinearGradient1Program : public ShaderBase
|
||||
{
|
||||
LinearGradient1Program (const OpenGLContext& context)
|
||||
LinearGradient1Program (OpenGLContext& context)
|
||||
: ShaderBase (context, JUCE_DECLARE_SHADER_VERSION
|
||||
JUCE_DECLARE_LINEAR_UNIFORMS // gradientInfo: x = x1, y = y1, z = (y2 - y1) / (x2 - x1), w = length
|
||||
"void main()"
|
||||
|
|
@ -416,7 +415,7 @@ public:
|
|||
|
||||
struct LinearGradient1MaskedProgram : public ShaderBase
|
||||
{
|
||||
LinearGradient1MaskedProgram (const OpenGLContext& context)
|
||||
LinearGradient1MaskedProgram (OpenGLContext& context)
|
||||
: ShaderBase (context, JUCE_DECLARE_SHADER_VERSION
|
||||
JUCE_DECLARE_LINEAR_UNIFORMS // gradientInfo: x = x1, y = y1, z = (y2 - y1) / (x2 - x1), w = length
|
||||
JUCE_DECLARE_MASK_UNIFORMS
|
||||
|
|
@ -435,7 +434,7 @@ public:
|
|||
|
||||
struct LinearGradient2Program : public ShaderBase
|
||||
{
|
||||
LinearGradient2Program (const OpenGLContext& context)
|
||||
LinearGradient2Program (OpenGLContext& context)
|
||||
: ShaderBase (context, JUCE_DECLARE_SHADER_VERSION
|
||||
JUCE_DECLARE_LINEAR_UNIFORMS // gradientInfo: x = x1, y = y1, z = (x2 - x1) / (y2 - y1), y = y1, w = length
|
||||
"void main()"
|
||||
|
|
@ -451,7 +450,7 @@ public:
|
|||
|
||||
struct LinearGradient2MaskedProgram : public ShaderBase
|
||||
{
|
||||
LinearGradient2MaskedProgram (const OpenGLContext& context)
|
||||
LinearGradient2MaskedProgram (OpenGLContext& context)
|
||||
: ShaderBase (context, JUCE_DECLARE_SHADER_VERSION
|
||||
JUCE_DECLARE_LINEAR_UNIFORMS // gradientInfo: x = x1, y = y1, z = (x2 - x1) / (y2 - y1), y = y1, w = length
|
||||
JUCE_DECLARE_MASK_UNIFORMS
|
||||
|
|
@ -471,7 +470,7 @@ public:
|
|||
//==============================================================================
|
||||
struct ImageParams
|
||||
{
|
||||
ImageParams (const OpenGLShaderProgram& program)
|
||||
ImageParams (OpenGLShaderProgram& program)
|
||||
: imageTexture (program, "imageTexture"),
|
||||
matrix (program, "matrix"),
|
||||
imageRepeatSize (program, "imageRepeatSize")
|
||||
|
|
@ -511,7 +510,7 @@ public:
|
|||
|
||||
struct ImageProgram : public ShaderBase
|
||||
{
|
||||
ImageProgram (const OpenGLContext& context)
|
||||
ImageProgram (OpenGLContext& context)
|
||||
: ShaderBase (context, JUCE_DECLARE_SHADER_VERSION
|
||||
JUCE_DECLARE_IMAGE_UNIFORMS
|
||||
"void main()"
|
||||
|
|
@ -527,7 +526,7 @@ public:
|
|||
|
||||
struct ImageMaskedProgram : public ShaderBase
|
||||
{
|
||||
ImageMaskedProgram (const OpenGLContext& context)
|
||||
ImageMaskedProgram (OpenGLContext& context)
|
||||
: ShaderBase (context, JUCE_DECLARE_SHADER_VERSION
|
||||
JUCE_DECLARE_IMAGE_UNIFORMS
|
||||
JUCE_DECLARE_MASK_UNIFORMS
|
||||
|
|
@ -546,7 +545,7 @@ public:
|
|||
|
||||
struct TiledImageProgram : public ShaderBase
|
||||
{
|
||||
TiledImageProgram (const OpenGLContext& context)
|
||||
TiledImageProgram (OpenGLContext& context)
|
||||
: ShaderBase (context, JUCE_DECLARE_SHADER_VERSION
|
||||
JUCE_DECLARE_IMAGE_UNIFORMS
|
||||
"void main()"
|
||||
|
|
@ -562,7 +561,7 @@ public:
|
|||
|
||||
struct TiledImageMaskedProgram : public ShaderBase
|
||||
{
|
||||
TiledImageMaskedProgram (const OpenGLContext& context)
|
||||
TiledImageMaskedProgram (OpenGLContext& context)
|
||||
: ShaderBase (context, JUCE_DECLARE_SHADER_VERSION
|
||||
JUCE_DECLARE_IMAGE_UNIFORMS
|
||||
JUCE_DECLARE_MASK_UNIFORMS
|
||||
|
|
@ -581,7 +580,7 @@ public:
|
|||
|
||||
struct CopyTextureProgram : public ShaderBase
|
||||
{
|
||||
CopyTextureProgram (const OpenGLContext& context)
|
||||
CopyTextureProgram (OpenGLContext& context)
|
||||
: ShaderBase (context, JUCE_DECLARE_SHADER_VERSION
|
||||
JUCE_DECLARE_IMAGE_UNIFORMS
|
||||
"void main()"
|
||||
|
|
@ -597,7 +596,7 @@ public:
|
|||
|
||||
struct MaskTextureProgram : public ShaderBase
|
||||
{
|
||||
MaskTextureProgram (const OpenGLContext& context)
|
||||
MaskTextureProgram (OpenGLContext& context)
|
||||
: ShaderBase (context, JUCE_DECLARE_SHADER_VERSION
|
||||
JUCE_DECLARE_IMAGE_UNIFORMS
|
||||
"void main()"
|
||||
|
|
@ -1237,7 +1236,7 @@ struct StateHelpers
|
|||
{
|
||||
quadQueue.flush();
|
||||
activeShader = &(shader.program);
|
||||
context.extensions.glUseProgram (shader.program.programID);
|
||||
shader.program.use();
|
||||
shader.bindAttributes (context);
|
||||
|
||||
currentBounds = bounds;
|
||||
|
|
@ -1351,6 +1350,10 @@ public:
|
|||
#if JUCE_USE_OPENGL_FIXED_FUNCTION
|
||||
resetMultiTextureModes (true);
|
||||
#endif
|
||||
|
||||
#if JUCE_USE_OPENGL_SHADERS
|
||||
glDisableClientState (GL_INDEX_ARRAY);
|
||||
#endif
|
||||
}
|
||||
|
||||
void flush()
|
||||
|
|
|
|||
|
|
@ -80,6 +80,11 @@ void OpenGLShaderProgram::link() noexcept
|
|||
#endif
|
||||
}
|
||||
|
||||
void OpenGLShaderProgram::use() const noexcept
|
||||
{
|
||||
context.extensions.glUseProgram (programID);
|
||||
}
|
||||
|
||||
OpenGLShaderProgram::Uniform::Uniform (const OpenGLShaderProgram& program, const char* const name)
|
||||
: uniformID (program.context.extensions.glGetUniformLocation (program.programID, name)), context (program.context)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -65,6 +65,9 @@ public:
|
|||
*/
|
||||
void link() noexcept;
|
||||
|
||||
/** Selects this program into the current context. */
|
||||
void use() const noexcept;
|
||||
|
||||
/** Represents an openGL uniform value.
|
||||
After a program has been linked, you can create Uniform objects to let you
|
||||
set the uniforms that your shaders use.
|
||||
|
|
|
|||
|
|
@ -154,6 +154,7 @@ void OpenGLTexture::unbind() const
|
|||
glBindTexture (GL_TEXTURE_2D, 0);
|
||||
}
|
||||
|
||||
#if JUCE_USE_OPENGL_FIXED_FUNCTION
|
||||
void OpenGLTexture::draw2D (float x1, float y1,
|
||||
float x2, float y2,
|
||||
float x3, float y3,
|
||||
|
|
@ -175,3 +176,4 @@ void OpenGLTexture::draw3D (float x1, float y1, float z1,
|
|||
OpenGLHelpers::drawQuad3D (x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4, colour);
|
||||
unbind();
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -80,6 +80,7 @@ public:
|
|||
/** Unbinds the texture to the currently selected openGL context. */
|
||||
void unbind() const;
|
||||
|
||||
#if JUCE_USE_OPENGL_FIXED_FUNCTION
|
||||
/** Draws this texture into the current context, with the specified corner positions. */
|
||||
void draw2D (float x1, float y1,
|
||||
float x2, float y2,
|
||||
|
|
@ -93,6 +94,7 @@ public:
|
|||
float x3, float y3, float z3,
|
||||
float x4, float y4, float z4,
|
||||
const Colour& colour) const;
|
||||
#endif
|
||||
|
||||
/** Returns the GL texture ID number. */
|
||||
GLuint getTextureID() const noexcept { return textureID; }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue