// Copyright (c) 2012- PPSSPP Project.

// 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, version 2.0 or later versions.

// 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 2.0 for more details.

// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/

// Official git repository and contact information can be found at
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.

#ifndef _GE_CONSTANTS_H
#define _GE_CONSTANTS_H

enum GECommand
{
	GE_CMD_NOP = 0,
	GE_CMD_VADDR=0x1,
	GE_CMD_IADDR=0x2,
	GE_CMD_PRIM=0x4,
	GE_CMD_BEZIER=0x5,
	GE_CMD_SPLINE=0x6,
	GE_CMD_BOUNDINGBOX=0x7,
	GE_CMD_JUMP=0x8,
	GE_CMD_BJUMP=0x9,
	GE_CMD_CALL=0xA,
	GE_CMD_RET=0xB,
	GE_CMD_END=0xC,
	GE_CMD_SIGNAL=0xE,
	GE_CMD_FINISH=0xF,
	GE_CMD_BASE=0x10,
	GE_CMD_VERTEXTYPE=0x12,
	GE_CMD_OFFSETADDR=0x13,
	GE_CMD_ORIGIN=0x14,
	GE_CMD_REGION1=0x15,
	GE_CMD_REGION2=0x16,
	GE_CMD_LIGHTINGENABLE=0x17,
	GE_CMD_LIGHTENABLE0=0x18,
	GE_CMD_LIGHTENABLE1=0x19,
	GE_CMD_LIGHTENABLE2=0x1a,
	GE_CMD_LIGHTENABLE3=0x1b,
	GE_CMD_CLIPENABLE=0x1c,
	GE_CMD_CULLFACEENABLE,
	GE_CMD_TEXTUREMAPENABLE,
	GE_CMD_FOGENABLE,
	GE_CMD_DITHERENABLE,
	GE_CMD_ALPHABLENDENABLE=0x21,
	GE_CMD_ALPHATESTENABLE=0x22,
	GE_CMD_ZTESTENABLE=0x23,
	GE_CMD_STENCILTESTENABLE=0x24,
	GE_CMD_ANTIALIASENABLE=0x25,
	GE_CMD_PATCHCULLENABLE=0x26,
	GE_CMD_COLORTESTENABLE=0x27,
	GE_CMD_LOGICOPENABLE=0x28,
	GE_CMD_BONEMATRIXNUMBER=0x2A,
	GE_CMD_BONEMATRIXDATA=0x2B,
	GE_CMD_MORPHWEIGHT0=0x2C,
	GE_CMD_MORPHWEIGHT1=0x2D,
	GE_CMD_MORPHWEIGHT2=0x2E,
	GE_CMD_MORPHWEIGHT3=0x2F,
	GE_CMD_MORPHWEIGHT4=0x30,
	GE_CMD_MORPHWEIGHT5=0x31,
	GE_CMD_MORPHWEIGHT6=0x32,
	GE_CMD_MORPHWEIGHT7=0x33,
	GE_CMD_PATCHDIVISION=0x36,
	GE_CMD_PATCHPRIMITIVE=0x37,
	GE_CMD_PATCHFACING=0x38,
	GE_CMD_WORLDMATRIXNUMBER=0x3A,
	GE_CMD_WORLDMATRIXDATA,
	GE_CMD_VIEWMATRIXNUMBER,
	GE_CMD_VIEWMATRIXDATA,
	GE_CMD_PROJMATRIXNUMBER,
	GE_CMD_PROJMATRIXDATA,
	GE_CMD_TGENMATRIXNUMBER=0x40,
	GE_CMD_TGENMATRIXDATA=0x41,
	GE_CMD_VIEWPORTX1,
	GE_CMD_VIEWPORTY1,
	GE_CMD_VIEWPORTZ1,
	GE_CMD_VIEWPORTX2,
	GE_CMD_VIEWPORTY2,
	GE_CMD_VIEWPORTZ2,
	GE_CMD_TEXSCALEU=0x48,
	GE_CMD_TEXSCALEV=0x49,
	GE_CMD_TEXOFFSETU=0x4A,
	GE_CMD_TEXOFFSETV=0x4B,
	GE_CMD_OFFSETX=0x4C,
	GE_CMD_OFFSETY=0x4D,
	GE_CMD_SHADEMODE=0x50,  // flat or gouraud
	GE_CMD_REVERSENORMAL=0x51,
	GE_CMD_MATERIALUPDATE=0x53,
	GE_CMD_MATERIALEMISSIVE, //not sure about these but this makes sense
	GE_CMD_MATERIALAMBIENT,  //gotta try enabling lighting and check :)
	GE_CMD_MATERIALDIFFUSE=0x56,
	GE_CMD_MATERIALSPECULAR=0x57,
	GE_CMD_MATERIALALPHA=0x58,
	GE_CMD_MATERIALSPECULARCOEF=0x5B,
	GE_CMD_AMBIENTCOLOR,
	GE_CMD_AMBIENTALPHA,
	GE_CMD_LIGHTMODE=0x5E,
	GE_CMD_LIGHTTYPE0=0x5F,
	GE_CMD_LIGHTTYPE1=0x60,
	GE_CMD_LIGHTTYPE2=0x61,
	GE_CMD_LIGHTTYPE3=0x62,
	GE_CMD_LX0=0x63,
	GE_CMD_LY0,
	GE_CMD_LZ0,
	GE_CMD_LX1,
	GE_CMD_LY1,
	GE_CMD_LZ1,
	GE_CMD_LX2,
	GE_CMD_LY2,
	GE_CMD_LZ2,
	GE_CMD_LX3,
	GE_CMD_LY3,
	GE_CMD_LZ3,
	GE_CMD_LDX0=0x6F,
	GE_CMD_LDY0,
	GE_CMD_LDZ0,
	GE_CMD_LDX1,
	GE_CMD_LDY1,
	GE_CMD_LDZ1,
	GE_CMD_LDX2,
	GE_CMD_LDY2,
	GE_CMD_LDZ2,
	GE_CMD_LDX3,
	GE_CMD_LDY3,
	GE_CMD_LDZ3,
	GE_CMD_LKA0=0x7B,
	GE_CMD_LKB0,
	GE_CMD_LKC0,
	GE_CMD_LKA1,
	GE_CMD_LKB1,
	GE_CMD_LKC1,
	GE_CMD_LKA2,
	GE_CMD_LKB2,
	GE_CMD_LKC2,
	GE_CMD_LKA3,
	GE_CMD_LKB3,
	GE_CMD_LKC3,
	GE_CMD_LKS0=0x87,
	GE_CMD_LKS1,
	GE_CMD_LKS2,
	GE_CMD_LKS3,
	GE_CMD_LKO0=0x8b,
	GE_CMD_LKO1,
	GE_CMD_LKO2,
	GE_CMD_LKO3,
	GE_CMD_LAC0=0x8F,
	GE_CMD_LDC0,
	GE_CMD_LSC0,
	GE_CMD_LAC1,
	GE_CMD_LDC1,
	GE_CMD_LSC1,
	GE_CMD_LAC2,
	GE_CMD_LDC2,
	GE_CMD_LSC2,
	GE_CMD_LAC3,
	GE_CMD_LDC3,
	GE_CMD_LSC3,
	GE_CMD_CULL=0x9B,
	GE_CMD_FRAMEBUFPTR=0x9C,
	GE_CMD_FRAMEBUFWIDTH=0x9D,
	GE_CMD_ZBUFPTR=0x9E,
	GE_CMD_ZBUFWIDTH=0x9F,
	GE_CMD_TEXADDR0=0xA0,
	GE_CMD_TEXADDR1,
	GE_CMD_TEXADDR2,
	GE_CMD_TEXADDR3,
	GE_CMD_TEXADDR4,
	GE_CMD_TEXADDR5,
	GE_CMD_TEXADDR6,
	GE_CMD_TEXADDR7,
	GE_CMD_TEXBUFWIDTH0=0xA8,
	GE_CMD_TEXBUFWIDTH1,
	GE_CMD_TEXBUFWIDTH2,
	GE_CMD_TEXBUFWIDTH3,
	GE_CMD_TEXBUFWIDTH4,
	GE_CMD_TEXBUFWIDTH5,	
	GE_CMD_TEXBUFWIDTH6,
	GE_CMD_TEXBUFWIDTH7,
	GE_CMD_CLUTADDR=0xB0,
	GE_CMD_CLUTADDRUPPER,
	GE_CMD_TRANSFERSRC,
	GE_CMD_TRANSFERSRCW,
	GE_CMD_TRANSFERDST,
	GE_CMD_TRANSFERDSTW,
	GE_CMD_TEXSIZE0=0xB8,
	GE_CMD_TEXSIZE1,
	GE_CMD_TEXSIZE2,
	GE_CMD_TEXSIZE3,
	GE_CMD_TEXSIZE4,
	GE_CMD_TEXSIZE5,
	GE_CMD_TEXSIZE6,
	GE_CMD_TEXSIZE7,
	GE_CMD_TEXMAPMODE=0xC0,
	GE_CMD_TEXSHADELS=0xC1,
	GE_CMD_TEXMODE=0xC2,
	GE_CMD_TEXFORMAT=0xC3,
	GE_CMD_LOADCLUT=0xC4,
	GE_CMD_CLUTFORMAT=0xC5,
	GE_CMD_TEXFILTER=0xC6,
	GE_CMD_TEXWRAP=0xC7,
	GE_CMD_TEXLEVEL=0xC8,
	GE_CMD_TEXFUNC=0xC9,
	GE_CMD_TEXENVCOLOR=0xCA,
	GE_CMD_TEXFLUSH=0xCB,
	GE_CMD_TEXSYNC=0xCC,
	GE_CMD_FOG1=0xCD,
	GE_CMD_FOG2=0xCE,
	GE_CMD_FOGCOLOR=0xCF,
	GE_CMD_TEXLODSLOPE=0xD0,
	GE_CMD_FRAMEBUFPIXFORMAT=0xD2,
	GE_CMD_CLEARMODE=0xD3,
	GE_CMD_SCISSOR1=0xD4,
	GE_CMD_SCISSOR2=0xD5,
	GE_CMD_MINZ=0xD6,
	GE_CMD_MAXZ=0xD7,
	GE_CMD_COLORTEST=0xD8,
	GE_CMD_COLORREF=0xD9,
	GE_CMD_COLORTESTMASK=0xDA,
	GE_CMD_ALPHATEST=0xDB,
	GE_CMD_STENCILTEST=0xDC,
	GE_CMD_STENCILOP=0xDD,
	GE_CMD_ZTEST=0xDE,
	GE_CMD_BLENDMODE=0xDF,
	GE_CMD_BLENDFIXEDA=0xE0,
	GE_CMD_BLENDFIXEDB=0xE1,				
	GE_CMD_DITH0=0xE2,
	GE_CMD_DITH1,
	GE_CMD_DITH2,
	GE_CMD_DITH3,
	GE_CMD_LOGICOP=0xE6,
	GE_CMD_ZWRITEDISABLE=0xE7,
	GE_CMD_MASKRGB=0xE8,
	GE_CMD_MASKALPHA=0xE9,
	GE_CMD_TRANSFERSTART=0xEA,
	GE_CMD_TRANSFERSRCPOS=0xEB,
	GE_CMD_TRANSFERDSTPOS=0xEC,
	GE_CMD_TRANSFERSIZE=0xEE,
};

enum GEBufferFormat
{
	GE_FORMAT_565=0,
	GE_FORMAT_5551=1,
	GE_FORMAT_4444=2,
	GE_FORMAT_8888=3,
};

#define GE_VTYPE_TRANSFORM (0<<23)
#define GE_VTYPE_THROUGH   (1<<23)
#define GE_VTYPE_THROUGH_MASK (1<<23)

#define GE_VTYPE_TC_NONE  (0<<0)
#define GE_VTYPE_TC_8BIT  (1<<0)
#define GE_VTYPE_TC_16BIT (2<<0)
#define GE_VTYPE_TC_FLOAT (3<<0)
#define GE_VTYPE_TC_MASK  (3<<0)
#define GE_VTYPE_TC_SHIFT 0

#define GE_VTYPE_COL_NONE (0<<2)
#define GE_VTYPE_COL_565  (4<<2)
#define GE_VTYPE_COL_5551 (5<<2)
#define GE_VTYPE_COL_4444 (6<<2)
#define GE_VTYPE_COL_8888 (7<<2)
#define GE_VTYPE_COL_MASK (7<<2)
#define GE_VTYPE_COL_SHIFT 2

#define GE_VTYPE_NRM_NONE  (0<<5)
#define GE_VTYPE_NRM_8BIT  (1<<5)
#define GE_VTYPE_NRM_16BIT (2<<5)
#define GE_VTYPE_NRM_FLOAT (3<<5)
#define GE_VTYPE_NRM_MASK  (3<<5)
#define GE_VTYPE_NRM_SHIFT 5

//#define GE_VTYPE_POSITION_NONE  (0<<5)
#define GE_VTYPE_POS_8BIT  (1<<7)
#define GE_VTYPE_POS_16BIT (2<<7)
#define GE_VTYPE_POS_FLOAT (3<<7)
#define GE_VTYPE_POS_MASK  (3<<7)
#define GE_VTYPE_POS_SHIFT 7

#define GE_VTYPE_WEIGHT_NONE  (0<<9)
#define GE_VTYPE_WEIGHT_8BIT  (1<<9)
#define GE_VTYPE_WEIGHT_16BIT (2<<9)
#define GE_VTYPE_WEIGHT_FLOAT (3<<9)
#define GE_VTYPE_WEIGHT_MASK  (3<<9)
#define GE_VTYPE_WEIGHT_SHIFT 9

#define GE_VTYPE_WEIGHTCOUNT_MASK  (7<<14)
#define GE_VTYPE_WEIGHTCOUNT_SHIFT 14

#define GE_VTYPE_MORPHCOUNT_MASK  (7<<18)
#define GE_VTYPE_MORPHCOUNT_SHIFT 18

#define GE_VTYPE_IDX_NONE  (0<<11)
#define GE_VTYPE_IDX_8BIT  (1<<11)
#define GE_VTYPE_IDX_16BIT (2<<11)
#define GE_VTYPE_IDX_MASK  (3<<11)
#define GE_VTYPE_IDX_SHIFT 11


