mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-19 01:04:20 +00:00
296 lines
9.9 KiB
C++
296 lines
9.9 KiB
C++
/*
|
|
==============================================================================
|
|
|
|
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
|
Copyright 2004-9 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.
|
|
|
|
==============================================================================
|
|
*/
|
|
|
|
#ifdef _WIN32
|
|
#include <windows.h>
|
|
#endif
|
|
|
|
#include "../jucedemo_headers.h"
|
|
|
|
#if JUCE_OPENGL
|
|
|
|
#if JUCE_WINDOWS
|
|
#include <gl/gl.h>
|
|
#include <gl/glu.h>
|
|
#elif JUCE_LINUX
|
|
#include <GL/gl.h>
|
|
#include <GL/glut.h>
|
|
#undef KeyPress
|
|
#elif JUCE_IOS
|
|
#include <OpenGLES/ES1/gl.h>
|
|
#include <OpenGLES/ES1/glext.h>
|
|
#elif JUCE_MAC
|
|
#include <GLUT/glut.h>
|
|
#elif JUCE_IOS
|
|
//#include <GL/glut.h>
|
|
#endif
|
|
|
|
#ifndef GL_BGRA_EXT
|
|
#define GL_BGRA_EXT 0x80e1
|
|
#endif
|
|
|
|
//==============================================================================
|
|
class DemoOpenGLCanvas : public OpenGLComponent,
|
|
public Timer
|
|
{
|
|
public:
|
|
DemoOpenGLCanvas()
|
|
: rotation (0.0f),
|
|
delta (1.0f)
|
|
{
|
|
#if JUCE_IOS
|
|
// (On the iPhone, choose a format without a depth buffer)
|
|
setPixelFormat (OpenGLPixelFormat (8, 8, 0, 0));
|
|
#endif
|
|
|
|
image = Image (Image::RGB, 512, 512, true, Image::SoftwareImage);
|
|
Graphics g (image);
|
|
|
|
g.fillAll (Colours::white);
|
|
g.drawImageWithin (ImageFileFormat::loadFrom (BinaryData::juce_png, BinaryData::juce_pngSize),
|
|
0, 0, 512, 512, RectanglePlacement::stretchToFit);
|
|
|
|
startTimer (20);
|
|
|
|
// Just for demo purposes, let's dump a list of all the available pixel formats..
|
|
OwnedArray <OpenGLPixelFormat> availablePixelFormats;
|
|
OpenGLPixelFormat::getAvailablePixelFormats (this, availablePixelFormats);
|
|
|
|
for (int i = 0; i < availablePixelFormats.size(); ++i)
|
|
{
|
|
const OpenGLPixelFormat* const pixFormat = availablePixelFormats[i];
|
|
|
|
String formatDescription;
|
|
formatDescription
|
|
<< i << ": RGBA=(" << pixFormat->redBits
|
|
<< ", " << pixFormat->greenBits
|
|
<< ", " << pixFormat->blueBits
|
|
<< ", " << pixFormat->alphaBits
|
|
<< "), depth=" << pixFormat->depthBufferBits
|
|
<< ", stencil=" << pixFormat->stencilBufferBits
|
|
<< ", accum RGBA=(" << pixFormat->accumulationBufferRedBits
|
|
<< ", " << pixFormat->accumulationBufferGreenBits
|
|
<< ", " << pixFormat->accumulationBufferBlueBits
|
|
<< ", " << pixFormat->accumulationBufferAlphaBits
|
|
<< "), full-scene AA="
|
|
<< (int) pixFormat->fullSceneAntiAliasingNumSamples;
|
|
|
|
Logger::outputDebugString (formatDescription);
|
|
}
|
|
}
|
|
|
|
~DemoOpenGLCanvas()
|
|
{
|
|
}
|
|
|
|
// when the component creates a new internal context, this is called, and
|
|
// we'll use the opportunity to create the textures needed.
|
|
void newOpenGLContextCreated()
|
|
{
|
|
#if ! JUCE_IOS
|
|
// (no need to call makeCurrentContextActive(), as that will have
|
|
// been done for us before the method call).
|
|
glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
|
|
glClearDepth (1.0);
|
|
|
|
glDepthFunc (GL_LESS);
|
|
glEnable (GL_DEPTH_TEST);
|
|
glEnable (GL_TEXTURE_2D);
|
|
glEnable (GL_BLEND);
|
|
glShadeModel (GL_SMOOTH);
|
|
|
|
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
|
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
|
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
|
|
glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
|
|
|
|
Image::BitmapData srcData (image, Image::BitmapData::readOnly);
|
|
|
|
glTexImage2D (GL_TEXTURE_2D, 0, 4, image.getWidth(), image.getHeight(),
|
|
0, GL_RGB,
|
|
GL_UNSIGNED_BYTE, srcData.data);
|
|
|
|
glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
|
|
glHint (GL_POINT_SMOOTH_HINT, GL_NICEST);
|
|
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
#endif
|
|
}
|
|
|
|
void mouseDrag (const MouseEvent& e)
|
|
{
|
|
delta = e.getDistanceFromDragStartX() / 100.0f;
|
|
repaint();
|
|
}
|
|
|
|
void renderOpenGL()
|
|
{
|
|
glClearColor (0.25f, 0.25f, 0.25f, 0.0f);
|
|
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
|
|
glMatrixMode (GL_PROJECTION);
|
|
glLoadIdentity();
|
|
|
|
#if JUCE_IOS
|
|
const GLfloat vertices[] = { -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f };
|
|
const GLubyte colours[] = { 255, 255, 0, 255, 0, 255, 255, 255, 0, 0, 0, 0, 255, 0, 255, 255 };
|
|
|
|
glOrthof (-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f);
|
|
glMatrixMode (GL_MODELVIEW);
|
|
glPushMatrix();
|
|
glRotatef (rotation, 0.0f, 0.0f, 1.0f);
|
|
|
|
glVertexPointer (2, GL_FLOAT, 0, vertices);
|
|
glEnableClientState (GL_VERTEX_ARRAY);
|
|
glColorPointer (4, GL_UNSIGNED_BYTE, 0, colours);
|
|
glEnableClientState (GL_COLOR_ARRAY);
|
|
|
|
glDrawArrays (GL_TRIANGLE_STRIP, 0, 4);
|
|
glPopMatrix();
|
|
#else
|
|
|
|
glOrtho (0.0, getWidth(), 0.0, getHeight(), 0, 1);
|
|
|
|
glColor4f (1.0f, 1.0f, 1.0f, fabsf (::sinf (rotation / 100.0f)));
|
|
glBegin (GL_QUADS);
|
|
glTexCoord2i (0, 0); glVertex2f (50.0f, getHeight() - 50.0f);
|
|
glTexCoord2i (1, 0); glVertex2f (getWidth() - 50.0f, getHeight() - 50.0f);
|
|
glTexCoord2i (1, 1); glVertex2f (getWidth() - 50.0f, 50.0f);
|
|
glTexCoord2i (0, 1); glVertex2f (50.0f, 50.0f);
|
|
glEnd();
|
|
|
|
glMatrixMode (GL_PROJECTION);
|
|
glLoadIdentity();
|
|
|
|
glClear (GL_DEPTH_BUFFER_BIT);
|
|
gluPerspective (45.0f,
|
|
getWidth() / (GLfloat) getHeight(),
|
|
0.1f,
|
|
100.0f);
|
|
|
|
glMatrixMode (GL_MODELVIEW);
|
|
|
|
glLoadIdentity();
|
|
glPushMatrix();
|
|
|
|
glTranslatef (0.0f, 0.0f, -5.0f);
|
|
glRotatef (rotation, 0.5f, 1.0f, 0.0f);
|
|
|
|
glBegin (GL_QUADS);
|
|
|
|
glColor3f (0.0f, 1.0f, 0.0f);
|
|
|
|
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
|
|
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
|
|
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
|
|
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
|
|
|
|
glColor3f (1.0f, 0.0f, 0.0f);
|
|
|
|
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
|
|
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
|
|
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
|
|
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
|
|
|
|
glColor3f (0.0f, 0.0f, 1.0f);
|
|
|
|
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
|
|
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
|
|
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
|
|
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
|
|
|
|
glColor3f (1.0f, 1.0f, 0.0f);
|
|
|
|
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
|
|
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
|
|
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
|
|
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
|
|
|
|
glColor3f (0.0f, 1.0f, 1.0f);
|
|
|
|
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
|
|
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
|
|
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
|
|
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
|
|
|
|
glColor3f (1.0f, 0.0f, 1.0f);
|
|
|
|
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
|
|
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
|
|
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
|
|
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
|
|
|
|
glEnd();
|
|
|
|
glPopMatrix();
|
|
#endif
|
|
}
|
|
|
|
void timerCallback()
|
|
{
|
|
rotation += delta;
|
|
|
|
repaint();
|
|
}
|
|
|
|
private:
|
|
float rotation, delta;
|
|
Image image;
|
|
};
|
|
|
|
|
|
//==============================================================================
|
|
class OpenGLDemo : public Component
|
|
{
|
|
public:
|
|
//==============================================================================
|
|
OpenGLDemo()
|
|
{
|
|
setName ("OpenGL");
|
|
|
|
addAndMakeVisible (&canvas);
|
|
}
|
|
|
|
void resized()
|
|
{
|
|
canvas.setBounds (10, 10, getWidth() - 20, getHeight() - 50);
|
|
}
|
|
|
|
private:
|
|
DemoOpenGLCanvas canvas;
|
|
|
|
OpenGLDemo (const OpenGLDemo&);
|
|
OpenGLDemo& operator= (const OpenGLDemo&);
|
|
};
|
|
|
|
|
|
//==============================================================================
|
|
Component* createOpenGLDemo()
|
|
{
|
|
return new OpenGLDemo();
|
|
}
|
|
|
|
#endif
|