/*
   Copyright (C) 1999-2007 id Software, Inc. and contributors.
   For a list of contributors, see the accompanying CONTRIBUTORS file.

   This file is part of GtkRadiant.

   GtkRadiant 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 2 of the License, or
   (at your option) any later version.

   GtkRadiant 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 GtkRadiant; if not, write to the Free Software
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

#ifndef JOINTS_H
#define JOINTS_H

#include "globaldefs.h"

#ifdef _HERETIC2_
#include "angles.h"
#endif

//typedef float vec3_t[3];
//typedef unsigned char byte;

#if !GDEF_OS_WINDOWS
#define stricmp strcasecmp
#define strcmpi strcasecmp
#endif

typedef struct Placement_s
{
	vec3_t origin;
	vec3_t direction;
	vec3_t up;
} Placement_t;

#if 1
typedef struct QDataJoint_s
{
	Placement_t placement;
	vec3_t rotation;
} QDataJoint_t;
#endif

typedef struct ArrayedListNode_s
{
	int data;
	int next;
	int inUse;
} ArrayedListNode_t;

#define ARRAYEDLISTNODE_NULL -1

typedef struct JointAngles_s
{
	float angles[3];
	int children;
	int created;
} JointAngles_t;

typedef struct JointAngles2_s
{
	float angles[3];
	int children;
	int changed[3];
	int inUse;
} JointAngles2_t;

#define MAX_MODELJOINTS         256
#define MAX_MODELJOINTNODES     255

extern JointAngles_t jointAngles[MAX_MODELJOINTS];
extern JointAngles2_t jointAngles2[MAX_MODELJOINTS];

extern ArrayedListNode_t jointAngleNodes[MAX_MODELJOINTNODES];

// Skeletal structures enums
enum {
	SKEL_RAVEN = 0,
	SKEL_BOX,
	NUM_SKELETONS
};

// Raven Skeletal structures enums
enum {
	RAVEN_WAIST1 = 0,
	RAVEN_WAIST2 = 1,
	RAVEN_HEAD = 2,
	NUM_JOINTS_RAVEN
};

// Box Skeletal structures enums
enum {
	BOX_CENTER = 0,
	NUM_JOINTS_BOX
};

extern int numJointsForSkeleton[];
extern char *RAVEN_SKEL_NAMES[];

#define J_NEW_SKELETON      0x00001000
#define J_YAW_CHANGED       0x00002000
#define J_PITCH_CHANGED     0x00004000
#define J_ROLL_CHANGED      0x00008000
#define MAX_JOINTS          0x00000fff
/*
   inline int GetFreeNode(ArrayedListNode_t *nodeArray, int max)
   {	// yeah, I know this is a sucky, inefficient way to do this, but I didn't feel like taking the time to write a real resource manager in C
    int i;

    for(i = 0; i < max; ++i)
    {
        if(!nodeArray[i].inUse)
        {
            nodeArray[i].inUse = 1;
            return i;
        }
    }

    assert(0);
    return -1;
   }

   inline void FreeNode(ArrayedListNode_t *nodeArray, int index)
   {
    nodeArray[index].inUse = 0;
   }
 */
int CreateSkeleton( int structure );
void CreateSkeletonAtIndex( int structure, int index );
void FreeSkeleton( int structure, int index );
void SetJointAngle( int jointIndex, int angleIndex, float angle );
float ModifyJointAngle( int jointIndex, int angleIndex, float deltaAngle );
int ZeroJointAngle( int jointIndex, int angleIndex, float angVel );
int ApplyAngVelToJoint( int jointIndex, int angleIndex, float angVel, float destAng );

#endif
