/**
 * @file indra_constants.h
 * @brief some useful short term constants for Indra
 *
 * $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$
 */

#ifndef LL_INDRA_CONSTANTS_H
#define LL_INDRA_CONSTANTS_H

#include "stdtypes.h"

class LLUUID;

static const F32 REGION_WIDTH_METERS = 256.f;
static const S32 REGION_WIDTH_UNITS = 256;
static const U32 REGION_WIDTH_U32 = 256;

const F32 REGION_HEIGHT_METERS = 4096.f;

const   F32     DEFAULT_AGENT_DEPTH     = 0.45f;
const   F32     DEFAULT_AGENT_WIDTH     = 0.60f;
const   F32     DEFAULT_AGENT_HEIGHT    = 1.9f;

enum ETerrainBrushType
{
    // the valid brush numbers cannot be reordered, because they
    // are used in the binary LSL format as arguments to llModifyLand()
    E_LANDBRUSH_LEVEL   = 0,
    E_LANDBRUSH_RAISE   = 1,
    E_LANDBRUSH_LOWER   = 2,
    E_LANDBRUSH_SMOOTH  = 3,
    E_LANDBRUSH_NOISE   = 4,
    E_LANDBRUSH_REVERT  = 5,
    E_LANDBRUSH_INVALID = 6
};

enum EMouseClickType{
    CLICK_NONE = -1,
    CLICK_LEFT = 0,
    CLICK_MIDDLE,
    CLICK_RIGHT,
    CLICK_BUTTON4,
    CLICK_BUTTON5,
    CLICK_DOUBLELEFT,
    CLICK_COUNT // 'size', CLICK_NONE does not counts
};

// keys
// Bit masks for various keyboard modifier keys.
const MASK MASK_NONE =          0x0000;
const MASK MASK_CONTROL =       0x0001;     // Mapped to cmd on Macs
const MASK MASK_ALT =           0x0002;
const MASK MASK_SHIFT =         0x0004;
const MASK MASK_NORMALKEYS =    0x0007;     // A real mask - only get the bits for normal modifier keys
const MASK MASK_MAC_CONTROL =   0x0008;     // Un-mapped Ctrl key on Macs, not used on Windows
const MASK MASK_MODIFIERS =     MASK_CONTROL|MASK_ALT|MASK_SHIFT|MASK_MAC_CONTROL;

// Special keys go into >128
const KEY KEY_SPECIAL = 0x80;   // special keys start here
const KEY KEY_RETURN =  0x81;
const KEY KEY_LEFT =    0x82;
const KEY KEY_RIGHT =   0x83;
const KEY KEY_UP =      0x84;
const KEY KEY_DOWN =    0x85;
const KEY KEY_ESCAPE =  0x86;
const KEY KEY_BACKSPACE =0x87;
const KEY KEY_DELETE =  0x88;
const KEY KEY_SHIFT =   0x89;
const KEY KEY_CONTROL = 0x8A;
const KEY KEY_ALT =     0x8B;
const KEY KEY_HOME =    0x8C;
const KEY KEY_END =     0x8D;
const KEY KEY_PAGE_UP = 0x8E;
const KEY KEY_PAGE_DOWN = 0x8F;
const KEY KEY_HYPHEN = 0x90;
const KEY KEY_EQUALS = 0x91;
const KEY KEY_INSERT = 0x92;
const KEY KEY_CAPSLOCK = 0x93;
const KEY KEY_TAB =     0x94;
const KEY KEY_ADD =     0x95;
const KEY KEY_SUBTRACT =0x96;
const KEY KEY_MULTIPLY =0x97;
const KEY KEY_DIVIDE =  0x98;
const KEY KEY_F1        = 0xA1;
const KEY KEY_F2        = 0xA2;
const KEY KEY_F3        = 0xA3;
const KEY KEY_F4        = 0xA4;
const KEY KEY_F5        = 0xA5;
const KEY KEY_F6        = 0xA6;
const KEY KEY_F7        = 0xA7;
const KEY KEY_F8        = 0xA8;
const KEY KEY_F9        = 0xA9;
const KEY KEY_F10       = 0xAA;
const KEY KEY_F11       = 0xAB;
const KEY KEY_F12       = 0xAC;

