Advertisement
PandaKnuckle

Tween.cpp

Jul 6th, 2013
61
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) 2012 GarageGames, LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to
  6. // deal in the Software without restriction, including without limitation the
  7. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. // sell copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. // IN THE SOFTWARE.
  21. //-----------------------------------------------------------------------------
  22.  
  23. #include "Tween.h"
  24.  
  25. #include "T3D\gameBase\gameBase.h"
  26.  
  27. IMPLEMENT_CONOBJECT(Tween);
  28.  
  29. //-------------------------------------------
  30. // Tween
  31. //-------------------------------------------
  32.  
  33. Tween::Tween()
  34. {
  35.    mDuration = 0.f;
  36.    mCurrentTime = 0.f;
  37.    mTarget = NULL;
  38.    mValueName = NULL;
  39.    mValueTarget = 0.f;
  40.    mEaseDirection = Ease::InOut;
  41.    mEaseType = Ease::Linear;
  42.    mState = TweenState::Idle;
  43. }
  44.  
  45. bool Tween::onAdd()
  46. {
  47.    if(!Parent::onAdd())
  48.       return false;
  49.    mCurrentTime = 0;
  50.    SetInitialValue();
  51.    return true;
  52. }
  53.  
  54. void Tween::onRemove()
  55. {
  56.    Parent::onRemove();
  57. }
  58.  
  59. void Tween::initPersistFields()
  60. {
  61.    addField("Duration", TypeF32, Offset(mDuration, Tween), "");
  62.    addField("EaseTarget", TYPEID<SimObject>(), Offset(mTarget, Tween), "");
  63.    addField("ValueName", TYPEID<const char*>(), Offset(mValueName, Tween), "");
  64.    addField("ValueTarget", TypeF32, Offset(mValueTarget, Tween), "");
  65.    addField("EaseDirection", TypeS32, Offset(mEaseDirection, Tween), "");
  66.    addField("EaseType", TypeS32, Offset(mEaseType, Tween), "");
  67.  
  68.    Parent::initPersistFields();
  69. }
  70.  
  71. void Tween::interpolateTick(F32 delta)
  72. {
  73. }
  74.  
  75. void Tween::processTick()
  76. {
  77. }
  78.  
  79. void Tween::advanceTime(F32 time)
  80. {
  81.    if(mTarget && mTarget->isDeleted()){
  82.       mTarget = NULL;
  83.       return;
  84.    }
  85.    switch (mState)
  86.    {
  87.    case Tween::Idle:
  88.       break;
  89.    case Tween::Playing:
  90.       mCurrentTime += time;
  91.       if(mCurrentTime >= mDuration)
  92.       {
  93.          mCurrentTime = mDuration;
  94.          SetValueByTime(mDuration);
  95.          mState = Tween::Idle;
  96.       }
  97.       else
  98.          SetValueByTime(mCurrentTime);
  99.       break;
  100.    case Tween::Paused:
  101.       break;
  102.    case Tween::PlayingReversed:
  103.       mCurrentTime += time;
  104.       if(mCurrentTime >= mDuration)
  105.       {
  106.          mCurrentTime = mDuration;
  107.          SetValueByTime(0);
  108.          mState = Tween::Idle;
  109.       }
  110.       else
  111.          SetValueByTime(mDuration - mCurrentTime);
  112.       break;
  113.    default:
  114.       break;
  115.    }
  116. }
  117.  
  118. void Tween::Play()
  119. {
  120.    mState = TweenState::Playing;
  121.    SetInitialValue();
  122. }
  123.  
  124. void Tween::Pause()
  125. {
  126.    mState = TweenState::Paused;
  127. }
  128.  
  129. void Tween::Rewind()
  130. {
  131.    mCurrentTime = 0;
  132.    SetValueByTime(0);
  133.    SetInitialValue();
  134. }
  135.  
  136. void Tween::Reverse()
  137. {
  138.    mState = TweenState::PlayingReversed;
  139.    SetInitialValue();
  140. }
  141.  
  142. void Tween::SetValueByTime(F32 time)
  143. {
  144.    EaseF ease = EaseF(mEaseDirection, mEaseType);
  145.    // t: current time, b: beginning value, c: change in value, d: duration
  146.    F32 t = time;
  147.    F32 b = mInitialValue;
  148.    F32 c = mValueTarget - mInitialValue;
  149.    F32 d = mDuration;
  150.    F32 newValue = ease.getValue(t,b,c,d);
  151.    if(mTarget)
  152.       SetTargetField(newValue);
  153.    else
  154.       SetGlobalField(newValue);
  155. }
  156.  
  157. void Tween::SetTargetField(F32 value)
  158. {
  159.    int size = strlen(mValueName);
  160.    char buffer[18];
  161.    dSprintf(buffer, sizeof(buffer), "%f", value);
  162.    if(size <= 0)
  163.    {
  164.       Con::errorf("ValueName not set, pausing Tween %s", getId());
  165.       Pause();
  166.       return;
  167.    }
  168.  
  169.    switch (mValueName[0])
  170.    {
  171.       // Position BEGIN -----
  172.    case 'x':
  173.    case 'X':
  174.       if(size == 1)
  175.       {
  176.          SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  177.          if(obj)
  178.          {
  179.             Point3F pos = obj->getPosition();
  180.             obj->setPosition(Point3F(value, pos.y, pos.z));
  181.          }
  182.          return;
  183.       }
  184.       break;
  185.    case 'y':
  186.    case 'Y':
  187.       if(size == 1)
  188.       {
  189.          SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  190.          if(obj)
  191.          {
  192.             Point3F pos = obj->getPosition();
  193.             obj->setPosition(Point3F(pos.x, value, pos.z));
  194.          }
  195.          return;
  196.       }
  197.       break;
  198.    case 'z':
  199.    case 'Z':
  200.       if(size == 1)
  201.       {
  202.          SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  203.          if(obj)
  204.          {
  205.             Point3F pos = obj->getPosition();
  206.             obj->setPosition(Point3F(pos.x, pos.y, value));
  207.          }
  208.          return;
  209.       }
  210.       break;
  211.       // Position END -----
  212.       // Rotation BEGIN -----
  213.    case 'R':
  214.    case 'r':
  215.       switch (mValueName[1])
  216.       {
  217.       case 'x':
  218.       case 'X':
  219.          if(size == 2)
  220.          {
  221.             SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  222.             if(obj)
  223.             {
  224.                EulerF euler = obj->getTransform().toEuler();
  225.                euler = Point3F(value, euler.y, euler.z);
  226.                obj->setTransform(MatrixF(euler));
  227.             }
  228.             return;
  229.          }
  230.          break;
  231.       case 'y':
  232.       case 'Y':
  233.          if(size == 2)
  234.          {
  235.             SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  236.             if(obj)
  237.             {
  238.                EulerF euler = obj->getTransform().toEuler();
  239.                euler = Point3F(euler.x, value, euler.z);
  240.                obj->setTransform(MatrixF(euler));
  241.             }
  242.             return;
  243.          }
  244.          break;
  245.       case 'z':
  246.       case 'Z':
  247.          if(size == 2)
  248.          {
  249.             SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  250.             if(obj)
  251.             {
  252.                EulerF euler = obj->getTransform().toEuler();
  253.                euler = Point3F(euler.x, euler.y, value);
  254.                obj->setTransform(MatrixF(euler));
  255.             }
  256.             return;
  257.          }
  258.          break;
  259.       default:
  260.          break;
  261.       }
  262.       break;
  263.       // Rotation END -----
  264.       // Scale BEGIN -----
  265.    case 's':
  266.    case 'S':
  267.       switch (mValueName[1])
  268.       {
  269.       case 'x':
  270.       case 'X':
  271.          if(size == 2)
  272.          {
  273.             SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  274.             if(obj)
  275.             {
  276.                VectorF scale = obj->getScale();
  277.                obj->setScale(VectorF(value, scale.y, scale.z));
  278.             }
  279.             return;
  280.          }
  281.          break;
  282.       case 'y':
  283.       case 'Y':
  284.          if(size == 2)
  285.          {
  286.             SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  287.             if(obj)
  288.             {
  289.                VectorF scale = obj->getScale();
  290.                obj->setScale(VectorF(scale.x, value, scale.z));
  291.             }
  292.             return;
  293.          }
  294.          break;
  295.       case 'z':
  296.       case 'Z':
  297.          if(size == 2)
  298.          {
  299.             SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  300.             if(obj)
  301.             {
  302.                VectorF scale = obj->getScale();
  303.                obj->setScale(VectorF(scale.z, scale.y, value));
  304.             }
  305.             return;
  306.          }
  307.          break;
  308.       default:
  309.          break;
  310.       }
  311.       break;
  312.       // Scale END -----
  313.    default:
  314.       break;
  315.    }
  316.    mTarget->setDataField(StringTable->insert(mValueName), NULL, buffer);
  317. }
  318.  
  319. void Tween::SetGlobalField(F32 value)
  320. {
  321.    char buffer[6];
  322.    dSprintf(buffer, sizeof(buffer), "%s", value);
  323.    Con::setVariable(StringTable->insert(mValueName), buffer);
  324. }
  325.  
  326. void Tween::SetInitialValue()
  327. {
  328.    int size = strlen(mValueName);
  329.    if(size <= 0)
  330.    {
  331.       Con::errorf("ValueName not set, pausing Tween %s", getId());
  332.       Pause();
  333.       return;
  334.    }
  335.    if(!mTarget){
  336.       mInitialValue = atoi(Con::getVariable(StringTable->insert(mValueName)));
  337.       return;
  338.    }
  339.    switch (mValueName[0])
  340.    {
  341.       // Position BEGIN -----
  342.    case 'x':
  343.    case 'X':
  344.       if(size == 1)
  345.       {
  346.          SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  347.          if(obj)
  348.          {
  349.             mInitialValue = obj->getPosition().x;
  350.          }
  351.          return;
  352.       }
  353.       break;
  354.    case 'y':
  355.    case 'Y':
  356.       if(size == 1)
  357.       {
  358.          SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  359.          if(obj)
  360.          {
  361.             mInitialValue = obj->getPosition().y;
  362.          }
  363.          return;
  364.       }
  365.       break;
  366.    case 'z':
  367.    case 'Z':
  368.       if(size == 1)
  369.       {
  370.          SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  371.          if(obj)
  372.          {
  373.             mInitialValue = obj->getPosition().z;
  374.          }
  375.          return;
  376.       }
  377.       break;
  378.       // Position END -----
  379.       // Rotation BEGIN -----
  380.    case 'R':
  381.    case 'r':
  382.       switch (mValueName[1])
  383.       {
  384.       case 'x':
  385.       case 'X':
  386.          if(size == 2)
  387.          {
  388.             SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  389.             if(obj)
  390.             {
  391.                mInitialValue = obj->getTransform().toEuler().x;
  392.             }
  393.             return;
  394.          }
  395.          break;
  396.       case 'y':
  397.       case 'Y':
  398.          if(size == 2)
  399.          {
  400.             SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  401.             if(obj)
  402.             {
  403.                mInitialValue = obj->getTransform().toEuler().y;
  404.             }
  405.             return;
  406.          }
  407.          break;
  408.       case 'z':
  409.       case 'Z':
  410.          if(size == 2)
  411.          {
  412.             SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  413.             if(obj)
  414.             {
  415.                mInitialValue = obj->getTransform().toEuler().z;
  416.             }
  417.             return;
  418.          }
  419.          break;
  420.       default:
  421.          break;
  422.       }
  423.       break;
  424.       // Rotation END -----
  425.       // Scale BEGIN -----
  426.    case 's':
  427.    case 'S':
  428.       switch (mValueName[1])
  429.       {
  430.       case 'x':
  431.       case 'X':
  432.          if(size == 2)
  433.          {
  434.             SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  435.             if(obj)
  436.             {
  437.                mInitialValue = obj->getScale().x;
  438.             }
  439.             return;
  440.          }
  441.          break;
  442.       case 'y':
  443.       case 'Y':
  444.          if(size == 2)
  445.          {
  446.             SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  447.             if(obj)
  448.             {
  449.                mInitialValue = obj->getScale().y;
  450.             }
  451.             return;
  452.          }
  453.          break;
  454.       case 'z':
  455.       case 'Z':
  456.          if(size == 2)
  457.          {
  458.             SceneObject* obj = dynamic_cast<SceneObject*>(mTarget);
  459.             if(obj)
  460.             {
  461.                mInitialValue = obj->getScale().z;
  462.             }
  463.             return;
  464.          }
  465.          break;
  466.       default:
  467.          break;
  468.       }
  469.       break;
  470.       // Scale END -----
  471.    default:
  472.       break;
  473.    }
  474.    mInitialValue = atoi(mTarget->getDataField(StringTable->insert(mValueName), NULL));
  475. }
  476.  
  477. DefineEngineMethod(Tween, Play, void, (),,"")
  478. {
  479.    object->Play();
  480. }
  481.  
  482. DefineEngineMethod(Tween, Pause, void, (),,"")
  483. {
  484.    object->Pause();
  485. }
  486.  
  487. DefineEngineMethod(Tween, Rewind, void, (),,"")
  488. {
  489.    object->Rewind();
  490. }
  491.  
  492. DefineEngineMethod(Tween, Reverse, void, (),,"")
  493. {
  494.    object->Reverse();
  495. }
Advertisement
RAW Paste Data Copied
Advertisement