/*==LICENSE==*

CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011  Cyan Worlds, Inc.

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/>.

You can contact Cyan Worlds, Inc. by email legal@cyan.com
 or by snail mail at:
      Cyan Worlds, Inc.
      14617 N Newport Hwy
      Mead, WA   99021

*==LICENSE==*/

#ifndef plFixedWaterState7_inc
#define plFixedWaterState7_inc

#include "hsGeometry3.h"
#include "hsColorRGBA.h"
#include "pnTimer/plTimedValue.h"

class hsStream;

class plFixedWaterState7
{
public:
    class WaveState
    {
    public:
        plTimedSimple<hsScalar>     fMaxLength;
        plTimedSimple<hsScalar>     fMinLength;
        plTimedSimple<hsScalar>     fAmpOverLen;
        plTimedSimple<hsScalar>     fChop;
        plTimedSimple<hsScalar>     fAngleDev;

        void Set(const WaveState& w, hsScalar secs);

        void Read(hsStream* s);
        void Write(hsStream* s) const;
    };
    // Main body of water state

    // Geometric waves
    WaveState                   fGeoState;

    // Texture waves
    WaveState                   fTexState;
    plTimedSimple<hsScalar>     fRippleScale;

    // Geometric and Texture share wind direction
    plTimedCompound<hsVector3>      fWindDir;

    // Level of noise added during summation of texture waves
    enum {
        kNoise  = 0,
        kSpecStart = 1,
        kSpecEnd = 2
    };
    plTimedCompound<hsVector3>      fSpecVec; // (Noise, SpecStart, SpecEnd);

    // Depth parameters. Affect how the depth of
    // the water vertex is interpreted into water
    // surface properties.
    plTimedSimple<hsScalar>         fWaterHeight;
    plTimedCompound<hsVector3>      fWaterOffset;
    plTimedCompound<hsVector3>      fMaxAtten;
    plTimedCompound<hsVector3>      fMinAtten;
    plTimedCompound<hsVector3>      fDepthFalloff;

    // Shore parameters

    // Appearance
    plTimedSimple<hsScalar>     fWispiness;
    plTimedCompound<hsColorRGBA>        fShoreTint;
    // Next two only used in generation of bubble layer
    plTimedCompound<hsColorRGBA>        fMaxColor;
    plTimedCompound<hsColorRGBA>        fMinColor;
    plTimedSimple<hsScalar>     fEdgeOpac;
    plTimedSimple<hsScalar>     fEdgeRadius;

    // Simulation
    plTimedSimple<hsScalar>     fPeriod;
    plTimedSimple<hsScalar>     fFingerLength;

    // The rest aren't really part of the state, that is they are normally controlled
    // by something exterior to the state. They are included here to allow a convenient
    // override during development.

    // Water appearance.
    plTimedCompound<hsColorRGBA>        fWaterTint;
    plTimedCompound<hsColorRGBA>        fSpecularTint;

    plTimedCompound<hsPoint3>       fEnvCenter;
    plTimedSimple<hsScalar>     fEnvRefresh;
    plTimedSimple<hsScalar>     fEnvRadius;

    void Set(const plFixedWaterState7& s, hsScalar secs);

    void Read(hsStream* s);
    void Write(hsStream* s) const;
};


#endif // plFixedWaterState7_inc