// Copyright (C) 2002-2010 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h

#ifndef __I_BONE_SCENE_NODE_H_INCLUDED__
#define __I_BONE_SCENE_NODE_H_INCLUDED__

#include "ISceneNode.h"

namespace irr
{
namespace scene
{

	//! Enumeration for different bone animation modes
	enum E_BONE_ANIMATION_MODE
	{
		//! The bone is usually animated, unless it's parent is not animated
		EBAM_AUTOMATIC=0,

		//! The bone is animated by the skin, if it's parent is not animated then animation will resume from this bone onward
		EBAM_ANIMATED,

		//! The bone is not animated by the skin
		EBAM_UNANIMATED,

		//! Not an animation mode, just here to count the available modes
		EBAM_COUNT

	};

	enum E_BONE_SKINNING_SPACE
	{
		//! local skinning, standard
		EBSS_LOCAL=0,

		//! global skinning
		EBSS_GLOBAL,

		EBSS_COUNT
	};

	//! Names for bone animation modes
	const c8* const BoneAnimationModeNames[] =
	{
		"automatic",
		"animated",
		"unanimated",
		0,
	};


	//! Interface for bones used for skeletal animation.
	/** Used with ISkinnedMesh and IAnimatedMeshSceneNode. */
	class IBoneSceneNode : public ISceneNode
	{
	public:

		IBoneSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id=-1) :
			ISceneNode(parent, mgr, id),positionHint(-1),scaleHint(-1),rotationHint(-1) { }

		//! Get the name of the bone
		/** \deprecated Use getName instead. */
		virtual const c8* getBoneName() const { return getName(); }

		//! Get the index of the bone
		virtual u32 getBoneIndex() const = 0;

		//! Sets the animation mode of the bone.
		/** \return True if successful. (Unused) */
		virtual bool setAnimationMode(E_BONE_ANIMATION_MODE mode) = 0;

		//! Gets the current animation mode of the bone
		virtual E_BONE_ANIMATION_MODE getAnimationMode() const = 0;

		//! Get the axis aligned bounding box of this node
		virtual const core::aabbox3d<f32>& getBoundingBox() const = 0;

		//! Returns the relative transformation of the scene node.
		//virtual core::matrix4 getRelativeTransformation() const = 0;

		//! The animation method.
		virtual void OnAnimate(u32 timeMs) =0;

		//! The render method.
		/** Does nothing as bones are not visible. */
		virtual void render() { }

		//! How the relative transformation of the bone is used
		virtual void setSkinningSpace( E_BONE_SKINNING_SPACE space ) =0;

		//! How the relative transformation of the bone is used
		virtual E_BONE_SKINNING_SPACE getSkinningSpace() const =0;

		//! Updates the absolute position based on the relative and the parents position
		virtual void updateAbsolutePositionOfAllChildren()=0;

		s32 positionHint;
		s32 scaleHint;
		s32 rotationHint;
	};


} // end namespace scene
} // end namespace irr

#endif

