#include #include #define _USE_MATH_DEFINES #include #include "C_Block.h" #define FADE_DURATION 500 /*Durations of animations*/ unsigned int g_BlockAnimDurations[4] = {0, 500, 500, 100}; C_Block::C_Block(const char* f_strFileName, GLuint f_uiColorTex , MatProps_t f_Mat) : C_3DObject(f_strFileName, f_uiColorTex, f_Mat), m_CurrState(BS_IDLE), m_uiAnimStart(0) { } C_Block::~C_Block() { } void C_Block::Render(unsigned int f_iElapsedTime) { unsigned int l_uiDeltaTime = f_iElapsedTime - m_uiAnimStart; double l_Scale, l_Scalexz, l_Frac; //check if the previous animation has ended in between //calls to this Render function. if (l_uiDeltaTime > g_BlockAnimDurations[(int)m_CurrState]) { m_CurrState = BS_IDLE; } glPushMatrix(); switch (m_CurrState) { case BS_FADE_IN: l_Scale = (double)l_uiDeltaTime / (double)g_BlockAnimDurations[BS_FADE_IN]; //glScaled(l_Scale, l_Scale, l_Scale); SetScale(l_Scale, l_Scale, l_Scale); TransRotateScale(); C_3DObject::Render(); break; case BS_FADE_OUT: l_Scale = 1.0 - ((double)l_uiDeltaTime / (double)g_BlockAnimDurations[BS_FADE_OUT]); // glScaled(l_Scale, l_Scale, l_Scale); SetScale(l_Scale, l_Scale, l_Scale); TransRotateScale(); C_3DObject::Render(); break; case BS_COLLIDE: //wobble l_Frac = ((double)l_uiDeltaTime / (double)g_BlockAnimDurations[BS_COLLIDE]); l_Frac *= (M_PI/2.0); l_Scale = 0.8 + cos(l_Frac)*0.2; l_Scalexz = 1.0 - sin(l_Frac)*0.2; SetScale(l_Scalexz, l_Scale, l_Scalexz); TransRotateScale(); C_3DObject::Render(); break; case BS_IDLE: default: SetScale(1.0, 1.0, 1.0); TransRotateScale(); C_3DObject::Render(); break; } glPopMatrix(); }