const KEY KEY_PAD_UP        = 0xC0;
const KEY KEY_PAD_DOWN      = 0xC1;
const KEY KEY_PAD_LEFT      = 0xC2;
const KEY KEY_PAD_RIGHT     = 0xC3;
const KEY KEY_PAD_HOME      = 0xC4;
const KEY KEY_PAD_END       = 0xC5;
const KEY KEY_PAD_PGUP      = 0xC6;
const KEY KEY_PAD_PGDN      = 0xC7;
const KEY KEY_PAD_CENTER    = 0xC8; // the 5 in the middle
const KEY KEY_PAD_INS       = 0xC9;
const KEY KEY_PAD_DEL       = 0xCA;
const KEY KEY_PAD_RETURN    = 0xCB;
const KEY KEY_PAD_ADD       = 0xCC; // not used
const KEY KEY_PAD_SUBTRACT  = 0xCD; // not used
const KEY KEY_PAD_MULTIPLY  = 0xCE; // not used
const KEY KEY_PAD_DIVIDE    = 0xCF; // not used

const KEY KEY_BUTTON0   = 0xD0;
const KEY KEY_BUTTON1   = 0xD1;
const KEY KEY_BUTTON2   = 0xD2;
const KEY KEY_BUTTON3   = 0xD3;
const KEY KEY_BUTTON4   = 0xD4;
const KEY KEY_BUTTON5   = 0xD5;
const KEY KEY_BUTTON6   = 0xD6;
const KEY KEY_BUTTON7   = 0xD7;
const KEY KEY_BUTTON8   = 0xD8;
const KEY KEY_BUTTON9   = 0xD9;
const KEY KEY_BUTTON10  = 0xDA;
const KEY KEY_BUTTON11  = 0xDB;
const KEY KEY_BUTTON12  = 0xDC;
const KEY KEY_BUTTON13  = 0xDD;
const KEY KEY_BUTTON14  = 0xDE;
const KEY KEY_BUTTON15  = 0xDF;

const KEY KEY_NONE =    0xFF; // not sent from keyboard.  For internal use only.

const S32 KEY_COUNT = 256;


const F32 DEFAULT_WATER_HEIGHT  = 20.0f;

// Maturity ratings for simulators
const U8 SIM_ACCESS_MIN     = 0;        // Treated as 'unknown', usually ends up being SIM_ACCESS_PG
const U8 SIM_ACCESS_PG      = 13;
const U8 SIM_ACCESS_MATURE  = 21;
const U8 SIM_ACCESS_ADULT   = 42;       // Seriously Adult Only
const U8 SIM_ACCESS_DOWN    = 254;
const U8 SIM_ACCESS_MAX     = SIM_ACCESS_ADULT;

// attachment constants
const U8  ATTACHMENT_ADD = 0x80;

// god levels
const U8 GOD_MAINTENANCE = 250;
const U8 GOD_FULL = 200;
const U8 GOD_LIAISON = 150;
const U8 GOD_CUSTOMER_SERVICE = 100;
const U8 GOD_LIKE = 1;
const U8 GOD_NOT = 0;

// "agent id" for things that should be done to ALL agents
LL_COMMON_API extern const LLUUID LL_UUID_ALL_AGENTS;

// inventory library owner
LL_COMMON_API extern const LLUUID ALEXANDRIA_LINDEN_ID;

LL_COMMON_API extern const LLUUID GOVERNOR_LINDEN_ID;
// Maintenance's group id.
LL_COMMON_API extern const LLUUID MAINTENANCE_GROUP_ID;

// image ids
LL_COMMON_API extern const LLUUID IMG_SMOKE;

LL_COMMON_API extern const LLUUID IMG_DEFAULT;

LL_COMMON_API extern const LLUUID IMG_SUN;
LL_COMMON_API extern const LLUUID IMG_MOON;
LL_COMMON_API extern const LLUUID IMG_SHOT;
LL_COMMON_API extern const LLUUID IMG_SPARK;
LL_COMMON_API extern const LLUUID IMG_FIRE;
LL_COMMON_API extern const LLUUID IMG_FACE_SELECT;
LL_COMMON_API extern const LLUUID IMG_DEFAULT_AVATAR;
LL_COMMON_API extern const LLUUID IMG_INVISIBLE;
LL_COMMON_API extern const LLUUID IMG_WHITE;

LL_COMMON_API extern const LLUUID IMG_EXPLOSION;
LL_COMMON_API extern const LLUUID IMG_EXPLOSION_2;
LL_COMMON_API extern const LLUUID IMG_EXPLOSION_3;
LL_COMMON_API extern const LLUUID IMG_EXPLOSION_4;
LL_COMMON_API extern const LLUUID IMG_SMOKE_POOF;

LL_COMMON_API extern const LLUUID IMG_BIG_EXPLOSION_1;
LL_COMMON_API extern const LLUUID IMG_BIG_EXPLOSION_2;

LL_COMMON_API extern const LLUUID IMG_ALPHA_GRAD;
LL_COMMON_API extern const LLUUID IMG_ALPHA_GRAD_2D;
LL_COMMON_API extern const LLUUID IMG_TRANSPARENT;

LL_COMMON_API extern const LLUUID TERRAIN_DIRT_DETAIL;
LL_COMMON_API extern const LLUUID TERRAIN_GRASS_DETAIL;
LL_COMMON_API extern const LLUUID TERRAIN_MOUNTAIN_DETAIL;
LL_COMMON_API extern const LLUUID TERRAIN_ROCK_DETAIL;

LL_COMMON_API extern const LLUUID IMG_USE_BAKED_HEAD;
LL_COMMON_API extern const LLUUID IMG_USE_BAKED_UPPER;
LL_COMMON_API extern const LLUUID IMG_USE_BAKED_LOWER;
LL_COMMON_API extern const LLUUID IMG_USE_BAKED_EYES;
LL_COMMON_API extern const LLUUID IMG_USE_BAKED_SKIRT;
LL_COMMON_API extern const LLUUID IMG_USE_BAKED_HAIR;
LL_COMMON_API extern const LLUUID IMG_USE_BAKED_LEFTARM;
LL_COMMON_API extern const LLUUID IMG_USE_BAKED_LEFTLEG;
LL_COMMON_API extern const LLUUID IMG_USE_BAKED_AUX1;
LL_COMMON_API extern const LLUUID IMG_USE_BAKED_AUX2;
LL_COMMON_API extern const LLUUID IMG_USE_BAKED_AUX3;

LL_COMMON_API extern const LLUUID DEFAULT_WATER_NORMAL;

LL_COMMON_API extern const LLUUID DEFAULT_OBJECT_TEXTURE;
LL_COMMON_API extern const LLUUID DEFAULT_OBJECT_SPECULAR;
LL_COMMON_API extern const LLUUID DEFAULT_OBJECT_NORMAL;
LL_COMMON_API extern const LLUUID BLANK_OBJECT_NORMAL;

LL_COMMON_API extern const LLUUID BLANK_MATERIAL_ASSET_ID;

// radius within which a chat message is fully audible
const F32 CHAT_NORMAL_RADIUS = 20.f;

// media commands
const U32 PARCEL_MEDIA_COMMAND_STOP  = 0;
const U32 PARCEL_MEDIA_COMMAND_PAUSE = 1;
const U32 PARCEL_MEDIA_COMMAND_PLAY  = 2;
const U32 PARCEL_MEDIA_COMMAND_LOOP  = 3;
const U32 PARCEL_MEDIA_COMMAND_TEXTURE = 4;
const U32 PARCEL_MEDIA_COMMAND_URL = 5;
const U32 PARCEL_MEDIA_COMMAND_TIME = 6;
const U32 PARCEL_MEDIA_COMMAND_AGENT = 7;
const U32 PARCEL_MEDIA_COMMAND_UNLOAD = 8;
const U32 PARCEL_MEDIA_COMMAND_AUTO_ALIGN = 9;
const U32 PARCEL_MEDIA_COMMAND_TYPE = 10;
const U32 PARCEL_MEDIA_COMMAND_SIZE = 11;
const U32 PARCEL_MEDIA_COMMAND_DESC = 12;
const U32 PARCEL_MEDIA_COMMAND_LOOP_SET = 13;

const S32 CHAT_CHANNEL_DEBUG = S32_MAX;

