/*
--------------------------------------------------------------------------------
This source file is part of SkyX.

Copyright (C) 2011 I-maginer <contact@i-maginer.com>

Adapted from Xavier Verguín González initial work:
Copyright (C) 2009 Xavier Verguín González <xavierverguin@hotmail.com>
                                           <xavyiy@gmail.com>

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 2 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 Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA, or go to
http://www.gnu.org/copyleft/lesser.txt.
--------------------------------------------------------------------------------
*/

#ifndef _SkyX_AstronomicalModel_H_
#define _SkyX_AstronomicalModel_H_

#include "SkyxPrerequisites.h"

namespace SkyX
{

  /*!
  Provide an abstracted way to access to sun & moon computed light directions (the basic model provided with skyx does not satisfied me).
  */
  class SkyXDllExport AstronomicalModel
  {
  public:
  protected:
  private:

  public:
    /*!
    ctor
    */
    AstronomicalModel();

    /*!
    dtor
    */
    ~AstronomicalModel();

    /*!
    Returns the computed sun light direction.
    */
    virtual const Ogre::Vector3 getSunDirection()=0;

    /*!
    Returns the computed moon light direction.
    */
    virtual const Ogre::Vector3 getMoonDirection()=0;

    /*!
    Returns the computed moon phase (values range [-1.0, 1.0]).
    */
    virtual const Ogre::Real getMoonPhase()=0;

    /*!
    Update the computation params if needed.
    @remarks Note that it's not the "time since last frame", it's the amount of time (in seconds) by which we want to advance the simulation.
    */
    virtual void update(const Ogre::Real& advanceTime)=0;
  protected:
  private:
  };

}

#endif
