| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 | //-----------------------------------------------------------------------------// Copyright (c) 2012 GarageGames, LLC//// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to// deal in the Software without restriction, including without limitation the// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or// sell copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions://// The above copyright notice and this permission notice shall be included in// all copies or substantial portions of the Software.//// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS// IN THE SOFTWARE.//-----------------------------------------------------------------------------#include "platform/platform.h"#include "gfx/gfxShader.h"#include "shaderGen/conditionerFeature.h"#include "core/volume.h"#include "console/engineAPI.h"Vector<GFXShaderMacro> GFXShader::smGlobalMacros;bool GFXShader::smLogErrors = true;bool GFXShader::smLogWarnings = true;GFXShader::GFXShader()   :  mPixVersion( 0.0f ),      mReloadKey( 0 ),      mInstancingFormat( NULL ){}GFXShader::~GFXShader(){   Torque::FS::RemoveChangeNotification( mVertexFile, this, &GFXShader::_onFileChanged );   Torque::FS::RemoveChangeNotification( mPixelFile, this, &GFXShader::_onFileChanged );   SAFE_DELETE(mInstancingFormat);}#ifndef TORQUE_OPENGLbool GFXShader::init(   const Torque::Path &vertFile,                         const Torque::Path &pixFile,                         F32 pixVersion,                         const Vector<GFXShaderMacro> ¯os ){   Vector<String> samplerNames;   return init( vertFile, pixFile, pixVersion, macros, samplerNames );}#endifbool GFXShader::init(   const Torque::Path &vertFile,                         const Torque::Path &pixFile,                         F32 pixVersion,                         const Vector<GFXShaderMacro> ¯os,                        const Vector<String> &samplerNames,                        GFXVertexFormat *instanceFormat){   // Take care of instancing   if (instanceFormat)   {      mInstancingFormat = new GFXVertexFormat;      mInstancingFormat->copy(*instanceFormat);   }   // Store the inputs for use in reloading.   mVertexFile = vertFile;   mPixelFile = pixFile;   mPixVersion = pixVersion;   mMacros = macros;   mSamplerNamesOrdered = samplerNames;   // Before we compile the shader make sure the   // conditioner features have been updated.   ConditionerFeature::updateConditioners();   // Now do the real initialization.   if ( !_init() )      return false;   _updateDesc();   // Add file change notifications for reloads.   Torque::FS::AddChangeNotification( mVertexFile, this, &GFXShader::_onFileChanged );   Torque::FS::AddChangeNotification( mPixelFile, this, &GFXShader::_onFileChanged );   return true;}bool GFXShader::reload(){   // Before we compile the shader make sure the   // conditioner features have been updated.   ConditionerFeature::updateConditioners();   mReloadKey++;   // Init does the work.   bool success = _init();   if ( success )      _updateDesc();   // Let anything that cares know that   // this shader has reloaded   mReloadSignal.trigger();   return success;}void GFXShader::_updateDesc(){   mDescription = String::ToString( "Files: %s, %s Pix Version: %0.2f\nMacros: ",       mVertexFile.getFullPath().c_str(), mPixelFile.getFullPath().c_str(), mPixVersion );   GFXShaderMacro::stringize( smGlobalMacros, &mDescription );   GFXShaderMacro::stringize( mMacros, &mDescription );   }void GFXShader::addGlobalMacro( const String &name, const String &value ){   // Check to see if we already have this macro.   Vector<GFXShaderMacro>::iterator iter = smGlobalMacros.begin();   for ( ; iter != smGlobalMacros.end(); iter++ )   {      if ( iter->name == name )      {         if ( iter->value != value )            iter->value = value;         return;      }   }   // Add a new macro.   smGlobalMacros.increment();   smGlobalMacros.last().name = name;   smGlobalMacros.last().value = value;}bool GFXShader::removeGlobalMacro( const String &name ){   Vector<GFXShaderMacro>::iterator iter = smGlobalMacros.begin();   for ( ; iter != smGlobalMacros.end(); iter++ )   {      if ( iter->name == name )      {         smGlobalMacros.erase( iter );         return true;      }   }   return false;}void GFXShader::_unlinkBuffer( GFXShaderConstBuffer *buf ){      Vector<GFXShaderConstBuffer*>::iterator iter = mActiveBuffers.begin();   for ( ; iter != mActiveBuffers.end(); iter++ )   {      if ( *iter == buf )      {         mActiveBuffers.erase_fast( iter );         return;      }   }   AssertFatal( false, "GFXShader::_unlinkBuffer - buffer was not found?" );}DefineEngineFunction( addGlobalShaderMacro, void,    ( const char *name, const char *value ), ( NULL ),   "Adds a global shader macro which will be merged with the script defined "   "macros on every shader.  The macro will replace the value of an existing "   "macro of the same name.  For the new macro to take effect all the shaders "   "in the system need to be reloaded.\n"   "@see resetLightManager, removeGlobalShaderMacro\n"   "@ingroup Rendering\n" ){   GFXShader::addGlobalMacro( name, value );}DefineEngineFunction( removeGlobalShaderMacro, void, ( const char *name ),,    "Removes an existing global macro by name.\n"   "@see addGlobalShaderMacro\n"   "@ingroup Rendering\n" ){   GFXShader::removeGlobalMacro( name );}
 |