/**
 * @file lltreeparams.cpp
 * @brief implementation of the LLTreeParams class.
 *
 * $LicenseInfo:firstyear=2001&license=viewerlgpl$
 * Second Life Viewer Source Code
 * Copyright (C) 2010, Linden Research, Inc.
 *
 * This library 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;
 * version 2.1 of the License only.
 *
 * This library 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 library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 * $/LicenseInfo$
 */

//////////////////////////////////////////////////////////////////////

#include "linden_common.h"

#include "llmath.h"

#include "lltreeparams.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


LLTreeParams::LLTreeParams()
{

//  LL_INFOS() << "TREE PARAMS INITIALIZED" << LL_ENDL;
    // init to basic something or other...
    mShape = SR_TEND_FLAME;
    mLevels = 1;
    mScale = 15;
    mScaleV = 0;

    mBaseSize = 0.3f;

    mRatio = 0.015f;
    mRatioPower = 1.3f;

    mLobes = 0;
    mLobeDepth = .1f;

    mFlare = 1.2f;
    mFlarePercentage = 0.1f;
    mFlareRes = 3;

    //mAttractionUp = .5f;

    mBaseSplits = 0;

    mScale0 = 2.0;
    mScaleV0 = 0.0;

    // level 0

    // scaling
    mLength[0] = 1.0f;
    mLengthV[0] = 0;
    mTaper[0] = 1.0f;

    // stem splits
    mSegSplits[0] = 0.15f;
    mSplitAngle[0] = 15.0f;
    mSplitAngleV[0] = 10.0f;

    mVertices[0] = 5;

    // curvature
    mCurveRes[0] = 4;
    mCurve[0] = 0;
    mCurveV[0] = 25;
    mCurveBack[0] = 0;

    // level 1

    // scaling
    mLength[1] = .3f;
    mLengthV[1] = 0.05f;
    mTaper[1] = 1.0f;

    // angle params
    mDownAngle[0] = 60.0f;
    mDownAngleV[0] = 20.0f;
    mRotate[0] = 140.0f;
    mRotateV[0] = 0.0f;
    mBranches[0] = 35;

    mVertices[1] = 3;

    // stem splits
    mSplitAngle[1] = 0.0f;
    mSplitAngleV[1] = 0.0f;
    mSegSplits[1] = 0.0f;

    // curvature
    mCurveRes[1] = 4;
    mCurve[1] = 0;
    mCurveV[1] = 0;
    mCurveBack[1] = 40;

    // level 2
    mLength[2] = .6f;
    mLengthV[2] = .1f;
    mTaper[2] = 1;

    mDownAngle[1] = 30;
    mDownAngleV[1] = 10;
    mRotate[1] = 140;
    mRotateV[1] = 0;

    mBranches[1] = 20;
    mVertices[2] = 3;

    mSplitAngle[2] = 0;
    mSplitAngleV[2] = 0;
    mSegSplits[2] = 0;

    mCurveRes[2] = 3;
    mCurve[2] = 10;
    mCurveV[2] = 150;
    mCurveBack[2] = 0;

    // level 3
    mLength[3] = .4f;
    mLengthV[3] = 0;
    mTaper[3] = 1;

    mDownAngle[2] = 45;
    mDownAngleV[2] = 10;
    mRotate[2] = 140;
    mRotateV[2] = 0;

    mBranches[2] = 5;
    mVertices[3] = 3;


    mSplitAngle[3] = 0;
    mSplitAngleV[3] = 0;
    mSegSplits[3] = 0;

    mCurveRes[3] = 2;
    mCurve[3] = 0;
    mCurveV[3] = 0;
    mCurveBack[3] = 0;

    mLeaves = 0;
    mLeafScaleX = 1.0f;
    mLeafScaleY = 1.0f;

    mLeafQuality = 1.25;
}

LLTreeParams::~LLTreeParams()
{

}

F32 LLTreeParams::ShapeRatio(EShapeRatio shape, F32 ratio)
{
    switch (shape) {
        case (SR_CONICAL):
            return (.2f + .8f * ratio);
        case (SR_SPHERICAL):
            return (.2f + .8f * sinf(F_PI*ratio));
        case (SR_HEMISPHERICAL):
            return (.2f + .8f * sinf(.5*F_PI*ratio));
        case (SR_CYLINDRICAL):
            return (1);
        case (SR_TAPERED_CYLINDRICAL):
            return (.5f + .5f * ratio);
        case (SR_FLAME):
            if (ratio <= .7f) {
                return ratio/.7f;
            } else {
                return ((1 - ratio)/.3f);
            }
        case (SR_INVERSE_CONICAL):
            return (1 - .8f * ratio);
        case (SR_TEND_FLAME):
            if (ratio <= .7) {
                return (.5f + .5f*(ratio/.7f));
            } else {
                return (.5f + .5f * (1 - ratio)/.3f);
            }
        case (SR_ENVELOPE):
            return 1;
        default:
            return 1;
    }
}