Browse Source

More openGL refactoring, completion of all-shader graphic pipeline.

tags/2021-05-28
jules 13 years ago
parent
commit
b65b34ad40
31 changed files with 461 additions and 217 deletions
  1. +2
    -0
      extras/JuceDemo/Builds/MacOSX/Juce Demo.xcodeproj/project.pbxproj
  2. +10
    -0
      extras/JuceDemo/Builds/VisualStudio2005/Juce Demo.vcproj
  3. +10
    -0
      extras/JuceDemo/Builds/VisualStudio2008/Juce Demo.vcproj
  4. +3
    -0
      extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj
  5. +3
    -0
      extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj.filters
  6. +2
    -0
      extras/JuceDemo/Builds/iOS/Juce Demo.xcodeproj/project.pbxproj
  7. +2
    -0
      extras/JuceDemo/Source/demos/OpenGLDemo.cpp
  8. +2
    -0
      extras/audio plugin host/Builds/MacOSX/Plugin Host.xcodeproj/project.pbxproj
  9. +10
    -0
      extras/audio plugin host/Builds/VisualStudio2005/Plugin Host.vcproj
  10. +10
    -0
      extras/audio plugin host/Builds/VisualStudio2008/Plugin Host.vcproj
  11. +2
    -0
      extras/static library/Builds/MacOSX/juce.xcodeproj/project.pbxproj
  12. +10
    -0
      extras/static library/Builds/VisualStudio2008/juce.vcproj
  13. +3
    -0
      extras/static library/Builds/VisualStudio2010/juce.vcxproj
  14. +3
    -0
      extras/static library/Builds/VisualStudio2010/juce.vcxproj.filters
  15. +1
    -1
      modules/juce_core/containers/juce_HashMap.h
  16. +1
    -0
      modules/juce_opengl/juce_opengl.cpp
  17. +0
    -1
      modules/juce_opengl/juce_opengl.h
  18. +7
    -8
      modules/juce_opengl/native/juce_ios_OpenGLComponent.mm
  19. +17
    -20
      modules/juce_opengl/native/juce_linux_OpenGLComponent.cpp
  20. +4
    -4
      modules/juce_opengl/native/juce_mac_OpenGLComponent.mm
  21. +8
    -15
      modules/juce_opengl/native/juce_win32_OpenGLComponent.cpp
  22. +10
    -99
      modules/juce_opengl/opengl/juce_OpenGLComponent.cpp
  23. +256
    -0
      modules/juce_opengl/opengl/juce_OpenGLContext.cpp
  24. +19
    -9
      modules/juce_opengl/opengl/juce_OpenGLContext.h
  25. +20
    -31
      modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp
  26. +6
    -4
      modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h
  27. +28
    -25
      modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp
  28. +5
    -0
      modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp
  29. +3
    -0
      modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h
  30. +2
    -0
      modules/juce_opengl/opengl/juce_OpenGLTexture.cpp
  31. +2
    -0
      modules/juce_opengl/opengl/juce_OpenGLTexture.h

+ 2
- 0
extras/JuceDemo/Builds/MacOSX/Juce Demo.xcodeproj/project.pbxproj View File

@@ -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,


+ 10
- 0
extras/JuceDemo/Builds/VisualStudio2005/Juce Demo.vcproj View File

@@ -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"


+ 10
- 0
extras/JuceDemo/Builds/VisualStudio2008/Juce Demo.vcproj View File

@@ -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"


+ 3
- 0
extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj View File

@@ -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>


+ 3
- 0
extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj.filters View File

@@ -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>


+ 2
- 0
extras/JuceDemo/Builds/iOS/Juce Demo.xcodeproj/project.pbxproj View File

@@ -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,


+ 2
- 0
extras/JuceDemo/Source/demos/OpenGLDemo.cpp View File

@@ -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()


+ 2
- 0
extras/audio plugin host/Builds/MacOSX/Plugin Host.xcodeproj/project.pbxproj View File

@@ -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,


+ 10
- 0
extras/audio plugin host/Builds/VisualStudio2005/Plugin Host.vcproj View File

@@ -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"


+ 10
- 0
extras/audio plugin host/Builds/VisualStudio2008/Plugin Host.vcproj View File

@@ -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"


+ 2
- 0
extras/static library/Builds/MacOSX/juce.xcodeproj/project.pbxproj View File

@@ -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,


+ 10
- 0
extras/static library/Builds/VisualStudio2008/juce.vcproj View File

@@ -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"


+ 3
- 0
extras/static library/Builds/VisualStudio2010/juce.vcxproj View File

@@ -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>


+ 3
- 0
extras/static library/Builds/VisualStudio2010/juce.vcxproj.filters View File

@@ -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>


+ 1
- 1
modules/juce_core/containers/juce_HashMap.h View File

@@ -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.


+ 1
- 0
modules/juce_opengl/juce_opengl.cpp View File

@@ -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"


+ 0
- 1
modules/juce_opengl/juce_opengl.h View File

@@ -76,7 +76,6 @@
//=============================================================================
BEGIN_JUCE_NAMESPACE
#include "opengl/juce_OpenGLRenderingTarget.h"
#include "opengl/juce_OpenGLHelpers.h"
// START_AUTOINCLUDE opengl


+ 7
- 8
modules/juce_opengl/native/juce_ios_OpenGLComponent.mm View File

@@ -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...


+ 17
- 20
modules/juce_opengl/native/juce_linux_OpenGLComponent.cpp View File

@@ -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; }
int getWidth() const { return bounds.getWidth(); }
int getHeight() const { return bounds.getHeight(); }
unsigned int getFrameBufferID() const
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);
}
//==============================================================================


+ 4
- 4
modules/juce_opengl/native/juce_mac_OpenGLComponent.mm View File

@@ -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];


+ 8
- 15
modules/juce_opengl/native/juce_win32_OpenGLComponent.cpp View File

@@ -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)
{


+ 10
- 99
modules/juce_opengl/opengl/juce_OpenGLComponent.cpp View File

@@ -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
- 0
modules/juce_opengl/opengl/juce_OpenGLContext.cpp View 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
}

+ 19
- 9
modules/juce_opengl/opengl/juce_OpenGLContext.h View File

@@ -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);
};


+ 20
- 31
modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp View File

@@ -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

+ 6
- 4
modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h View File

@@ -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


+ 28
- 25
modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp View File

@@ -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()


+ 5
- 0
modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp View File

@@ -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)
{


+ 3
- 0
modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h View File

@@ -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.


+ 2
- 0
modules/juce_opengl/opengl/juce_OpenGLTexture.cpp View File

@@ -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

+ 2
- 0
modules/juce_opengl/opengl/juce_OpenGLTexture.h View File

@@ -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…
Cancel
Save