Add Mark Haris' RenderTexture class based on SimGear's extesion support files.
This commit is contained in:
parent
6a6cc22e9c
commit
73f9febe06
@ -12,7 +12,7 @@ IMAGE_SERVER_INCL =
|
|||||||
IMAGE_SERVER_SRCS =
|
IMAGE_SERVER_SRCS =
|
||||||
endif
|
endif
|
||||||
|
|
||||||
noinst_HEADERS = colours.h
|
noinst_HEADERS = colours.h RenderTexture.h
|
||||||
|
|
||||||
include_HEADERS = \
|
include_HEADERS = \
|
||||||
colors.hxx \
|
colors.hxx \
|
||||||
@ -29,6 +29,7 @@ libsgscreen_a_SOURCES = \
|
|||||||
screen-dump.cxx \
|
screen-dump.cxx \
|
||||||
tr.cxx \
|
tr.cxx \
|
||||||
extensions.cxx \
|
extensions.cxx \
|
||||||
|
RenderTexture.cpp \
|
||||||
win32-printer.h
|
win32-printer.h
|
||||||
|
|
||||||
INCLUDES = -I$(top_srcdir)
|
INCLUDES = -I$(top_srcdir) -DGLX_GLXEXT_PROTOTYPES
|
||||||
|
2206
simgear/screen/RenderTexture.cpp
Normal file
2206
simgear/screen/RenderTexture.cpp
Normal file
File diff suppressed because it is too large
Load Diff
363
simgear/screen/RenderTexture.h
Normal file
363
simgear/screen/RenderTexture.h
Normal file
@ -0,0 +1,363 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// File : RenderTexture.h
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Copyright (c) 2002-2004 Mark J. Harris
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any
|
||||||
|
// damages arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any
|
||||||
|
// purpose, including commercial applications, and to alter it and
|
||||||
|
// redistribute it freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you
|
||||||
|
// must not claim that you wrote the original software. If you use
|
||||||
|
// this software in a product, an acknowledgment in the product
|
||||||
|
// documentation would be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and
|
||||||
|
// must not be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source
|
||||||
|
// distribution.
|
||||||
|
//
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// Credits:
|
||||||
|
// Original RenderTexture code: Mark J. Harris
|
||||||
|
// Original Render-to-depth-texture support: Thorsten Scheuermann
|
||||||
|
// Linux Copy-to-texture: Eric Werness
|
||||||
|
// Various Bug Fixes: Daniel (Redge) Sperl
|
||||||
|
// Bill Baxter
|
||||||
|
//
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* @file RenderTexture.h
|
||||||
|
*
|
||||||
|
* Interface definition for class RenderTexture. A multi-format render to
|
||||||
|
* texture wrapper.
|
||||||
|
*/
|
||||||
|
#ifndef __RENDERTEXTURE2_HPP__
|
||||||
|
#define __RENDERTEXTURE2_HPP__
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Changelog:
|
||||||
|
*
|
||||||
|
* Jan. 2005, Removed GLEW dependencies, Erik Hofman
|
||||||
|
*/
|
||||||
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#endif
|
||||||
|
#include SG_GL_H
|
||||||
|
#include SG_GLX_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
/* The pixel format for the pbuffer is controlled by the mode string passed
|
||||||
|
* into the PBuffer constructor. This string can have the following attributes:
|
||||||
|
*
|
||||||
|
* To specify the pixel format, use the following syntax.
|
||||||
|
* <channels>=<bits>
|
||||||
|
* <channels> must match one of the following.
|
||||||
|
*
|
||||||
|
* r - r pixel format (for float buffer).
|
||||||
|
* rg - rg pixel format (for float buffer).
|
||||||
|
* rgb - rgb pixel format. 8 bit or 16/32 bit in float buffer mode
|
||||||
|
* rgba - same as "rgb alpha" string
|
||||||
|
*
|
||||||
|
* <bits> can either be a scalar--meaning the same bit depth for each
|
||||||
|
* channel-- or a 2-, 3-, 4-component vector matching the specified number of
|
||||||
|
* channels. Vector components should be comma separated. An optional 'f'
|
||||||
|
* suffix on the bit depth specifies float components. In this case <bits>
|
||||||
|
* must be either "32f" or "16f". If <bits> is empty, the default 8 bits per
|
||||||
|
* channel will be used.
|
||||||
|
* r=32f
|
||||||
|
* rg=16f
|
||||||
|
* rgb=8
|
||||||
|
* rgb=5,6,5
|
||||||
|
*
|
||||||
|
* The following other attributes are supported.
|
||||||
|
*
|
||||||
|
* depth=n - must have n-bit depth buffer, omit n for default (24 bits)
|
||||||
|
* stencil=n - must have n-bit stencil buffer, omit n for default (8 bits)
|
||||||
|
* samples=n - must support n-sample antialiasing (n can be 2 or 4)
|
||||||
|
* aux=n - must have n AUX buffers
|
||||||
|
* doublebuffer - must support double buffered rendering
|
||||||
|
*
|
||||||
|
* tex2D
|
||||||
|
* texRECT
|
||||||
|
* texCUBE - must support binding pbuffer as texture to specified target
|
||||||
|
* - binding the depth buffer is also supported by specifying
|
||||||
|
* depthTex2D
|
||||||
|
* depthTexRECT
|
||||||
|
* depthTexCUBE
|
||||||
|
* - Both depth and color texture binding, may be specified, but
|
||||||
|
* the targets must match!
|
||||||
|
* For example: "tex2D depthTex2D" or "texRECT depthTexRECT"
|
||||||
|
*
|
||||||
|
* rtt
|
||||||
|
* ctt - These mutually exclusive options specify the update method used
|
||||||
|
* for render textures that support texture binding. "rtt"
|
||||||
|
* indicates that render to texture will be used to update the
|
||||||
|
* texture. "ctt" indicates that copy to texture will be used
|
||||||
|
* (i.e. glCopyTexSubImage2D()). "rtt" is the default if neither is
|
||||||
|
* specified, and one of the "tex*" options above is.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*---------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* USAGE NOTES:
|
||||||
|
*
|
||||||
|
* * Texture Parameters:
|
||||||
|
* The default texture wrap mode is GL_CLAMP_TO_EDGE for all textures, and
|
||||||
|
* the default texture filtering modes (min and mag) are GL_NEAREST.
|
||||||
|
* To change these parameters, simply bind the RenderTexture (using the
|
||||||
|
* Bind() method), and set them the way you would for any GL texture object.
|
||||||
|
* The same goes for depth textures.
|
||||||
|
*
|
||||||
|
* * Enabling Mipmapping:
|
||||||
|
* This is similar to the texture parameters above. When "rtt" is specified
|
||||||
|
* in the mode string, "mipmap" must also be specified in order to enable
|
||||||
|
* a mipmapped pbuffer. Then, the mipmaps must be created by enabling the
|
||||||
|
* GL_SGIS_GENERATE_MIPMAP texture parameter in the same way as above, and
|
||||||
|
* the min filter mode must be set to a mipmap filter mode, as with any
|
||||||
|
* mipmapped texture object.
|
||||||
|
*
|
||||||
|
* * Enabling Anisotropic Filtering
|
||||||
|
* As with the texture parameters above, except as in the following code:
|
||||||
|
* glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, max);
|
||||||
|
* glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, <value < max>);
|
||||||
|
*/
|
||||||
|
class RenderTexture
|
||||||
|
{
|
||||||
|
public: // enums
|
||||||
|
enum UpdateMode
|
||||||
|
{
|
||||||
|
RT_RENDER_TO_TEXTURE,
|
||||||
|
RT_COPY_TO_TEXTURE
|
||||||
|
};
|
||||||
|
|
||||||
|
public: // interface
|
||||||
|
// ctor / dtor
|
||||||
|
RenderTexture(const char *strMode="rgb tex2D");
|
||||||
|
~RenderTexture();
|
||||||
|
|
||||||
|
//! Call this once before use. Set bShare to true to share lists, textures,
|
||||||
|
//! and program objects between the render texture context and the
|
||||||
|
//! current active GL context.
|
||||||
|
bool Initialize(int width, int height,
|
||||||
|
bool shareObjects=true,
|
||||||
|
bool copyContext=false);
|
||||||
|
|
||||||
|
// !Change the render texture format.
|
||||||
|
bool Reset(const char* strMode,...);
|
||||||
|
// !Change the size of the render texture.
|
||||||
|
bool Resize(int width, int height);
|
||||||
|
|
||||||
|
// !Begin drawing to the texture. (i.e. use as "output" texture)
|
||||||
|
bool BeginCapture();
|
||||||
|
// !Ends drawing to 'current', begins drawing to this RenderTexture
|
||||||
|
bool BeginCapture(RenderTexture* current);
|
||||||
|
// !End drawing to the texture.
|
||||||
|
bool EndCapture();
|
||||||
|
|
||||||
|
// !Bind the texture to the active texture unit for use as an "input" texture
|
||||||
|
void Bind() const;
|
||||||
|
|
||||||
|
// !Bind the depth texture to the active texture unit for use as an "input" texture
|
||||||
|
void BindDepth() const;
|
||||||
|
|
||||||
|
// !Associate the RTT texture with 'iBuffer' (default is WGL_FRONT_LEFT_ARB)
|
||||||
|
bool BindBuffer( int iBuffer );
|
||||||
|
|
||||||
|
//! Enables the texture target appropriate for this render texture.
|
||||||
|
void EnableTextureTarget() const
|
||||||
|
{ if (_bInitialized) glEnable(_iTextureTarget); }
|
||||||
|
//! Disables the texture target appropriate for this render texture.
|
||||||
|
void DisableTextureTarget() const
|
||||||
|
{ if (_bInitialized) glDisable(_iTextureTarget); }
|
||||||
|
|
||||||
|
//! Returns the texture ID. Useful in Cg applications.
|
||||||
|
unsigned int GetTextureID() const { return _iTextureID; }
|
||||||
|
//! Returns the depth texture ID. Useful in Cg applications.
|
||||||
|
unsigned int GetDepthTextureID() const { return _iDepthTextureID; }
|
||||||
|
//! Returns the texture target this texture is bound to.
|
||||||
|
unsigned int GetTextureTarget() const { return _iTextureTarget; }
|
||||||
|
//! Conversion operator allows RenderTexture to be passed to GL calls
|
||||||
|
operator unsigned int()const{return _iTextureID;}
|
||||||
|
|
||||||
|
//! Returns the width of the offscreen buffer.
|
||||||
|
int GetWidth() const { return _iWidth; }
|
||||||
|
//! Returns the width of the offscreen buffer.
|
||||||
|
int GetHeight() const { return _iHeight; }
|
||||||
|
//! Returns the maximum S texture coordinate.
|
||||||
|
int GetMaxS() const { return IsRectangleTexture() ? _iWidth : 1; }
|
||||||
|
//! Returns the maximum T texture coordinate.
|
||||||
|
int GetMaxT() const { return IsRectangleTexture() ? _iHeight : 1; }
|
||||||
|
|
||||||
|
//! Returns the number of red bits allocated.
|
||||||
|
int GetRedBits() const { return _iNumColorBits[0]; }
|
||||||
|
//! Returns the number of green bits allocated.
|
||||||
|
int GetGreenBits() const { return _iNumColorBits[1]; }
|
||||||
|
//! Returns the number of blue bits allocated.
|
||||||
|
int GetBlueBits() const { return _iNumColorBits[2]; }
|
||||||
|
//! Returns the number of alpha bits allocated.
|
||||||
|
int GetAlphaBits() const { return _iNumColorBits[3]; }
|
||||||
|
|
||||||
|
//! Returns the number of depth bits allocated.
|
||||||
|
int GetDepthBits() const { return _iNumDepthBits; }
|
||||||
|
//! Returns the number of stencil bits allocated.
|
||||||
|
int GetStencilBits() const { return _iNumStencilBits; }
|
||||||
|
|
||||||
|
//! True if this RenderTexture has been properly initialized.
|
||||||
|
bool IsInitialized() const { return _bInitialized; }
|
||||||
|
//! True if this is a texture and not just an offscreen buffer.
|
||||||
|
bool IsTexture() const { return _bIsTexture; }
|
||||||
|
//! True if this is a depth texture and not just an offscreen buffer.
|
||||||
|
bool IsDepthTexture() const { return _bIsDepthTexture; }
|
||||||
|
//! True if this is a floating point buffer / texture.
|
||||||
|
bool IsFloatTexture() const { return _bFloat; }
|
||||||
|
//! True if this is a double-buffered pbuffer
|
||||||
|
bool IsDoubleBuffered() const { return _bDoubleBuffered; }
|
||||||
|
//! True if this texture has non-power-of-two dimensions.
|
||||||
|
bool IsRectangleTexture() const { return _bRectangle; }
|
||||||
|
//! True if this texture has non-power-of-two dimensions.
|
||||||
|
//! True if this pbuffer has a depth buffer.
|
||||||
|
bool HasDepth() const { return (_iNumDepthBits > 0); }
|
||||||
|
//! True if this pbuffer has a stencil buffer.
|
||||||
|
bool HasStencil() const { return (_iNumStencilBits > 0); }
|
||||||
|
//! True if this texture has mipmaps.
|
||||||
|
bool IsMipmapped() const { return _bMipmap; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @fn IsPowerOfTwo(int n)
|
||||||
|
* @brief Returns true if /param n is an integer power of 2.
|
||||||
|
*
|
||||||
|
* Taken from Steve Baker's Cute Code Collection.
|
||||||
|
* http://www.sjbaker.org/steve/software/cute_code.html
|
||||||
|
*/
|
||||||
|
static bool IsPowerOfTwo(int n) { return ((n&(n-1))==0); }
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// This is the deprecated (old) interface. It will likely be removed
|
||||||
|
// in a future version, so it is recommended that you transition to the
|
||||||
|
// new mode-string-based interface.
|
||||||
|
RenderTexture(int width, int height,
|
||||||
|
bool bIsTexture = true,
|
||||||
|
bool bIsDepthTexture = false);
|
||||||
|
//
|
||||||
|
// Call this once before use. Set bShare to true to share lists,
|
||||||
|
// textures, and program objects between the render texture context
|
||||||
|
// and the current active GL context. [deprecated]
|
||||||
|
bool Initialize(bool bShare = true,
|
||||||
|
bool bDepth = false,
|
||||||
|
bool bStencil = false,
|
||||||
|
bool bMipmap = false,
|
||||||
|
bool bAnisoFilter = false,
|
||||||
|
unsigned int iRBits = 8,
|
||||||
|
unsigned int iGBits = 8,
|
||||||
|
unsigned int iBBits = 8,
|
||||||
|
unsigned int iABits = 8,
|
||||||
|
// Only Win32 has RT now, so only make it default there
|
||||||
|
#ifdef _WIN32
|
||||||
|
UpdateMode updateMode = RT_RENDER_TO_TEXTURE
|
||||||
|
#else
|
||||||
|
UpdateMode updateMode = RT_COPY_TO_TEXTURE
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
// !Change the render texture resolution. [deprecated]
|
||||||
|
bool Reset(int iWidth, int iHeight);
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
protected: // methods
|
||||||
|
bool _Invalidate();
|
||||||
|
|
||||||
|
typedef std::pair<std::string, std::string> KeyVal;
|
||||||
|
|
||||||
|
void _ParseModeString(const char *modeString,
|
||||||
|
std::vector<int> &pixelFormatAttribs,
|
||||||
|
std::vector<int> &pbufferAttribs);
|
||||||
|
|
||||||
|
std::vector<int> _ParseBitVector(std::string bitVector);
|
||||||
|
KeyVal _GetKeyValuePair(std::string token);
|
||||||
|
|
||||||
|
|
||||||
|
bool _VerifyExtensions();
|
||||||
|
bool _InitializeTextures();
|
||||||
|
|
||||||
|
void _MaybeCopyBuffer();
|
||||||
|
bool _ReleaseBoundBuffers();
|
||||||
|
bool _MakeCurrent();
|
||||||
|
bool _BindDepthBuffer( ) const;
|
||||||
|
|
||||||
|
protected: // data
|
||||||
|
int _iWidth; // width of the pbuffer
|
||||||
|
int _iHeight; // height of the pbuffer
|
||||||
|
|
||||||
|
bool _bIsTexture;
|
||||||
|
bool _bIsDepthTexture;
|
||||||
|
bool _bHasARBDepthTexture; // [Redge]
|
||||||
|
|
||||||
|
UpdateMode _eUpdateMode;
|
||||||
|
|
||||||
|
bool _bInitialized;
|
||||||
|
|
||||||
|
unsigned int _iNumAuxBuffers;
|
||||||
|
bool _bIsBufferBound;
|
||||||
|
int _iCurrentBoundBuffer;
|
||||||
|
|
||||||
|
unsigned int _iNumComponents;
|
||||||
|
unsigned int _iNumColorBits[4];
|
||||||
|
unsigned int _iNumDepthBits;
|
||||||
|
unsigned int _iNumStencilBits;
|
||||||
|
|
||||||
|
|
||||||
|
bool _bFloat;
|
||||||
|
bool _bDoubleBuffered;
|
||||||
|
bool _bPowerOf2;
|
||||||
|
bool _bRectangle;
|
||||||
|
bool _bMipmap;
|
||||||
|
|
||||||
|
bool _bShareObjects;
|
||||||
|
bool _bCopyContext;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
HDC _hDC; // Handle to a device context.
|
||||||
|
HGLRC _hGLContext; // Handle to a GL context.
|
||||||
|
HPBUFFERARB _hPBuffer; // Handle to a pbuffer.
|
||||||
|
|
||||||
|
HDC _hPreviousDC;
|
||||||
|
HGLRC _hPreviousContext;
|
||||||
|
#else
|
||||||
|
Display *_pDisplay;
|
||||||
|
GLXContext _hGLContext;
|
||||||
|
GLXPbuffer _hPBuffer;
|
||||||
|
|
||||||
|
GLXDrawable _hPreviousDrawable;
|
||||||
|
GLXContext _hPreviousContext;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Texture stuff
|
||||||
|
GLenum _iTextureTarget;
|
||||||
|
unsigned int _iTextureID;
|
||||||
|
unsigned int _iDepthTextureID;
|
||||||
|
|
||||||
|
unsigned short* _pPoorDepthTexture; // [Redge]
|
||||||
|
|
||||||
|
std::vector<int> _pixelFormatAttribs;
|
||||||
|
std::vector<int> _pbufferAttribs;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Using these could lead to some odd behavior
|
||||||
|
RenderTexture(const RenderTexture&);
|
||||||
|
RenderTexture& operator=(const RenderTexture&);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //__RENDERTEXTURE2_HPP__
|
Loading…
Reference in New Issue
Block a user