diff --git a/Engine/source/T3D/fx/precipitation.cpp b/Engine/source/T3D/fx/precipitation.cpp index caebe48cd..4356cd45f 100644 --- a/Engine/source/T3D/fx/precipitation.cpp +++ b/Engine/source/T3D/fx/precipitation.cpp @@ -127,7 +127,7 @@ ConsoleDocClass( PrecipitationData, //---------------------------------------------------------- PrecipitationData::PrecipitationData() { - soundProfile = NULL; + INIT_SOUNDASSET(Sound); INIT_IMAGEASSET(Drop); @@ -143,8 +143,7 @@ PrecipitationData::PrecipitationData() void PrecipitationData::initPersistFields() { - addField( "soundProfile", TYPEID< SFXTrack >(), Offset(soundProfile, PrecipitationData), - "Looping SFXProfile effect to play while Precipitation is active." ); + INITPERSISTFIELD_SOUNDASSET(Sound, PrecipitationData, "Looping SFXProfile effect to play while Precipitation is active."); addProtectedField( "dropTexture", TypeFilename, Offset(mDropName, PrecipitationData), &_setDropData, &defaultProtectedGetFn, "@brief Texture filename for drop particles.\n\n" @@ -190,7 +189,7 @@ bool PrecipitationData::preload( bool server, String &errorStr ) if( Parent::preload( server, errorStr) == false) return false; - if( !server && !sfxResolve( &soundProfile, errorStr ) ) + if (!server && !getSFXProfile()) return false; return true; @@ -200,7 +199,7 @@ void PrecipitationData::packData(BitStream* stream) { Parent::packData(stream); - sfxWrite( stream, soundProfile ); + PACKDATA_SOUNDASSET(Sound); PACKDATA_IMAGEASSET(Drop); @@ -217,7 +216,7 @@ void PrecipitationData::unpackData(BitStream* stream) { Parent::unpackData(stream); - sfxRead( stream, &soundProfile ); + UNPACKDATA_SOUNDASSET(Sound); UNPACKDATA_IMAGEASSET(Drop); @@ -598,9 +597,9 @@ bool Precipitation::onNewDataBlock( GameBaseData *dptr, bool reload ) { SFX_DELETE( mAmbientSound ); - if ( mDataBlock->soundProfile ) + if ( mDataBlock->getSFXProfile()) { - mAmbientSound = SFX->createSource( mDataBlock->soundProfile, &getTransform() ); + mAmbientSound = SFX->createSource(mDataBlock->getSFXProfile(), &getTransform() ); if ( mAmbientSound ) mAmbientSound->play(); } diff --git a/Engine/source/T3D/fx/precipitation.h b/Engine/source/T3D/fx/precipitation.h index 58c8c44dd..cdef0c2a8 100644 --- a/Engine/source/T3D/fx/precipitation.h +++ b/Engine/source/T3D/fx/precipitation.h @@ -34,8 +34,9 @@ #endif #include "T3D/assets/ImageAsset.h" +#include "T3D/assets/SoundAsset.h" -class SFXTrack; +//class SFXTrack; class SFXSource; //-------------------------------------------------------------------------- @@ -45,30 +46,39 @@ class PrecipitationData : public GameBaseData typedef GameBaseData Parent; public: - SFXTrack* soundProfile; + //SFXTrack* soundProfile; + DECLARE_SOUNDASSET(PrecipitationData, Sound); + DECLARE_SOUNDASSET_SETGET(PrecipitationData, Sound); - DECLARE_IMAGEASSET(PrecipitationData, Drop, onDropChanged, GFXStaticTextureSRGBProfile); ///< Texture for drop particles - DECLARE_IMAGEASSET_SETGET(PrecipitationData, Drop); + DECLARE_IMAGEASSET(PrecipitationData, Drop, onDropChanged, GFXStaticTextureSRGBProfile); ///< Texture for drop particles + DECLARE_IMAGEASSET_SETGET(PrecipitationData, Drop); - StringTableEntry mDropShaderName; ///< The name of the shader used for raindrops + StringTableEntry mDropShaderName; ///< The name of the shader used for raindrops - DECLARE_IMAGEASSET(PrecipitationData, Splash, onSplashChanged, GFXStaticTextureSRGBProfile); ///< Texture for splash particles - DECLARE_IMAGEASSET_SETGET(PrecipitationData, Splash); + DECLARE_IMAGEASSET(PrecipitationData, Splash, onSplashChanged, GFXStaticTextureSRGBProfile); ///< Texture for splash particles + DECLARE_IMAGEASSET_SETGET(PrecipitationData, Splash); - StringTableEntry mSplashShaderName; ///< The name of the shader used for raindrops + StringTableEntry mSplashShaderName; ///< The name of the shader used for raindrops - S32 mDropsPerSide; ///< How many drops are on a side of the raindrop texture. - S32 mSplashesPerSide; ///< How many splash are on a side of the splash texture. + S32 mDropsPerSide; ///< How many drops are on a side of the raindrop texture. + S32 mSplashesPerSide; ///< How many splash are on a side of the splash texture. - PrecipitationData(); - DECLARE_CONOBJECT(PrecipitationData); - bool preload( bool server, String& errorStr ); - static void initPersistFields(); - virtual void packData(BitStream* stream); - virtual void unpackData(BitStream* stream); + PrecipitationData(); + DECLARE_CONOBJECT(PrecipitationData); + bool preload( bool server, String& errorStr ); + static void initPersistFields(); + virtual void packData(BitStream* stream); + virtual void unpackData(BitStream* stream); - void onDropChanged() {} - void onSplashChanged() {} + void onDropChanged() {} + void onSplashChanged() {} + + SFXProfile* getSFXProfile() { + if (mSoundAsset.notNull()) + return mSoundAsset->getSfxProfile(); + else + return NULL; + } }; struct Raindrop diff --git a/Engine/source/gfx/gfxInit.cpp b/Engine/source/gfx/gfxInit.cpp index b5d67206d..0a5c66466 100644 --- a/Engine/source/gfx/gfxInit.cpp +++ b/Engine/source/gfx/gfxInit.cpp @@ -290,7 +290,7 @@ GFXAdapter *GFXInit::getBestAdapterChoice() { S32 adapterIdx = dAtoi(adapterDevice.c_str()); if (adapterIdx == -1) - adapter = chooseAdapter(adapterType, outputDevice.c_str()); + adapter = chooseAdapter(NullDevice, outputDevice.c_str()); else adapter = chooseAdapter(adapterType, adapterIdx); } diff --git a/Engine/source/gfx/gl/gfxGLDevice.cpp b/Engine/source/gfx/gl/gfxGLDevice.cpp index 6179bd618..1c82b4e74 100644 --- a/Engine/source/gfx/gl/gfxGLDevice.cpp +++ b/Engine/source/gfx/gl/gfxGLDevice.cpp @@ -933,7 +933,7 @@ void GFXGLDevice::setupGenericShaders( GenericShaderType type ) } GFXShader* GFXGLDevice::createShader() { - GFXGLShader* shader = new GFXGLShader(); + GFXGLShader* shader = new GFXGLShader(this); shader->registerResourceWithDevice( this ); return shader; } diff --git a/Engine/source/gfx/gl/gfxGLShader.cpp b/Engine/source/gfx/gl/gfxGLShader.cpp index d2f2edd22..ce8e7c855 100644 --- a/Engine/source/gfx/gl/gfxGLShader.cpp +++ b/Engine/source/gfx/gl/gfxGLShader.cpp @@ -382,10 +382,11 @@ void GFXGLShaderConstBuffer::onShaderReload( GFXGLShader *shader ) mWasLost = true; } -GFXGLShader::GFXGLShader() : +GFXGLShader::GFXGLShader(GFXGLDevice* device) : mVertexShader(0), mPixelShader(0), mProgram(0), + mDevice(device), mConstBufferSize(0), mConstBuffer(NULL) { @@ -706,7 +707,8 @@ void GFXGLShader::initHandles() dMemset(mConstBuffer, 0, mConstBufferSize); // Set our program so uniforms are assigned properly. - glUseProgram(mProgram); + mDevice->setShader(this, false); + // Iterate through uniforms to set sampler numbers. for (HandleMap::Iterator iter = mHandles.begin(); iter != mHandles.end(); ++iter) { @@ -723,7 +725,6 @@ void GFXGLShader::initHandles() dMemcpy(mConstBuffer + handle->mOffset, &handle->mSamplerNum, handle->getSize()); } } - glUseProgram(0); //instancing if (!mInstancingFormat) @@ -830,6 +831,7 @@ void GFXGLShader::setConstantsFromBuffer(GFXGLShaderConstBuffer* buffer) // Copy new value into our const buffer and set in GL. dMemcpy(mConstBuffer + handle->mOffset, buffer->mBuffer + handle->mOffset, handle->getSize()); + switch(handle->mDesc.constType) { case GFXSCT_Float: diff --git a/Engine/source/gfx/gl/gfxGLShader.h b/Engine/source/gfx/gl/gfxGLShader.h index 80fa4d9d9..e3d3bb69c 100644 --- a/Engine/source/gfx/gl/gfxGLShader.h +++ b/Engine/source/gfx/gl/gfxGLShader.h @@ -32,14 +32,15 @@ class GFXGLShaderConstHandle; class FileStream; class GFXGLShaderConstBuffer; +class GFXGLDevice; class GFXGLShader : public GFXShader { typedef Map HandleMap; public: - GFXGLShader(); + GFXGLShader(GFXGLDevice* device); virtual ~GFXGLShader(); - + /// @name GFXShader interface /// @{ virtual GFXShaderConstHandle* getShaderConstHandle(const String& name); @@ -99,6 +100,7 @@ protected: U32 mConstBufferSize; U8* mConstBuffer; HandleMap mHandles; + GFXGLDevice* mDevice; Vector mValidHandles; }; diff --git a/Engine/source/gui/core/guiCanvas.cpp b/Engine/source/gui/core/guiCanvas.cpp index 7cbea6d64..967c3e7d7 100644 --- a/Engine/source/gui/core/guiCanvas.cpp +++ b/Engine/source/gui/core/guiCanvas.cpp @@ -258,17 +258,19 @@ bool GuiCanvas::onAdd() // Make sure we're able to render. newDevice->setAllowRender( true ); - if(mDisplayWindow) + // NULL device returns a nullptr for getPlatformWindow + PlatformWindow* window = getPlatformWindow(); + if (mDisplayWindow && window) { - getPlatformWindow()->show(); + window->show(); WindowManager->setDisplayWindow(true); - getPlatformWindow()->setDisplayWindow(true); + window->setDisplayWindow(true); } - else + else if (window) { - getPlatformWindow()->hide(); + window->hide(); WindowManager->setDisplayWindow(false); - getPlatformWindow()->setDisplayWindow(false); + window->setDisplayWindow(false); } // Propagate add to parents. diff --git a/Templates/BaseGame/game/main.tscript.in b/Templates/BaseGame/game/main.tscript.in index 5d5569e7d..4e83ff2b2 100644 --- a/Templates/BaseGame/game/main.tscript.in +++ b/Templates/BaseGame/game/main.tscript.in @@ -1,10 +1,6 @@ $Core::windowIcon = "data/icon.png"; $Core::splashWindowImage = "data/splash.png"; -// Display a splash window immediately to improve app responsiveness before -// engine is initialized and main window created. -displaySplashWindow($Core::splashWindowImage); - // Console does something. setLogMode(6); @@ -20,6 +16,13 @@ ModuleDatabase.setModuleExtension("module"); ModuleDatabase.scanModules( "core", false ); ModuleDatabase.LoadExplicit( "CoreModule" ); +// Display a splash window immediately to improve app responsiveness before +// engine is initialized and main window created. +if ($Server::Dedicated == false) + displaySplashWindow($Core::splashWindowImage); +else + $Video::forceDisplayAdapter = -1; + //----------------------------------------------------------------------------- // Load any gameplay modules ModuleDatabase.scanModules( "data", false ); @@ -42,6 +45,7 @@ else } } -closeSplashWindow(); +if ($Server::Dedicated == false) + closeSplashWindow(); echo("Engine initialized..."); \ No newline at end of file diff --git a/Templates/BaseGame/game/tools/projectImporter/scripts/pre40/T3Dpre4ProjectImporter.tscript b/Templates/BaseGame/game/tools/projectImporter/scripts/pre40/T3Dpre4ProjectImporter.tscript index d996182dd..645bd38ca 100644 --- a/Templates/BaseGame/game/tools/projectImporter/scripts/pre40/T3Dpre4ProjectImporter.tscript +++ b/Templates/BaseGame/game/tools/projectImporter/scripts/pre40/T3Dpre4ProjectImporter.tscript @@ -919,7 +919,7 @@ T3Dpre4ProjectImporter::genProcessor("DebrisData", "shape shapeAsset shapeFile s T3Dpre4ProjectImporter::genProcessor("DecalData", "material materialAsset"); T3Dpre4ProjectImporter::genProcessor("ExplosionData", "explosionShape explosionShapeAsset"); T3Dpre4ProjectImporter::genProcessor("ParticleData", "texture textureAsset textureName textureAsset textureExt textureExtAsset textureExtName textureExtAsset"); -T3Dpre4ProjectImporter::genProcessor("PrecipitationData", "drop dropAsset dropTexture dropAsset splash splashAsset splashTexture splashAsset"); +T3Dpre4ProjectImporter::genProcessor("PrecipitationData", "drop dropAsset dropTexture dropAsset splash splashAsset splashTexture splashAsset soundProfile soundAsset"); T3Dpre4ProjectImporter::genProcessor("SplashData", "texture textureAsset"); T3Dpre4ProjectImporter::genProcessor("LightFlareData", "flareTexture flareTextureAsset"); T3Dpre4ProjectImporter::genProcessor("PhysicsDebrisData", "shape shapeAsset shapeFile shapeAsset"); diff --git a/Templates/BaseGame/game/tools/projectImporter/scripts/projectImporter.tscript b/Templates/BaseGame/game/tools/projectImporter/scripts/projectImporter.tscript index ab62befb8..039a71238 100644 --- a/Templates/BaseGame/game/tools/projectImporter/scripts/projectImporter.tscript +++ b/Templates/BaseGame/game/tools/projectImporter/scripts/projectImporter.tscript @@ -556,23 +556,49 @@ function processLegacyField(%line, %originalFieldName, %newFieldName) %targetFilename = sanitizeFilename(%value); if(isObject(%targetFilename)) + { + if(%originalFieldName $= "soundProfile") { - //likely a material name, so handle it that way - %assetId = MaterialAsset::getAssetIdByMaterialName(%targetFilename); + $ProjectImporter::assetQuery.clear(); + %foundAssets = AssetDatabase.findAssetName($ProjectImporter::assetQuery, %targetFilename); + if(%foundAssets != 0) + { + %assetId = $ProjectImporter::assetQuery.getAsset(0); + } + } + else + { + //likely a material name, so handle it that way + %assetId = MaterialAsset::getAssetIdByMaterialName(%targetFilename); + } } else { if(!isFile(%targetFilename)) - { - error("Legacy Project Importer - file described in line could not be found/is not valid"); - return %line; - } - - $ProjectImporter::assetQuery.clear(); - %foundAssets = AssetDatabase.findAssetLooseFile($ProjectImporter::assetQuery, %targetFilename); - if(%foundAssets != 0) - { - %assetId = $ProjectImporter::assetQuery.getAsset(0); + { + if(%originalFieldName $= "soundProfile") + { + $ProjectImporter::assetQuery.clear(); + %foundAssets = AssetDatabase.findAssetName($ProjectImporter::assetQuery, %targetFilename); + if(%foundAssets != 0) + { + %assetId = $ProjectImporter::assetQuery.getAsset(0); + } + } + else + { + error("Legacy Project Importer - file described in line could not be found/is not valid"); + return %line; + } + } + else + { + $ProjectImporter::assetQuery.clear(); + %foundAssets = AssetDatabase.findAssetLooseFile($ProjectImporter::assetQuery, %targetFilename); + if(%foundAssets != 0) + { + %assetId = $ProjectImporter::assetQuery.getAsset(0); + } } }