/*==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 __HSMAXLAYERBASE_H
#define __HSMAXLAYERBASE_H

#include "stdmat.h"

#define HSMAX_LAYER_CLASS_ID 0x41990fe7

const Class_ID hsMaxLayerClassID(HSMAX_LAYER_CLASS_ID, 0x72404998);
const Class_ID hsMaxMtlClassID(0x2f335902, 0x111d2ea7);
const Class_ID hsEnvironMapMtlClassID(0x98777b3, 0x5eb270dd);

class hsMaxLayerBase : public BitmapTex {
public:
   enum hsMatBlendFlags {
        kBlendTest	= 0x1,							// dev
            // Rest of blends are mutually exclusive
            kBlendAlpha						= 0x2,		// dev
            kBlendMult						= 0x4,		// dev
            kBlendAdd						= 0x8,		// dev
            kBlendAddColorTimesAlpha		= 0x10,		// dev
            kBlendAntiAlias					= 0x20,
            kBlendDetail					= 0x40,
            kBlendDetailAdd                 = 0x80,
            kBlendMask						= kBlendAlpha
            | kBlendMult
            | kBlendAdd
            | kBlendAddColorTimesAlpha
            | kBlendAntiAlias
            | kBlendDetail
            | kBlendDetailAdd,
            kBlendInvertAlpha				= 0x1000,	// dev
            kBlendInvertColor				= 0x2000,	// dev
			kBlendAlphaMult					= 0x4000,
			kBlendAlphaAdd					= 0x8000,
			kBlendNoColor					= 0x10000,
			kBlendNoVtxAlpha				= 0x20000
    };
    
   enum hsMatZFlags {
       kZIncLayer			= 0x1, // dev
           kZOnlyZ				= 0x2,		// dev
           kZClearZ			= 0x4, // dev
           kZNoZRead			= 0x8, // dev
           kZNoZWrite			= 0x10,
           kZMask				= kZNoZWrite | kZClearZ | kZNoZRead,
           kZLODBias			= 0x20
   };

    enum hsMatShadeFlags {
        kShadeSoftShadow		= 0x1,			// view, dev
            kShadeNoProjectors		= 0x2,			// projector
            kShadeVertexShade		= 0x20,			// dev
            kShadeNoShade			= 0x40,			// view,dev
            kShadeBlack				= kShadeNoShade,
            kShadeSpecular			= 0x80,			// view, dev
            kShadeNoFog				= 0x100,		// dev
            kShadeWhite				= 0x200,
            kShadeSpecularAlpha		= 0x400,
            kShadeSpecularColor		= 0x800,
            kShadeSpecularHighlight	= 0x1000,
	        kShadeVertColShade		= 0x2000,
            kShadeInherit           = 0x4000
    };

    enum hsMatMiscFlags {
        kMiscWireFrame			= 0x1,			// dev (running out of bits)
            kMiscDrawMeshOutlines	= 0x2,			// dev, currently unimplemented
            kMiscTwoSided			= 0x4,			// view,dev
            kMiscDrawAsSplats		= 0x8,			// dev? bwt
            kMiscMipMap             = 0x10,
            kMiscUseBitmap          = 0x20,
            kMiscIntensityOnly      = 0x40,
            kMiscAutoStart          = 0x80,
            kMiscDetailBias         = 0x100,    // obsolete...
            kMiscDetailMax          = 0x200,    // obsolete...
            kMiscExplicitMipmap     = 0x400,
            kMiscAdjustPlane		= 0x800,
            kMiscAdjustCylinder		= 0x1000,
            kMiscAdjustSphere		= 0x2000,
            kMiscTroubledLoner		= 0x4000,
			kMiscBindSkip			= 0x8000,
			kMiscBindMask			= 0x10000,
			kMiscForceNonCompressed	= 0x20000,
			kMiscNoMaxSize			= 0x40000,
			kMiscHalfSize			= 0x80000,
			kMiscBindNext			= 0x100000,
			kMiscBindPrev			= 0x200000,
			kMiscReserved			= 0x400000
    };

	enum ProcType {
		kProcTypeDefault,
		kProcTypeWater
	};

	enum hsMatUsage {
		kUseNone		= 0x0,
		kUseBase		= 0x1,
		kUseDetail		= 0x2,
		kUseGrime		= 0x4,
		kUseTransition	= 0x8,
		kUseHighlight	= 0x10,
		kUseMask		= 0x20,
		kUseShadowLight	= 0x40,
		kUseHelper		= 0x80,
		
		kUseGuess		= 0x10000000
	};

public:
    // For hsMaxMtl...  Special case for higher layers.  Sigh.
    virtual void SetDirty(BOOL state) = 0;
    virtual void SetBlendFlag(int i, BOOL state) = 0;
    virtual void SetZFlag(int flag, BOOL state) = 0;
    virtual void SetShadeFlag(int flag, BOOL state) = 0;
    virtual void SetMiscFlag(int flag, BOOL state) = 0;
	virtual void SetProcType(ProcType type) = 0;
	virtual void SetUsage(hsMatUsage use) = 0;
	virtual void GuessUsage() = 0;

    // For interactive renderer
    virtual Color GetAmbient(int mtlNum=0, BOOL backFace=FALSE) = 0;
    virtual Color GetColor(int mtlNum=0, BOOL backFace=FALSE) = 0;

    virtual float GetShininess(int mtlNum=0, BOOL backFace=FALSE) = 0;
    virtual float GetShinStr(int mtlNum=0, BOOL backFace=FALSE) = 0;
    virtual float GetOpacity(int mtlNum=0, BOOL backFace=FALSE) = 0;

    // For exporter
    virtual Color GetAmbient(TimeValue t) const = 0;
    virtual Color GetColor(TimeValue t) const = 0;        
    
    virtual float GetShininess(TimeValue t) const = 0;
    virtual float GetShinStr(TimeValue t) const = 0;
    virtual float GetMapPercent(TimeValue t) const = 0;
    virtual float GetOpacity(TimeValue t) const = 0;
    virtual float GetMipMapBlur(TimeValue t) const = 0;
    virtual float GetLODBias(TimeValue t) const = 0;
    virtual float GetDetailDropoffStart(TimeValue t) const = 0;
    virtual float GetDetailDropoffStop(TimeValue t) const = 0;
    virtual float GetDetailMax(TimeValue t) const = 0;
    virtual float GetDetailMin(TimeValue t) const = 0;
    virtual int GetEnvironMapSize(TimeValue t) const = 0;

    virtual BOOL GetDirty() const = 0;
    virtual ULONG GetBlendFlags() const = 0;
    virtual ULONG GetZFlags() const = 0;
    virtual ULONG GetShadeFlags() const = 0;
    virtual ULONG GetMiscFlags() const = 0;
	virtual ProcType GetProcType() const = 0;
	virtual hsMatUsage GetUsage() const = 0;

    virtual int GetNumExplicitMipmaps() const = 0;
    virtual TCHAR *GetExplicitMipmapName(int i) const = 0;
    virtual BOOL ExplicitMipmapEnabled(int i) const = 0;
    virtual int GetExplicitMipmapLevel(int i) const = 0;

	// KLUDGE - Had to do this to compile under MAX4 beta
	virtual void fnReload() {};
	virtual void fnViewImage() {};
};

#endif