Merge pull request #1931 from Areloch/LightingFix

Fixes some issues with lightning
This commit is contained in:
Areloch 2017-01-24 23:43:19 -06:00 committed by GitHub
commit 1523fe55de
4 changed files with 68 additions and 36 deletions

View file

@ -200,7 +200,7 @@ void LightningStrikeEvent::unpack(NetConnection* con, BitStream* stream)
{ {
if(!stream->readFlag()) if(!stream->readFlag())
return; return;
S32 mClientId = stream->readRangedU32(0, NetConnection::MaxGhostCount); mClientId = stream->readRangedU32(0, NetConnection::MaxGhostCount);
mLightning = NULL; mLightning = NULL;
NetObject* pObject = con->resolveGhost(mClientId); NetObject* pObject = con->resolveGhost(mClientId);
if (pObject) if (pObject)
@ -214,10 +214,10 @@ void LightningStrikeEvent::unpack(NetConnection* con, BitStream* stream)
// target id // target id
S32 mTargetID = stream->readRangedU32(0, NetConnection::MaxGhostCount); S32 mTargetID = stream->readRangedU32(0, NetConnection::MaxGhostCount);
NetObject* pObject = con->resolveGhost(mTargetID); NetObject* tObject = con->resolveGhost(mTargetID);
if( pObject != NULL ) if(tObject != NULL )
{ {
mTarget = dynamic_cast<SceneObject*>(pObject); mTarget = dynamic_cast<SceneObject*>(tObject);
} }
if( bool(mTarget) == false ) if( bool(mTarget) == false )
{ {
@ -243,6 +243,7 @@ LightningData::LightningData()
dMemset( strikeTextureNames, 0, sizeof( strikeTextureNames ) ); dMemset( strikeTextureNames, 0, sizeof( strikeTextureNames ) );
dMemset( strikeTextures, 0, sizeof( strikeTextures ) ); dMemset( strikeTextures, 0, sizeof( strikeTextures ) );
dMemset( thunderSounds, 0, sizeof( thunderSounds ) ); dMemset( thunderSounds, 0, sizeof( thunderSounds ) );
mNumStrikeTextures = 0;
} }
LightningData::~LightningData() LightningData::~LightningData()
@ -297,10 +298,14 @@ bool LightningData::preload(bool server, String &errorStr)
if( !sfxResolve( &strikeSound, sfxErrorStr ) ) if( !sfxResolve( &strikeSound, sfxErrorStr ) )
Con::errorf(ConsoleLogEntry::General, "LightningData::preload: Invalid packet: %s", sfxErrorStr.c_str()); Con::errorf(ConsoleLogEntry::General, "LightningData::preload: Invalid packet: %s", sfxErrorStr.c_str());
mNumStrikeTextures = 0;
for (U32 i = 0; i < MaxTextures; i++) for (U32 i = 0; i < MaxTextures; i++)
{ {
if (strikeTextureNames[i][0]) if (strikeTextureNames[i][0])
{
strikeTextures[i] = GFXTexHandle(strikeTextureNames[i], &GFXDefaultStaticDiffuseProfile, avar("%s() - strikeTextures[%d] (line %d)", __FUNCTION__, i, __LINE__)); strikeTextures[i] = GFXTexHandle(strikeTextureNames[i], &GFXDefaultStaticDiffuseProfile, avar("%s() - strikeTextures[%d] (line %d)", __FUNCTION__, i, __LINE__));
mNumStrikeTextures++;
}
} }
} }
@ -317,7 +322,11 @@ void LightningData::packData(BitStream* stream)
U32 i; U32 i;
for (i = 0; i < MaxThunders; i++) for (i = 0; i < MaxThunders; i++)
sfxWrite( stream, thunderSounds[ i ] ); sfxWrite( stream, thunderSounds[ i ] );
for (i = 0; i < MaxTextures; i++) {
stream->writeInt(mNumStrikeTextures, 4);
for (i = 0; i < MaxTextures; i++)
{
stream->writeString(strikeTextureNames[i]); stream->writeString(strikeTextureNames[i]);
} }
@ -331,7 +340,11 @@ void LightningData::unpackData(BitStream* stream)
U32 i; U32 i;
for (i = 0; i < MaxThunders; i++) for (i = 0; i < MaxThunders; i++)
sfxRead( stream, &thunderSounds[ i ] ); sfxRead( stream, &thunderSounds[ i ] );
for (i = 0; i < MaxTextures; i++) {
mNumStrikeTextures = stream->readInt(4);
for (i = 0; i < MaxTextures; i++)
{
strikeTextureNames[i] = stream->readSTString(); strikeTextureNames[i] = stream->readSTString();
} }
@ -368,16 +381,16 @@ Lightning::~Lightning()
{ {
while( mThunderListHead ) while( mThunderListHead )
{ {
Thunder* next = mThunderListHead->next; Thunder* nextThunder = mThunderListHead->next;
delete mThunderListHead; delete mThunderListHead;
mThunderListHead = next; mThunderListHead = nextThunder;
} }
while( mStrikeListHead ) while( mStrikeListHead )
{ {
Strike* next = mStrikeListHead->next; Strike* nextStrike = mStrikeListHead->next;
delete mStrikeListHead; delete mStrikeListHead;
mStrikeListHead = next; mStrikeListHead = nextStrike;
} }
} }
@ -478,11 +491,16 @@ void Lightning::renderObject(ObjectRenderInst *ri, SceneRenderState *state, Base
desc.setBlend( true, GFXBlendSrcAlpha, GFXBlendOne); desc.setBlend( true, GFXBlendSrcAlpha, GFXBlendOne);
desc.setCullMode(GFXCullNone); desc.setCullMode(GFXCullNone);
desc.zWriteEnable = false; desc.zWriteEnable = false;
desc.vertexColorEnable = true;
if (mDataBlock->mNumStrikeTextures != 0)
{
desc.samplersDefined = true; desc.samplersDefined = true;
desc.samplers[0].magFilter = GFXTextureFilterLinear; desc.samplers[0].magFilter = GFXTextureFilterLinear;
desc.samplers[0].minFilter = GFXTextureFilterLinear; desc.samplers[0].minFilter = GFXTextureFilterLinear;
desc.samplers[0].addressModeU = GFXAddressWrap; desc.samplers[0].addressModeU = GFXAddressWrap;
desc.samplers[0].addressModeV = GFXAddressWrap; desc.samplers[0].addressModeV = GFXAddressWrap;
}
mLightningSB = GFX->createStateBlock(desc); mLightningSB = GFX->createStateBlock(desc);
@ -493,10 +511,17 @@ void Lightning::renderObject(ObjectRenderInst *ri, SceneRenderState *state, Base
Strike* walk = mStrikeListHead; Strike* walk = mStrikeListHead;
while (walk != NULL) while (walk != NULL)
{
if (mDataBlock->mNumStrikeTextures > 1)
{
GFX->setTexture(0, mDataBlock->strikeTextures[sgLightningRand.randI(0, mDataBlock->mNumStrikeTextures - 1)]);
}
else if (mDataBlock->mNumStrikeTextures > 0)
{ {
GFX->setTexture(0, mDataBlock->strikeTextures[0]); GFX->setTexture(0, mDataBlock->strikeTextures[0]);
}
for( U32 i=0; i<3; i++ ) for( U32 i=0; i<MAX_LIGHTNING; i++ )
{ {
if( walk->bolt[i].isFading ) if( walk->bolt[i].isFading )
{ {
@ -589,7 +614,7 @@ void Lightning::advanceTime(F32 dt)
while (*pWalker != NULL) { while (*pWalker != NULL) {
Strike* pStrike = *pWalker; Strike* pStrike = *pWalker;
for( U32 i=0; i<3; i++ ) for( U32 i=0; i<MAX_LIGHTNING; i++ )
{ {
pStrike->bolt[i].update( dt ); pStrike->bolt[i].update( dt );
} }
@ -673,7 +698,7 @@ void Lightning::processEvent(LightningStrikeEvent* pEvent)
pStrike->currentAge = 0.0f; pStrike->currentAge = 0.0f;
pStrike->next = mStrikeListHead; pStrike->next = mStrikeListHead;
for( U32 i=0; i<3; i++ ) for( U32 i=0; i<MAX_LIGHTNING; i++ )
{ {
F32 randStart = boltStartRadius; F32 randStart = boltStartRadius;
F32 height = mObjScale.z * 0.5f + getPosition().z; F32 height = mObjScale.z * 0.5f + getPosition().z;
@ -731,18 +756,19 @@ void Lightning::strikeRandomPoint()
Point3F strikePoint( gRandGen.randF( 0.0f, 1.0f ), gRandGen.randF( 0.0f, 1.0f ), 0.0f ); Point3F strikePoint( gRandGen.randF( 0.0f, 1.0f ), gRandGen.randF( 0.0f, 1.0f ), 0.0f );
// check if an object is within target range // check if an object is within target range
Point3F worldPosStrikePoint = strikePoint;
strikePoint *= mObjScale; worldPosStrikePoint *= mObjScale;
strikePoint += getPosition(); worldPosStrikePoint += getPosition();
strikePoint += Point3F( -mObjScale.x * 0.5f, -mObjScale.y * 0.5f, 0.0f ); worldPosStrikePoint += Point3F( -mObjScale.x * 0.5f, -mObjScale.y * 0.5f, 0.0f );
Box3F queryBox; Box3F queryBox;
F32 boxWidth = strikeRadius * 2.0f; F32 boxWidth = strikeRadius * 2.0f;
queryBox.minExtents.set( -boxWidth * 0.5f, -boxWidth * 0.5f, -mObjScale.z * 0.5f ); queryBox.minExtents.set( -boxWidth * 0.5f, -boxWidth * 0.5f, -mObjScale.z * 0.5f );
queryBox.maxExtents.set( boxWidth * 0.5f, boxWidth * 0.5f, mObjScale.z * 0.5f ); queryBox.maxExtents.set( boxWidth * 0.5f, boxWidth * 0.5f, mObjScale.z * 0.5f );
queryBox.minExtents += strikePoint; queryBox.minExtents += worldPosStrikePoint;
queryBox.maxExtents += strikePoint; queryBox.maxExtents += worldPosStrikePoint;
SimpleQueryList sql; SimpleQueryList sql;
getContainer()->findObjects(queryBox, DAMAGEABLE_TYPEMASK, getContainer()->findObjects(queryBox, DAMAGEABLE_TYPEMASK,
@ -864,6 +890,7 @@ U32 Lightning::packUpdate(NetConnection* con, U32 mask, BitStream* stream)
stream->write(color.red); stream->write(color.red);
stream->write(color.green); stream->write(color.green);
stream->write(color.blue); stream->write(color.blue);
stream->write(color.alpha);
stream->write(fadeColor.red); stream->write(fadeColor.red);
stream->write(fadeColor.green); stream->write(fadeColor.green);
stream->write(fadeColor.blue); stream->write(fadeColor.blue);
@ -895,6 +922,7 @@ void Lightning::unpackUpdate(NetConnection* con, BitStream* stream)
stream->read(&color.red); stream->read(&color.red);
stream->read(&color.green); stream->read(&color.green);
stream->read(&color.blue); stream->read(&color.blue);
stream->read(&color.alpha);
stream->read(&fadeColor.red); stream->read(&fadeColor.red);
stream->read(&fadeColor.green); stream->read(&fadeColor.green);
stream->read(&fadeColor.blue); stream->read(&fadeColor.blue);
@ -930,7 +958,7 @@ DefineEngineMethod(Lightning, strikeRandomPoint, void, (),,
object->strikeRandomPoint(); object->strikeRandomPoint();
} }
DefineEngineMethod(Lightning, strikeObject, void, (ShapeBase* pSB),, DefineEngineMethod(Lightning, strikeObject, void, (ShapeBase* pSB), (nullAsType<ShapeBase*>()),
"Creates a LightningStrikeEvent which strikes a specific object.\n" "Creates a LightningStrikeEvent which strikes a specific object.\n"
"@note This method is currently unimplemented.\n" ) "@note This method is currently unimplemented.\n" )
{ {
@ -1154,7 +1182,7 @@ void LightningBolt::generateMinorNodes()
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// Recursive algo to create bolts that split off from main bolt // Recursive algo to create bolts that split off from main bolt
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void LightningBolt::createSplit( const Point3F &startPoint, const Point3F &endPoint, U32 depth, F32 width ) void LightningBolt::createSplit( const Point3F &startingPoint, const Point3F &endingPoint, U32 depth, F32 splitWidth )
{ {
if( depth == 0 ) if( depth == 0 )
return; return;
@ -1163,17 +1191,17 @@ void LightningBolt::createSplit( const Point3F &startPoint, const Point3F &endPo
if( chanceToEnd > 0.70f ) if( chanceToEnd > 0.70f )
return; return;
if( width < 0.75f ) if(splitWidth < 0.75f )
width = 0.75f; splitWidth = 0.75f;
VectorF diff = endPoint - startPoint; VectorF diff = endingPoint - startingPoint;
F32 length = diff.len(); F32 length = diff.len();
diff.normalizeSafe(); diff.normalizeSafe();
LightningBolt newBolt; LightningBolt newBolt;
newBolt.startPoint = startPoint; newBolt.startPoint = startingPoint;
newBolt.endPoint = endPoint; newBolt.endPoint = endingPoint;
newBolt.width = width; newBolt.width = splitWidth;
newBolt.numMajorNodes = 3; newBolt.numMajorNodes = 3;
newBolt.maxMajorAngle = 30.0f; newBolt.maxMajorAngle = 30.0f;
newBolt.numMinorNodes = 3; newBolt.numMinorNodes = 3;
@ -1184,13 +1212,13 @@ void LightningBolt::createSplit( const Point3F &startPoint, const Point3F &endPo
splitList.pushBack( newBolt ); splitList.pushBack( newBolt );
VectorF newDir1 = MathUtils::randomDir( diff, 10.0f, 45.0f ); VectorF newDir1 = MathUtils::randomDir( diff, 10.0f, 45.0f );
Point3F newEndPoint1 = endPoint + newDir1 * gRandGen.randF( 0.5f, 1.5f ) * length; Point3F newEndPoint1 = endingPoint + newDir1 * gRandGen.randF( 0.5f, 1.5f ) * length;
VectorF newDir2 = MathUtils::randomDir( diff, 10.0f, 45.0f ); VectorF newDir2 = MathUtils::randomDir( diff, 10.0f, 45.0f );
Point3F newEndPoint2 = endPoint + newDir2 * gRandGen.randF( 0.5f, 1.5f ) * length; Point3F newEndPoint2 = endingPoint + newDir2 * gRandGen.randF( 0.5f, 1.5f ) * length;
createSplit( endPoint, newEndPoint1, depth - 1, width * 0.30f ); createSplit(endingPoint, newEndPoint1, depth - 1, splitWidth * 0.30f );
createSplit( endPoint, newEndPoint2, depth - 1, width * 0.30f ); createSplit(endingPoint, newEndPoint2, depth - 1, splitWidth * 0.30f );
} }

View file

@ -47,6 +47,7 @@ class ShapeBase;
class LightningStrikeEvent; class LightningStrikeEvent;
class SFXTrack; class SFXTrack;
#define MAX_LIGHTNING 3
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
class LightningData : public GameBaseData class LightningData : public GameBaseData
@ -70,6 +71,7 @@ class LightningData : public GameBaseData
GFXTexHandle strikeTextures[MaxTextures]; GFXTexHandle strikeTextures[MaxTextures];
U32 numThunders; U32 numThunders;
U32 mNumStrikeTextures;
protected: protected:
bool onAdd(); bool onAdd();

View file

@ -83,6 +83,8 @@ datablock LightningData(DefaultStorm)
thunderSounds[1] = ThunderCrash2Sound; thunderSounds[1] = ThunderCrash2Sound;
thunderSounds[2] = ThunderCrash3Sound; thunderSounds[2] = ThunderCrash3Sound;
thunderSounds[3] = ThunderCrash4Sound; thunderSounds[3] = ThunderCrash4Sound;
strikeTextures[0] = "art/environment/lightning";
}; };
datablock ReflectorDesc( DefaultCubeDesc ) datablock ReflectorDesc( DefaultCubeDesc )

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB