Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //===== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======//
- //
- // Purpose:
- //
- // $NoKeywords: $
- //===========================================================================//
- #ifndef VTF_H
- #define VTF_H
- #ifdef _WIN32
- #pragma once
- #endif
- #include "bitmap/imageformat.h"
- // #define XTF_FILE_FORMAT_ONLY to just include the vtf / xtf structures, and none of the code declaration
- #ifndef XTF_FILE_FORMAT_ONLY
- //-----------------------------------------------------------------------------
- // Forward declarations
- //-----------------------------------------------------------------------------
- class CUtlBuffer;
- class Vector;
- struct Rect_t;
- //-----------------------------------------------------------------------------
- // Texture flags
- //-----------------------------------------------------------------------------
- enum
- {
- // flags from the *.txt config file
- TEXTUREFLAGS_POINTSAMPLE = 0x00000001,
- TEXTUREFLAGS_TRILINEAR = 0x00000002,
- TEXTUREFLAGS_CLAMPS = 0x00000004,
- TEXTUREFLAGS_CLAMPT = 0x00000008,
- TEXTUREFLAGS_ANISOTROPIC = 0x00000010,
- TEXTUREFLAGS_HINT_DXT5 = 0x00000020,
- TEXTUREFLAGS_NOCOMPRESS = 0x00000040,
- TEXTUREFLAGS_NORMAL = 0x00000080,
- TEXTUREFLAGS_NOMIP = 0x00000100,
- TEXTUREFLAGS_NOLOD = 0x00000200,
- TEXTUREFLAGS_MINMIP = 0x00000400,
- TEXTUREFLAGS_PROCEDURAL = 0x00000800,
- // These are automatically generated by vtex from the texture data.
- TEXTUREFLAGS_ONEBITALPHA = 0x00001000,
- TEXTUREFLAGS_EIGHTBITALPHA = 0x00002000,
- // newer flags from the *.txt config file
- TEXTUREFLAGS_ENVMAP = 0x00004000,
- TEXTUREFLAGS_RENDERTARGET = 0x00008000,
- TEXTUREFLAGS_DEPTHRENDERTARGET = 0x00010000,
- TEXTUREFLAGS_NODEBUGOVERRIDE = 0x00020000,
- TEXTUREFLAGS_SINGLECOPY = 0x00040000,
- TEXTUREFLAGS_ONEOVERMIPLEVELINALPHA = 0x00080000,
- TEXTUREFLAGS_PREMULTCOLORBYONEOVERMIPLEVEL = 0x00100000,
- TEXTUREFLAGS_NORMALTODUDV = 0x00200000,
- TEXTUREFLAGS_ALPHATESTMIPGENERATION = 0x00400000,
- TEXTUREFLAGS_NODEPTHBUFFER = 0x00800000,
- TEXTUREFLAGS_NICEFILTERED = 0x01000000,
- TEXTUREFLAGS_CLAMPU = 0x02000000,
- // xbox extensions
- TEXTUREFLAGS_PRESWIZZLED = 0x04000000,
- TEXTUREFLAGS_CACHEABLE = 0x08000000,
- TEXTUREFLAGS_UNFILTERABLE_OK = 0x10000000,
- TEXTUREFLAGS_LASTFLAG = 0x10000000,
- };
- //-----------------------------------------------------------------------------
- // Cubemap face indices
- //-----------------------------------------------------------------------------
- enum CubeMapFaceIndex_t
- {
- CUBEMAP_FACE_RIGHT = 0,
- CUBEMAP_FACE_LEFT,
- CUBEMAP_FACE_BACK, // NOTE: This face is in the +y direction?!?!?
- CUBEMAP_FACE_FRONT, // NOTE: This face is in the -y direction!?!?
- CUBEMAP_FACE_UP,
- CUBEMAP_FACE_DOWN,
- // This is the fallback for low-end
- CUBEMAP_FACE_SPHEREMAP,
- // NOTE: Cubemaps have *7* faces; the 7th is the fallback spheremap
- CUBEMAP_FACE_COUNT
- };
- //-----------------------------------------------------------------------------
- // Enumeration used for spheremap generation
- //-----------------------------------------------------------------------------
- enum LookDir_t
- {
- LOOK_DOWN_X = 0,
- LOOK_DOWN_NEGX,
- LOOK_DOWN_Y,
- LOOK_DOWN_NEGY,
- LOOK_DOWN_Z,
- LOOK_DOWN_NEGZ,
- };
- //-----------------------------------------------------------------------------
- // Use this image format if you want to perform tool operations on the texture
- //-----------------------------------------------------------------------------
- #define IMAGE_FORMAT_DEFAULT ((ImageFormat)-2)
- //-----------------------------------------------------------------------------
- // Interface to get at various bits of a VTF texture
- //-----------------------------------------------------------------------------
- class IVTFTexture
- {
- public:
- // Initializes the texture and allocates space for the bits
- // In most cases, you shouldn't force the mip count.
- virtual bool Init( int nWidth, int nHeight, int nDepth, ImageFormat fmt, int nFlags, int iFrameCount, int nForceMipCount = -1 ) = 0;
- // Methods to set other texture fields
- virtual void SetBumpScale( float flScale ) = 0;
- virtual void SetReflectivity( const Vector &vecReflectivity ) = 0;
- // Methods to initialize the low-res image
- virtual void InitLowResImage( int nWidth, int nHeight, ImageFormat fmt ) = 0;
- // When unserializing, we can skip a certain number of mip levels,
- // and we also can just load everything but the image data
- // NOTE: If you load only the buffer header, you'll need to use the
- // VTFBufferHeaderSize() method below to only read that much from the file
- // NOTE: If you skip mip levels, the height + width of the texture will
- // change to reflect the size of the largest read in mip level
- #ifndef _XBOX
- virtual bool Unserialize( CUtlBuffer &buf, bool bBufferHeaderOnly = false, int nSkipMipLevels = 0 ) = 0;
- virtual bool Serialize( CUtlBuffer &buf ) = 0;
- #else
- virtual bool Unserialize( CUtlBuffer &buf, bool bBufferHeaderOnly, bool bStaticDataOnly ) = 0;
- #endif
- // These are methods to help with optimization:
- // Once the header is read in, they indicate where to start reading
- // other data (measured from file start), and how many bytes to read....
- virtual void LowResFileInfo( int *pStartLocation, int *pSizeInBytes) const = 0;
- virtual void ImageFileInfo( int nFrame, int nFace, int nMip, int *pStartLocation, int *pSizeInBytes) const = 0;
- #ifndef _XBOX
- virtual int FileSize( int nMipSkipCount = 0 ) const = 0;
- #else
- virtual int FileSize( bool bStaticOnly ) const = 0;
- virtual int FileImageDataOffset( void ) const = 0;
- virtual int FileImageDataLength( int numFrames ) const = 0;
- #endif
- // Attributes...
- virtual int Width() const = 0;
- virtual int Height() const = 0;
- virtual int Depth() const = 0;
- virtual int MipCount() const = 0;
- // returns the size of one row of a particular mip level
- virtual int RowSizeInBytes( int nMipLevel ) const = 0;
- // returns the size of one face of a particular mip level
- virtual int FaceSizeInBytes( int nMipLevel ) const = 0;
- virtual ImageFormat Format() const = 0;
- virtual int FaceCount() const = 0;
- virtual int FrameCount() const = 0;
- virtual int Flags() const = 0;
- virtual float BumpScale() const = 0;
- virtual int LowResWidth() const = 0;
- virtual int LowResHeight() const = 0;
- virtual ImageFormat LowResFormat() const = 0;
- #ifdef _XBOX
- virtual int FallbackWidth() const = 0;
- virtual int FallbackHeight() const = 0;
- virtual int FallbackMipCount() const = 0;
- virtual int MappingWidth() const = 0;
- virtual int MappingHeight() const = 0;
- virtual int MipSkipCount() const = 0;
- #endif
- // NOTE: reflectivity[0] = blue, [1] = greem, [2] = red
- virtual const Vector &Reflectivity() const = 0;
- virtual bool IsCubeMap() const = 0;
- virtual bool IsNormalMap() const = 0;
- virtual bool IsVolumeTexture() const = 0;
- #ifdef _XBOX
- virtual bool IsPreSwizzled() const = 0;
- #endif
- // Computes the dimensions of a particular mip level
- virtual void ComputeMipLevelDimensions( int iMipLevel, int *pMipWidth, int *pMipHeight, int *pMipDepth ) const = 0;
- #ifdef _XBOX
- virtual void ComputeFallbackMipDimensions( int iMipLevel, int *pMipWidth, int *pMipHeight ) const = 0;
- #endif
- // Computes the size (in bytes) of a single mipmap of a single face of a single frame
- virtual int ComputeMipSize( int iMipLevel ) const = 0;
- // Computes the size of a subrect (specified at the top mip level) at a particular lower mip level
- virtual void ComputeMipLevelSubRect( Rect_t* pSrcRect, int nMipLevel, Rect_t *pSubRect ) const = 0;
- // Computes the size (in bytes) of a single face of a single frame
- // All mip levels starting at the specified mip level are included
- virtual int ComputeFaceSize( int iStartingMipLevel = 0 ) const = 0;
- // Computes the total size (in bytes) of all faces, all frames
- virtual int ComputeTotalSize() const = 0;
- // Returns the base address of the image data
- virtual unsigned char *ImageData() = 0;
- // Returns a pointer to the data associated with a particular frame, face, and mip level
- virtual unsigned char *ImageData( int iFrame, int iFace, int iMipLevel ) = 0;
- // Returns a pointer to the data associated with a particular frame, face, mip level, and offset
- virtual unsigned char *ImageData( int iFrame, int iFace, int iMipLevel, int x, int y, int z = 0 ) = 0;
- #ifdef _XBOX
- // Returns a pointer to the palette data associated with a particular frame
- virtual unsigned char *PaletteData( int iFrame ) = 0;
- // Returns a pointer to the fallback data associated with a particular frame, face, and mip level
- virtual unsigned char *FallbackImageData( int iFrame, int iFace, int iMipLevel ) = 0;
- #endif
- // Returns the base address of the low-res image data
- virtual unsigned char *LowResImageData() = 0;
- // Converts the textures image format. Use IMAGE_FORMAT_DEFAULT
- // if you want to be able to use various tool functions below
- virtual void ConvertImageFormat( ImageFormat fmt, bool bNormalToDUDV ) = 0;
- // NOTE: The following methods only work on textures using the
- // IMAGE_FORMAT_DEFAULT!
- // Generate spheremap based on the current cube faces (only works for cubemaps)
- // The look dir indicates the direction of the center of the sphere
- // NOTE: Only call this *after* cube faces have been correctly
- // oriented (using FixCubemapFaceOrientation)
- #ifndef _XBOX
- virtual void GenerateSpheremap( LookDir_t lookDir = LOOK_DOWN_Z ) = 0;
- // Generate spheremap based on the current cube faces (only works for cubemaps)
- // The look dir indicates the direction of the center of the sphere
- // NOTE: Only call this *after* cube faces have been correctly
- // oriented (using FixCubemapFaceOrientation)
- virtual void GenerateHemisphereMap( unsigned char *pSphereMapBitsRGBA, int targetWidth,
- int targetHeight, LookDir_t lookDir, int iFrame ) = 0;
- // Fixes the cubemap faces orientation from our standard to the
- // standard the material system needs.
- virtual void FixCubemapFaceOrientation( ) = 0;
- // Generates mipmaps from the base mip levels
- virtual void GenerateMipmaps() = 0;
- // Put 1/miplevel (1..n) into alpha.
- virtual void PutOneOverMipLevelInAlpha() = 0;
- // Computes the reflectivity
- virtual void ComputeReflectivity( ) = 0;
- // Computes the alpha flags
- virtual void ComputeAlphaFlags() = 0;
- // Generate the low-res image bits
- virtual bool ConstructLowResImage() = 0;
- // Gets the texture all internally consistent assuming you've loaded
- // mip 0 of all faces of all frames
- virtual void PostProcess(bool bGenerateSpheremap, LookDir_t lookDir = LOOK_DOWN_Z, bool bAllowFixCubemapOrientation = true) = 0;
- // Blends adjacent pixels on cubemap borders, since the card doesn't do it. If the texture
- // is S3TC compressed, then it has to do it AFTER the texture has been compressed to prevent
- // artifacts along the edges.
- //
- // If bSkybox is true, it assumes the faces are oriented in the way the engine draws the skybox
- // (which happens to be different from the way cubemaps have their faces).
- virtual void MatchCubeMapBorders( int iStage, ImageFormat finalFormat, bool bSkybox ) = 0;
- // Sets threshhold values for alphatest mipmapping
- virtual void SetAlphaTestThreshholds( float flBase, float flHighFreq ) = 0;
- #endif
- #ifdef _XBOX
- virtual void ReleaseMemory() = 0;
- #endif
- };
- //-----------------------------------------------------------------------------
- // Class factory
- //-----------------------------------------------------------------------------
- IVTFTexture *CreateVTFTexture();
- void DestroyVTFTexture( IVTFTexture *pTexture );
- //-----------------------------------------------------------------------------
- // Allows us to only load in the first little bit of the VTF file to get info
- // Clients should read this much into a UtlBuffer and then pass it in to
- // Unserialize
- //-----------------------------------------------------------------------------
- int VTFFileHeaderSize( int nMajorVersion = -1, int nMinorVersion = -1 );
- #include "vector.h"
- #endif // XTF_FILE_FORMAT_ONLY
- //-----------------------------------------------------------------------------
- // Disk format for VTF files
- //
- // NOTE: After the header is the low-res image data
- // Then follows image data, which is sorted in the following manner
- //
- // for each mip level (starting with 1x1, and getting larger)
- // for each animation frame
- // for each face
- // store the image data for the face
- //
- // NOTE: In memory, we store the data in the following manner:
- // for each animation frame
- // for each face
- // for each mip level (starting with the largest, and getting smaller)
- // store the image data for the face
- //
- // This is done because the various image manipulation function we have
- // expect this format
- //-----------------------------------------------------------------------------
- #pragma pack(1)
- // version number for the disk texture cache
- #define VTF_MAJOR_VERSION 7
- #define VTF_MINOR_VERSION 2
- struct VTFFileBaseHeader_t
- {
- char fileTypeString[4]; // "VTF" Valve texture file
- int version[2]; // version[0].version[1]
- int headerSize;
- };
- struct VTFFileHeaderV7_1_t : public VTFFileBaseHeader_t
- {
- unsigned short width;
- unsigned short height;
- unsigned int flags;
- unsigned short numFrames;
- unsigned short startFrame;
- VectorAligned reflectivity; // This is a linear value, right? Average of all frames?
- float bumpScale;
- ImageFormat imageFormat;
- unsigned char numMipLevels;
- ImageFormat lowResImageFormat;
- unsigned char lowResImageWidth;
- unsigned char lowResImageHeight;
- };
- struct VTFFileHeader_t : public VTFFileHeaderV7_1_t
- {
- unsigned short depth;
- };
- #define XTF_MAJOR_VERSION 5
- #define XTF_MINOR_VERSION 0
- struct XTFFileHeader_t : public VTFFileBaseHeader_t
- {
- unsigned int flags;
- unsigned short width; // actual width
- unsigned short height; // actual height
- unsigned short depth; // always 1
- unsigned short numFrames;
- unsigned short preloadDataSize; // exact size of preload data
- unsigned short imageDataOffset; // aligned to sector size
- Vector reflectivity; // Resides on 16 byte boundary!
- float bumpScale;
- ImageFormat imageFormat;
- unsigned char lowResImageWidth;
- unsigned char lowResImageHeight;
- unsigned char fallbackImageWidth;
- unsigned char fallbackImageHeight;
- unsigned char mipSkipCount; // used to resconstruct mapping dimensions
- unsigned char pad; // for alignment
- };
- #pragma pack()
- #endif // VTF_H
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement