summaryrefslogtreecommitdiff
path: root/movieobjects/dmetexture.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'movieobjects/dmetexture.cpp')
-rw-r--r--movieobjects/dmetexture.cpp290
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()
+{
+}