#define GE_CLEARMODE_COLOR (1<<8)
#define GE_CLEARMODE_ALPHA (1<<9) //or stencil?
#define GE_CLEARMODE_Z     (1<<10)
#define GE_CLEARMODE_ALL (GE_CLEARMODE_COLOR|GE_CLEARMODE_ALPHA|GE_CLEARMODE_Z)

enum GEMatrixType {
	GE_MTX_BONE0 = 0,
	GE_MTX_BONE1,
	GE_MTX_BONE2,
	GE_MTX_BONE3,
	GE_MTX_BONE4,
	GE_MTX_BONE5,
	GE_MTX_BONE6,
	GE_MTX_BONE7,
	GE_MTX_WORLD,
	GE_MTX_VIEW,
	GE_MTX_PROJECTION,
	GE_MTX_TEXGEN,
};

enum GEComparison
{
	GE_COMP_NEVER=0,
	GE_COMP_ALWAYS,
	GE_COMP_EQUAL,
	GE_COMP_NOTEQUAL,
	GE_COMP_LESS,
	GE_COMP_LEQUAL,
	GE_COMP_GREATER,
	GE_COMP_GEQUAL
};

enum GELightType
{
	GE_LIGHTTYPE_DIRECTIONAL=0,
	GE_LIGHTTYPE_POINT = 1,
	GE_LIGHTTYPE_SPOT = 2
};

enum GELightColorSetting
{
	GE_LIGHTCOLOR_AMBIENT = 0,
	GE_LIGHTCOLOR_DIFFUSE = 1,
	GE_LIGHTCOLOR_SPECULAR = 2
};

enum GELightComputation
{
	GE_LIGHTCOMP_ONLYDIFFUSE=0,
	GE_LIGHTCOMP_BOTH=1,
	GE_LIGHTCOMP_BOTHWITHPOWDIFFUSE=2,
};
enum GETextureFormat
{
	GE_TFMT_5650=0,
	GE_TFMT_5551=1,
	GE_TFMT_4444=2,
	GE_TFMT_8888=3,
	GE_TFMT_CLUT4=4,
	GE_TFMT_CLUT8=5,
	GE_TFMT_CLUT16=6,
	GE_TFMT_CLUT32=7,
	GE_TFMT_DXT1=8,
	GE_TFMT_DXT3=9,
	GE_TFMT_DXT5=10
};

