2012-12-02 09:31:01 +00:00
//
// KRAnimationAttribute.cpp
// KREngine
//
// Copyright 2012 Kearwood Gilbert. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other materials
// provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY KEARWOOD GILBERT ''AS IS'' AND ANY EXPRESS OR IMPLIED
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KEARWOOD GILBERT OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// The views and conclusions contained in the software and documentation are those of the
// authors and should not be interpreted as representing official policies, either expressed
// or implied, of Kearwood Gilbert.
//
# include "KRAnimationAttribute.h"
2012-12-07 03:13:10 +00:00
# include "KRContext.h"
# include "KRAnimationManager.h"
# include "KRAnimationCurveManager.h"
2012-12-02 09:31:01 +00:00
KRAnimationAttribute : : KRAnimationAttribute ( KRContext & context ) : KRContextObject ( context )
{
2012-12-07 00:20:06 +00:00
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_NONE ;
2012-12-07 03:13:10 +00:00
m_target = NULL ;
m_curve = NULL ;
2012-12-02 09:31:01 +00:00
}
KRAnimationAttribute : : ~ KRAnimationAttribute ( )
{
}
tinyxml2 : : XMLElement * KRAnimationAttribute : : saveXML ( tinyxml2 : : XMLNode * parent )
{
tinyxml2 : : XMLDocument * doc = parent - > GetDocument ( ) ;
tinyxml2 : : XMLElement * e = doc - > NewElement ( " attribute " ) ;
2012-12-20 01:23:57 +00:00
parent - > InsertEndChild ( e ) ;
2012-12-02 10:58:59 +00:00
e - > SetAttribute ( " curve " , m_curve_name . c_str ( ) ) ;
e - > SetAttribute ( " target " , m_target_name . c_str ( ) ) ;
2012-12-20 01:23:57 +00:00
const char * szAttribute = " none " ;
2012-12-07 00:20:06 +00:00
switch ( m_node_attribute ) {
case KRNode : : KRENGINE_NODE_ATTRIBUTE_NONE :
szAttribute = " none " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_TRANSLATE_X :
szAttribute = " translate_x " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_TRANSLATE_Y :
szAttribute = " translate_y " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_TRANSLATE_Z :
szAttribute = " translate_z " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_SCALE_X :
szAttribute = " scale_x " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_SCALE_Y :
szAttribute = " scale_y " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_SCALE_Z :
szAttribute = " scale_z " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATE_X :
szAttribute = " rotate_x " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATE_Y :
szAttribute = " rotate_y " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATE_Z :
szAttribute = " rotate_z " ;
break ;
2013-05-24 12:20:47 -07:00
case KRNode : : KRENGINE_NODE_ATTRIBUTE_PRE_ROTATION_X :
szAttribute = " pre_rotate_x " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_PRE_ROTATION_Y :
szAttribute = " pre_rotate_y " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_PRE_ROTATION_Z :
szAttribute = " pre_rotate_z " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_POST_ROTATION_X :
szAttribute = " post_rotate_x " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_POST_ROTATION_Y :
szAttribute = " post_rotate_y " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_POST_ROTATION_Z :
szAttribute = " post_rotate_z " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATION_PIVOT_X :
szAttribute = " rotate_pivot_x " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATION_PIVOT_Y :
szAttribute = " rotate_pivot_y " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATION_PIVOT_Z :
szAttribute = " rotate_pivot_z " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_SCALE_PIVOT_X :
szAttribute = " scale_pivot_x " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_SCALE_PIVOT_Y :
szAttribute = " scale_pivot_y " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_SCALE_PIVOT_Z :
szAttribute = " scale_pivot_z " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATE_OFFSET_X :
szAttribute = " rotate_offset_x " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATE_OFFSET_Y :
szAttribute = " rotate_offset_y " ;
break ;
case KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATE_OFFSET_Z :
szAttribute = " rotate_offset_z " ;
break ;
case KRNode : : KRENGINE_NODE_SCALE_OFFSET_X :
szAttribute = " scale_offset_x " ;
break ;
case KRNode : : KRENGINE_NODE_SCALE_OFFSET_Y :
szAttribute = " scale_offset_y " ;
break ;
case KRNode : : KRENGINE_NODE_SCALE_OFFSET_Z :
szAttribute = " scale_offset_z " ;
break ;
2017-11-05 19:14:29 -08:00
case KRNode : : KRENGINE_NODE_ATTRIBUTE_COUNT :
// Suppress warning
break ;
2012-12-07 00:20:06 +00:00
}
e - > SetAttribute ( " attribute " , szAttribute ) ;
2012-12-02 09:31:01 +00:00
return e ;
}
void KRAnimationAttribute : : loadXML ( tinyxml2 : : XMLElement * e )
{
2012-12-07 03:13:10 +00:00
m_target = NULL ;
m_curve = NULL ;
2012-12-02 10:58:59 +00:00
m_curve_name = e - > Attribute ( " curve " ) ;
m_target_name = e - > Attribute ( " target " ) ;
2013-08-24 16:37:07 -07:00
2012-12-07 03:13:10 +00:00
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_NONE ;
2012-12-07 00:20:06 +00:00
const char * szAttribute = e - > Attribute ( " attribute " ) ;
if ( strcmp ( szAttribute , " none " ) = = 0 ) {
2012-12-07 03:13:10 +00:00
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_NONE ;
2012-12-07 00:20:06 +00:00
} else if ( strcmp ( szAttribute , " translate_x " ) = = 0 ) {
2012-12-07 03:13:10 +00:00
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_TRANSLATE_X ;
2012-12-07 00:20:06 +00:00
} else if ( strcmp ( szAttribute , " translate_y " ) = = 0 ) {
2012-12-07 03:13:10 +00:00
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_TRANSLATE_Y ;
2012-12-07 00:20:06 +00:00
} else if ( strcmp ( szAttribute , " translate_z " ) = = 0 ) {
2012-12-07 03:13:10 +00:00
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_TRANSLATE_Z ;
2012-12-07 00:20:06 +00:00
} else if ( strcmp ( szAttribute , " rotate_x " ) = = 0 ) {
2012-12-07 03:13:10 +00:00
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATE_X ;
2012-12-07 00:20:06 +00:00
} else if ( strcmp ( szAttribute , " rotate_y " ) = = 0 ) {
2012-12-07 03:13:10 +00:00
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATE_Y ;
2012-12-07 00:20:06 +00:00
} else if ( strcmp ( szAttribute , " rotate_z " ) = = 0 ) {
2012-12-07 03:13:10 +00:00
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATE_Z ;
2012-12-07 00:20:06 +00:00
} else if ( strcmp ( szAttribute , " scale_x " ) = = 0 ) {
2012-12-07 03:13:10 +00:00
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_SCALE_X ;
2012-12-07 00:20:06 +00:00
} else if ( strcmp ( szAttribute , " scale_y " ) = = 0 ) {
2012-12-07 03:13:10 +00:00
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_SCALE_Y ;
2012-12-07 00:20:06 +00:00
} else if ( strcmp ( szAttribute , " scale_z " ) = = 0 ) {
2012-12-07 03:13:10 +00:00
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_SCALE_Z ;
2013-05-24 12:20:47 -07:00
} else if ( strcmp ( szAttribute , " pre_rotate_x " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_PRE_ROTATION_X ;
} else if ( strcmp ( szAttribute , " pre_rotate_y " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_PRE_ROTATION_Y ;
} else if ( strcmp ( szAttribute , " pre_rotate_z " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_PRE_ROTATION_Z ;
} else if ( strcmp ( szAttribute , " post_rotate_x " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_POST_ROTATION_X ;
} else if ( strcmp ( szAttribute , " post_rotate_y " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_POST_ROTATION_Y ;
} else if ( strcmp ( szAttribute , " post_rotate_z " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_POST_ROTATION_Z ;
} else if ( strcmp ( szAttribute , " rotate_pivot_x " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATION_PIVOT_X ;
} else if ( strcmp ( szAttribute , " rotate_pivot_y " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATION_PIVOT_Y ;
} else if ( strcmp ( szAttribute , " rotate_pivot_z " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATION_PIVOT_Z ;
} else if ( strcmp ( szAttribute , " scale_pivot_x " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_SCALE_PIVOT_X ;
} else if ( strcmp ( szAttribute , " scale_pivot_y " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_SCALE_PIVOT_Y ;
} else if ( strcmp ( szAttribute , " scale_pivot_z " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_SCALE_PIVOT_Z ;
} else if ( strcmp ( szAttribute , " rotate_offset_x " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATE_OFFSET_X ;
} else if ( strcmp ( szAttribute , " rotate_offset_y " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATE_OFFSET_Y ;
} else if ( strcmp ( szAttribute , " rotate_offset_z " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_ROTATE_OFFSET_Z ;
} else if ( strcmp ( szAttribute , " scale_offset_x " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_SCALE_OFFSET_X ;
} else if ( strcmp ( szAttribute , " scale_offset_y " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_SCALE_OFFSET_Y ;
} else if ( strcmp ( szAttribute , " scale_offset_z " ) = = 0 ) {
m_node_attribute = KRNode : : KRENGINE_NODE_SCALE_OFFSET_Z ;
2012-12-07 00:20:06 +00:00
} else {
2012-12-07 03:13:10 +00:00
m_node_attribute = KRNode : : KRENGINE_NODE_ATTRIBUTE_NONE ;
2012-12-07 00:20:06 +00:00
}
2012-12-02 10:58:59 +00:00
}
2012-12-07 03:13:10 +00:00
KRNode : : node_attribute_type KRAnimationAttribute : : getTargetAttribute ( ) const
2012-12-02 10:58:59 +00:00
{
2012-12-07 03:13:10 +00:00
return m_node_attribute ;
2012-12-02 10:58:59 +00:00
}
2012-12-07 03:13:10 +00:00
void KRAnimationAttribute : : setTargetAttribute ( KRNode : : node_attribute_type target_attribute )
2012-12-02 10:58:59 +00:00
{
2012-12-07 03:13:10 +00:00
m_node_attribute = target_attribute ;
2012-12-02 10:58:59 +00:00
}
2012-12-07 03:13:10 +00:00
std : : string KRAnimationAttribute : : getTargetName ( ) const
2012-12-02 10:58:59 +00:00
{
2012-12-07 03:13:10 +00:00
return m_target_name ;
2012-12-02 10:58:59 +00:00
}
2012-12-07 03:13:10 +00:00
void KRAnimationAttribute : : setTargetName ( const std : : string & target_name )
2012-12-02 10:58:59 +00:00
{
2012-12-07 03:13:10 +00:00
m_target_name = target_name ;
m_target = NULL ;
2012-12-02 10:58:59 +00:00
}
std : : string KRAnimationAttribute : : getCurveName ( ) const
{
return m_curve_name ;
2012-12-02 09:31:01 +00:00
}
2012-12-02 10:58:59 +00:00
void KRAnimationAttribute : : setCurveName ( const std : : string & curve_name )
{
m_curve_name = curve_name ;
2012-12-07 03:13:10 +00:00
m_curve = NULL ;
}
KRNode * KRAnimationAttribute : : getTarget ( )
{
if ( m_target = = NULL ) {
2012-12-20 22:08:41 +00:00
m_target = getContext ( ) . getSceneManager ( ) - > getFirstScene ( ) - > getRootNode ( ) - > find < KRNode > ( m_target_name ) ; // FINDME, HACK! - This won't work with multiple scenes in a context; we should move the animations out of KRAnimationManager and attach them to the parent nodes of the animated KRNode's
2012-12-07 03:13:10 +00:00
}
2013-05-24 12:20:47 -07:00
if ( m_target = = NULL ) {
2013-12-14 16:06:44 -08:00
KRContext : : Log ( KRContext : : LOG_LEVEL_ERROR , " Kraken - Animation attribute could not find object: %s " , m_target_name . c_str ( ) ) ;
2013-05-24 12:20:47 -07:00
}
2012-12-07 03:13:10 +00:00
return m_target ;
}
KRAnimationCurve * KRAnimationAttribute : : getCurve ( )
{
if ( m_curve = = NULL ) {
m_curve = getContext ( ) . getAnimationCurveManager ( ) - > getAnimationCurve ( m_curve_name . c_str ( ) ) ;
}
return m_curve ;
2012-12-02 10:58:59 +00:00
}
2013-08-24 16:37:07 -07:00
void KRAnimationAttribute : : deleteCurve ( )
{
KRAnimationCurve * curve = getCurve ( ) ;
if ( curve ) {
getContext ( ) . getAnimationCurveManager ( ) - > deleteAnimationCurve ( curve ) ;
m_curve = NULL ;
}
}
2012-12-02 10:58:59 +00:00