// NeL - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#ifndef NL_U_POINT_LIGHT_H
#define NL_U_POINT_LIGHT_H
#include "nel/misc/types_nl.h"
#include "nel/misc/rgba.h"
#include "u_transform.h"
namespace NL3D
{
// ***************************************************************************
/**
* Game interface for manipulating Dynamic Lights
* \author Lionel Berenguier
* \author Nevrax France
* \date 2001
*/
class UPointLight : public UTransform
{
public:
/// Set the ambient color of the light. Default to Black
void setAmbient (NLMISC::CRGBA ambient);
/// Set the diffuse color of the light. Default to White
void setDiffuse (NLMISC::CRGBA diffuse);
/// Set the specular color of the light. Default to White
void setSpecular (NLMISC::CRGBA specular);
/// Set the diffuse and specular color of the light to the same value. don't modify _Ambient.
void setColor (NLMISC::CRGBA color);
/// Get the ambient color of the light.
NLMISC::CRGBA getAmbient () const;
/// Get the diffuse color of the light.
NLMISC::CRGBA getDiffuse () const;
/// Get the specular color of the light.
NLMISC::CRGBA getSpecular () const;
/** setup the attenuation of the light. if (0,0) attenuation is disabled.
* clamp(attenuationBegin,0 , +oo) and clamp(attenuationEnd, attenuationBegin, +oo)
* By default, attenuation is 10-30.
* PERFORMANCE WARNING: big lights (disabled attenuation and big attenuationEnd) slow down
* performances. (by experience, with a factor of 2).
*/
void setupAttenuation(float attenuationBegin, float attenuationEnd);
/// get the begin radius of the attenuation.
float getAttenuationBegin() const;
/// get the end radius of the attenuation.
float getAttenuationEnd() const;
/** Setup SpotLight. SpotLight is disabled by default. The direction of the spot is lead by the J vector of the
* UPointLight WorldMatrix
*/
void enableSpotlight(bool enable);
/// Is Spotlight enabled?
bool isSpotlight() const;
/** setup the spot AngleBegin and AngleEnd that define spot attenuation of the light. Useful only if SpotLight
* NB: clamp(angleBegin, 0, PI); clamp(angleEnd, angleBegin, PI); Default is PI/4, PI/2
*/
void setupSpotAngle(float spotAngleBegin, float spotAngleEnd);
/// get the begin radius of the SpotAngles.
float getSpotAngleBegin() const;
/// get the end radius of the SpotAngles.
float getSpotAngleEnd() const;
/** setup the deltaPosToSkeletonWhenOutOfFrustum
* When a light is sticked to a skeleton, and if this skeleton is clipped, then the position of the light
* can't be computed correctly without animating the skeleton. To allow good position of the light,
* and to avoid recomputing the skeleton even if it is clipped, the light position is set to
* skeletonMatrix * this "deltaPosToSkeletonWhenOutOfFrustum".
*
* Default is (0, 0, 1.5).
* You may change this according to the approximate size of the skeleton (dwarf or giant), and you must
* take into account any mount (horse etc...). eg for a man on a elephant, a good value would be (0,0,5) :)
*/
void setDeltaPosToSkeletonWhenOutOfFrustum(const CVector &deltaPos);
/// see setDeltaPosToSkeletonWhenOutOfFrustum()
const CVector &getDeltaPosToSkeletonWhenOutOfFrustum() const;
/** Special For Lightmap dynamic Lighting. if true, this light will influence lightmaped objects.
* Lightmaped objects can be lighted by ONLY ONE (preference big) dynamic light.
* If you setup multiple CPointLightModel with this flag, then it will randomly choose between one
* of those visible lights.
* NB: Lighting is made hardware per vertex.
*/
void setInfluenceLightMap(bool enable);
bool getInfluenceLightMap() const;
/// Proxy interface
/// Constructors
UPointLight() { _Object = NULL; }
UPointLight(class CPointLightModel *object) { _Object = (ITransformable*)object; };
/// Attach an object to this proxy
void attach(class CPointLightModel *object) { _Object = (ITransformable*)object; }
/// Detach the object
void detach() { _Object = NULL; }
/// Return true if the proxy is empty() (not attached)
bool empty() const {return _Object==NULL;}
/// For advanced usage, get the internal object ptr
class CPointLightModel *getObjectPtr() const {return (CPointLightModel*)_Object;}
};
} // NL3D
#endif // NL_U_POINT_LIGHT_H
/* End of u_point_light.h */