enum GEMaterialColorSetting
{
	GE_MATERIALCOLOR_EMISSIVE = 0,
	GE_MATERIALCOLOR_AMBIENT = 1,
	GE_MATERIALCOLOR_DIFFUSE = 2,
	GE_MATERIALCOLOR_SPECULAR = 3,
};

enum GEBlendMode
{
	GE_BLENDMODE_MUL_AND_ADD=0,
	GE_BLENDMODE_MUL_AND_SUBTRACT=1,
	GE_BLENDMODE_MUL_AND_SUBTRACT_REVERSE=2,
	GE_BLENDMODE_MIN=3,
	GE_BLENDMODE_MAX=4,
	GE_BLENDMODE_ABSDIFF=5
};

enum GEBlendSrcFactor
{
	GE_SRCBLEND_DSTCOLOR,
	GE_SRCBLEND_INVDSTCOLOR,
	GE_SRCBLEND_SRCALPHA,
	GE_SRCBLEND_INVSRCALPHA,
	GE_SRCBLEND_DSTALPHA,
	GE_SRCBLEND_INVDSTALPHA,
	GE_SRCBLEND_DOUBLESRCALPHA,
	GE_SRCBLEND_DOUBLEINVSRCALPHA,
	GE_SRCBLEND_DOUBLEDSTALPHA,
	GE_SRCBLEND_DOUBLEINVDSTALPHA,
	GE_SRCBLEND_FIXA,
};

enum GEBlendDstFactor
{
	GE_DSTBLEND_SRCCOLOR,
	GE_DSTBLEND_INVSRCCOLOR,
	GE_DSTBLEND_SRCALPHA,
	GE_DSTBLEND_INVSRCALPHA,
	GE_DSTBLEND_DSTALPHA,
	GE_DSTBLEND_INVDSTALPHA,
	GE_DSTBLEND_DOUBLESRCALPHA,
	GE_DSTBLEND_DOUBLEINVSRCALPHA,
	GE_DSTBLEND_DOUBLEDSTALPHA,
	GE_DSTBLEND_DOUBLEINVDSTALPHA,
	GE_DSTBLEND_FIXB,
};

enum GETexFunc
{
	GE_TEXFUNC_MODULATE=0,
	GE_TEXFUNC_DECAL=1,
	GE_TEXFUNC_BLEND=2,
	GE_TEXFUNC_REPLACE=3,
	GE_TEXFUNC_ADD=4,
};

enum GEStencilOp
{
	GE_STENCILOP_KEEP=0,
	GE_STENCILOP_ZERO=0,
	GE_STENCILOP_REPLACE=0,
	GE_STENCILOP_INVERT=0,
	GE_STENCILOP_INCR=0,
	GE_STENCILOP_DECR=0,
};


// And more i haven't checked yet

#define GE_TFILT_NEAREST 0
#define GE_TFILT_LINEAR  1
#define GE_TFILT_NEAREST_MIPMAP_NEAREST 4
#define GE_TFILT_LINEAR_MIPMAP_NEAREST  5
#define GE_TFILT_NEAREST_MIPMAP_LINEAR  6
#define GE_TFILT_LINEAR_MIPMAP_LINEAR   7

enum GEPrimitiveType
{
	GE_PRIM_POINTS=0,
	GE_PRIM_LINES=1,
	GE_PRIM_LINE_STRIP=2,
	GE_PRIM_TRIANGLES=3,
	GE_PRIM_TRIANGLE_STRIP=4,
	GE_PRIM_TRIANGLE_FAN=5,
	GE_PRIM_RECTANGLES=6,
};

enum GELogicOp
{
	GE_LOGIC_AND = 1,
	GE_LOGIC_XOR = 6,
	GE_LOGIC_INVERT = 10,
	GE_LOGIC_DRAWINVERTED = 12,
};

enum GEPaletteFormat
{
	GE_CMODE_16BIT_BGR5650,
	GE_CMODE_16BIT_ABGR5551,
	GE_CMODE_16BIT_ABGR4444,
	GE_CMODE_32BIT_ABGR8888
};

#endif
