mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-12-26 23:54:50 +01:00
221 lines
8.9 KiB
C++
221 lines
8.9 KiB
C++
/* Copyright (c) 2002-2012 Croteam Ltd.
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of version 2 of the GNU General Public License as published by
|
|
the Free Software Foundation
|
|
|
|
|
|
This program 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.
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
|
|
|
|
#ifndef SE_INCL_TEXTURE_H
|
|
#define SE_INCL_TEXTURE_H
|
|
#ifdef PRAGMA_ONCE
|
|
#pragma once
|
|
#endif
|
|
|
|
#include <Engine/Base/Lists.h>
|
|
#include <Engine/Base/Anim.h>
|
|
#include <Engine/Graphics/GfxLibrary.h>
|
|
|
|
#define BYTES_PER_TEXEL 4 // all textures in engine are 4 bytes per pixel
|
|
|
|
// td_ulFlags bits
|
|
// (on disk and in memory)
|
|
#define TEX_ALPHACHANNEL (1UL<<0) // texture has alpha channel (for old version support)
|
|
#define TEX_32BIT (1UL<<1) // texture needs to be in 32-bit quality uploaded if can
|
|
// (only in memory)
|
|
#define TEX_STATIC (1UL<<5) // remain loaded after being bound (i.e. uploaded - for base textures)
|
|
#define TEX_CONSTANT (1UL<<6) // cannot be changed (no mip-map disposing, no LOD biasing, no colorizing, nothing!)
|
|
#define TEX_TRANSPARENT (1UL<<7) // only one bit of alpha channel is enough (internal format GL_RGB5_A1)
|
|
#define TEX_EQUALIZED (1UL<<8) // texture has 128-gray last mipmap (i.e. can be discarded in shade mode)
|
|
#define TEX_GRAY (1UL<<9) // grayscale texture
|
|
#define TEX_WHITE (1UL<<10) // completely white texture (believe me, there are some cases)
|
|
#define TEX_KEEPCOLOR (1UL<<11) // don't (de)saturate (for heightmaps and such!)
|
|
#define TEX_SINGLEMIPMAP (1UL<<18) // set if last uploading was in single-mipmap
|
|
#define TEX_PROBED (1UL<<19) // set if last binding was as probe-texture
|
|
// (flags that shows if texture mipmaps has been changed)
|
|
#define TEX_DISPOSED (1UL<<20) // largest mip-map(s) has been left-out
|
|
#define TEX_DITHERED (1UL<<21) // dithering has been applied on this texture
|
|
#define TEX_FILTERED (1UL<<22) // flitering has been applied on this texture
|
|
#define TEX_SATURATED (1UL<<23) // saturation has been adjusted on this texture
|
|
#define TEX_COLORIZED (1UL<<24) // mipmaps has been colorized on this texture
|
|
#define TEX_WASOLD (1UL<<30) // loaded from old format (version 3)
|
|
|
|
|
|
/*
|
|
* Bitmap data for a class of texture objects
|
|
*/
|
|
class ENGINE_API CTextureData : public CAnimData {
|
|
public:
|
|
// implementation:
|
|
ULONG td_ulFlags; // see defines
|
|
MEX td_mexWidth, td_mexHeight; // texture dimensions
|
|
INDEX td_iFirstMipLevel; // the highest quality mip level
|
|
INDEX td_ctFineMipLevels; // number of bilineary created mip levels
|
|
SLONG td_slFrameSize; // sum of sizes of all mip-maps for one frame
|
|
INDEX td_ctFrames; // number of different frames
|
|
|
|
class CTexParams td_tpLocal; // local texture parameters
|
|
ULONG td_ulInternalFormat; // format in which texture will be uploaded
|
|
CTimerValue td_tvLastDrawn; // timer for probing
|
|
ULONG td_ulProbeObject;
|
|
union {
|
|
ULONG td_ulObject;
|
|
ULONG *td_pulObjects;
|
|
};
|
|
ULONG *td_pulFrames; // all frames with their mip-maps and private palettes
|
|
UBYTE *td_pubBuffer1, *td_pubBuffer2; // buffers for effect textures
|
|
PIX td_pixBufferWidth, td_pixBufferHeight; // effect buffer dimensions
|
|
class CTextureData *td_ptdBaseTexture; // base texure for effects (if any)
|
|
class CTextureEffectGlobal *td_ptegEffect; // all data for effect textures
|
|
|
|
INDEX td_iRenderFrame; // frame number currently rendering (for profiling)
|
|
|
|
// constructor and destructor
|
|
CTextureData();
|
|
~CTextureData();
|
|
|
|
// reference counting (override from CAnimData)
|
|
void RemReference_internal(void);
|
|
|
|
// converts global mip level to the corresponding one of texture
|
|
INDEX ClampMipLevel( FLOAT fMipFactor) const;
|
|
|
|
// gets values from some of texture data members
|
|
inline MEX GetWidth(void) const { return td_mexWidth; };
|
|
inline MEX GetHeight(void) const { return td_mexHeight; };
|
|
inline PIX GetPixWidth(void) const { return td_mexWidth >>td_iFirstMipLevel; };
|
|
inline PIX GetPixHeight(void) const { return td_mexHeight>>td_iFirstMipLevel; };
|
|
inline ULONG GetFlags(void) const { return td_ulFlags; };
|
|
inline ULONG GetNoOfMips(void) const { return GetNoOfMipmaps( GetPixWidth(), GetPixHeight()); };
|
|
inline ULONG GetNoOfFineMips(void) const { return td_ctFineMipLevels; };
|
|
|
|
// mark that texture has been used
|
|
inline void MarkDrawn(void) { td_tvLastDrawn = _pTimer->GetHighPrecisionTimer(); };
|
|
|
|
// get string description of texture size, mips and parameters
|
|
CTString GetDescription(void);
|
|
|
|
// sets new texture mex width and changes height remaining texture's aspect ratio
|
|
inline void ChangeSize( MEX mexNewWidth) {
|
|
td_mexHeight = MEX( ((FLOAT)mexNewWidth)/td_mexWidth * td_mexHeight);
|
|
td_mexWidth = mexNewWidth;
|
|
};
|
|
|
|
// check if texture frame(s) has been somehow altered (dithering, filtering, saturation, colorizing...)
|
|
inline BOOL IsModified(void) {
|
|
return td_ulFlags & (TEX_DISPOSED|TEX_DITHERED|TEX_FILTERED|TEX_SATURATED|TEX_COLORIZED);
|
|
};
|
|
|
|
// export finest mipmap of one texture's frame to imageinfo
|
|
void Export_t( class CImageInfo &iiExportedImage, INDEX iFrame);
|
|
|
|
// set texture frame as current for accelerator (this will upload texture that needs or wants uploading)
|
|
void SetAsCurrent( INDEX iFrameNo=0, BOOL bForceUpload=FALSE);
|
|
|
|
// creates new effect texture with one frame
|
|
void CreateEffectTexture( PIX pixWidth, PIX pixHeight, MEX mexWidth,
|
|
CTextureData *ptdBaseTexture, ULONG ulGlobalEffect);
|
|
// creates new texture with one frame
|
|
void Create_t( const CImageInfo *pII, MEX mexWanted, INDEX ctFineMips, BOOL bForce32bit);
|
|
// adds one frame to created texture
|
|
void AddFrame_t( const CImageInfo *pII);
|
|
|
|
// remove texture from gfx API (driver)
|
|
void Unbind(void);
|
|
// free memory allocated for texture
|
|
void Clear(void);
|
|
|
|
// read texture from file
|
|
void Read_t( CTStream *inFile);
|
|
// write texture to file
|
|
void Write_t( CTStream *outFile);
|
|
// force texture to be re-loaded (if needed) in corresponding manner
|
|
void Force( ULONG ulTexFlags);
|
|
|
|
// get texel from texture's largest mip-map
|
|
COLOR GetTexel( MEX mexU, MEX mexV);
|
|
// copy (and eventually convert to floats) one row from texture to an array (iChannel is 1=R,2=G,3=B,4=A)
|
|
void FetchRow( PIX pixRow, void *pfDst, INDEX iChannel=4, BOOL bConvertToFloat=TRUE);
|
|
// get pointer to one row of texture
|
|
ULONG *GetRowPointer( PIX pixRow);
|
|
|
|
// overridden from CSerial:
|
|
|
|
// check if this kind of objects is auto-freed
|
|
virtual BOOL IsAutoFreed(void);
|
|
// get amount of memory used by this object
|
|
virtual SLONG GetUsedMemory(void);
|
|
};
|
|
|
|
|
|
/*
|
|
* An instance of a texture object
|
|
*/
|
|
class ENGINE_API CTextureObject : public CAnimObject {
|
|
// implementation:
|
|
public:
|
|
// interface:
|
|
public:
|
|
CTextureObject(void);
|
|
// copy from another object of same class
|
|
void Copy(CTextureObject &toOther);
|
|
MEX GetWidth(void) const;
|
|
MEX GetHeight(void) const;
|
|
ULONG GetFlags(void) const;
|
|
void Read_t( CTStream *istrFile); // throw char * // read and
|
|
void Write_t( CTStream *ostrFile); // throw char * // write functions
|
|
|
|
// obtain texture and set it for this object
|
|
void SetData_t(const CTFileName &fnmTexture); // throw char *
|
|
// get filename of texture or empty string if no texture
|
|
const CTFileName &GetName(void);
|
|
};
|
|
|
|
ENGINE_API extern void CreateTexture_t( const CTFileName &inFileName,
|
|
MEX inMex, INDEX inMipmaps, BOOL bForce32bit);
|
|
ENGINE_API extern void CreateTexture_t( const CTFileName &inFileName, const CTFileName &outFileName,
|
|
MEX inMex, INDEX inMipmaps, BOOL bForce32bit);
|
|
ENGINE_API extern void ProcessScript_t( const CTFileName &inFileName);
|
|
|
|
|
|
|
|
/*
|
|
* Render-to-texture class
|
|
*/
|
|
/*
|
|
class ENGINE_API CRenderTexture
|
|
{
|
|
// implementation:
|
|
public:
|
|
CListNode rt_lnInGfx // for linking in list of all renderable textures
|
|
ULONG rt_ulFlags; // see defines (only alpha and 32bit, for now)
|
|
PIX tt_pixWidth, rt_pixHeight; // texture dimensions
|
|
ULONG td_ulInternalFormat; // format in which texture will be uploaded
|
|
ULONG *rt_pulImage; // image in memory (no mipmaps for now!)
|
|
class CTexParams td_tpLocal; // local texture parameters
|
|
|
|
// interface:
|
|
public:
|
|
CRenderTexture(void);
|
|
~CRenderTexture(void);
|
|
// prepare
|
|
BOOL Init( PIX pixWidth, PIX pixHeight, BOOL b32bit, BOOL bAlpha=FALSE);
|
|
// reset (i.e. prepare again - after display mode switch and stuff like that)
|
|
void Reset(void);
|
|
// set texture as current for accelerator
|
|
void SetAsCurrent(void);
|
|
// set texture as target for rendering
|
|
void SetAsTarget(void);
|
|
};
|
|
*/
|
|
|
|
#endif /* include-once check. */
|
|
|