diff options
Diffstat (limited to 'movieobjects/dmetexture.cpp')
| -rw-r--r-- | movieobjects/dmetexture.cpp | 290 |
1 files changed, 290 insertions, 0 deletions
diff --git a/movieobjects/dmetexture.cpp b/movieobjects/dmetexture.cpp new file mode 100644 index 0000000..39214d1 --- /dev/null +++ b/movieobjects/dmetexture.cpp @@ -0,0 +1,290 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= +#include "movieobjects/dmetexture.h" +#include "datamodel/dmelementfactoryhelper.h" +#include "movieobjects_interfaces.h" + +#include "materialsystem/imaterial.h" +#include "materialsystem/imaterialsystem.h" + +//----------------------------------------------------------------------------- +// Expose this class to the scene database +//----------------------------------------------------------------------------- +IMPLEMENT_ELEMENT_FACTORY( DmeBaseTexture, CDmeBaseTexture ); + + +//----------------------------------------------------------------------------- +// Constructor, destructor +//----------------------------------------------------------------------------- +void CDmeBaseTexture::OnConstruction() +{ + m_pVTFTexture = CreateVTFTexture(); + + m_bClampS.Init( this, "clampS" ); + m_bClampT.Init( this, "clampT" ); + m_bClampU.Init( this, "clampU" ); + m_bNoLod.Init( this, "noMipmapLOD" ); + m_bNiceFiltered.Init( this, "niceFiltered" ); + m_bNormalMap.Init( this, "normalMap" ); + m_flBumpScale.Init( this, "bumpScale" ); + m_nCompressType.Init( this, "compressType" ); + m_nFilterType.Init( this, "filterType" ); + m_nMipmapType.Init( this, "mipmapType" ); +} + +void CDmeBaseTexture::OnDestruction() +{ + if ( m_pVTFTexture ) + { + DestroyVTFTexture( m_pVTFTexture ); + m_pVTFTexture = NULL; + } +} + + +//----------------------------------------------------------------------------- +// accessor for cached ITexture +//----------------------------------------------------------------------------- +ITexture *CDmeBaseTexture::GetCachedTexture() +{ + return m_Texture; +} + + +//----------------------------------------------------------------------------- +// Computes texture flags +//----------------------------------------------------------------------------- +int CDmeBaseTexture::CalcTextureFlags( int nDepth ) const +{ + int nFlags = 0; + if ( m_bClampS ) + { + nFlags |= TEXTUREFLAGS_CLAMPS; + } + if ( m_bClampT ) + { + nFlags |= TEXTUREFLAGS_CLAMPT; + } + if ( m_bClampU ) + { + nFlags |= TEXTUREFLAGS_CLAMPU; + } + if ( m_bNoLod ) + { + nFlags |= TEXTUREFLAGS_NOLOD; + } + if ( m_bNiceFiltered ) + { + nFlags |= TEXTUREFLAGS_NICEFILTERED; + } + if ( m_bNormalMap ) + { + nFlags |= TEXTUREFLAGS_NORMAL; + } + if ( m_bNormalMap ) + { + nFlags |= TEXTUREFLAGS_NORMAL; + } + if ( m_bNoDebugOverride ) + { + nFlags |= TEXTUREFLAGS_NODEBUGOVERRIDE; + } + + switch ( m_nCompressType ) + { + case DMETEXTURE_COMPRESS_DEFAULT: + case DMETEXTURE_COMPRESS_DXT1: + break; + case DMETEXTURE_COMPRESS_NONE: + nFlags |= TEXTUREFLAGS_NOCOMPRESS; + break; + case DMETEXTURE_COMPRESS_DXT5: + nFlags |= TEXTUREFLAGS_HINT_DXT5; + break; + } + + switch ( m_nFilterType ) + { + case DMETEXTURE_FILTER_DEFAULT: + case DMETEXTURE_FILTER_BILINEAR: + break; + case DMETEXTURE_FILTER_ANISOTROPIC: + nFlags |= TEXTUREFLAGS_ANISOTROPIC; + break; + case DMETEXTURE_FILTER_TRILINEAR: + nFlags |= TEXTUREFLAGS_TRILINEAR; + break; + case DMETEXTURE_FILTER_POINT: + nFlags |= TEXTUREFLAGS_POINTSAMPLE; + break; + } + + switch ( m_nMipmapType ) + { + case DMETEXTURE_MIPMAP_DEFAULT: + case DMETEXTURE_MIPMAP_ALL_LEVELS: + break; + case DMETEXTURE_MIPMAP_NONE: + nFlags |= TEXTUREFLAGS_NOMIP; + break; + } + + if ( nDepth > 1 ) + { + // FIXME: Volume textures don't currently support DXT compression + nFlags &= ~TEXTUREFLAGS_HINT_DXT5; + nFlags |= TEXTUREFLAGS_NOCOMPRESS; + + // FIXME: Volume textures don't currently support NICE filtering + nFlags &= ~TEXTUREFLAGS_NICEFILTERED; + } + + return nFlags; +} + + +//----------------------------------------------------------------------------- +// Computes the desired texture format based on flags +//----------------------------------------------------------------------------- +ImageFormat CDmeBaseTexture::ComputeDesiredImageFormat( ImageFormat srcFormat, int nWidth, int nHeight, int nDepth, int nFlags ) +{ + // HDRFIXME: Need to figure out what format to use here. + if ( srcFormat == IMAGE_FORMAT_RGB323232F ) + return IMAGE_FORMAT_RGBA16161616F; + + /* + if( bDUDVTarget) + { + if ( bCopyAlphaToLuminance && ( nFlags & ( TEXTUREFLAGS_ONEBITALPHA | TEXTUREFLAGS_EIGHTBITALPHA ) ) ) + return IMAGE_FORMAT_UVLX8888; + return IMAGE_FORMAT_UV88; + } + */ + + // can't compress textures that are smaller than 4x4 + if ( (nFlags & TEXTUREFLAGS_NOCOMPRESS) || (nFlags & TEXTUREFLAGS_PROCEDURAL) || + ( nWidth < 4 ) || ( nHeight < 4 ) || ( nDepth > 1 ) ) + { + if ( nFlags & ( TEXTUREFLAGS_ONEBITALPHA | TEXTUREFLAGS_EIGHTBITALPHA ) ) + return IMAGE_FORMAT_BGRA8888; + return IMAGE_FORMAT_BGR888; + } + + if( nFlags & TEXTUREFLAGS_HINT_DXT5 ) + return IMAGE_FORMAT_DXT5; + + // compressed with alpha blending + if ( nFlags & TEXTUREFLAGS_EIGHTBITALPHA ) + return IMAGE_FORMAT_DXT5; + + if ( nFlags & TEXTUREFLAGS_ONEBITALPHA ) + return IMAGE_FORMAT_DXT5; // IMAGE_FORMAT_DXT1_ONEBITALPHA + + return IMAGE_FORMAT_DXT1; +} + + +//----------------------------------------------------------------------------- +// +// Normal texture +// +//----------------------------------------------------------------------------- + + +//----------------------------------------------------------------------------- +// Expose this class to the scene database +//----------------------------------------------------------------------------- +IMPLEMENT_ELEMENT_FACTORY( DmeTexture, CDmeTexture ); + + +//----------------------------------------------------------------------------- +// Constructor, destructor +//----------------------------------------------------------------------------- +void CDmeTexture::OnConstruction() +{ + m_Images.Init( this, "images" ); +} + +void CDmeTexture::OnDestruction() +{ +} + + +//----------------------------------------------------------------------------- +// Build a VTF representing the +//----------------------------------------------------------------------------- + + +//----------------------------------------------------------------------------- +// resolve +//----------------------------------------------------------------------------- +void CDmeTexture::Resolve() +{ + // FIXME: Could change this to not shutdown if only the bits have changed + m_Texture.Shutdown(); + + int nFrameCount = m_Images.Count(); + if ( nFrameCount == 0 ) + return; + + // Use the size of the 0th image + CDmeImage *pImage = m_Images[0]; + int nWidth = pImage->m_Width; + int nHeight = pImage->m_Height; + int nDepth = pImage->m_Depth; + ImageFormat srcFormat = pImage->Format(); + + // FIXME: How should this work exactly? + int nFlags = CalcTextureFlags( nDepth ); + + m_pVTFTexture->Init( nWidth, nHeight, nDepth, srcFormat, nFlags, nFrameCount ); + + + ImageFormat format = ComputeDesiredImageFormat( pImage->Format(), nWidth, nHeight, nDepth, nFlags ); + +// m_Texture.InitProceduralTexture( GetName(), "DmeTexture", nWidth, nHeight, nDepth, nFrameCount, format, nFlags ); +// m_Texture->SetTextureRegenerator( this ); + + // Fill in the texture bits +} + +/* +//----------------------------------------------------------------------------- +// Fill in the texture bits +//----------------------------------------------------------------------------- +void CDmeTexture::RegenerateTextureBits( ITexture *pTexture, IVTFTexture *pVTFTexture, Rect_t *pRect ) +{ +} +*/ + +//----------------------------------------------------------------------------- +// +// Cube texture +// +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// Expose this class to the scene database +//----------------------------------------------------------------------------- +IMPLEMENT_ELEMENT_FACTORY( DmeCubeTexture, CDmeCubeTexture ); + + +//----------------------------------------------------------------------------- +// Constructor, destructor +//----------------------------------------------------------------------------- +void CDmeCubeTexture::OnConstruction() +{ + m_ImagesPosX.Init( this, "imagesPosX" ); + m_ImagesNegX.Init( this, "imagesNegX" ); + m_ImagesPosY.Init( this, "imagesPosY" ); + m_ImagesNegY.Init( this, "imagesNegY" ); + m_ImagesPosZ.Init( this, "imagesPosZ" ); + m_ImagesNegZ.Init( this, "imagesNegZ" ); +} + +void CDmeCubeTexture::OnDestruction() +{ +} |