// agent constants
const U32 CONTROL_AT_POS_INDEX              = 0;
const U32 CONTROL_AT_NEG_INDEX              = 1;
const U32 CONTROL_LEFT_POS_INDEX            = 2;
const U32 CONTROL_LEFT_NEG_INDEX            = 3;
const U32 CONTROL_UP_POS_INDEX              = 4;
const U32 CONTROL_UP_NEG_INDEX              = 5;
const U32 CONTROL_PITCH_POS_INDEX           = 6;
const U32 CONTROL_PITCH_NEG_INDEX           = 7;
const U32 CONTROL_YAW_POS_INDEX             = 8;
const U32 CONTROL_YAW_NEG_INDEX             = 9;
const U32 CONTROL_FAST_AT_INDEX             = 10;
const U32 CONTROL_FAST_LEFT_INDEX           = 11;
const U32 CONTROL_FAST_UP_INDEX             = 12;
const U32 CONTROL_FLY_INDEX                 = 13;
const U32 CONTROL_STOP_INDEX                = 14;
const U32 CONTROL_FINISH_ANIM_INDEX         = 15;
const U32 CONTROL_STAND_UP_INDEX            = 16;
const U32 CONTROL_SIT_ON_GROUND_INDEX       = 17;
const U32 CONTROL_MOUSELOOK_INDEX           = 18;
const U32 CONTROL_NUDGE_AT_POS_INDEX        = 19;
const U32 CONTROL_NUDGE_AT_NEG_INDEX        = 20;
const U32 CONTROL_NUDGE_LEFT_POS_INDEX      = 21;
const U32 CONTROL_NUDGE_LEFT_NEG_INDEX      = 22;
const U32 CONTROL_NUDGE_UP_POS_INDEX        = 23;
const U32 CONTROL_NUDGE_UP_NEG_INDEX        = 24;
const U32 CONTROL_TURN_LEFT_INDEX           = 25;
const U32 CONTROL_TURN_RIGHT_INDEX          = 26;
const U32 CONTROL_AWAY_INDEX                = 27;
const U32 CONTROL_LBUTTON_DOWN_INDEX        = 28;
const U32 CONTROL_LBUTTON_UP_INDEX          = 29;
const U32 CONTROL_ML_LBUTTON_DOWN_INDEX     = 30;
const U32 CONTROL_ML_LBUTTON_UP_INDEX       = 31;
const U32 TOTAL_CONTROLS                    = 32;

const U32 AGENT_CONTROL_AT_POS              = 0x1 << CONTROL_AT_POS_INDEX;          // 0x00000001
const U32 AGENT_CONTROL_AT_NEG              = 0x1 << CONTROL_AT_NEG_INDEX;          // 0x00000002
const U32 AGENT_CONTROL_LEFT_POS            = 0x1 << CONTROL_LEFT_POS_INDEX;        // 0x00000004
const U32 AGENT_CONTROL_LEFT_NEG            = 0x1 << CONTROL_LEFT_NEG_INDEX;        // 0x00000008
const U32 AGENT_CONTROL_UP_POS              = 0x1 << CONTROL_UP_POS_INDEX;          // 0x00000010
const U32 AGENT_CONTROL_UP_NEG              = 0x1 << CONTROL_UP_NEG_INDEX;          // 0x00000020
const U32 AGENT_CONTROL_PITCH_POS           = 0x1 << CONTROL_PITCH_POS_INDEX;       // 0x00000040
const U32 AGENT_CONTROL_PITCH_NEG           = 0x1 << CONTROL_PITCH_NEG_INDEX;       // 0x00000080
const U32 AGENT_CONTROL_YAW_POS             = 0x1 << CONTROL_YAW_POS_INDEX;         // 0x00000100
const U32 AGENT_CONTROL_YAW_NEG             = 0x1 << CONTROL_YAW_NEG_INDEX;         // 0x00000200

const U32 AGENT_CONTROL_FAST_AT             = 0x1 << CONTROL_FAST_AT_INDEX;         // 0x00000400
const U32 AGENT_CONTROL_FAST_LEFT           = 0x1 << CONTROL_FAST_LEFT_INDEX;       // 0x00000800
const U32 AGENT_CONTROL_FAST_UP             = 0x1 << CONTROL_FAST_UP_INDEX;         // 0x00001000

