diff --git a/Engine/source/gfx/D3D11/gfxD3D11StateBlock.cpp b/Engine/source/gfx/D3D11/gfxD3D11StateBlock.cpp index 23844665b..a7a3789b7 100644 --- a/Engine/source/gfx/D3D11/gfxD3D11StateBlock.cpp +++ b/Engine/source/gfx/D3D11/gfxD3D11StateBlock.cpp @@ -186,10 +186,11 @@ GFXD3D11StateBlock::GFXD3D11StateBlock(const GFXStateBlockDesc& desc) else mSamplerDesc[i].Filter = comparison ? D3D11_FILTER_COMPARISON_ANISOTROPIC : D3D11_FILTER_ANISOTROPIC; - mSamplerDesc[i].BorderColor[0] = 1.0f; - mSamplerDesc[i].BorderColor[1] = 1.0f; - mSamplerDesc[i].BorderColor[2] = 1.0f; - mSamplerDesc[i].BorderColor[3] = 1.0f; + LinearColorF bc = LinearColorF(gfxSamplerState.borderColor); + mSamplerDesc[i].BorderColor[0] = bc.red; + mSamplerDesc[i].BorderColor[1] = bc.green; + mSamplerDesc[i].BorderColor[2] = bc.blue; + mSamplerDesc[i].BorderColor[3] = bc.alpha; mSamplerDesc[i].ComparisonFunc = GFXD3D11CmpFunc[gfxSamplerState.samplerFunc]; hr = D3D11DEVICE->CreateSamplerState(&mSamplerDesc[i], &mSamplerStates[i]); diff --git a/Engine/source/gfx/gfxInit.cpp b/Engine/source/gfx/gfxInit.cpp index 0a5c66466..0f102a92b 100644 --- a/Engine/source/gfx/gfxInit.cpp +++ b/Engine/source/gfx/gfxInit.cpp @@ -333,17 +333,26 @@ GFXAdapter *GFXInit::getBestAdapterChoice() } } - // Return best found in order DX11, GL - if (foundAdapter11) - return foundAdapter11; + if (renderer.equal("NullDevice", String::NoCase) == false) + { + // Return best found in order DX11, GL + if (foundAdapter11) + return foundAdapter11; - if (foundAdapterGL) - return foundAdapterGL; + if (foundAdapterGL) + return foundAdapterGL; - // Uh oh - we didn't find anything. Grab whatever we can that's not Null... - for(S32 i=0; imType != NullDevice) - return smAdapters[i]; + // Uh oh - we didn't find anything. Grab whatever we can that's not Null... + for (S32 i = 0; i < smAdapters.size(); i++) + if (smAdapters[i]->mType != NullDevice) + return smAdapters[i]; + } + else + { + for (S32 i = 0; i < smAdapters.size(); i++) + if (smAdapters[i]->mType == NullDevice) + return smAdapters[i]; + } // Dare we return a null device? No. Just return NULL. return NULL; diff --git a/Engine/source/gfx/gfxStateBlock.cpp b/Engine/source/gfx/gfxStateBlock.cpp index 61ff8958c..66f19e54c 100644 --- a/Engine/source/gfx/gfxStateBlock.cpp +++ b/Engine/source/gfx/gfxStateBlock.cpp @@ -278,6 +278,7 @@ GFXSamplerStateDesc::GFXSamplerStateDesc() samplerFunc = GFXCmpNever; maxAnisotropy = 1; mipLODBias = 0.0f; + borderColor = ColorI::WHITE; } GFXSamplerStateDesc GFXSamplerStateDesc::getWrapLinear() diff --git a/Engine/source/gfx/gfxStateBlock.h b/Engine/source/gfx/gfxStateBlock.h index f8f19f360..21ca5b4d5 100644 --- a/Engine/source/gfx/gfxStateBlock.h +++ b/Engine/source/gfx/gfxStateBlock.h @@ -49,6 +49,8 @@ struct GFXSamplerStateDesc GFXCmpFunc samplerFunc; + ColorI borderColor; + /// The maximum anisotropy used when one of the filter types /// is set to anisotropic. /// diff --git a/Engine/source/gfx/gl/gfxGLEnumTranslate.cpp b/Engine/source/gfx/gl/gfxGLEnumTranslate.cpp index 93c8ee57c..b5b56fc6f 100644 --- a/Engine/source/gfx/gl/gfxGLEnumTranslate.cpp +++ b/Engine/source/gfx/gl/gfxGLEnumTranslate.cpp @@ -93,7 +93,7 @@ void GFXGLEnumTranslate::init() GFXGLTextureAddress[GFXAddressWrap] = GL_REPEAT; GFXGLTextureAddress[GFXAddressMirror] = GL_REPEAT; GFXGLTextureAddress[GFXAddressClamp] = GL_CLAMP_TO_EDGE; - GFXGLTextureAddress[GFXAddressBorder] = GL_REPEAT; + GFXGLTextureAddress[GFXAddressBorder] = GL_CLAMP_TO_BORDER; GFXGLTextureAddress[GFXAddressMirrorOnce] = GL_REPEAT; // Stencil ops diff --git a/Engine/source/gfx/gl/gfxGLStateBlock.cpp b/Engine/source/gfx/gl/gfxGLStateBlock.cpp index 12eab71b0..1d2968776 100644 --- a/Engine/source/gfx/gl/gfxGLStateBlock.cpp +++ b/Engine/source/gfx/gl/gfxGLStateBlock.cpp @@ -55,7 +55,16 @@ GFXGLStateBlock::GFXGLStateBlock(const GFXStateBlockDesc& desc) : glSamplerParameteri(id, GL_TEXTURE_WRAP_S, GFXGLTextureAddress[ssd.addressModeU]); glSamplerParameteri(id, GL_TEXTURE_WRAP_T, GFXGLTextureAddress[ssd.addressModeV]); glSamplerParameteri(id, GL_TEXTURE_WRAP_R, GFXGLTextureAddress[ssd.addressModeW]); - + + if (ssd.addressModeU == GFXAddressBorder || + ssd.addressModeV == GFXAddressBorder || + ssd.addressModeW == GFXAddressBorder) + { + LinearColorF bc = LinearColorF(ssd.borderColor); + GLfloat color[4] = { bc.red, bc.green, bc.blue, bc.alpha }; + glSamplerParameterfv(id, GL_TEXTURE_BORDER_COLOR, color); + } + //compare modes const bool comparison = ssd.samplerFunc != GFXCmpNever; glSamplerParameteri(id, GL_TEXTURE_COMPARE_MODE, comparison ? GL_COMPARE_R_TO_TEXTURE_ARB : GL_NONE ); diff --git a/Engine/source/gfx/gl/gfxGLTextureObject.cpp b/Engine/source/gfx/gl/gfxGLTextureObject.cpp index 198292dbc..06ee43dc0 100644 --- a/Engine/source/gfx/gl/gfxGLTextureObject.cpp +++ b/Engine/source/gfx/gl/gfxGLTextureObject.cpp @@ -219,7 +219,7 @@ void GFXGLTextureObject::initSamplerState(const GFXSamplerStateDesc &ssd) glTexParameteri(mBinding, GL_TEXTURE_WRAP_R, GFXGLTextureAddress[ssd.addressModeW]); if(static_cast< GFXGLDevice* >( GFX )->supportsAnisotropic() ) glTexParameterf(mBinding, GL_TEXTURE_MAX_ANISOTROPY_EXT, ssd.maxAnisotropy); - + mNeedInitSamplerState = false; mSampler = ssd; } diff --git a/Engine/source/gfx/sim/gfxStateBlockData.cpp b/Engine/source/gfx/sim/gfxStateBlockData.cpp index 9b015559d..853250221 100644 --- a/Engine/source/gfx/sim/gfxStateBlockData.cpp +++ b/Engine/source/gfx/sim/gfxStateBlockData.cpp @@ -315,6 +315,8 @@ void GFXSamplerStateData::initPersistFields() endGroup( "Filter State" ); + addField("borderColor", TypeColorI, Offset(mState.borderColor, GFXSamplerStateData), ""); + addField("samplerFunc", TypeGFXCmpFunc, Offset(mState.samplerFunc, GFXSamplerStateData), "Compares sampled data against existing sampled data. The default is GFXCmpNever."); } diff --git a/Engine/source/platform/test/platformFileIOTest.cpp b/Engine/source/platform/test/platformFileIOTest.cpp index 198baca4f..0afd61593 100644 --- a/Engine/source/platform/test/platformFileIOTest.cpp +++ b/Engine/source/platform/test/platformFileIOTest.cpp @@ -68,13 +68,17 @@ TEST(File, TouchAndTime) // Touch a file and note its last-modified. dFileTouch("testTouch.file"); + + // Sleep for a tick + Platform::sleep(32); + EXPECT_TRUE(Platform::isFile("testTouch.file")) << "We just touched this file - it should exist."; EXPECT_TRUE(Platform::getFileTimes("testTouch.file", &create[0], &modify[0])) << "Failed to get filetimes for a file we just created."; // Sleep for a tick - Platform::sleep(10); + Platform::sleep(32); // Touch it again, and compare the last-modifieds. EXPECT_TRUE(Platform::isFile("testTouch.file")) diff --git a/Templates/BaseGame/game/data/ExampleModule/ExampleModule.tscript b/Templates/BaseGame/game/data/ExampleModule/ExampleModule.tscript index ddb70fa85..63c051431 100644 --- a/Templates/BaseGame/game/data/ExampleModule/ExampleModule.tscript +++ b/Templates/BaseGame/game/data/ExampleModule/ExampleModule.tscript @@ -24,10 +24,10 @@ function ExampleModule::onCreateGameServer(%this) %this.registerDatablock("./scripts/managedData/managedForestItemData"); if(isFile("./scripts/managedData/managedForestBrushData." @ $TorqueScriptFileExtension)) %this.registerDatablock("./scripts/managedData/managedForestBrushData"); - if(isFile("./scripts/managedData/managedParticleEmitterData." @ $TorqueScriptFileExtension)) - %this.registerDatablock("./scripts/managedData/managedParticleEmitterData"); if(isFile("./scripts/managedData/managedParticleData." @ $TorqueScriptFileExtension)) %this.registerDatablock("./scripts/managedData/managedParticleData"); + if(isFile("./scripts/managedData/managedParticleEmitterData." @ $TorqueScriptFileExtension)) + %this.registerDatablock("./scripts/managedData/managedParticleEmitterData"); } //This is called when the server is shut down due to the game/map being exited