//-----------------------------------------------------------------------------
// Torque Game Engine - fxLight
//
// Written by Melvyn May, 27th August 2002.
//-----------------------------------------------------------------------------

#ifndef _FXSUNLIGHT_H_
#define _FXSUNLIGHT_H_

#ifndef _SCENEOBJECT_H_
#include "sim/sceneObject.h"
#endif


//------------------------------------------------------------------------------
// Class: fxSunLight
//------------------------------------------------------------------------------
class fxSunLight : public SceneObject
{
private:
   typedef SceneObject      Parent;

   U32 CheckKeySyntax(StringTableEntry Key);
   void CheckAnimationKeys(void);
   F32 GetLerpKey(StringTableEntry Key, U32 PosFrom, U32 PosTo, F32 ValueFrom, F32 ValueTo, F32 Lerp);
   void AnimateSun(F32 ElapsedTime);
   void InitialiseAnimation(void);
   void ResetAnimation(void);
   bool TestLOS(const Point3F& Pos);


protected:

   enum {   fxSunLightConfigChangeMask      = BIT(0) };

   bool                 mAddedToScene;

   MRandomLCG           RandomGen;

   // Textures.
   TextureHandle        mLocalFlareTextureHandle;
   TextureHandle        mRemoteFlareTextureHandle;

   F32                  mElapsedTime;
   S32                  mLastRenderTime;
   F32                  mLocalFlareScale;
   Point3F              mSunlightPosition;            // Sunlight Frame Position.

public:
   fxSunLight();
   ~fxSunLight();

   // *********************************
   // Configuration Interface.
   // *********************************

   // Debugging.
   void setEnable(bool Status);

   // Media.
   void setFlareBitmaps(const char* LocalName, const char* RemoteName);

   // Sun Orbit.
   void setSunAzimuth(F32 Azimuth);
   void setSunElevation(F32 Elevation);

   // Flare.
   void setFlareTP(bool Status);
   void setFlareColour(ColorF Colour);
   void setFlareBrightness(F32 Brightness);
   void setFlareSize(F32 Size);
   void setFadeTime(F32 Time);
   void setBlendMode(U32 Mode);

   // Animation Options.
   void setUseColour(bool Status);
   void setUseBrightness(bool Status);
   void setUseRotation(bool Status);
   void setUseSize(bool Status);
   void setUseAzimuth(bool Status);
   void setUseElevation(bool Status);
   void setLerpColour(bool Status);
   void setLerpBrightness(bool Status);
   void setLerpRotation(bool Status);
   void setLerpSize(bool Status);
   void setLerpAzimuth(bool Status);
   void setLerpElevation(bool Status);
   void setLinkFlareSize(bool Status);
   void setSingleColourKeys(bool Status);

   // Animation Extents.
   void setMinColour(ColorF Colour);
   void setMaxColour(ColorF Colour);
   void setMinBrightness(F32 Brightness);
   void setMaxBrightness(F32 Brightness);
   void setMinRotation(F32 Rotation);
   void setMaxRotation(F32 Rotation);
   void setMinSize(F32 Size);
   void setMaxSize(F32 Size);
   void setMinAzimuth(F32 Azimuth);
   void setMaxAzimuth(F32 Azimuth);
   void setMinElevation(F32 Elevation);
   void setMaxElevation(F32 Elevation);

   // Animation Keys.
   void setRedKeys(const char* Keys);
   void setGreenKeys(const char* Keys);
   void setBlueKeys(const char* Keys);
   void setBrightnessKeys(const char* Keys);
   void setRotationKeys(const char* Keys);
   void setSizeKeys(const char* Keys);
   void setAzimuthKeys(const char* Keys);
   void setElevationKeys(const char* Keys);

   // Animation Times.
   void setColourTime(F32 Time);
   void setBrightnessTime(F32 Time);
   void setRotationTime(F32 Time);
   void setSizeTime(F32 Time);
   void setAzimuthTime(F32 Time);
   void setElevationTime(F32 Time);

   // Misc,
   void reset(void);

   // SceneObject
   bool prepRenderImage(SceneState* state, const U32 stateKey, const U32 startZone, const bool modifyBaseZoneState);
   void renderObject(SceneState *state, SceneRenderImage *image);

   // SimObject
   bool onAdd();
   void onRemove();
   void inspectPostApply();

   // NetObject
   U32 packUpdate(NetConnection *conn, U32 mask, BitStream *stream);
   void unpackUpdate(NetConnection *conn, BitStream *stream);

   // ConObject.
   static void initPersistFields();

   bool				   mDoneSunLock;

   // Field Data.

   // Debugging.
   bool              mEnable;                  // Light Enable.

   // Media.
    StringTableEntry mLocalFlareTextureName;         // Local Flare Texture Name.
    StringTableEntry mRemoteFlareTextureName;      // Remote Flare Texture Name.

   // Sun Orbit.
   F32               mSunAzimuth;
   F32               mSunElevation;
   bool				   mLockToRealSun;			// Lock to Real Sun Flag.

   // Flare.
   bool				   mFlareTP;                  // Flare Third Person Flag.
   ColorF            mFlareColour;               // Flare Colour.
   F32               mFlareBrightness;            // Brightness.
   F32               mFlareSize;                  // Flare Size.
   F32               mFadeTime;                  // Fade Time.
   U32               mBlendMode;                  // Blend Mode.

   // Animation Options.
   bool              mUseColour;                  // Use Colour Flag.
   bool              mUseBrightness;               // Use Brightness Flag.
   bool              mUseRotation;               // Use Rotation Flag.
   bool              mUseSize;                  // Use Size Flag.
   bool              mUseAzimuth;               // Use Azimuth Flag.
   bool              mUseElevation;               // Use Elevation Flag.
   bool              mLerpColour;               // Lerp Colour Flag.
   bool              mLerpBrightness;            // Lerp Brightness Flag.
   bool              mLerpRotation;               // Lerp Rotation Flag.
   bool              mLerpSize;                  // Lerp Size Flag.
   bool              mLerpAzimuth;               // Lerp Azimuth Flag.
   bool              mLerpElevation;               // Lerp Elevation Flag.
   bool              mLinkFlareSize;               // Link Flare Size Animation.
   bool              mSingleColourKeys;            // Single-Channel Colour Keys.

   // Animation Extents.
   ColorF            mMinColour;                  // Minimum Colour.
   ColorF            mMaxColour;                  // Maximum Colour.
   F32               mMinBrightness;               // Minimum Brightness.
   F32               mMaxBrightness;               // Maximum Brightness.
   F32               mMinRotation;               // Minimum Rotation.
   F32               mMaxRotation;               // Maximum Rotation.
   F32               mMinSize;                  // Minimum Size.
   F32               mMaxSize;                  // Maximum Size.
   F32               mMinAzimuth;               // Minimum Azimuth.
   F32               mMaxAzimuth;               // Maximum Azimuth.
   F32               mMinElevation;               // Minimum Elevation.
   F32               mMaxElevation;               // Maximum Elevation.

   // Animation Keys.
   StringTableEntry  mRedKeys;                  // Red Animation Keys.
   StringTableEntry  mGreenKeys;                  // Green Animation Keys.
   StringTableEntry  mBlueKeys;                  // Blue Animation Keys.
   StringTableEntry  mBrightnessKeys;            // Brightness Animation Keys.
   StringTableEntry  mRotationKeys;               // Rotation Animation Keys.
   StringTableEntry  mSizeKeys;                  // Size Animation Keys.
   StringTableEntry  mAzimuthKeys;               // Size Azimuth Keys.
   StringTableEntry  mElevationKeys;               // Size Elevation Keys.

   // Animation Times.
   F32               mColourTime;               // Colour Time (Seconds).
   F32               mBrightnessTime;            // Brightness Time.
   F32               mRotationTime;               // Rotation Time.
   F32               mSizeTime;                  // Size Time.
   F32               mAzimuthTime;               // Azimuth Time.
   F32               mElevationTime;               // Elevation Time.

   // Current Animation.
   ColorF            mAnimationColour;            // Current Colour.
   F32               mAnimationBrightness;         // Current Brightness.
   F32               mAnimationRotation;            // Current Rotation.
   F32               mAnimationSize;               // Current Size.
   F32               mAnimationAzimuth;            // Current Azimuth.
   F32               mAnimationElevation;         // Current Elevation.

   // Elapsed Times.
   F32               mColourElapsedTime;            // Colour Elapsed Time.
   F32               mBrightnessElapsedTime;         // Brightness Elapsed Time.
   F32               mRotationElapsedTime;         // Rotation Elapsed Time.
   F32               mSizeElapsedTime;            // Size Elapsed Time.
   F32               mAzimuthElapsedTime;         // Azimuth Elapsed Time.
   F32               mElevationElapsedTime;         // Elevation Elapsed Time.

   // Time Scales.
   F32               mColourTimeScale;            // Colour Time Scale.
   F32               mBrightnessTimeScale;         // Brightness Time Scale.
   F32               mRotationTimeScale;            // Rotation Time Scale.
   F32               mSizeTimeScale;               // Size Time Scale.
   F32               mAzimuthTimeScale;            // Azimuth Time Scale.
   F32               mElevationTimeScale;         // Elevation Time Scale.

   // Key Lengths (Validity).
   U32               mRedKeysLength;               // Red Keys Length.
   U32               mGreenKeysLength;            // Green Keys Length.
   U32               mBlueKeysLength;            // Blue Keys Length.
   U32               mBrightnessKeysLength;         // Brightness Keys Length.
   U32               mRotationKeysLength;         // Rotation Keys Length.
   U32               mSizeKeysLength;            // Size Keys Length.
   U32               mAzimuthKeysLength;            // Azimuth Keys Length.
   U32               mElevationKeysLength;         // Elevation Keys Length.

   // Declare Console Object.
   DECLARE_CONOBJECT(fxSunLight);
};

#endif // _FXSUNLIGHT_H_