/** @brief 키의 위치값을 얻는다. 아직 랜덤적용이 안된상태면 랜덤적용 시킨값을 생성해 리턴한다. */ XE::VEC2 XKeyScale::GetvScaleRandomed() { if( m_vScaleRandomed.IsInit() ) { m_vScaleRandomed = AssignRandom(); } return m_vScaleRandomed; }
void XKeyEffect::Execute( XSprObj *pSprObj, float fOverSec ) { auto pLayer = pSprObj->GetpLayerMove( GetLayerType(), GetnLayer() ); auto& cn = pLayer->GetcnEffect(); cn.interpolation = m_Interpolation; cn.fAlphaSrc = GetOpacityRandomed(); cn.fStartKeyFrame = GetfFrame(); auto pNextKey = m_pNextKey; if( pNextKey ) { cn.fAlphaDest = pNextKey->GetOpacityRandomed(); cn.fNextKeyFrame = pNextKey->GetfFrame(); } else { cn.interpolation = XBaseLayer::xNONE; cn.fNextKeyFrame = GetfFrame(); } cn.DrawMode = m_DrawMode; cn.dwDrawFlag = m_dwFlag; m_fOpacityRandomed = AssignRandom(); // XLayerMove *pLayer = pSprObj->GetpLayerMove(GetLayerType(), GetnLayer()); // pLayer->GetcnEffect().fAlpha = m_fOpacity; // XKeyEffect *pNextKey = m_pNextKey; // // if( m_Interpolation && pNextKey ) // 다음키까지 보간모드로 변해야 하고 다음키가 있으면 // pLayer->SetcnEffect( m_Interpolation, pNextKey->GetfOpacity(), m_fOpacity, m_dwFlag, m_DrawMode, GetfFrame(), pNextKey->GetfFrame() ); // else // pLayer->SetcnEffect( XBaseLayer::xNONE, 0, 0, m_dwFlag, m_DrawMode, 0, 0 ); }
void XKeyScale::Execute( XSPActObj spActObj, XSPBaseLayer spLayer, float fOverSec ) { // const auto bPlaying = spActObj->GetpSprObj()->IsPlaying(); auto pSprObj = spActObj->GetpSprObj(); auto bPlaying = pSprObj->IsPlaying(); if( pSprObj->GetpParent() ) bPlaying = pSprObj->GetpParent()->IsPlaying(); auto spLayerMove = std::static_pointer_cast<XLayerMove>( spLayer ); if( XASSERT( spLayerMove ) ) { auto& cn = spLayerMove->GetcnScaleMutable(); // 실시간으로 이 키의 뒤에 같은타입의 키가 있는지 찾는다 auto pNextKey = dynamic_cast<XKeyScale *>( GetNextKey() ); if( pNextKey ) { cn.interpolation = m_Interpolation; if( bPlaying ) cn.vScaleDest = pNextKey->GetvScaleRandomed(); else cn.vScaleDest = pNextKey->GetvScaleOrig(); // cn.vScaleSrc = m_vScaleOrig; cn.vScaleSrc = GetvScaleRandomed(); cn.fNextKeyFrame = pNextKey->GetfFrame(); cn.fStartKeyFrame = GetfFrame(); } else { cn.interpolation = xSpr::xNONE; cn.vScaleDest = m_vScaleOrig; cn.vScaleSrc = GetvScaleRandomed(); cn.fNextKeyFrame = GetfFrame(); cn.fStartKeyFrame = GetfFrame(); } if( bPlaying ) m_vScaleRandomed = AssignRandom(); // 다음 보간을 위해 랜덤값 만듬. else m_vScaleRandomed = m_vScaleOrig; // 에디팅 모드에선 오리지날 값만 씀. } // if( XASSERT( spLayerMove ) ) { // spLayerMove->SetScale( m_vScale ); // CHANNEL_SCALE cn; // cn.vScale = m_vScale; // cn.interpolation = m_Interpolation; // // spLayerMove->SetScale( m_fScaleX, m_fScaleY ); // // 실시간으로 이 키의 뒤에 같은타입의 키가 있는지 찾는다 // auto pNextKey = dynamic_cast<XKeyScale *>( GetNextKey() ); // if( m_Interpolation && pNextKey ) { // 다음키가 있으면 보간으로 움직이도록 한다 // cn.vScaleDest = pNextKey->GetvScale(); // cn.vScaleSrc = m_vScale; // cn.fNextKeyFrame = pNextKey->GetfFrame(); // cn.fStartKeyFrame = GetfFrame(); // } else { // cn.interpolation = xSpr::xNONE; // cn.vScaleDest.Set( 1.f ); // cn.vScaleSrc.Set( 1.f ); // cn.fNextKeyFrame = 0; // cn.fStartKeyFrame = 0; // } // // 채널정보 씀 // spLayerMove->SetcnScale( cn ); // } }
void XKeyPos::Execute( XSprObj *pSprObj, float fOverSec ) { auto pActObj = pSprObj->GetpObjActCurr(); if( XASSERT( pActObj ) ) { XLayerMove* pLayer = nullptr; if( GetidLayer() ) { pLayer = SafeCast<XLayerMove*>( pActObj->GetpLayerByidLocalInLayer( GetidLayer() ) ); } else { pLayer = SafeCast<XLayerMove*>( pSprObj->GetLayer( GetLayerType(), GetnLayer() ) ); } // auto pLayer = GetpLayerByidLayerT<XLayerMove>( pSprObj ); if( XASSERT( pLayer ) ) { auto& cn = pLayer->GetcnPos(); // if( cn.interpolation ) // 새 키가 실행될때 이전 채널값을 안지운다는 가정. // // 현재 채널이 보간모드면 이전 위치를 시작위치로 한다. // cn.m_vStart = cn.m_vEnd; // else // // 채널에 보간옵션이 없으면 현재키의 랜덤값으로 지정한다. // cn.m_vStart = AssignRandom(); if( m_pInterpolationEndKey ) { cn.interpolation = m_Interpolation; cn.m_frameStartKey = GetfFrame(); cn.m_vStart = GetvPosRandomed(); // cn.m_vStart = AssignRandom(); cn.m_frameEndKey = m_pInterpolationEndKey->GetfFrame(); // cn.m_vEnd = m_pInterpolationEndKey->GetvPosRandomed(); cn.m_vEnd = m_pInterpolationEndKey->AssignRandom(); } else { // 다음키가 없다는것은 보간옵션이 켜져있어도 보간할게 없다는뜻임. cn.interpolation = XBaseLayer::xNONE; cn.m_frameStartKey = GetfFrame(); cn.m_vStart = GetvPosRandomed(); // cn.m_frameEndKey = GetfFrame(); } m_vPosRandomed = AssignRandom(); // cn.m_mapRandom[ GetidKey() ] = AssignRandom(); } // pLayer } // pActObj }
void XKeyScale::Execute( XSprObj *pSprObj, float fOverSec ) { auto pLayer = pSprObj->GetpLayerMove( GetLayerType(), GetnLayer() ); auto& cn = pLayer->GetcnScale(); cn.m_vScaleSrc = GetvScaleRandomed(); cn.fStartKeyFrame = GetfFrame(); if( m_pNextKey ) { cn.interpolation = m_Interpolation; cn.m_vScaleDest = m_pNextKey->GetvScaleRandomed(); cn.fNextKeyFrame = m_pNextKey->GetfFrame(); } else { cn.interpolation = XBaseLayer::xNONE; } m_vScaleRandomed = AssignRandom(); // XLayerMove *pLayer = pSprObj->GetpLayerMove(GetLayerType(), GetnLayer()); // pLayer->SetScale( m_fScaleX, m_fScaleY ); // // XKeyScale *pNextKey = m_pNextKey; // // if( m_Interpolation && pNextKey ) // 다음키가 있으면 보간으로 움직이도록 한다 // pLayer->SetcnScale( m_Interpolation, pNextKey->GetfScaleX(), pNextKey->GetfScaleY(), GetfScaleX(), GetfScaleY(), GetfFrame(), pNextKey->GetfFrame() ); // else // pLayer->SetcnScale( XBaseLayer::xNONE, 1.0f, 1.0f, 1.0f, 1.0f, 0, 0 ); }
float XKeyEffect::GetOpacityRandomed() { if( m_fOpacityRandomed == 9999.f ) m_fOpacityRandomed = AssignRandom(); return m_fOpacityRandomed; }