const U32 AGENT_CONTROL_FLY                 = 0x1 << CONTROL_FLY_INDEX;             // 0x00002000
const U32 AGENT_CONTROL_STOP                = 0x1 << CONTROL_STOP_INDEX;            // 0x00004000
const U32 AGENT_CONTROL_FINISH_ANIM         = 0x1 << CONTROL_FINISH_ANIM_INDEX;     // 0x00008000
const U32 AGENT_CONTROL_STAND_UP            = 0x1 << CONTROL_STAND_UP_INDEX;        // 0x00010000
const U32 AGENT_CONTROL_SIT_ON_GROUND       = 0x1 << CONTROL_SIT_ON_GROUND_INDEX;   // 0x00020000
const U32 AGENT_CONTROL_MOUSELOOK           = 0x1 << CONTROL_MOUSELOOK_INDEX;       // 0x00040000

const U32 AGENT_CONTROL_NUDGE_AT_POS        = 0x1 << CONTROL_NUDGE_AT_POS_INDEX;    // 0x00080000
const U32 AGENT_CONTROL_NUDGE_AT_NEG        = 0x1 << CONTROL_NUDGE_AT_NEG_INDEX;    // 0x00100000
const U32 AGENT_CONTROL_NUDGE_LEFT_POS      = 0x1 << CONTROL_NUDGE_LEFT_POS_INDEX;  // 0x00200000
const U32 AGENT_CONTROL_NUDGE_LEFT_NEG      = 0x1 << CONTROL_NUDGE_LEFT_NEG_INDEX;  // 0x00400000
const U32 AGENT_CONTROL_NUDGE_UP_POS        = 0x1 << CONTROL_NUDGE_UP_POS_INDEX;    // 0x00800000
const U32 AGENT_CONTROL_NUDGE_UP_NEG        = 0x1 << CONTROL_NUDGE_UP_NEG_INDEX;    // 0x01000000
const U32 AGENT_CONTROL_TURN_LEFT           = 0x1 << CONTROL_TURN_LEFT_INDEX;       // 0x02000000
const U32 AGENT_CONTROL_TURN_RIGHT          = 0x1 << CONTROL_TURN_RIGHT_INDEX;      // 0x04000000

const U32 AGENT_CONTROL_AWAY                = 0x1 << CONTROL_AWAY_INDEX;            // 0x08000000

const U32 AGENT_CONTROL_LBUTTON_DOWN        = 0x1 << CONTROL_LBUTTON_DOWN_INDEX;    // 0x10000000
const U32 AGENT_CONTROL_LBUTTON_UP          = 0x1 << CONTROL_LBUTTON_UP_INDEX;      // 0x20000000
const U32 AGENT_CONTROL_ML_LBUTTON_DOWN     = 0x1 << CONTROL_ML_LBUTTON_DOWN_INDEX; // 0x40000000
const U32 AGENT_CONTROL_ML_LBUTTON_UP       = ((U32)0x1) << CONTROL_ML_LBUTTON_UP_INDEX;    // 0x80000000

// move these up so that we can hide them in "State" for object updates
// (for now)
const U32 AGENT_ATTACH_OFFSET               = 4;
const U32 AGENT_ATTACH_MASK                 = 0xf << AGENT_ATTACH_OFFSET;

// RN: this method swaps the upper and lower nibbles to maintain backward
// compatibility with old objects that only used the upper nibble
#define ATTACHMENT_ID_FROM_STATE(state) ((S32)((((U8)state & AGENT_ATTACH_MASK) >> 4) | (((U8)state & ~AGENT_ATTACH_MASK) << 4)))

// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!
const U8 CLICK_ACTION_NONE = 0;
const U8 CLICK_ACTION_TOUCH = 0;
const U8 CLICK_ACTION_SIT = 1;
const U8 CLICK_ACTION_BUY = 2;
const U8 CLICK_ACTION_PAY = 3;
const U8 CLICK_ACTION_OPEN = 4;
const U8 CLICK_ACTION_PLAY = 5;
const U8 CLICK_ACTION_OPEN_MEDIA = 6;
const U8 CLICK_ACTION_ZOOM = 7;
const U8 CLICK_ACTION_DISABLED = 8;
const U8 CLICK_ACTION_IGNORE = 9;
// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!


#endif