#ifndef BONE_ACCESSOR_H
#define BONE_ACCESSOR_H
#ifdef _WIN32
#pragma once
#endif


#include "studio.h"


class C_BaseAnimating;


class CBoneAccessor
{
public:

	CBoneAccessor();
	CBoneAccessor(matrix3x4_t* pBones);           

#if defined( CLIENT_DLL )
	void Init(const C_BaseAnimating* pAnimating, matrix3x4_t* pBones);
#endif

	int GetReadableBones();
	void SetReadableBones(int flags);

	int GetWritableBones();
	void SetWritableBones(int flags);

	const matrix3x4_t& GetBone(int iBone) const;
	const matrix3x4_t& operator[](int iBone) const;
	matrix3x4_t& GetBoneForWrite(int iBone);

	matrix3x4_t* GetBoneArrayForWrite() const;

private:

#if defined( CLIENT_DLL ) && defined( _DEBUG )
	void SanityCheckBone(int iBone, bool bReadable) const;
#endif

	const C_BaseAnimating* m_pAnimating;

	matrix3x4_t* m_pBones;

	int m_ReadableBones;		     
	int m_WritableBones;		     
};


inline CBoneAccessor::CBoneAccessor()
{
	m_pAnimating = NULL;
	m_pBones = NULL;
	m_ReadableBones = m_WritableBones = 0;
}

inline CBoneAccessor::CBoneAccessor(matrix3x4_t* pBones)
{
	m_pAnimating = NULL;
	m_pBones = pBones;
}

#if defined( CLIENT_DLL )
inline void CBoneAccessor::Init(const C_BaseAnimating* pAnimating, matrix3x4_t* pBones)
{
	m_pAnimating = pAnimating;
	m_pBones = pBones;
}
#endif

inline int CBoneAccessor::GetReadableBones()
{
	return m_ReadableBones;
}

inline void CBoneAccessor::SetReadableBones(int flags)
{
	m_ReadableBones = flags;
}

inline int CBoneAccessor::GetWritableBones()
{
	return m_WritableBones;
}

inline void CBoneAccessor::SetWritableBones(int flags)
{
	m_WritableBones = flags;
}

inline const matrix3x4_t& CBoneAccessor::GetBone(int iBone) const
{
#if defined( CLIENT_DLL ) && defined( _DEBUG )
	SanityCheckBone(iBone, true);
#endif
	return m_pBones[iBone];
}

inline const matrix3x4_t& CBoneAccessor::operator[](int iBone) const
{
#if defined( CLIENT_DLL ) && defined( _DEBUG )
	SanityCheckBone(iBone, true);
#endif
	return m_pBones[iBone];
}

inline matrix3x4_t& CBoneAccessor::GetBoneForWrite(int iBone)
{
#if defined( CLIENT_DLL ) && defined( _DEBUG )
	SanityCheckBone(iBone, false);
#endif
	return m_pBones[iBone];
}

inline matrix3x4_t* CBoneAccessor::GetBoneArrayForWrite(void) const
{
	return m_pBones;
}

#endif  