diff --git a/Engine/source/T3D/gameBase/gameConnection.cpp b/Engine/source/T3D/gameBase/gameConnection.cpp index 34dfe99c1..7aada8048 100644 --- a/Engine/source/T3D/gameBase/gameConnection.cpp +++ b/Engine/source/T3D/gameBase/gameConnection.cpp @@ -1024,8 +1024,10 @@ bool GameConnection::readDemoStartBlock(BitStream *stream) void GameConnection::demoPlaybackComplete() { - static ConsoleValueRef demoPlaybackArgv[1] = { "demoPlaybackComplete" }; - Sim::postCurrentEvent(Sim::getRootGroup(), new SimConsoleEvent(1, demoPlaybackArgv, false)); + static const char* demoPlaybackArgv[1] = { "demoPlaybackComplete" }; + static StringStackConsoleWrapper demoPlaybackCmd(1, demoPlaybackArgv); + + Sim::postCurrentEvent(Sim::getRootGroup(), new SimConsoleEvent(demoPlaybackCmd.argc, demoPlaybackCmd.argv, false)); Parent::demoPlaybackComplete(); } diff --git a/Engine/source/cinterface/c_scripting.cpp b/Engine/source/cinterface/c_scripting.cpp index db223aefd..1138cbc1c 100644 --- a/Engine/source/cinterface/c_scripting.cpp +++ b/Engine/source/cinterface/c_scripting.cpp @@ -76,9 +76,10 @@ extern "C" { if (!entry) return ""; - ConsoleValueRef argv[] = {"consoleExportXML"}; + static const char* exportArgv[1] = { "consoleExportXML" }; + static StringStackConsoleWrapper exportCmd(1, exportArgv); - return entry->cb.mStringCallbackFunc(NULL, 1, argv); + return entry->cb.mStringCallbackFunc(NULL, exportCmd.argc, exportCmd.argv); } MarshalNativeEntry* script_get_namespace_entry(const char* nameSpace, const char* name) diff --git a/Engine/source/console/console.cpp b/Engine/source/console/console.cpp index b12cf022a..9449abf83 100644 --- a/Engine/source/console/console.cpp +++ b/Engine/source/console/console.cpp @@ -1534,9 +1534,16 @@ StringTableEntry getModNameFromPath(const char *path) void postConsoleInput( RawData data ) { // Schedule this to happen at the next time event. + ConsoleValue values[2]; ConsoleValueRef argv[2]; - argv[0] = "eval"; - argv[1] = ( const char* ) data.data; + + values[0].init(); + values[0].setStringValue("eval"); + values[1].init(); + values[1].setStringValue((const char*)data.data); + argv[0].value = &values[0]; + argv[1].value = &values[1]; + Sim::postCurrentEvent(Sim::getRootGroup(), new SimConsoleEvent(2, argv, false)); } @@ -1610,36 +1617,6 @@ ConsoleValueRef::ConsoleValueRef(const ConsoleValueRef &ref) value = ref.value; } -ConsoleValueRef::ConsoleValueRef(const char *newValue) : value(NULL) -{ - *this = newValue; -} - -ConsoleValueRef::ConsoleValueRef(const String &newValue) : value(NULL) -{ - *this = (const char*)(newValue.utf8()); -} - -ConsoleValueRef::ConsoleValueRef(U32 newValue) : value(NULL) -{ - *this = newValue; -} - -ConsoleValueRef::ConsoleValueRef(S32 newValue) : value(NULL) -{ - *this = newValue; -} - -ConsoleValueRef::ConsoleValueRef(F32 newValue) : value(NULL) -{ - *this = newValue; -} - -ConsoleValueRef::ConsoleValueRef(F64 newValue) : value(NULL) -{ - *this = newValue; -} - ConsoleValueRef& ConsoleValueRef::operator=(const ConsoleValueRef &newValue) { value = newValue.value; diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index 8ca1b26b4..1c2b0b933 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -215,12 +215,6 @@ public: ~ConsoleValueRef() { ; } ConsoleValueRef(const ConsoleValueRef &ref); - ConsoleValueRef(const char *value); - ConsoleValueRef(const String &ref); - ConsoleValueRef(U32 value); - ConsoleValueRef(S32 value); - ConsoleValueRef(F32 value); - ConsoleValueRef(F64 value); static ConsoleValueRef fromValue(ConsoleValue *value) { ConsoleValueRef ref; ref.value = value; return ref; } diff --git a/Engine/source/console/simEvents.cpp b/Engine/source/console/simEvents.cpp index f564aa772..bc1e1789c 100644 --- a/Engine/source/console/simEvents.cpp +++ b/Engine/source/console/simEvents.cpp @@ -129,7 +129,7 @@ ConsoleValueRef SimConsoleThreadExecCallback::waitForResult() return retVal; } - return (const char*)NULL; + return ConsoleValueRef(); } //----------------------------------------------------------------------------- diff --git a/Engine/source/forest/editor/forestEditorCtrl.cpp b/Engine/source/forest/editor/forestEditorCtrl.cpp index 651fb4780..d8b54ba9c 100644 --- a/Engine/source/forest/editor/forestEditorCtrl.cpp +++ b/Engine/source/forest/editor/forestEditorCtrl.cpp @@ -97,7 +97,6 @@ void ForestEditorCtrl::onSleep() bool ForestEditorCtrl::updateActiveForest( bool createNew ) { - mForest = dynamic_cast( Sim::findObject( "theForest" ) ); Con::executef( this, "onActiveForestUpdated", mForest ? mForest->getIdString() : "", createNew ? "1" : "0" ); if ( mTool ) @@ -400,4 +399,13 @@ DefineConsoleMethod( ForestEditorCtrl, deleteMeshSafe, void, ( const char * obj DefineConsoleMethod( ForestEditorCtrl, isDirty, bool, (), , "" ) { return object->isDirty(); +} + +DefineConsoleMethod(ForestEditorCtrl, setActiveForest, void, (const char * obj), , "( Forest obj )") +{ + Forest *forestObject; + if (!Sim::findObject(obj, forestObject)) + return; + + object->setActiveForest(forestObject); } \ No newline at end of file diff --git a/Engine/source/forest/editor/forestEditorCtrl.h b/Engine/source/forest/editor/forestEditorCtrl.h index d210040e9..b91310a58 100644 --- a/Engine/source/forest/editor/forestEditorCtrl.h +++ b/Engine/source/forest/editor/forestEditorCtrl.h @@ -86,6 +86,9 @@ class ForestEditorCtrl : public EditTSCtrl /// Causes the editor to reselect the active forest. bool updateActiveForest( bool createNew ); + /// Sets the active Forest + void setActiveForest(Forest* forestObject) { mForest = forestObject; } + /// Returns the active Forest. Forest *getActiveForest() const { return mForest; } diff --git a/Engine/source/forest/ts/tsForestItemData.h b/Engine/source/forest/ts/tsForestItemData.h index 197069c9f..46252361b 100644 --- a/Engine/source/forest/ts/tsForestItemData.h +++ b/Engine/source/forest/ts/tsForestItemData.h @@ -88,7 +88,7 @@ public: const Vector& getLOSDetails() const { return mLOSDetails; } // ForestItemData - const Box3F& getObjBox() const { return mShape ? mShape->bounds : Box3F::Invalid; } + const Box3F& getObjBox() const { return mShape ? mShape->bounds : Box3F::Zero; } bool render( TSRenderState *rdata, const ForestItem& item ) const; ForestCellBatch* allocateBatch() const; bool canBillboard( const SceneRenderState *state, const ForestItem &item, F32 distToCamera ) const; diff --git a/Engine/source/gfx/gl/gfxGLDevice.cpp b/Engine/source/gfx/gl/gfxGLDevice.cpp index 5f690a14d..9cec609d1 100644 --- a/Engine/source/gfx/gl/gfxGLDevice.cpp +++ b/Engine/source/gfx/gl/gfxGLDevice.cpp @@ -811,9 +811,9 @@ GFXShader* GFXGLDevice::createShader() return shader; } -void GFXGLDevice::setShader( GFXShader *shader ) +void GFXGLDevice::setShader(GFXShader *shader, bool force) { - if(mCurrentShader == shader) + if(mCurrentShader == shader && !force) return; if ( shader ) diff --git a/Engine/source/gfx/gl/gfxGLDevice.h b/Engine/source/gfx/gl/gfxGLDevice.h index c7f167647..72193835d 100644 --- a/Engine/source/gfx/gl/gfxGLDevice.h +++ b/Engine/source/gfx/gl/gfxGLDevice.h @@ -90,7 +90,7 @@ public: virtual F32 getPixelShaderVersion() const { return mPixelShaderVersion; } virtual void setPixelShaderVersion( F32 version ) { mPixelShaderVersion = version; } - virtual void setShader(GFXShader* shd); + virtual void setShader(GFXShader *shader, bool force = false); /// @attention GL cannot check if the given format supports blending or filtering! virtual GFXFormat selectSupportedFormat(GFXTextureProfile *profile, diff --git a/Engine/source/math/mathTypes.cpp b/Engine/source/math/mathTypes.cpp index ce0f198d1..7498cc8fc 100644 --- a/Engine/source/math/mathTypes.cpp +++ b/Engine/source/math/mathTypes.cpp @@ -1019,7 +1019,7 @@ F32 mRandF() return gRandGen.randF(); } -DefineConsoleFunction( getRandom, F32, (S32 a, S32 b), (1, 0), +DefineConsoleFunction(getRandom, F32, (S32 a, S32 b), (S32_MAX, S32_MAX), "( int a, int b ) " "@brief Returns a random number based on parameters passed in..\n\n" "If no parameters are passed in, getRandom() will return a float between 0.0 and 1.0. If one " @@ -1033,21 +1033,21 @@ DefineConsoleFunction( getRandom, F32, (S32 a, S32 b), (1, 0), "@see setRandomSeed\n" "@ingroup Random" ) { - if (b == 0) - return F32(gRandGen.randI(0,getMax( a, 0 ))); - else + if (a != S32_MAX) { - if (b != 0) + if (b == S32_MAX) + return F32(gRandGen.randI(0, getMax(a, 0))); + else { S32 min = a; S32 max = b; - if (min > max) + if (min > max) { S32 t = min; min = max; max = t; } - return F32(gRandGen.randI(min,max)); + return F32(gRandGen.randI(min, max)); } } return gRandGen.randF(); diff --git a/Engine/source/platform/platformIntrinsics.gcc.h b/Engine/source/platform/platformIntrinsics.gcc.h index 4b092d067..115d62e6c 100644 --- a/Engine/source/platform/platformIntrinsics.gcc.h +++ b/Engine/source/platform/platformIntrinsics.gcc.h @@ -42,7 +42,7 @@ inline void dFetchAndAdd( volatile U32& ref, U32 val ) #if defined(TORQUE_OS_PS3) cellAtomicAdd32( (std::uint32_t *)&ref, val ); #elif !defined(TORQUE_OS_MAC) - __sync_fetch_and_add( ( volatile long* ) &ref, val ); + __sync_fetch_and_add(&ref, val ); #else OSAtomicAdd32( val, (int32_t* ) &ref); #endif @@ -53,7 +53,7 @@ inline void dFetchAndAdd( volatile S32& ref, S32 val ) #if defined(TORQUE_OS_PS3) cellAtomicAdd32( (std::uint32_t *)&ref, val ); #elif !defined(TORQUE_OS_MAC) - __sync_fetch_and_add( ( volatile long* ) &ref, val ); + __sync_fetch_and_add( &ref, val ); #else OSAtomicAdd32( val, (int32_t* ) &ref); #endif diff --git a/Engine/source/platform/threads/threadPool.cpp b/Engine/source/platform/threads/threadPool.cpp index 2ef2bb69b..5b96b495b 100644 --- a/Engine/source/platform/threads/threadPool.cpp +++ b/Engine/source/platform/threads/threadPool.cpp @@ -412,15 +412,7 @@ void ThreadPool::queueWorkItem( WorkItem* item ) mWorkItemQueue.insert( item->getPriority(), item ); - // Wake up some thread, if we need to. - // Use the ready count here as the wake count does - // not correctly protect the critical section in the - // thread's run function. This may lead us to release - // the semaphore more often than necessary, but it avoids - // a race condition. - - if( !dCompareAndSwap( mNumThreadsReady, mNumThreads, mNumThreads ) ) - mSemaphore.release(); + mSemaphore.release(); } } diff --git a/Engine/source/renderInstance/renderGlowMgr.cpp b/Engine/source/renderInstance/renderGlowMgr.cpp index 3ad9587ce..ed48c095f 100644 --- a/Engine/source/renderInstance/renderGlowMgr.cpp +++ b/Engine/source/renderInstance/renderGlowMgr.cpp @@ -202,6 +202,10 @@ void RenderGlowMgr::render( SceneRenderState *state ) } ParticleRenderInst *ri = static_cast(_ri); + + GFX->setStateBlock(mParticleRenderMgr->_getHighResStateBlock(ri)); + mParticleRenderMgr->_getShaderConsts().mShaderConsts->setSafe(mParticleRenderMgr->_getShaderConsts().mModelViewProjSC, *ri->modelViewProj); + mParticleRenderMgr->renderParticle(ri, state); j++; continue; diff --git a/Engine/source/renderInstance/renderParticleMgr.h b/Engine/source/renderInstance/renderParticleMgr.h index f7a1e2861..f1cdc5fd0 100644 --- a/Engine/source/renderInstance/renderParticleMgr.h +++ b/Engine/source/renderInstance/renderParticleMgr.h @@ -137,11 +137,13 @@ protected: GFXStateBlockRef mOffscreenBlocks[ParticleRenderInst::BlendStyle_COUNT]; GFXStateBlockRef mBackbufferBlocks[ParticleRenderInst::BlendStyle_COUNT]; GFXStateBlockRef mMixedResBlocks[ParticleRenderInst::BlendStyle_COUNT]; - + +public: GFXStateBlockRef _getHighResStateBlock(ParticleRenderInst *ri); GFXStateBlockRef _getMixedResStateBlock(ParticleRenderInst *ri); GFXStateBlockRef _getOffscreenStateBlock(ParticleRenderInst *ri); GFXStateBlockRef _getCompositeStateBlock(ParticleRenderInst *ri); + ShaderConsts &_getShaderConsts() { return mParticleShaderConsts; }; }; diff --git a/Engine/source/scene/sceneContainer.cpp b/Engine/source/scene/sceneContainer.cpp index 5d81cc0bd..7d95327ff 100644 --- a/Engine/source/scene/sceneContainer.cpp +++ b/Engine/source/scene/sceneContainer.cpp @@ -1374,7 +1374,7 @@ F32 SceneContainer::containerSearchCurrRadiusDist() void SceneContainer::getBinRange( const F32 min, const F32 max, U32& minBin, U32& maxBin ) { - AssertFatal(max >= min, "Error, bad range! in getBinRange"); + AssertFatal(max >= min, avar("Error, bad range in getBinRange. min: %f, max: %f", min, max)); if ((max - min) >= (SceneContainer::csmTotalBinSize - SceneContainer::csmBinSize)) { diff --git a/Engine/source/terrain/hlsl/terrFeatureHLSL.cpp b/Engine/source/terrain/hlsl/terrFeatureHLSL.cpp index 94c7e4943..6292bd32a 100644 --- a/Engine/source/terrain/hlsl/terrFeatureHLSL.cpp +++ b/Engine/source/terrain/hlsl/terrFeatureHLSL.cpp @@ -545,8 +545,8 @@ void TerrainDetailMapFeatHLSL::processPix( Vector &component Var *baseColor = (Var*)LangElement::find( "baseColor" ); Var *outColor = (Var*)LangElement::find( "col" ); - meta->addStatement( new GenOp( " @ = lerp( @, @ + @, @ );\r\n", - outColor, outColor, baseColor, detailColor, detailBlend ) ); + meta->addStatement( new GenOp( " @ += @ * @;\r\n", + outColor, detailColor, detailBlend)); meta->addStatement( new GenOp( " }\r\n" ) ); @@ -742,7 +742,7 @@ void TerrainMacroMapFeatHLSL::processPix( Vector &componentL } // Add to the blend total. - meta->addStatement( new GenOp( " @ = max( @, @ );\r\n", blendTotal, blendTotal, detailBlend ) ); + meta->addStatement( new GenOp( " @ += @;\r\n", blendTotal, detailBlend ) ); // If this is a prepass then we skip color. if ( fd.features.hasFeature( MFT_PrePassConditioner ) ) @@ -815,9 +815,8 @@ void TerrainMacroMapFeatHLSL::processPix( Vector &componentL //Var *baseColor = (Var*)LangElement::find( "baseColor" ); Var *outColor = (Var*)LangElement::find( "col" ); - meta->addStatement( new GenOp( " @ = lerp( @, @ + @, @ );\r\n", - outColor, outColor, outColor, detailColor, detailBlend ) ); - //outColor, outColor, baseColor, detailColor, detailBlend ) ); + meta->addStatement(new GenOp(" @ += @ * @;\r\n", + outColor, detailColor, detailBlend)); meta->addStatement( new GenOp( " }\r\n" ) ); diff --git a/Engine/source/terrain/terrData.cpp b/Engine/source/terrain/terrData.cpp index f33e32340..eeee6b008 100644 --- a/Engine/source/terrain/terrData.cpp +++ b/Engine/source/terrain/terrData.cpp @@ -287,8 +287,14 @@ bool TerrainBlock::_setBaseTexFormat(void *obj, const char *index, const char *d { terrain->mBaseTexFormat = (BaseTexFormat)eTable[i].mInt; terrain->_updateMaterials(); + + if (terrain->isServerObject()) return false; terrain->_updateLayerTexture(); - terrain->_updateBaseTexture(true); + // If the cached base texture is older that the terrain file or + // it doesn't exist then generate and cache it. + String baseCachePath = terrain->_getBaseTexCacheFileName(); + if (Platform::compareModifiedTimes(baseCachePath, terrain->mTerrFileName) < 0) + terrain->_updateBaseTexture(true); break; } } diff --git a/Engine/source/terrain/terrRender.cpp b/Engine/source/terrain/terrRender.cpp index c9e5070d1..14280e067 100644 --- a/Engine/source/terrain/terrRender.cpp +++ b/Engine/source/terrain/terrRender.cpp @@ -170,7 +170,7 @@ bool TerrainBlock::_initBaseShader() desc.zDefined = true; desc.zWriteEnable = false; desc.zEnable = false; - desc.setBlend( true, GFXBlendSrcAlpha, GFXBlendOne ); + desc.setBlend( true, GFXBlendSrcAlpha, GFXBlendOne ); desc.cullDefined = true; desc.cullMode = GFXCullNone; desc.colorWriteAlpha = false; diff --git a/README.md b/README.md index 226abfd29..88bd21f46 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ MIT Licensed Open Source version of [Torque 3D](http://torque3d.org) from [Garag ## More Information +* [Homepage](http://torque3d.org) * [Torque 3D wiki](http://wiki.torque3d.org) * [Community forum](http://forums.torque3d.org) * [GarageGames forum](http://www.garagegames.com/community/forums) diff --git a/Templates/Empty/buildFiles/VisualStudio 2012/projects/Torque.rc b/Templates/Empty/buildFiles/VisualStudio 2012/projects/Torque.rc new file mode 100644 index 000000000..cf88543da --- /dev/null +++ b/Templates/Empty/buildFiles/VisualStudio 2012/projects/Torque.rc @@ -0,0 +1,85 @@ +//Microsoft Developer Studio generated resource script. +// +#define IDI_ICON1 103 +#define IDI_ICON2 107 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 108 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "windows.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_ICON1 ICON DISCARDABLE "torque.ico" +IDI_ICON2 ICON DISCARDABLE "torque.ico" + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""windows.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Templates/Empty/buildFiles/VisualStudio 2012/projects/torque.ico b/Templates/Empty/buildFiles/VisualStudio 2012/projects/torque.ico new file mode 100644 index 000000000..22ac1a3d1 Binary files /dev/null and b/Templates/Empty/buildFiles/VisualStudio 2012/projects/torque.ico differ diff --git a/Templates/Empty/game/core/scripts/client/helperfuncs.cs b/Templates/Empty/game/core/scripts/client/helperfuncs.cs index 785ab2577..f8988a270 100644 --- a/Templates/Empty/game/core/scripts/client/helperfuncs.cs +++ b/Templates/Empty/game/core/scripts/client/helperfuncs.cs @@ -252,7 +252,7 @@ function parseMissionGroupForIds( %className, %childGroup ) if( (%currentGroup).getObject(%i).getClassName() $= "SimGroup" ) %classIds = %classIds @ parseMissionGroupForIds( %className, (%currentGroup).getObject(%i).getId()); } - return %classIds; + return trim( %classIds ); } //------------------------------------------------------------------------------ diff --git a/Templates/Empty/game/core/scripts/client/postFx/default.postfxpreset.cs b/Templates/Empty/game/core/scripts/client/postFx/default.postfxpreset.cs index bd7a56d64..e2d8ae125 100644 --- a/Templates/Empty/game/core/scripts/client/postFx/default.postfxpreset.cs +++ b/Templates/Empty/game/core/scripts/client/postFx/default.postfxpreset.cs @@ -20,11 +20,13 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- +$PostFXManager::Settings::EnableVignette = "0"; $PostFXManager::Settings::EnableDOF = "0"; $PostFXManager::Settings::EnabledSSAO = "0"; $PostFXManager::Settings::EnableHDR = "0"; $PostFXManager::Settings::EnableLightRays = "0"; $PostFXManager::Settings::EnablePostFX = "0"; +$PostFXManager::Settings::Vignette::VMax = "0.6"; $PostFXManager::Settings::DOF::BlurCurveFar = ""; $PostFXManager::Settings::DOF::BlurCurveNear = ""; $PostFXManager::Settings::DOF::BlurMax = ""; diff --git a/Templates/Empty/game/core/scripts/client/postFx/postFxManager.gui.settings.cs b/Templates/Empty/game/core/scripts/client/postFx/postFxManager.gui.settings.cs index a73f7c702..d30d2314b 100644 --- a/Templates/Empty/game/core/scripts/client/postFx/postFxManager.gui.settings.cs +++ b/Templates/Empty/game/core/scripts/client/postFx/postFxManager.gui.settings.cs @@ -298,6 +298,9 @@ function PostFXManager::settingsApplyFromPreset(%this) $DOFPostFx::FocusRangeMax = $PostFXManager::Settings::DOF::FocusRangeMax; $DOFPostFx::BlurCurveNear = $PostFXManager::Settings::DOF::BlurCurveNear; $DOFPostFx::BlurCurveFar = $PostFXManager::Settings::DOF::BlurCurveFar; + + //Vignette settings + $VignettePostEffect::VMax = $PostFXManager::Settings::Vignette::VMax; if ( $PostFXManager::forceEnableFromPresets ) { @@ -392,6 +395,8 @@ function PostFXManager::settingsApplyDOF(%this) function PostFXManager::settingsApplyVignette(%this) { + $PostFXManager::Settings::Vignette::VMax = $VignettePostEffect::VMax; + postVerbose("% - PostFX Manager - Settings Saved - Vignette"); } diff --git a/Templates/Empty/game/tools/forestEditor/forestEditorGui.cs b/Templates/Empty/game/tools/forestEditor/forestEditorGui.cs index d2c5b9737..e0e9f1ce4 100644 --- a/Templates/Empty/game/tools/forestEditor/forestEditorGui.cs +++ b/Templates/Empty/game/tools/forestEditor/forestEditorGui.cs @@ -50,7 +50,9 @@ function ForestEditorGui::onActiveForestUpdated( %this, %forest, %createNew ) /// Called from a message box when a forest is not found. function ForestEditorGui::createForest( %this ) { - if ( isObject( theForest ) ) + %forestObject = parseMissionGroupForIds("Forest", ""); + + if ( isObject( %forestObject ) ) { error( "Cannot create a second 'theForest' Forest!" ); return; @@ -64,8 +66,42 @@ function ForestEditorGui::createForest( %this ) }; MECreateUndoAction::submit( theForest ); - - ForestEditorInspector.inspect( theForest ); + + ForestEditorGui.setActiveForest( theForest ); + + //Re-initialize the editor settings so we can start using it immediately. + %tool = ForestEditorGui.getActiveTool(); + if ( isObject( %tool ) ) + %tool.onActivated(); + + if ( %tool == ForestTools->SelectionTool ) + { + %mode = GlobalGizmoProfile.mode; + switch$ (%mode) + { + case "None": + ForestEditorSelectModeBtn.performClick(); + case "Move": + ForestEditorMoveModeBtn.performClick(); + case "Rotate": + ForestEditorRotateModeBtn.performClick(); + case "Scale": + ForestEditorScaleModeBtn.performClick(); + } + } + else if ( %tool == ForestTools->BrushTool ) + { + %mode = ForestTools->BrushTool.mode; + switch$ (%mode) + { + case "Paint": + ForestEditorPaintModeBtn.performClick(); + case "Erase": + ForestEditorEraseModeBtn.performClick(); + case "EraseSelected": + ForestEditorEraseSelectedModeBtn.performClick(); + } + } EWorldEditor.isDirty = true; } diff --git a/Templates/Empty/game/tools/forestEditor/main.cs b/Templates/Empty/game/tools/forestEditor/main.cs index a5fc84f38..6a7dbf994 100644 --- a/Templates/Empty/game/tools/forestEditor/main.cs +++ b/Templates/Empty/game/tools/forestEditor/main.cs @@ -141,6 +141,13 @@ function ForestEditorPlugin::onActivated( %this ) ForestEditorPropertiesWindow.setVisible( true ); ForestEditorGui.makeFirstResponder( true ); //ForestEditToolbar.setVisible( true ); + + //Get our existing forest object in our current mission if we have one + %forestObject = parseMissionGroupForIds("Forest", ""); + if(isObject(%forestObject)) + { + ForestEditorGui.setActiveForest(%forestObject.getName()); + } %this.map.push(); Parent::onActivated(%this); @@ -232,9 +239,27 @@ function ForestEditorPlugin::clearDirty( %this ) function ForestEditorPlugin::onSaveMission( %this, %missionFile ) { ForestDataManager.saveDirty(); - - if ( isObject( theForest ) ) - theForest.saveDataFile(); + + //First, find out if we have an existing forest object + %forestObject = parseMissionGroupForIds("Forest", ""); + + if ( isObject( %forestObject ) ) + { + //We do. Next, see if we have a file already by polling the datafield. + if(%forestObject.dataFile !$= "") + { + //If we do, just save to the provided file. + %forestObject.saveDataFile(%forestObject.dataFile); + } + else + { + //We don't, so we'll save in the same place as the mission file and give it the missionpath\missionName.forest + //naming convention. + %path = filePath(%missionFile); + %missionName = fileBase(%missionFile); + %forestObject.saveDataFile(%path @ "/" @ %missionName @ ".forest"); + } + } ForestBrushGroup.save( "art/forest/brushes.cs" ); } diff --git a/Templates/Empty/game/tools/gui/images/expand-toolbar_d.png b/Templates/Empty/game/tools/gui/images/expand-toolbar_d.png new file mode 100644 index 000000000..a3415c7d0 Binary files /dev/null and b/Templates/Empty/game/tools/gui/images/expand-toolbar_d.png differ diff --git a/Templates/Empty/game/tools/gui/images/expand-toolbar_h.png b/Templates/Empty/game/tools/gui/images/expand-toolbar_h.png new file mode 100644 index 000000000..c50608264 Binary files /dev/null and b/Templates/Empty/game/tools/gui/images/expand-toolbar_h.png differ diff --git a/Templates/Empty/game/tools/gui/images/expand-toolbar_n.png b/Templates/Empty/game/tools/gui/images/expand-toolbar_n.png new file mode 100644 index 000000000..d6c63504e Binary files /dev/null and b/Templates/Empty/game/tools/gui/images/expand-toolbar_n.png differ diff --git a/Templates/Full/game/art/forest/managedItemData.cs b/Templates/Full/game/art/forest/managedItemData.cs index a4d4d64b9..d5c6deb29 100644 --- a/Templates/Full/game/art/forest/managedItemData.cs +++ b/Templates/Full/game/art/forest/managedItemData.cs @@ -25,7 +25,7 @@ datablock TSForestItemData(ExampleForestMesh) { - shapeFile = "art/shapes/trees/defaulttree/defaulttree.dae"; + shapeFile = "art/shapes/trees/defaulttree/defaulttree.DAE"; internalName = "ExampleForestMesh"; windScale = "1"; trunkBendScale = "0.02"; diff --git a/Templates/Full/game/core/scripts/client/helperfuncs.cs b/Templates/Full/game/core/scripts/client/helperfuncs.cs index 785ab2577..f8988a270 100644 --- a/Templates/Full/game/core/scripts/client/helperfuncs.cs +++ b/Templates/Full/game/core/scripts/client/helperfuncs.cs @@ -252,7 +252,7 @@ function parseMissionGroupForIds( %className, %childGroup ) if( (%currentGroup).getObject(%i).getClassName() $= "SimGroup" ) %classIds = %classIds @ parseMissionGroupForIds( %className, (%currentGroup).getObject(%i).getId()); } - return %classIds; + return trim( %classIds ); } //------------------------------------------------------------------------------ diff --git a/Templates/Full/game/core/scripts/client/postFx/default.postfxpreset.cs b/Templates/Full/game/core/scripts/client/postFx/default.postfxpreset.cs index bd7a56d64..e2d8ae125 100644 --- a/Templates/Full/game/core/scripts/client/postFx/default.postfxpreset.cs +++ b/Templates/Full/game/core/scripts/client/postFx/default.postfxpreset.cs @@ -20,11 +20,13 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- +$PostFXManager::Settings::EnableVignette = "0"; $PostFXManager::Settings::EnableDOF = "0"; $PostFXManager::Settings::EnabledSSAO = "0"; $PostFXManager::Settings::EnableHDR = "0"; $PostFXManager::Settings::EnableLightRays = "0"; $PostFXManager::Settings::EnablePostFX = "0"; +$PostFXManager::Settings::Vignette::VMax = "0.6"; $PostFXManager::Settings::DOF::BlurCurveFar = ""; $PostFXManager::Settings::DOF::BlurCurveNear = ""; $PostFXManager::Settings::DOF::BlurMax = ""; diff --git a/Templates/Full/game/core/scripts/client/postFx/postFxManager.gui.settings.cs b/Templates/Full/game/core/scripts/client/postFx/postFxManager.gui.settings.cs index a73f7c702..d30d2314b 100644 --- a/Templates/Full/game/core/scripts/client/postFx/postFxManager.gui.settings.cs +++ b/Templates/Full/game/core/scripts/client/postFx/postFxManager.gui.settings.cs @@ -298,6 +298,9 @@ function PostFXManager::settingsApplyFromPreset(%this) $DOFPostFx::FocusRangeMax = $PostFXManager::Settings::DOF::FocusRangeMax; $DOFPostFx::BlurCurveNear = $PostFXManager::Settings::DOF::BlurCurveNear; $DOFPostFx::BlurCurveFar = $PostFXManager::Settings::DOF::BlurCurveFar; + + //Vignette settings + $VignettePostEffect::VMax = $PostFXManager::Settings::Vignette::VMax; if ( $PostFXManager::forceEnableFromPresets ) { @@ -392,6 +395,8 @@ function PostFXManager::settingsApplyDOF(%this) function PostFXManager::settingsApplyVignette(%this) { + $PostFXManager::Settings::Vignette::VMax = $VignettePostEffect::VMax; + postVerbose("% - PostFX Manager - Settings Saved - Vignette"); } diff --git a/Templates/Full/game/levels/Outpost.mis b/Templates/Full/game/levels/Outpost.mis index df29dd7ec..6a7045e30 100644 --- a/Templates/Full/game/levels/Outpost.mis +++ b/Templates/Full/game/levels/Outpost.mis @@ -1040,7 +1040,7 @@ new SimGroup(MissionGroup) { scale = "1 1 1"; canSave = "1"; canSaveDynamicFields = "1"; - dataFile = "levels/outpost.forest"; + dataFile = "levels/Outpost.forest"; lodReflectScalar = "2"; }; new WheeledVehicle() { @@ -1277,7 +1277,7 @@ new SimGroup(MissionGroup) { }; }; new TSStatic() { - shapeName = "art/shapes/trees/defaulttree/defaulttree.dae"; + shapeName = "art/shapes/trees/defaulttree/defaulttree.DAE"; playAmbient = "1"; meshCulling = "0"; originSort = "0"; diff --git a/Templates/Full/game/levels/Outpost.postfxpreset.cs b/Templates/Full/game/levels/Outpost.postfxpreset.cs index bec904f6a..01f6d1ae5 100644 --- a/Templates/Full/game/levels/Outpost.postfxpreset.cs +++ b/Templates/Full/game/levels/Outpost.postfxpreset.cs @@ -7,6 +7,7 @@ $PostFXManager::Settings::DOF::EnableAutoFocus = ""; $PostFXManager::Settings::DOF::EnableDOF = ""; $PostFXManager::Settings::DOF::FocusRangeMax = ""; $PostFXManager::Settings::DOF::FocusRangeMin = ""; +$PostFXManager::Settings::EnableVignette = "0"; $PostFXManager::Settings::EnableDOF = "1"; $PostFXManager::Settings::EnabledSSAO = "1"; $PostFXManager::Settings::EnableHDR = "1"; diff --git a/Templates/Full/game/shaders/common/lighting/advanced/gl/pointLightP.glsl b/Templates/Full/game/shaders/common/lighting/advanced/gl/pointLightP.glsl index e70f68a43..2c8e43736 100644 --- a/Templates/Full/game/shaders/common/lighting/advanced/gl/pointLightP.glsl +++ b/Templates/Full/game/shaders/common/lighting/advanced/gl/pointLightP.glsl @@ -187,13 +187,14 @@ void main() #endif // !NO_SHADOW + vec3 lightcol = lightColor.rgb; #ifdef USE_COOKIE_TEX // Lookup the cookie sample. vec4 cookie = texture( cookieMap, tMul( viewToLightProj, -lightVec ) ); // Multiply the light with the cookie tex. - lightColor.rgb *= cookie.rgb; + lightcol *= cookie.rgb; // Use a maximum channel luminance to attenuate // the lighting else we get specular in the dark @@ -211,7 +212,7 @@ void main() normalize( -eyeRay ) ) * lightBrightness * atten * shadowed; float Sat_NL_Att = saturate( nDotL * atten * shadowed ) * lightBrightness; - vec3 lightColorOut = lightMapParams.rgb * lightColor.rgb; + vec3 lightColorOut = lightMapParams.rgb * lightcol; vec4 addToResult = vec4(0.0); // TODO: This needs to be removed when lightmapping is disabled diff --git a/Templates/Full/game/shaders/common/lighting/advanced/gl/spotLightP.glsl b/Templates/Full/game/shaders/common/lighting/advanced/gl/spotLightP.glsl index b3920ec9a..91bc5915a 100644 --- a/Templates/Full/game/shaders/common/lighting/advanced/gl/spotLightP.glsl +++ b/Templates/Full/game/shaders/common/lighting/advanced/gl/spotLightP.glsl @@ -121,13 +121,14 @@ void main() #endif // !NO_SHADOW + vec3 lightcol = lightColor.rgb; #ifdef USE_COOKIE_TEX // Lookup the cookie sample. vec4 cookie = texture( cookieMap, shadowCoord ); // Multiply the light with the cookie tex. - lightColor.rgb *= cookie.rgb; + lightcol *= cookie.rgb; // Use a maximum channel luminance to attenuate // the lighting else we get specular in the dark @@ -145,7 +146,7 @@ void main() normalize( -eyeRay ) ) * lightBrightness * atten * shadowed; float Sat_NL_Att = saturate( nDotL * atten * shadowed ) * lightBrightness; - vec3 lightColorOut = lightMapParams.rgb * lightColor.rgb; + vec3 lightColorOut = lightMapParams.rgb * lightcol; vec4 addToResult = vec4(0.0); // TODO: This needs to be removed when lightmapping is disabled diff --git a/Templates/Full/game/shaders/common/lighting/advanced/pointLightP.hlsl b/Templates/Full/game/shaders/common/lighting/advanced/pointLightP.hlsl index fbfced097..ff1f3d437 100644 --- a/Templates/Full/game/shaders/common/lighting/advanced/pointLightP.hlsl +++ b/Templates/Full/game/shaders/common/lighting/advanced/pointLightP.hlsl @@ -192,13 +192,14 @@ float4 main( ConvexConnectP IN, #endif // !NO_SHADOW + float3 lightcol = lightColor.rgb; #ifdef USE_COOKIE_TEX // Lookup the cookie sample. float4 cookie = texCUBE( cookieMap, mul( viewToLightProj, -lightVec ) ); // Multiply the light with the cookie tex. - lightColor.rgb *= cookie.rgb; + lightcol *= cookie.rgb; // Use a maximum channel luminance to attenuate // the lighting else we get specular in the dark @@ -216,7 +217,7 @@ float4 main( ConvexConnectP IN, normalize( -eyeRay ) ) * lightBrightness * atten * shadowed; float Sat_NL_Att = saturate( nDotL * atten * shadowed ) * lightBrightness; - float3 lightColorOut = lightMapParams.rgb * lightColor.rgb; + float3 lightColorOut = lightMapParams.rgb * lightcol; float4 addToResult = 0.0; // TODO: This needs to be removed when lightmapping is disabled diff --git a/Templates/Full/game/shaders/common/lighting/advanced/spotLightP.hlsl b/Templates/Full/game/shaders/common/lighting/advanced/spotLightP.hlsl index 88e35ad3a..1f1c8e140 100644 --- a/Templates/Full/game/shaders/common/lighting/advanced/spotLightP.hlsl +++ b/Templates/Full/game/shaders/common/lighting/advanced/spotLightP.hlsl @@ -120,13 +120,14 @@ float4 main( ConvexConnectP IN, #endif // !NO_SHADOW + float3 lightcol = lightColor.rgb; #ifdef USE_COOKIE_TEX // Lookup the cookie sample. float4 cookie = tex2D( cookieMap, shadowCoord ); // Multiply the light with the cookie tex. - lightColor.rgb *= cookie.rgb; + lightcol *= cookie.rgb; // Use a maximum channel luminance to attenuate // the lighting else we get specular in the dark @@ -144,7 +145,7 @@ float4 main( ConvexConnectP IN, normalize( -eyeRay ) ) * lightBrightness * atten * shadowed; float Sat_NL_Att = saturate( nDotL * atten * shadowed ) * lightBrightness; - float3 lightColorOut = lightMapParams.rgb * lightColor.rgb; + float3 lightColorOut = lightMapParams.rgb * lightcol; float4 addToResult = 0.0; // TODO: This needs to be removed when lightmapping is disabled diff --git a/Templates/Full/game/tools/forestEditor/forestEditorGui.cs b/Templates/Full/game/tools/forestEditor/forestEditorGui.cs index d2c5b9737..e0e9f1ce4 100644 --- a/Templates/Full/game/tools/forestEditor/forestEditorGui.cs +++ b/Templates/Full/game/tools/forestEditor/forestEditorGui.cs @@ -50,7 +50,9 @@ function ForestEditorGui::onActiveForestUpdated( %this, %forest, %createNew ) /// Called from a message box when a forest is not found. function ForestEditorGui::createForest( %this ) { - if ( isObject( theForest ) ) + %forestObject = parseMissionGroupForIds("Forest", ""); + + if ( isObject( %forestObject ) ) { error( "Cannot create a second 'theForest' Forest!" ); return; @@ -64,8 +66,42 @@ function ForestEditorGui::createForest( %this ) }; MECreateUndoAction::submit( theForest ); - - ForestEditorInspector.inspect( theForest ); + + ForestEditorGui.setActiveForest( theForest ); + + //Re-initialize the editor settings so we can start using it immediately. + %tool = ForestEditorGui.getActiveTool(); + if ( isObject( %tool ) ) + %tool.onActivated(); + + if ( %tool == ForestTools->SelectionTool ) + { + %mode = GlobalGizmoProfile.mode; + switch$ (%mode) + { + case "None": + ForestEditorSelectModeBtn.performClick(); + case "Move": + ForestEditorMoveModeBtn.performClick(); + case "Rotate": + ForestEditorRotateModeBtn.performClick(); + case "Scale": + ForestEditorScaleModeBtn.performClick(); + } + } + else if ( %tool == ForestTools->BrushTool ) + { + %mode = ForestTools->BrushTool.mode; + switch$ (%mode) + { + case "Paint": + ForestEditorPaintModeBtn.performClick(); + case "Erase": + ForestEditorEraseModeBtn.performClick(); + case "EraseSelected": + ForestEditorEraseSelectedModeBtn.performClick(); + } + } EWorldEditor.isDirty = true; } diff --git a/Templates/Full/game/tools/forestEditor/main.cs b/Templates/Full/game/tools/forestEditor/main.cs index a5fc84f38..6a7dbf994 100644 --- a/Templates/Full/game/tools/forestEditor/main.cs +++ b/Templates/Full/game/tools/forestEditor/main.cs @@ -141,6 +141,13 @@ function ForestEditorPlugin::onActivated( %this ) ForestEditorPropertiesWindow.setVisible( true ); ForestEditorGui.makeFirstResponder( true ); //ForestEditToolbar.setVisible( true ); + + //Get our existing forest object in our current mission if we have one + %forestObject = parseMissionGroupForIds("Forest", ""); + if(isObject(%forestObject)) + { + ForestEditorGui.setActiveForest(%forestObject.getName()); + } %this.map.push(); Parent::onActivated(%this); @@ -232,9 +239,27 @@ function ForestEditorPlugin::clearDirty( %this ) function ForestEditorPlugin::onSaveMission( %this, %missionFile ) { ForestDataManager.saveDirty(); - - if ( isObject( theForest ) ) - theForest.saveDataFile(); + + //First, find out if we have an existing forest object + %forestObject = parseMissionGroupForIds("Forest", ""); + + if ( isObject( %forestObject ) ) + { + //We do. Next, see if we have a file already by polling the datafield. + if(%forestObject.dataFile !$= "") + { + //If we do, just save to the provided file. + %forestObject.saveDataFile(%forestObject.dataFile); + } + else + { + //We don't, so we'll save in the same place as the mission file and give it the missionpath\missionName.forest + //naming convention. + %path = filePath(%missionFile); + %missionName = fileBase(%missionFile); + %forestObject.saveDataFile(%path @ "/" @ %missionName @ ".forest"); + } + } ForestBrushGroup.save( "art/forest/brushes.cs" ); } diff --git a/Templates/Full/game/tools/gui/images/expand-toolbar_d.png b/Templates/Full/game/tools/gui/images/expand-toolbar_d.png new file mode 100644 index 000000000..a3415c7d0 Binary files /dev/null and b/Templates/Full/game/tools/gui/images/expand-toolbar_d.png differ diff --git a/Templates/Full/game/tools/gui/images/expand-toolbar_h.png b/Templates/Full/game/tools/gui/images/expand-toolbar_h.png new file mode 100644 index 000000000..c50608264 Binary files /dev/null and b/Templates/Full/game/tools/gui/images/expand-toolbar_h.png differ diff --git a/Templates/Full/game/tools/gui/images/expand-toolbar_n.png b/Templates/Full/game/tools/gui/images/expand-toolbar_n.png new file mode 100644 index 000000000..d6c63504e Binary files /dev/null and b/Templates/Full/game/tools/gui/images/expand-toolbar_n.png differ diff --git a/Tools/Vagrant/Vagrantfile b/Tools/Vagrant/Ubuntu 14/Vagrantfile similarity index 95% rename from Tools/Vagrant/Vagrantfile rename to Tools/Vagrant/Ubuntu 14/Vagrantfile index 8c6d0f381..b1959e1cf 100644 --- a/Tools/Vagrant/Vagrantfile +++ b/Tools/Vagrant/Ubuntu 14/Vagrantfile @@ -22,7 +22,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| end end - config.vm.synced_folder '../../', '/torque' + config.vm.synced_folder '../../../', '/torque' config.vm.provision :shell, path: 'provision.sh' if gui? diff --git a/Tools/Vagrant/provision-gui.sh b/Tools/Vagrant/Ubuntu 14/provision-gui.sh similarity index 100% rename from Tools/Vagrant/provision-gui.sh rename to Tools/Vagrant/Ubuntu 14/provision-gui.sh diff --git a/Tools/Vagrant/provision.sh b/Tools/Vagrant/Ubuntu 14/provision.sh similarity index 100% rename from Tools/Vagrant/provision.sh rename to Tools/Vagrant/Ubuntu 14/provision.sh