Add Mark Haris' RenderTexture class based on SimGear's extesion support files.

This commit is contained in:
ehofman 2005-01-27 10:39:15 +00:00
parent 6a6cc22e9c
commit 73f9febe06
3 changed files with 2572 additions and 2 deletions

View File

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

File diff suppressed because it is too large Load Diff

View 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__