152 lines
4.2 KiB
C++
Executable File
152 lines
4.2 KiB
C++
Executable File
//-----------------------------------------------------------------------------
|
|
// Torque Game Engine
|
|
// Copyright (C) GarageGames.com, Inc.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "dgl/gBitmap.h"
|
|
#include "math/mathIO.h"
|
|
#include "core/bitStream.h"
|
|
#include "console/consoleTypes.h"
|
|
#include "sceneGraph/sceneGraph.h"
|
|
#include "terrain/terrData.h"
|
|
#include "math/mathUtils.h"
|
|
#include "terrain/sun.h"
|
|
|
|
IMPLEMENT_CO_NETOBJECT_V1(Sun);
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
Sun::Sun()
|
|
{
|
|
mNetFlags.set(Ghostable | ScopeAlways);
|
|
mTypeMask = EnvironmentObjectType;
|
|
|
|
mLight.mType = LightInfo::Vector;
|
|
mLight.mDirection.set(0.f, 0.707f, -0.707f);
|
|
mLight.mColor.set(0.7f, 0.7f, 0.7f);
|
|
mLight.mAmbient.set(0.3f, 0.3f, 0.3f);
|
|
|
|
mLight.sgCastsShadows = true;
|
|
mLight.sgDoubleSidedAmbient = true;
|
|
mLight.sgUseNormals = true;
|
|
mLight.sgZone[0] = 0;
|
|
|
|
mSunAzimuth = 0.0f;
|
|
mSunElevation = 35.0f;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void Sun::conformLight()
|
|
{
|
|
mLight.mDirection.normalize();
|
|
mLight.mColor.clamp();
|
|
mLight.mAmbient.clamp();
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
bool Sun::onAdd()
|
|
{
|
|
if(!Parent::onAdd())
|
|
return(false);
|
|
|
|
if(isClientObject())
|
|
Sim::getLightSet()->addObject(this);
|
|
else
|
|
conformLight();
|
|
|
|
return(true);
|
|
}
|
|
|
|
void Sun::registerLights(LightManager *lightManager, bool relight)
|
|
{
|
|
mRegisteredLight = mLight;
|
|
LightManager::sgGetFilteredLightColor(mRegisteredLight.mColor, mRegisteredLight.mAmbient, 0);
|
|
|
|
if(relight)
|
|
{
|
|
// static lighting not affected by this option when using the sun...
|
|
mRegisteredLight.sgCastsShadows = true;
|
|
lightManager->sgRegisterGlobalLight(&mRegisteredLight);
|
|
}
|
|
else
|
|
lightManager->sgSetSpecialLight(LightManager::sgSunLightType, &mRegisteredLight);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void Sun::inspectPostApply()
|
|
{
|
|
conformLight();
|
|
setMaskBits(UpdateMask);
|
|
}
|
|
|
|
void Sun::unpackUpdate(NetConnection *, BitStream * stream)
|
|
{
|
|
if(stream->readFlag())
|
|
{
|
|
// direction -> color -> ambient
|
|
mathRead(*stream, &mLight.mDirection);
|
|
|
|
stream->read(&mLight.mColor.red);
|
|
stream->read(&mLight.mColor.green);
|
|
stream->read(&mLight.mColor.blue);
|
|
stream->read(&mLight.mColor.alpha);
|
|
|
|
stream->read(&mLight.mAmbient.red);
|
|
stream->read(&mLight.mAmbient.green);
|
|
stream->read(&mLight.mAmbient.blue);
|
|
stream->read(&mLight.mAmbient.alpha);
|
|
|
|
mLight.sgCastsShadows = stream->readFlag();
|
|
}
|
|
}
|
|
|
|
U32 Sun::packUpdate(NetConnection *, U32 mask, BitStream * stream)
|
|
{
|
|
if(stream->writeFlag(mask & UpdateMask))
|
|
{
|
|
|
|
// Calculate Light Direction.
|
|
F32 Yaw = mDegToRad(mClampF(mSunAzimuth,0,359));
|
|
F32 Pitch = mDegToRad(mClampF(mSunElevation,-360,+360));
|
|
VectorF sunvec;
|
|
MathUtils::getVectorFromAngles(sunvec, Yaw, Pitch);
|
|
mLight.mDirection = -sunvec;
|
|
|
|
// direction -> color -> ambient
|
|
mathWrite(*stream, mLight.mDirection);
|
|
|
|
stream->write(mLight.mColor.red);
|
|
stream->write(mLight.mColor.green);
|
|
stream->write(mLight.mColor.blue);
|
|
stream->write(mLight.mColor.alpha);
|
|
|
|
stream->write(mLight.mAmbient.red);
|
|
stream->write(mLight.mAmbient.green);
|
|
stream->write(mLight.mAmbient.blue);
|
|
stream->write(mLight.mAmbient.alpha);
|
|
|
|
stream->writeFlag(mLight.sgCastsShadows);
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void Sun::initPersistFields()
|
|
{
|
|
Parent::initPersistFields();
|
|
addGroup("Misc");
|
|
addField("azimuth", TypeF32, Offset( mSunAzimuth, Sun));
|
|
addField("elevation", TypeF32, Offset( mSunElevation, Sun));
|
|
//addField("direction", TypePoint3F, Offset(mLight.mDirection, Sun));
|
|
addField("color", TypeColorF, Offset(mLight.mColor, Sun));
|
|
addField("ambient", TypeColorF, Offset(mLight.mAmbient, Sun));
|
|
|
|
addField( "castsShadows", TypeBool, Offset(mLight.sgCastsShadows,Sun));
|
|
endGroup("Misc");
|
|
|
|
}
|