2019-10-05 17:28:05 +00:00
/*
* * textures . h
* *
* * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* * Copyright 2005 - 2016 Randy Heit
2019-10-12 20:49:46 +00:00
* * Copyright 2005 - 2019 Christoph Oelckers
2019-10-05 17:28:05 +00:00
* * All rights reserved .
* *
* * Redistribution and use in source and binary forms , with or without
* * modification , are permitted provided that the following conditions
* * are met :
* *
* * 1. Redistributions of source code must retain the above copyright
* * notice , this list of conditions and the following disclaimer .
* * 2. Redistributions in binary form must reproduce the above copyright
* * notice , this list of conditions and the following disclaimer in the
* * documentation and / or other materials provided with the distribution .
* * 3. The name of the author may not be used to endorse or promote products
* * derived from this software without specific prior written permission .
* *
* * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ` ` AS IS ' ' AND ANY EXPRESS OR
* * IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
* * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED .
* * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT , INDIRECT ,
* * INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
* * NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* * DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* * THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* * ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* * THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
* * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* *
*/
# ifndef __TEXTURES_H
# define __TEXTURES_H
2020-05-24 17:12:22 +00:00
# include "basics.h"
# include "vectors.h"
# include "colormatcher.h"
# include "renderstyle.h"
2019-10-05 17:28:05 +00:00
# include "textureid.h"
2020-05-24 17:12:22 +00:00
# include <vector>
# include "hw_texcontainer.h"
2019-10-05 17:28:05 +00:00
2020-05-24 17:12:22 +00:00
// 15 because 0th texture is our texture
# define MAX_CUSTOM_HW_SHADER_TEXTURES 15
typedef TMap < int , bool > SpriteHits ;
2020-05-24 11:53:27 +00:00
class FImageSource ;
2019-10-05 17:28:05 +00:00
2020-05-24 11:53:27 +00:00
enum MaterialShaderIndex
2019-10-12 20:49:46 +00:00
{
2020-05-24 11:53:27 +00:00
SHADER_Default ,
SHADER_Warp1 ,
SHADER_Warp2 ,
SHADER_Brightmap ,
SHADER_Specular ,
SHADER_SpecularBrightmap ,
SHADER_PBR ,
SHADER_PBRBrightmap ,
SHADER_Paletted ,
SHADER_NoTexture ,
SHADER_BasicFuzz ,
SHADER_SmoothFuzz ,
SHADER_SwirlyFuzz ,
SHADER_TranslucentFuzz ,
SHADER_JaggedFuzz ,
SHADER_NoiseFuzz ,
SHADER_SmoothNoiseFuzz ,
SHADER_SoftwareFuzz ,
FIRST_USER_SHADER
2019-10-12 20:49:46 +00:00
} ;
2020-05-24 11:53:27 +00:00
struct UserShaderDesc
2019-10-05 17:28:05 +00:00
{
2020-05-24 11:53:27 +00:00
FString shader ;
MaterialShaderIndex shaderType ;
FString defines ;
bool disablealphatest = false ;
2019-10-05 17:28:05 +00:00
} ;
2020-05-24 11:53:27 +00:00
extern TArray < UserShaderDesc > usershaders ;
2019-10-14 21:11:01 +00:00
2019-10-05 17:28:05 +00:00
2020-05-24 11:53:27 +00:00
struct FloatRect
2019-10-12 20:49:46 +00:00
{
2020-05-24 11:53:27 +00:00
float left , top ;
float width , height ;
2019-10-12 20:49:46 +00:00
2020-05-24 11:53:27 +00:00
void Offset ( float xofs , float yofs )
{
left + = xofs ;
top + = yofs ;
}
void Scale ( float xfac , float yfac )
2019-10-12 20:49:46 +00:00
{
2020-05-24 11:53:27 +00:00
left * = xfac ;
width * = xfac ;
top * = yfac ;
height * = yfac ;
2019-10-12 20:49:46 +00:00
}
} ;
2020-05-24 11:53:27 +00:00
enum ECreateTexBufferFlags
2019-10-12 20:49:46 +00:00
{
2020-05-24 11:53:27 +00:00
CTF_Expand = 2 , // create buffer with a one-pixel wide border
CTF_ProcessData = 4 , // run postprocessing on the generated buffer. This is only needed when using the data for a hardware texture.
CTF_CheckOnly = 8 , // Only runs the code to get a content ID but does not create a texture. Can be used to access a caching system for the hardware textures.
2019-10-12 20:49:46 +00:00
} ;
2020-05-24 11:53:27 +00:00
2019-10-05 17:28:05 +00:00
class FBitmap ;
struct FRemapTable ;
struct FCopyInfo ;
class FScanner ;
// Texture IDs
class FTextureManager ;
class FTerrainTypeArray ;
class IHardwareTexture ;
class FMaterial ;
class FMultipatchTextureBuilder ;
extern int r_spriteadjustSW , r_spriteadjustHW ;
class FNullTextureID : public FTextureID
{
public :
FNullTextureID ( ) : FTextureID ( 0 ) { }
} ;
2020-05-24 11:53:27 +00:00
enum FTextureFormat : uint32_t
{
TEX_Pal ,
TEX_Gray ,
TEX_RGB , // Actually ARGB
2019-10-05 17:28:05 +00:00
2020-05-24 11:53:27 +00:00
TEX_Count
} ;
2019-10-05 17:28:05 +00:00
2020-05-24 11:53:27 +00:00
class FSoftwareTexture ;
2019-10-05 17:28:05 +00:00
class FGLRenderState ;
2020-05-24 11:53:27 +00:00
struct spriteframewithrotate ;
2019-10-05 17:28:05 +00:00
class FSerializer ;
namespace OpenGLRenderer
{
class FGLRenderState ;
2020-05-24 11:53:27 +00:00
class FHardwareTexture ;
2019-10-05 17:28:05 +00:00
}
union FContentIdBuilder
{
uint64_t id ;
struct
{
unsigned imageID : 24 ;
unsigned translation : 16 ;
unsigned expand : 1 ;
unsigned scaler : 4 ;
unsigned scalefactor : 4 ;
} ;
} ;
struct FTextureBuffer
{
uint8_t * mBuffer = nullptr ;
int mWidth = 0 ;
int mHeight = 0 ;
2020-05-24 11:53:27 +00:00
uint64_t mContentId = 0 ; // unique content identifier. (Two images created from the same image source with the same settings will return the same value.)
2019-10-05 17:28:05 +00:00
FTextureBuffer ( ) = default ;
~ FTextureBuffer ( )
{
if ( mBuffer ) delete [ ] mBuffer ;
}
FTextureBuffer ( const FTextureBuffer & other ) = delete ;
FTextureBuffer ( FTextureBuffer & & other )
{
mBuffer = other . mBuffer ;
mWidth = other . mWidth ;
mHeight = other . mHeight ;
2020-05-24 11:53:27 +00:00
mContentId = other . mContentId ;
2019-10-05 17:28:05 +00:00
other . mBuffer = nullptr ;
}
FTextureBuffer & operator = ( FTextureBuffer & & other )
{
mBuffer = other . mBuffer ;
mWidth = other . mWidth ;
mHeight = other . mHeight ;
2020-05-24 11:53:27 +00:00
mContentId = other . mContentId ;
2019-10-05 17:28:05 +00:00
other . mBuffer = nullptr ;
return * this ;
}
} ;
// Base texture class
class FTexture
{
2020-05-24 17:12:22 +00:00
friend class GLDefsParser ;
friend class FMultipatchTextureBuilder ;
// The serializer also needs access to more specific info that shouldn't be accessible through the interface.
friend FSerializer & Serialize ( FSerializer & arc , const char * key , FTextureID & value , FTextureID * defval ) ;
// For now only give access to classes which cannot be reworked yet. None of these should remain here when all is done.
friend class FSoftwareTexture ;
friend class FWarpTexture ;
friend class FMaterial ;
friend class OpenGLRenderer : : FGLRenderState ; // For now this needs access to some fields in ApplyMaterial. This should be rerouted through the Material class
friend class VkRenderState ;
friend class PolyRenderState ;
friend struct FTexCoordInfo ;
friend class OpenGLRenderer : : FHardwareTexture ;
friend class VkHardwareTexture ;
friend class PolyHardwareTexture ;
friend class FMultiPatchTexture ;
friend class FSkyBox ;
friend class FBrightmapTexture ;
friend class FFont ;
2019-10-14 21:11:01 +00:00
2019-10-05 19:59:03 +00:00
2020-05-24 17:12:22 +00:00
public :
static FTexture * CreateTexture ( const char * name , int lumpnum , ETextureType usetype ) ;
2019-10-05 17:28:05 +00:00
virtual ~ FTexture ( ) ;
virtual FImageSource * GetImage ( ) const { return nullptr ; }
2020-05-24 17:12:22 +00:00
void AddAutoMaterials ( ) ;
void CreateUpsampledTextureBuffer ( FTextureBuffer & texbuffer , bool hasAlpha , bool checkonly ) ;
// These are mainly meant for 2D code which only needs logical information about the texture to position it properly.
int GetDisplayWidth ( ) { int foo = int ( ( Width * 2 ) / Scale . X ) ; return ( foo > > 1 ) + ( foo & 1 ) ; }
int GetDisplayHeight ( ) { int foo = int ( ( Height * 2 ) / Scale . Y ) ; return ( foo > > 1 ) + ( foo & 1 ) ; }
double GetDisplayWidthDouble ( ) { return Width / Scale . X ; }
double GetDisplayHeightDouble ( ) { return Height / Scale . Y ; }
int GetDisplayLeftOffset ( ) { return GetScaledLeftOffset ( 0 ) ; }
int GetDisplayTopOffset ( ) { return GetScaledTopOffset ( 0 ) ; }
double GetDisplayLeftOffsetDouble ( ) { return GetScaledLeftOffsetDouble ( 0 ) ; }
double GetDisplayTopOffsetDouble ( ) { return GetScaledTopOffsetDouble ( 0 ) ; }
void SetOffsets ( int l , int t )
{
_LeftOffset [ 0 ] = _LeftOffset [ 1 ] = l ;
2020-05-24 18:11:17 +00:00
_TopOffset [ 0 ] = _TopOffset [ 1 ] = t ;
2020-05-24 17:12:22 +00:00
}
int GetTexelWidth ( ) { return Width ; }
int GetTexelHeight ( ) { return Height ; }
int GetTexelLeftOffset ( int adjusted ) { return _LeftOffset [ adjusted ] ; }
int GetTexelTopOffset ( int adjusted ) { return _TopOffset [ adjusted ] ; }
2019-10-05 17:28:05 +00:00
2020-05-24 17:12:22 +00:00
bool isValid ( ) const { return UseType ! = ETextureType : : Null ; }
bool isSWCanvas ( ) const { return UseType = = ETextureType : : SWCanvas ; }
bool isSkybox ( ) const { return bSkybox ; }
bool isFullbrightDisabled ( ) const { return bDisableFullbright ; }
bool isHardwareCanvas ( ) const { return bHasCanvas ; } // There's two here so that this can deal with software canvases in the hardware renderer later.
bool isCanvas ( ) const { return bHasCanvas ; }
bool isMiscPatch ( ) const { return UseType = = ETextureType : : MiscPatch ; } // only used by the intermission screen to decide whether to tile the background image or not.
int isWarped ( ) const { return bWarped ; }
int GetRotations ( ) const { return Rotations ; }
void SetRotations ( int rot ) { Rotations = int16_t ( rot ) ; }
bool isSprite ( ) const { return UseType = = ETextureType : : Sprite | | UseType = = ETextureType : : SkinSprite | | UseType = = ETextureType : : Decal ; }
2019-10-05 17:28:05 +00:00
const FString & GetName ( ) const { return Name ; }
2020-05-24 17:12:22 +00:00
void SetNoDecals ( bool on ) { bNoDecals = on ; }
void SetWarpStyle ( int style ) { bWarped = style ; }
bool allowNoDecals ( ) const { return bNoDecals ; }
bool isScaled ( ) const { return Scale . X ! = 1 | | Scale . Y ! = 1 ; }
2019-10-05 17:28:05 +00:00
bool isMasked ( ) const { return bMasked ; }
2020-05-24 17:12:22 +00:00
void SetSkyOffset ( int offs ) { SkyOffset = offs ; }
int GetSkyOffset ( ) const { return SkyOffset ; }
FTextureID GetID ( ) const { return id ; }
2019-10-05 17:28:05 +00:00
PalEntry GetSkyCapColor ( bool bottom ) ;
2020-05-24 17:12:22 +00:00
FTexture * GetRawTexture ( ) ;
virtual int GetSourceLump ( ) { return SourceLump ; } // needed by the scripted GetName method.
void GetGlowColor ( float * data ) ;
bool isGlowing ( ) const { return bGlowing ; }
bool isAutoGlowing ( ) const { return bAutoGlowing ; }
int GetGlowHeight ( ) const { return GlowHeight ; }
bool isFullbright ( ) const { return bFullbright ; }
void CreateDefaultBrightmap ( ) ;
bool FindHoles ( const unsigned char * buffer , int w , int h ) ;
void SetUseType ( ETextureType type ) { UseType = type ; }
int GetSourceLump ( ) const { return SourceLump ; }
ETextureType GetUseType ( ) const { return UseType ; }
void SetSpeed ( float fac ) { shaderspeed = fac ; }
void SetWorldPanning ( bool on ) { bWorldPanning = on ; }
void SetDisplaySize ( int fitwidth , int fitheight ) ;
void SetFrontSkyLayer ( bool on = true ) { bNoRemap0 = on ; }
bool IsFrontSkyLayer ( ) { return bNoRemap0 ; }
FTexture * GetBrightmap ( )
{
if ( ! bBrightmapChecked )
CreateDefaultBrightmap ( ) ;
return Brightmap ;
}
void CopySize ( FTexture * BaseTexture )
{
Width = BaseTexture - > GetTexelWidth ( ) ;
Height = BaseTexture - > GetTexelHeight ( ) ;
_TopOffset [ 0 ] = BaseTexture - > _TopOffset [ 0 ] ;
_TopOffset [ 1 ] = BaseTexture - > _TopOffset [ 1 ] ;
_LeftOffset [ 0 ] = BaseTexture - > _LeftOffset [ 0 ] ;
_LeftOffset [ 1 ] = BaseTexture - > _LeftOffset [ 1 ] ;
Scale = BaseTexture - > Scale ;
}
// This is only used for the null texture and for Heretic's skies.
void SetSize ( int w , int h )
{
Width = w ;
Height = h ;
}
2019-10-05 17:28:05 +00:00
// Returns the whole texture, stored in column-major order
2020-05-24 17:12:22 +00:00
virtual TArray < uint8_t > Get8BitPixels ( bool alphatex ) ;
2019-10-18 17:06:57 +00:00
virtual FBitmap GetBgraBitmap ( const PalEntry * remap , int * trans = nullptr ) ;
2019-10-05 17:28:05 +00:00
2020-05-24 17:12:22 +00:00
static bool SmoothEdges ( unsigned char * buffer , int w , int h ) ;
2019-10-05 17:28:05 +00:00
static PalEntry averageColor ( const uint32_t * data , int size , int maxout ) ;
2020-05-24 17:12:22 +00:00
FSoftwareTexture * GetSoftwareTexture ( ) ;
2019-10-14 21:11:01 +00:00
2020-05-24 17:12:22 +00:00
protected :
DVector2 Scale ;
2019-10-17 22:20:27 +00:00
2020-05-24 17:12:22 +00:00
int SourceLump ;
FTextureID id ;
2019-10-05 17:28:05 +00:00
2020-05-24 17:12:22 +00:00
FMaterial * Material [ 2 ] = { nullptr , nullptr } ;
public :
FHardwareTextureContainer SystemTextures ;
int alphaThreshold = 0.5 ;
FixedBitArray < 256 > NoBrightmapFlag = false ;
2019-10-05 17:28:05 +00:00
protected :
2020-05-24 17:12:22 +00:00
FSoftwareTexture * SoftwareTexture = nullptr ;
// None of the following pointers are owned by this texture, they are all controlled by the texture manager.
// Offset-less version for COMPATF_MASKEDMIDTEX
FTexture * OffsetLess = nullptr ;
// Paletted variant
FTexture * PalVersion = nullptr ;
// Material layers
FTexture * Brightmap = nullptr ;
FTexture * Normal = nullptr ; // Normal map texture
FTexture * Specular = nullptr ; // Specular light texture for the diffuse+normal+specular light model
FTexture * Metallic = nullptr ; // Metalness texture for the physically based rendering (PBR) light model
FTexture * Roughness = nullptr ; // Roughness texture for PBR
FTexture * AmbientOcclusion = nullptr ; // Ambient occlusion texture for PBR
2019-10-05 17:28:05 +00:00
2020-05-24 17:12:22 +00:00
FTexture * CustomShaderTextures [ MAX_CUSTOM_HW_SHADER_TEXTURES ] = { nullptr } ; // Custom texture maps for custom hardware shaders
FString Name ;
ETextureType UseType ; // This texture's primary purpose
uint8_t bNoDecals : 1 ; // Decals should not stick to texture
uint8_t bNoRemap0 : 1 ; // Do not remap color 0 (used by front layer of parallax skies)
uint8_t bWorldPanning : 1 ; // Texture is panned in world units rather than texels
uint8_t bMasked : 1 ; // Texture (might) have holes
uint8_t bAlphaTexture : 1 ; // Texture is an alpha channel without color information
uint8_t bHasCanvas : 1 ; // Texture is based off FCanvasTexture
uint8_t bWarped : 2 ; // This is a warped texture. Used to avoid multiple warps on one texture
uint8_t bComplex : 1 ; // Will be used to mark extended MultipatchTextures that have to be
// fully composited before subjected to any kind of postprocessing instead of
// doing it per patch.
uint8_t bMultiPatch : 2 ; // This is a multipatch texture (we really could use real type info for textures...)
uint8_t bFullNameTexture : 1 ;
uint8_t bBrightmapChecked : 1 ; // Set to 1 if brightmap has been checked
uint8_t bGlowing : 1 ; // Texture glow color
uint8_t bAutoGlowing : 1 ; // Glow info is determined from texture image.
uint8_t bFullbright : 1 ; // always draw fullbright
uint8_t bDisableFullbright : 1 ; // This texture will not be displayed as fullbright sprite
uint8_t bSkybox : 1 ; // is a cubic skybox
uint8_t bNoCompress : 1 ;
uint8_t bNoExpand : 1 ;
int8_t bTranslucent : 2 ;
bool bHiresHasColorKey = false ; // Support for old color-keyed Doomsday textures
uint16_t Rotations ;
int16_t SkyOffset ;
FloatRect * areas = nullptr ;
int areacount = 0 ;
int GlowHeight = 128 ;
PalEntry GlowColor = 0 ;
int HiresLump = - 1 ; // For external hires textures.
float Glossiness = 10.f ;
float SpecularLevel = 0.1f ;
float shaderspeed = 1.f ;
int shaderindex = 0 ;
int GetScaledWidth ( ) { int foo = int ( ( Width * 2 ) / Scale . X ) ; return ( foo > > 1 ) + ( foo & 1 ) ; }
int GetScaledHeight ( ) { int foo = int ( ( Height * 2 ) / Scale . Y ) ; return ( foo > > 1 ) + ( foo & 1 ) ; }
double GetScaledWidthDouble ( ) { return Width / Scale . X ; }
double GetScaledHeightDouble ( ) { return Height / Scale . Y ; }
double GetScaleY ( ) const { return Scale . Y ; }
// Now with improved offset adjustment.
int GetLeftOffset ( int adjusted ) { return _LeftOffset [ adjusted ] ; }
int GetTopOffset ( int adjusted ) { return _TopOffset [ adjusted ] ; }
int GetScaledLeftOffset ( int adjusted ) { int foo = int ( ( _LeftOffset [ adjusted ] * 2 ) / Scale . X ) ; return ( foo > > 1 ) + ( foo & 1 ) ; }
int GetScaledTopOffset ( int adjusted ) { int foo = int ( ( _TopOffset [ adjusted ] * 2 ) / Scale . Y ) ; return ( foo > > 1 ) + ( foo & 1 ) ; }
double GetScaledLeftOffsetDouble ( int adjusted ) { return _LeftOffset [ adjusted ] / Scale . X ; }
double GetScaledTopOffsetDouble ( int adjusted ) { return _TopOffset [ adjusted ] / Scale . Y ; }
// Interfaces for the different renderers. Everything that needs to check renderer-dependent offsets
// should use these, so that if changes are needed, this is the only place to edit.
// For the hardware renderer. The software renderer's have been offloaded to FSoftwareTexture
int GetLeftOffsetHW ( ) { return _LeftOffset [ r_spriteadjustHW ] ; }
int GetTopOffsetHW ( ) { return _TopOffset [ r_spriteadjustHW ] ; }
virtual void ResolvePatches ( ) { }
void SetScale ( const DVector2 & scale )
2019-10-05 17:28:05 +00:00
{
2020-05-24 17:12:22 +00:00
Scale = scale ;
2019-10-05 17:28:05 +00:00
}
2020-05-24 17:12:22 +00:00
protected :
uint16_t Width , Height ;
int16_t _LeftOffset [ 2 ] , _TopOffset [ 2 ] ;
2020-05-24 21:26:47 +00:00
FTexture ( const char * name = NULL , int lumpnum = - 1 ) ;
2020-05-24 17:12:22 +00:00
public :
FTextureBuffer CreateTexBuffer ( int translation , int flags = 0 ) ;
FTextureBuffer CreateTexBuffer ( const PalEntry * translation , int flags = 0 ) ;
2020-04-10 16:17:26 +00:00
virtual bool DetermineTranslucency ( ) ;
bool GetTranslucency ( )
{
return bTranslucent ! = - 1 ? bTranslucent : DetermineTranslucency ( ) ;
}
2020-05-24 17:12:22 +00:00
FMaterial * GetMaterial ( int num )
{
return Material [ num ] ;
}
FTexture * GetPalVersion ( )
2019-10-12 06:54:06 +00:00
{
2020-05-24 17:12:22 +00:00
return PalVersion ;
2019-10-12 20:49:46 +00:00
}
2020-05-24 17:12:22 +00:00
void DeleteHardwareTextures ( )
2020-05-23 22:38:10 +00:00
{
2020-05-24 17:12:22 +00:00
SystemTextures . Clean ( true , true ) ;
}
private :
int CheckDDPK3 ( ) ;
int CheckExternalFile ( bool & hascolorkey ) ;
bool bSWSkyColorDone = false ;
2019-10-05 17:28:05 +00:00
PalEntry FloorSkyColor ;
PalEntry CeilingSkyColor ;
2020-05-24 17:12:22 +00:00
public :
void CheckTrans ( unsigned char * buffer , int size , int trans ) ;
bool ProcessData ( unsigned char * buffer , int w , int h , bool ispatch ) ;
int CheckRealHeight ( ) ;
friend class FTextureManager ;
2019-10-05 19:59:03 +00:00
} ;
2019-10-05 17:28:05 +00:00
2020-05-24 17:12:22 +00:00
// A texture that can be drawn to.
2020-03-29 12:01:46 +00:00
class FCanvasTexture : public FTexture
{
public :
FCanvasTexture ( const char * name , int width , int height )
{
Name = name ;
2020-05-24 17:12:22 +00:00
Width = width ;
Height = height ;
2020-03-29 12:01:46 +00:00
bMasked = false ;
2020-05-24 17:12:22 +00:00
bHasCanvas = true ;
2020-03-29 12:01:46 +00:00
bTranslucent = false ;
2020-05-24 17:12:22 +00:00
bNoExpand = true ;
2020-05-24 14:11:10 +00:00
UseType = ETextureType : : Wall ;
2020-03-29 12:01:46 +00:00
}
void NeedUpdate ( ) { bNeedsUpdate = true ; }
void SetUpdated ( bool rendertype ) { bNeedsUpdate = false ; bFirstUpdate = false ; bLastUpdateType = rendertype ; }
protected :
bool bLastUpdateType = false ;
bool bNeedsUpdate = true ;
public :
bool bFirstUpdate = true ;
friend struct FCanvasTextureInfo ;
} ;
2019-10-18 09:37:07 +00:00
2020-05-24 17:12:22 +00:00
// A wrapper around a hardware texture, to allow using it in the 2D drawing interface.
class FWrapperTexture : public FTexture
{
int Format ;
public :
FWrapperTexture ( int w , int h , int bits = 1 ) ;
IHardwareTexture * GetSystemTexture ( )
{
return SystemTextures . GetHardwareTexture ( 0 , false ) ;
}
int GetColorFormat ( ) const
{
return Format ;
}
} ;
class FImageTexture : public FTexture
{
FImageSource * mImage ;
public :
FImageTexture ( FImageSource * image , const char * name = nullptr ) noexcept ;
virtual TArray < uint8_t > Get8BitPixels ( bool alphatex ) ;
void SetImage ( FImageSource * img ) // This is only for the multipatch texture builder!
{
mImage = img ;
}
FImageSource * GetImage ( ) const override { return mImage ; }
FBitmap GetBgraBitmap ( const PalEntry * p , int * trans ) override ;
2020-04-10 16:17:26 +00:00
bool DetermineTranslucency ( ) override ;
2020-05-24 17:12:22 +00:00
} ;
struct FTexCoordInfo
{
int mRenderWidth ;
int mRenderHeight ;
int mWidth ;
FVector2 mScale ;
FVector2 mTempScale ;
bool mWorldPanning ;
float FloatToTexU ( float v ) const { return v / mRenderWidth ; }
float FloatToTexV ( float v ) const { return v / mRenderHeight ; }
float RowOffset ( float ofs ) const ;
float TextureOffset ( float ofs ) const ;
float TextureAdjustWidth ( ) const ;
void GetFromTexture ( FTexture * tex , float x , float y , bool forceworldpanning ) ;
} ;
2019-10-05 17:28:05 +00:00
# endif