Initial commit
This commit is contained in:
223
engines/hpl1/engine/scene/Light.cpp
Normal file
223
engines/hpl1/engine/scene/Light.cpp
Normal file
@@ -0,0 +1,223 @@
|
||||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2006-2010 - Frictional Games
|
||||
*
|
||||
* This file is part of HPL1 Engine.
|
||||
*/
|
||||
|
||||
#include "hpl1/engine/scene/Light.h"
|
||||
|
||||
#include "hpl1/engine/math/Math.h"
|
||||
#include "hpl1/engine/system/low_level_system.h"
|
||||
|
||||
#include "hpl1/engine/scene/SoundEntity.h"
|
||||
#include "hpl1/engine/scene/World3D.h"
|
||||
|
||||
namespace hpl {
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// CONSTRUCTORS
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
|
||||
iLight::iLight() : mDiffuseColor(0), mSpecularColor(0), mfIntensity(1),
|
||||
mbCastShadows(false), mfFarAttenuation(0), mfNearAttenuation(0),
|
||||
mfSourceRadius(10), mbAffectMaterial(true) {
|
||||
mfFadeTime = 0;
|
||||
|
||||
mbFlickering = false;
|
||||
|
||||
mpWorld3D = NULL;
|
||||
|
||||
mfFlickerStateLength = 0;
|
||||
|
||||
mfFadeTime = 0;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// PUBLIC METHODS
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
|
||||
void iLight::SetDiffuseColor(cColor aColor) {
|
||||
mDiffuseColor = aColor;
|
||||
|
||||
OnSetDiffuse();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
|
||||
void iLight::UpdateLight(float afTimeStep) {
|
||||
/////////////////////////////////////////////
|
||||
// Fade
|
||||
if (mfFadeTime > 0) {
|
||||
// Log("Fading: %f / %f\n",afTimeStep,mfFadeTime);
|
||||
|
||||
mfFarAttenuation += mfRadiusAdd * afTimeStep;
|
||||
mDiffuseColor.r += mColAdd.r * afTimeStep;
|
||||
mDiffuseColor.g += mColAdd.g * afTimeStep;
|
||||
mDiffuseColor.b += mColAdd.b * afTimeStep;
|
||||
mDiffuseColor.a += mColAdd.a * afTimeStep;
|
||||
SetDiffuseColor(mDiffuseColor);
|
||||
|
||||
mfFadeTime -= afTimeStep;
|
||||
|
||||
// Set the dest values.
|
||||
if (mfFadeTime <= 0) {
|
||||
mfFadeTime = 0;
|
||||
SetDiffuseColor(mDestCol);
|
||||
mfFarAttenuation = mfDestRadius;
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////
|
||||
// Flickering
|
||||
if (mbFlickering && mfFadeTime <= 0) {
|
||||
//////////////////////
|
||||
// On
|
||||
if (mbFlickerOn) {
|
||||
if (mfFlickerTime >= mfFlickerStateLength) {
|
||||
mbFlickerOn = false;
|
||||
if (!mbFlickerFade) {
|
||||
SetDiffuseColor(mFlickerOffColor);
|
||||
mfFarAttenuation = mfFlickerOffRadius;
|
||||
} else {
|
||||
FadeTo(mFlickerOffColor, mfFlickerOffRadius, mfFlickerOffFadeLength);
|
||||
}
|
||||
// Sound
|
||||
if (msFlickerOffSound != "") {
|
||||
cSoundEntity *pSound = mpWorld3D->CreateSoundEntity("FlickerOff",
|
||||
msFlickerOffSound, true);
|
||||
if (pSound)
|
||||
pSound->SetPosition(GetLightPosition());
|
||||
}
|
||||
|
||||
OnFlickerOff();
|
||||
|
||||
mfFlickerTime = 0;
|
||||
mfFlickerStateLength = cMath::RandRectf(mfFlickerOffMinLength, mfFlickerOffMaxLength);
|
||||
}
|
||||
}
|
||||
//////////////////////
|
||||
// Off
|
||||
else {
|
||||
if (mfFlickerTime >= mfFlickerStateLength) {
|
||||
mbFlickerOn = true;
|
||||
if (!mbFlickerFade) {
|
||||
SetDiffuseColor(mFlickerOnColor);
|
||||
mfFarAttenuation = mfFlickerOnRadius;
|
||||
} else {
|
||||
FadeTo(mFlickerOnColor, mfFlickerOnRadius, mfFlickerOnFadeLength);
|
||||
}
|
||||
if (msFlickerOnSound != "") {
|
||||
cSoundEntity *pSound = mpWorld3D->CreateSoundEntity("FlickerOn",
|
||||
msFlickerOnSound, true);
|
||||
if (pSound)
|
||||
pSound->SetPosition(GetLightPosition());
|
||||
}
|
||||
|
||||
OnFlickerOn();
|
||||
|
||||
mfFlickerTime = 0;
|
||||
mfFlickerStateLength = cMath::RandRectf(mfFlickerOnMinLength, mfFlickerOnMaxLength);
|
||||
}
|
||||
}
|
||||
|
||||
mfFlickerTime += afTimeStep;
|
||||
}
|
||||
|
||||
/*Log("Time: %f Length: %f FadeTime: %f Color: (%f %f %f %f)\n",mfFlickerTime, mfFlickerStateLength,
|
||||
mfFadeTime,
|
||||
mDiffuseColor.r,mDiffuseColor.g,
|
||||
mDiffuseColor.b,mDiffuseColor.a);*/
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
|
||||
void iLight::FadeTo(const cColor &aCol, float afRadius, float afTime) {
|
||||
if (afTime <= 0)
|
||||
afTime = 0.0001f;
|
||||
|
||||
mfFadeTime = afTime;
|
||||
|
||||
mColAdd.r = (aCol.r - mDiffuseColor.r) / afTime;
|
||||
mColAdd.g = (aCol.g - mDiffuseColor.g) / afTime;
|
||||
mColAdd.b = (aCol.b - mDiffuseColor.b) / afTime;
|
||||
mColAdd.a = (aCol.a - mDiffuseColor.a) / afTime;
|
||||
|
||||
mfRadiusAdd = (afRadius - mfFarAttenuation) / afTime;
|
||||
|
||||
mfDestRadius = afRadius;
|
||||
mDestCol = aCol;
|
||||
}
|
||||
|
||||
bool iLight::IsFading() {
|
||||
return mfFadeTime != 0;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
|
||||
void iLight::SetFlickerActive(bool abX) {
|
||||
mbFlickering = abX;
|
||||
}
|
||||
|
||||
void iLight::SetFlicker(const cColor &aOffCol, float afOffRadius,
|
||||
float afOnMinLength, float afOnMaxLength, const tString &asOnSound, const tString &asOnPS,
|
||||
float afOffMinLength, float afOffMaxLength, const tString &asOffSound, const tString &asOffPS,
|
||||
bool abFade, float afOnFadeLength, float afOffFadeLength) {
|
||||
mFlickerOffColor = aOffCol;
|
||||
mfFlickerOffRadius = afOffRadius;
|
||||
|
||||
mfFlickerOnMinLength = afOnMinLength;
|
||||
mfFlickerOnMaxLength = afOnMaxLength;
|
||||
msFlickerOnSound = asOnSound;
|
||||
msFlickerOnPS = asOnPS;
|
||||
|
||||
mfFlickerOffMinLength = afOffMinLength;
|
||||
mfFlickerOffMaxLength = afOffMaxLength;
|
||||
msFlickerOffSound = asOffSound;
|
||||
msFlickerOffPS = asOffPS;
|
||||
|
||||
mbFlickerFade = abFade;
|
||||
|
||||
mfFlickerOnFadeLength = afOnFadeLength;
|
||||
mfFlickerOffFadeLength = afOffFadeLength;
|
||||
|
||||
mFlickerOnColor = mDiffuseColor;
|
||||
mfFlickerOnRadius = mfFarAttenuation;
|
||||
|
||||
mbFlickerOn = true;
|
||||
mfFlickerTime = 0;
|
||||
|
||||
mfFadeTime = 0;
|
||||
|
||||
mfFlickerStateLength = cMath::RandRectf(mfFlickerOnMinLength, mfFlickerOnMaxLength);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
|
||||
} // namespace hpl
|
||||
Reference in New Issue
Block a user