m3g/m3gcore11/src/m3g_animationcontroller.c
changeset 0 5d03bc08d59c
equal deleted inserted replaced
-1:000000000000 0:5d03bc08d59c
       
     1 /*
       
     2 * Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the License "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: AnimationController implementation
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 /*!
       
    20  * \internal
       
    21  * \file
       
    22  * \brief AnimationController implementation
       
    23  */
       
    24 
       
    25 #ifndef M3G_CORE_INCLUDE
       
    26 #   error included by m3g_core.c; do not compile separately.
       
    27 #endif
       
    28 
       
    29 #include "m3g_animationcontroller.h"
       
    30 #include "m3g_memory.h"
       
    31 
       
    32 
       
    33 /*----------------------------------------------------------------------
       
    34  * Internal functions
       
    35  *--------------------------------------------------------------------*/
       
    36 
       
    37 /*!
       
    38  * \internal
       
    39  * \brief Destroys this AnimationController object.
       
    40  *
       
    41  * \param obj AnimationController object
       
    42  */
       
    43 static void m3gDestroyAnimationController(Object *obj)
       
    44 {
       
    45     AnimationController *animController = (AnimationController *) obj;
       
    46     M3G_VALIDATE_OBJECT(animController);
       
    47 
       
    48     m3gDestroyObject(&animController->object);
       
    49 }
       
    50 
       
    51 /*!
       
    52  * \internal
       
    53  * \brief Check if controller is active.
       
    54  *
       
    55  * \param controller AnimationController object
       
    56  * \param worldTime current world time
       
    57  * \retval M3G_TRUE controller active
       
    58  * \retval M3G_FALSE controller not active
       
    59  */
       
    60 static M3Gbool m3gIsActive(const AnimationController *controller,
       
    61                         M3Gint worldTime)
       
    62 {
       
    63     if (controller->activationTime == controller->deactivationTime) {
       
    64         return M3G_TRUE;
       
    65     }
       
    66     return (worldTime >= controller->activationTime &&
       
    67             worldTime < controller->deactivationTime);
       
    68 }
       
    69 
       
    70 /*!
       
    71  * \internal
       
    72  * \brief Gets time to controller activation.
       
    73  *
       
    74  * \param controller AnimationController object
       
    75  * \param worldTime current world time
       
    76  * \return time to controller activation
       
    77  */
       
    78 static M3Gint m3gTimeToActivation(const AnimationController *controller,
       
    79                                M3Gint worldTime)
       
    80 {
       
    81     if (worldTime < controller->activationTime) {
       
    82         return (controller->activationTime - worldTime);
       
    83     }
       
    84     else if (worldTime < controller->deactivationTime) {
       
    85         return 0;
       
    86     }
       
    87     return 0x7FFFFFFF;
       
    88 }
       
    89 
       
    90 /*!
       
    91  * \internal
       
    92  * \brief Gets time to controller deactivation.
       
    93  *
       
    94  * \param controller AnimationController object
       
    95  * \param worldTime current world time
       
    96  * \return time to controller deactivation
       
    97  */
       
    98 static M3Gint m3gTimeToDeactivation(const AnimationController *controller,
       
    99                                  M3Gint worldTime)
       
   100 {
       
   101     if (worldTime < controller->deactivationTime) {
       
   102         return (controller->deactivationTime - worldTime);
       
   103     }
       
   104     return 0x7FFFFFFF;
       
   105 }
       
   106 
       
   107 /*!
       
   108  * \internal
       
   109  * \brief Overloaded Object3D method.
       
   110  *
       
   111  * \param originalObj original AnimationController object
       
   112  * \param cloneObj pointer to cloned AnimationController object
       
   113  * \param pairs array for all object-duplicate pairs
       
   114  * \param numPairs number of pairs
       
   115  */
       
   116 static M3Gbool m3gAnimationControllerDuplicate(const Object *originalObj,
       
   117                                                Object **cloneObj,
       
   118                                                Object **pairs,
       
   119                                                M3Gint *numPairs)
       
   120 {
       
   121     const AnimationController *original = (AnimationController *)originalObj;
       
   122     AnimationController *clone =
       
   123         m3gCreateAnimationController(originalObj->interface);
       
   124     *cloneObj = (Object *)clone;
       
   125     if (*cloneObj == NULL) {
       
   126         return M3G_FALSE;
       
   127     }
       
   128 
       
   129     if (m3gObjectDuplicate(originalObj, cloneObj, pairs, numPairs)) {
       
   130         clone->activationTime = original->activationTime;
       
   131         clone->deactivationTime = original->deactivationTime;
       
   132         clone->weight = original->weight;
       
   133         clone->speed = original->speed;
       
   134         clone->refWorldTime = original->refWorldTime;
       
   135         clone->refSequenceTime = original->refSequenceTime;
       
   136         return M3G_TRUE;
       
   137     }
       
   138     else {
       
   139         return M3G_FALSE;
       
   140     }
       
   141 }
       
   142 
       
   143 /*----------------------------------------------------------------------
       
   144  * Virtual function table
       
   145  *--------------------------------------------------------------------*/
       
   146 
       
   147 static const ObjectVFTable m3gvf_AnimationController = {
       
   148     m3gObjectApplyAnimation,
       
   149     m3gObjectIsCompatible,
       
   150     m3gObjectUpdateProperty,
       
   151     m3gObjectDoGetReferences,
       
   152     m3gObjectFindID,
       
   153     m3gAnimationControllerDuplicate,
       
   154     m3gDestroyAnimationController
       
   155 };
       
   156 
       
   157 
       
   158 /*----------------------------------------------------------------------
       
   159  * Public API functions
       
   160  *--------------------------------------------------------------------*/
       
   161 
       
   162 /*!
       
   163  * \brief Creates a new AnimationController with default values
       
   164  *
       
   165  * \param hInterface    M3G interface
       
   166  * \retval AnimationController new AnimationController object
       
   167  * \retval NULL AnimationController creating failed
       
   168  */
       
   169 M3G_API M3GAnimationController m3gCreateAnimationController(
       
   170     M3GInterface hInterface)
       
   171 {
       
   172     Interface *m3g = (Interface *) hInterface;
       
   173     M3G_VALIDATE_INTERFACE(m3g);
       
   174     {
       
   175         AnimationController *controller = m3gAllocZ(m3g, sizeof(AnimationController));
       
   176 
       
   177         if (controller != NULL) {
       
   178             m3gInitObject(&controller->object, m3g,
       
   179                           M3G_CLASS_ANIMATION_CONTROLLER);
       
   180             controller->weight = 1;
       
   181             controller->speed = 1.0f;
       
   182         }
       
   183 
       
   184         return (M3GAnimationController) controller;
       
   185     }
       
   186 }
       
   187 
       
   188 /*!
       
   189  * \brief Set active interval.
       
   190  *
       
   191  * \param hController AnimationController object
       
   192  * \param worldTimeMin active interval start
       
   193  * \param worldTimeMax active interval end
       
   194  */
       
   195 M3G_API void m3gSetActiveInterval(M3GAnimationController hController,
       
   196                                   M3Gint worldTimeMin,
       
   197                                   M3Gint worldTimeMax)
       
   198 {
       
   199     AnimationController *controller = (AnimationController *) hController;
       
   200     M3G_VALIDATE_OBJECT(controller);
       
   201 
       
   202     if (worldTimeMin > worldTimeMax) {
       
   203         m3gRaiseError(M3G_INTERFACE(controller), M3G_INVALID_VALUE);
       
   204         return;
       
   205     }
       
   206     controller->activationTime   = worldTimeMin;
       
   207     controller->deactivationTime = worldTimeMax;
       
   208 }
       
   209 
       
   210 /*!
       
   211  * \brief Get active interval start.
       
   212  *
       
   213  * \param hController AnimationController object
       
   214  * \return active interval start
       
   215  */
       
   216 M3G_API M3Gint m3gGetActiveIntervalStart(M3GAnimationController hController)
       
   217 {
       
   218     AnimationController *controller = (AnimationController *) hController;
       
   219     M3G_VALIDATE_OBJECT(controller);
       
   220 
       
   221     return controller->activationTime;
       
   222 }
       
   223 
       
   224 /*!
       
   225  * \brief Get active interval end.
       
   226  *
       
   227  * \param hController AnimationController object
       
   228  * \return active interval end
       
   229  */
       
   230 M3G_API M3Gint m3gGetActiveIntervalEnd(M3GAnimationController hController)
       
   231 {
       
   232     AnimationController *controller = (AnimationController *) hController;
       
   233     M3G_VALIDATE_OBJECT(controller);
       
   234 
       
   235     return controller->deactivationTime;
       
   236 }
       
   237 
       
   238 /*!
       
   239  * \brief Set speed.
       
   240  *
       
   241  * \param hController   AnimationController object
       
   242  * \param factor        speed factor
       
   243  * \param worldTime     reference world time
       
   244  */
       
   245 M3G_API void m3gSetSpeed(M3GAnimationController hController,
       
   246                          M3Gfloat factor, M3Gint worldTime)
       
   247 {
       
   248     AnimationController *controller = (AnimationController *) hController;
       
   249     M3G_VALIDATE_OBJECT(controller);
       
   250 
       
   251     controller->refSequenceTime = m3gGetPosition(controller, worldTime);
       
   252     controller->refWorldTime = worldTime;
       
   253     controller->speed = factor;
       
   254 }
       
   255 
       
   256 /*!
       
   257  * \brief Get speed.
       
   258  *
       
   259  * \param hController   AnimationController object
       
   260  * \return              speed factor
       
   261  */
       
   262 M3G_API M3Gfloat m3gGetSpeed(M3GAnimationController hController)
       
   263 {
       
   264     AnimationController *controller = (AnimationController *) hController;
       
   265     M3G_VALIDATE_OBJECT(controller);
       
   266 
       
   267     return controller->speed;
       
   268 }
       
   269 
       
   270 /*!
       
   271  * \brief Set position.
       
   272  *
       
   273  * \param hController   AnimationController object
       
   274  * \param sequenceTime  sequence time
       
   275  * \param worldTime     world time
       
   276  */
       
   277 M3G_API void m3gSetPosition(M3GAnimationController hController,
       
   278                             M3Gfloat sequenceTime, M3Gint worldTime)
       
   279 {
       
   280     AnimationController *controller = (AnimationController *) hController;
       
   281     M3G_VALIDATE_OBJECT(controller);
       
   282 
       
   283     controller->refWorldTime = worldTime;
       
   284     controller->refSequenceTime = sequenceTime;
       
   285 }
       
   286 
       
   287 /*!
       
   288  * \brief Get position.
       
   289  *
       
   290  * \param hController   AnimationController object
       
   291  * \param worldTime     current world time
       
   292  * \retrun              position
       
   293  */
       
   294 M3G_API M3Gfloat m3gGetPosition(M3GAnimationController hController, M3Gint worldTime)
       
   295 {
       
   296     AnimationController *controller = (AnimationController *) hController;
       
   297     M3G_VALIDATE_OBJECT(controller);
       
   298 
       
   299     return m3gAdd(controller->refSequenceTime,
       
   300                   m3gMul(controller->speed, (M3Gfloat) worldTime - controller->refWorldTime));
       
   301 }
       
   302 
       
   303 
       
   304 /*!
       
   305  * \brief Set controller weight.
       
   306  *
       
   307  * \param hController   AnimationController object
       
   308  * \param weight        controller weight
       
   309  */
       
   310 M3G_API void m3gSetWeight(M3GAnimationController hController, M3Gfloat weight)
       
   311 {
       
   312     AnimationController *controller = (AnimationController *) hController;
       
   313     M3G_VALIDATE_OBJECT(controller);
       
   314 
       
   315     if (weight < 0) {
       
   316         m3gRaiseError(M3G_INTERFACE(controller), M3G_INVALID_VALUE);
       
   317         return;
       
   318     }
       
   319     controller->weight = weight;
       
   320 }
       
   321 
       
   322 /*!
       
   323  * \brief Get controller weight.
       
   324  *
       
   325  * \param hController   AnimationController object
       
   326  * \return              controller weight
       
   327  */
       
   328 M3G_API M3Gfloat m3gGetWeight(M3GAnimationController hController)
       
   329 {
       
   330     AnimationController *controller = (AnimationController *) hController;
       
   331     M3G_VALIDATE_OBJECT(controller);
       
   332 
       
   333     return controller->weight;
       
   334 }
       
   335 
       
   336 /*!
       
   337  * \brief Get reference world time.
       
   338  *
       
   339  * \param hController   AnimationController object
       
   340  * \return              reference world time
       
   341  */
       
   342 M3G_API M3Gint m3gGetRefWorldTime(M3GAnimationController hController)
       
   343 {
       
   344     AnimationController *controller = (AnimationController *) hController;
       
   345     M3G_VALIDATE_OBJECT(controller);
       
   346 
       
   347     return controller->refWorldTime;
       
   348 }