| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: glcanvas.h
- // Purpose: interface of wxGLContext and wxGLCanvas
- // Author: wxWidgets team
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- /**
- @class wxGLContext
- An instance of a wxGLContext represents the state of an OpenGL state
- machine and the connection between OpenGL and the system.
- The OpenGL state includes everything that can be set with the OpenGL API:
- colors, rendering variables, display lists, texture objects, etc. Although
- it is possible to have multiple rendering contexts share display lists in
- order to save resources, this method is hardly used today any more, because
- display lists are only a tiny fraction of the overall state.
- Therefore, one rendering context is usually used with or bound to multiple
- output windows in turn, so that the application has access to the complete
- and identical state while rendering into each window.
- Binding (making current) a rendering context with another instance of a
- wxGLCanvas however works only if the other wxGLCanvas was created with the
- same attributes as the wxGLCanvas from which the wxGLContext was
- initialized. (This applies to sharing display lists among contexts
- analogously.)
- Note that some wxGLContext features are extremely platform-specific - its
- best to check your native platform's glcanvas header (on windows
- include/wx/msw/glcanvas.h) to see what features your native platform
- provides.
-
- wxHAS_OPENGL_ES is defined on platforms that only have this implementation
- available (eg the iPhone) und don't support the full specification.
- @library{wxgl}
- @category{gl}
- @see wxGLCanvas
- */
- class wxGLContext : public wxObject
- {
- public:
- /**
- Constructor.
- @param win
- The canvas that is used to initialize this context. This parameter
- is needed only temporarily, and the caller may do anything with it
- (e.g. destroy the window) after the constructor returned. @n
- It will be possible to bind (make current) this context to any
- other wxGLCanvas that has been created with equivalent attributes
- as win.
- @param other
- Context to share display lists with or @NULL (the default) for no
- sharing.
- */
- wxGLContext(wxGLCanvas* win, const wxGLContext* other = NULL);
- /**
- Makes the OpenGL state that is represented by this rendering context
- current with the wxGLCanvas @e win.
- @note @a win can be a different wxGLCanvas window than the one that was
- passed to the constructor of this rendering context. If @e RC is
- an object of type wxGLContext, the statements
- @e "RC.SetCurrent(win);" and @e "win.SetCurrent(RC);" are
- equivalent, see wxGLCanvas::SetCurrent().
- */
- virtual bool SetCurrent(const wxGLCanvas& win) const;
- };
- /**
- @anchor wxGL_FLAGS
- Constants for use with wxGLCanvas.
- @note Not all implementations support options such as stereo, auxiliary
- buffers, alpha channel, and accumulator buffer, use
- wxGLCanvas::IsDisplaySupported() to check for individual attributes
- support.
- */
- enum
- {
- /// Use true color (the default if no attributes at all are specified);
- /// do not use a palette.
- WX_GL_RGBA = 1,
- /// Specifies the number of bits for buffer if not WX_GL_RGBA.
- WX_GL_BUFFER_SIZE,
- /// Must be followed by 0 for main buffer, >0 for overlay, <0 for underlay.
- WX_GL_LEVEL,
- /// Use double buffering if present (on if no attributes specified).
- WX_GL_DOUBLEBUFFER,
- /// Use stereoscopic display.
- WX_GL_STEREO,
- /// Specifies number of auxiliary buffers.
- WX_GL_AUX_BUFFERS,
- /// Use red buffer with most bits (> MIN_RED bits)
- WX_GL_MIN_RED,
- /// Use green buffer with most bits (> MIN_GREEN bits)
- WX_GL_MIN_GREEN,
- /// Use blue buffer with most bits (> MIN_BLUE bits)
- WX_GL_MIN_BLUE,
- /// Use alpha buffer with most bits (> MIN_ALPHA bits)
- WX_GL_MIN_ALPHA,
- /// Specifies number of bits for Z-buffer (typically 0, 16 or 32).
- WX_GL_DEPTH_SIZE,
- /// Specifies number of bits for stencil buffer.
- WX_GL_STENCIL_SIZE,
- /// Specifies minimal number of red accumulator bits.
- WX_GL_MIN_ACCUM_RED,
- /// Specifies minimal number of green accumulator bits.
- WX_GL_MIN_ACCUM_GREEN,
- /// Specifies minimal number of blue accumulator bits.
- WX_GL_MIN_ACCUM_BLUE,
- /// Specifies minimal number of alpha accumulator bits.
- WX_GL_MIN_ACCUM_ALPHA,
- /// 1 for multisampling support (antialiasing)
- WX_GL_SAMPLE_BUFFERS,
- /// 4 for 2x2 antialiasing supersampling on most graphics cards
- WX_GL_SAMPLES
- };
- /**
- @class wxGLCanvas
- wxGLCanvas is a class for displaying OpenGL graphics. It is always used in
- conjunction with wxGLContext as the context can only be made current (i.e.
- active for the OpenGL commands) when it is associated to a wxGLCanvas.
- More precisely, you first need to create a wxGLCanvas window and then
- create an instance of a wxGLContext that is initialized with this
- wxGLCanvas and then later use either SetCurrent() with the instance of the
- wxGLContext or wxGLContext::SetCurrent() with the instance of the
- wxGLCanvas (which might be not the same as was used for the creation of the
- context) to bind the OpenGL state that is represented by the rendering
- context to the canvas, and then finally call SwapBuffers() to swap the
- buffers of the OpenGL canvas and thus show your current output.
- Notice that versions of wxWidgets previous to 2.9 used to implicitly create a
- wxGLContext inside wxGLCanvas itself. This is still supported in the
- current version but is deprecated now and will be removed in the future,
- please update your code to create the rendering contexts explicitly.
- To set up the attributes for the canvas (number of bits for the depth
- buffer, number of bits for the stencil buffer and so on) you should set up
- the correct values of the @e attribList parameter. The values that should
- be set up and their meanings will be described below.
- @note
- On those platforms which use a configure script (e.g. Linux and Mac OS)
- OpenGL support is automatically enabled if the relative headers and
- libraries are found.
- To switch it on under the other platforms (e.g. Windows), you need to edit
- the @c setup.h file and set @c wxUSE_GLCANVAS to @c 1 and then also pass
- @c USE_OPENGL=1 to the make utility. You may also need to add @c opengl32.lib
- and @c glu32.lib to the list of the libraries your program is linked with.
- @library{wxgl}
- @category{gl}
- @see wxGLContext
- */
- class wxGLCanvas : public wxWindow
- {
- public:
- /**
- Creates a window with the given parameters. Notice that you need to
- create and use a wxGLContext to output to this window.
- If @a attribList is not specified, double buffered RGBA mode is used.
- @param parent
- Pointer to a parent window.
- @param id
- Window identifier. If -1, will automatically create an identifier.
- @param pos
- Window position. wxDefaultPosition is (-1, -1) which indicates that
- wxWidgets should generate a default position for the window.
- @param size
- Window size. wxDefaultSize is (-1, -1) which indicates that
- wxWidgets should generate a default size for the window. If no
- suitable size can be found, the window will be sized to 20x20
- pixels so that the window is visible but obviously not correctly
- sized.
- @param style
- Window style.
- @param name
- Window name.
- @param attribList
- Array of integers. With this parameter you can set the device
- context attributes associated to this window. This array is
- zero-terminated: it should be set up using @ref wxGL_FLAGS
- constants. If a constant should be followed by a value, put it in
- the next array position. For example, WX_GL_DEPTH_SIZE should be
- followed by the value that indicates the number of bits for the
- depth buffer, e.g.:
- @code
- attribList[n++] = WX_GL_DEPTH_SIZE;
- attribList[n++] = 32;
- attribList[n] = 0; // terminate the list
- @endcode
- If the attribute list is not specified at all, i.e. if this
- parameter is @NULL, the default attributes including WX_GL_RGBA and
- WX_GL_DOUBLEBUFFER are used. But notice that if you do specify some
- attributes you also need to explicitly include these two default
- attributes in the list if you need them.
- @param palette
- Palette for indexed colour (i.e. non WX_GL_RGBA) mode. Ignored
- under most platforms.
- */
- wxGLCanvas(wxWindow* parent, wxWindowID id = wxID_ANY,
- const int* attribList = NULL,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize,
- long style = 0,
- const wxString& name = "GLCanvas",
- const wxPalette& palette = wxNullPalette);
- /**
- Determines if a canvas having the specified attributes is available.
- @param attribList
- See @a attribList for wxGLCanvas().
- @return @true if attributes are supported.
- */
- static bool IsDisplaySupported(const int* attribList);
- /**
- Returns true if the extension with given name is supported
- Notice that while this function is implemented for all of GLX, WGL and
- AGL the extensions names are usually not the same for different
- platforms and so the code using it still usually uses conditional
- compilation.
- */
- static bool IsExtensionSupported(const char *extension);
- /**
- Sets the current colour for this window (using @c glcolor3f()), using
- the wxWidgets colour database to find a named colour.
- */
- bool SetColour(const wxString& colour);
- /**
- Makes the OpenGL state that is represented by the OpenGL rendering
- context @a context current, i.e. it will be used by all subsequent
- OpenGL calls.
- This is equivalent to wxGLContext::SetCurrent() called with this window
- as parameter.
- @note This function may only be called when the window is shown on
- screen, in particular it can't usually be called from the
- constructor as the window isn't yet shown at this moment.
- @return @false if an error occurred.
- */
- bool SetCurrent(const wxGLContext& context) const;
- /**
- Swaps the double-buffer of this window, making the back-buffer the
- front-buffer and vice versa, so that the output of the previous OpenGL
- commands is displayed on the window.
- @return @false if an error occurred.
- */
- virtual bool SwapBuffers();
- };
|