void UIScrollView::ScrollToTop() { m_pkInnerNode->setPositionY(VeFloorf(-m_f32MoveTop)); UpdateScrollBar(); m_f32Velocity = 0; m_bOnTouch = false; }
void UIScrollView::UpdateBounding() { CCRect kRect = boundingBox(); if(m_kChildren.Size()) { m_f32MinX = VE_MAXFLOAT_F; m_f32MaxX = -VE_MAXFLOAT_F; m_f32MinY = VE_MAXFLOAT_F; m_f32MaxY = -VE_MAXFLOAT_F; m_kChildren.BeginIterator(); while(!m_kChildren.IsEnd()) { UIWidget* pkWidget = m_kChildren.GetIterNode()->m_tContent; m_kChildren.Next(); VE_ASSERT(pkWidget); if(pkWidget->GetVisible()) { CCRect kRectWidget = pkWidget->boundingBox(); kRectWidget.origin.x -= kRectWidget.size.width * pkWidget->GetTouchAnchorPoint().x; kRectWidget.origin.y -= kRectWidget.size.height * pkWidget->GetTouchAnchorPoint().y; m_f32MinX = VE_MIN(kRectWidget.getMinX(), m_f32MinX); m_f32MaxX = VE_MAX(kRectWidget.getMaxX(), m_f32MaxX); m_f32MinY = VE_MIN(kRectWidget.getMinY(), m_f32MinY); m_f32MaxY = VE_MAX(kRectWidget.getMaxY(), m_f32MaxY); } } m_f32MinY = VE_MIN(m_f32MinY, m_f32MaxY - kRect.size.height); } else { m_f32MinX = 0; m_f32MaxX = kRect.size.width; m_f32MinY = 0; m_f32MaxY = kRect.size.height; } m_f32MoveLeft = m_f32MinX; m_f32MoveRight = m_f32MaxX - kRect.size.width; m_f32MoveBottom = m_f32MinY; m_f32MoveTop = m_f32MaxY - kRect.size.height; VeFloat32 f32Rate = m_f32MaxY > m_f32MinY ? kRect.size.height / (m_f32MaxY - m_f32MinY) : 1.0f; f32Rate = VE_MIN(f32Rate, 1.0f); m_f32ScrollBarLen = VeFloorf(VeFloat32(kRect.size.height) * f32Rate); m_bCanScroll = f32Rate < 1.0f; UpdateScrollBar(); }
//-------------------------------------------------------------------------- void VeRenderTest::OnUpdate() noexcept { /*VE_VECTOR eye = { 500,0,500,0 }; VE_VECTOR focus = { 0,0,0,0 }; VE_VECTOR up = g_MathIdentityR2; VE_MATRIX4X3 view = VeMatrixLookAtLH(eye, focus, up); VE_MATRIX view4; view4.r[0] = view.r[0]; view4.r[1] = view.r[1]; view4.r[2] = view.r[2]; view4.r[3] = g_MathIdentityR3; VE_MATRIX proj = VeMatrixPerspectiveFovLH(VE_MATH_PI_2_F, 720.f / 1280.f, 0.25f, 8000.f); view4 = VeMatrixMultiply(view4, proj);*/ //static VeFloat32 s_Test = 0.0f; //s_Test -= ve_time.GetDeltaTime() * 0.3f; //VE_FLOAT4A* pvData = (VE_FLOAT4A*)spCB->Map(); //VE_VECTOR v = { 0, s_Test, 0.5f, 0.5f }; //VeStoreFloat4A(pvData, v); ////VeStoreFloat4x4A(pvData, view4); //spCB->Unmap(); //VE_FLOAT4X4A* pvData = (VE_FLOAT4X4A*)spCB->Map(); //VeStoreFloat4x4A(pvData, view4); //spCB->Unmap(); static VeFloat32 s_f32TimeCount(0); static VeUInt32 s_u32FrameCount(0); static VeUInt32 s_u32FPS; s_f32TimeCount += ve_time.GetDeltaTime(); ++s_u32FrameCount; if (s_f32TimeCount > 1.0f) { s_u32FPS = s_u32FrameCount; VeChar8 s_acFPS[64]; VeSprintf(s_acFPS, "%s[FPS:%d]", (const VeChar8*)m_kString, s_u32FrameCount); m_spMainWindow->SetTitle(s_acFPS); s_f32TimeCount -= VeFloorf(s_f32TimeCount); s_u32FrameCount = 0; } }
void UIScrollView::UpdateScrollBar() { VeFloat32 f32Len = m_f32ScrollBarLen; VeFloat32 f32PosY = -m_pkInnerNode->getPositionY(); CCRect kRect = m_apkScrollBarV[0]->getTextureRect(); VeFloat32 f32ScaleLen = VeFloorf(f32Len - kRect.size.height * 2.4f * ui_main_scale); f32ScaleLen = VE_MAX(f32ScaleLen, 0); if(f32PosY < m_f32MoveBottom) { f32ScaleLen = VE_MAX(f32ScaleLen - m_f32MoveBottom + f32PosY, 0); VeFloat32 f32PosYMin = VeFloorf(kRect.size.height * ui_main_scale * 1.2f) + f32ScaleLen; m_pkScrollBarV->setPositionY(f32PosYMin); } else if(f32PosY > m_f32MoveTop) { f32ScaleLen = VE_MAX(f32ScaleLen - f32PosY + m_f32MoveTop, 0); VeFloat32 f32PosYMax = getContentSize().height - VeFloorf(kRect.size.height * ui_main_scale * 1.2f); m_pkScrollBarV->setPositionY(f32PosYMax); } else { VeFloat32 f32PosYMin = VeFloorf(kRect.size.height * ui_main_scale * 1.2f) + f32ScaleLen; VeFloat32 f32PosYMax = getContentSize().height - VeFloorf(kRect.size.height * ui_main_scale * 1.2f); if(f32PosYMin != f32PosYMax) { VeFloat32 f32PosYRate = (f32PosY - m_f32MoveBottom) / (m_f32MoveTop - m_f32MoveBottom); m_pkScrollBarV->setPositionY(VeFloorf(VeLerp(f32PosYRate, f32PosYMin, f32PosYMax))); } else { m_pkScrollBarV->setPositionY(VeFloorf(f32PosYMin)); } } m_apkScrollBarV[1]->setPositionY(-f32ScaleLen); m_apkScrollBarV[2]->setScaleY(f32ScaleLen); }
void UIScrollView::ScroolToBottom() { m_pkInnerNode->setPositionY(VeFloorf(-m_f32MoveBottom)); UpdateScrollBar(); }
UIWidget* UIScrollView::ProcessTouch(UILayer::TouchType eType, cocos2d::CCTouch* pkTouch) { static CCPoint s_kBeganPos; static bool s_bScroll; static VeFloat32 s_f32InnerNodeStart; if(m_bCanScroll) { if(m_bEnabled && m_bVisible) { switch(eType) { case UILayer::TOUCH_BEGAN: m_pkScrollBarV->setVisible(false); m_bShowScrollBar = false; m_bOnTouch = true; s_bScroll = false; m_bRollBack = false; s_kBeganPos = pkTouch->getLocation(); m_f32Velocity = 0.0f; { UIWidget* pkWidget = UIWidget::ProcessTouch(eType, pkTouch); if(pkWidget) return pkWidget; } break; case UILayer::TOUCH_MOVED: m_bOnTouch = true; if(s_bScroll) { VeFloat32 f32DeltaY = pkTouch->getLocation().y - pkTouch->getPreviousLocation().y; if(((-s_f32InnerNodeStart) < m_f32MoveBottom) || ((-s_f32InnerNodeStart) > m_f32MoveTop)) { f32DeltaY *= 0.3f; m_f32Velocity = 0; } else { m_f32Velocity = f32DeltaY * EVENT_RATE; m_f32Velocity = VE_MIN(m_f32Velocity, VELOCITYMAX); m_f32Velocity = VE_MAX(m_f32Velocity, -VELOCITYMAX); } s_f32InnerNodeStart += f32DeltaY; m_pkInnerNode->setPositionY(VeFloorf(s_f32InnerNodeStart)); UpdateScrollBar(); } else { if(VeFabsf(pkTouch->getLocation().y - s_kBeganPos.y) > (10.0f * ui_main_scale)) { m_bShowScrollBar = true; m_fHideScrollBarPass = 0; m_pkScrollBarV->setVisible(true); m_apkScrollBarV[0]->setOpacity(m_ubyOpacity); m_apkScrollBarV[1]->setOpacity(m_ubyOpacity); m_apkScrollBarV[2]->setOpacity(m_ubyOpacity); s_bScroll = true; s_f32InnerNodeStart = m_pkInnerNode->getPositionY(); } else { UIWidget* pkWidget = UIWidget::ProcessTouch(eType, pkTouch); if(pkWidget) return pkWidget; } } break; case UILayer::TOUCH_ENDED: case UILayer::TOUCH_CANCELLED: { UIWidget* pkWidget = UIWidget::ProcessTouch(eType, pkTouch); if(pkWidget) { return pkWidget; } else { OnRelease(); } } break; default: break; } return this; } else { m_bOnTouch = false; return NULL; } } else { return UIWidget::ProcessTouch(eType, pkTouch); } }
void UIScrollView::Update(VeFloat32 f32Delta) { if(!m_bOnTouch) { if(m_f32Velocity > 0) { VeFloat32 f32PosY = m_pkInnerNode->getPositionY(); VeFloat32 f32Acce = FRICTION_PER_SEC * ui_main_scale; if(m_f32MoveBottom > (-f32PosY)) { f32Acce += (m_f32MoveBottom + f32PosY) * DAMPING; } m_f32Velocity = VE_MAX(m_f32Velocity - f32Acce * f32Delta, 0); if(m_f32Velocity > 0) { m_pkInnerNode->setPositionY(VeFloorf(f32PosY + m_f32Velocity * f32Delta)); } else { m_bRollBack = true; m_f32RollBackTime = ROLLBACK_TIME; m_f32RollBackPosY = f32PosY; } UpdateScrollBar(); } else if(m_f32Velocity < 0) { VeFloat32 f32PosY = m_pkInnerNode->getPositionY(); VeFloat32 f32Acce = -FRICTION_PER_SEC * ui_main_scale; if((-f32PosY) > m_f32MoveTop) { f32Acce += (m_f32MoveTop + f32PosY) * DAMPING; } m_f32Velocity = VE_MIN(m_f32Velocity - f32Acce * f32Delta, 0); if(m_f32Velocity < 0) { m_pkInnerNode->setPositionY(VeFloorf(f32PosY + m_f32Velocity * f32Delta)); } else { m_bRollBack = true; m_f32RollBackTime = ROLLBACK_TIME; m_f32RollBackPosY = f32PosY; } UpdateScrollBar(); } else if(m_bRollBack) { if(m_f32RollBackTime <= 0) { m_bRollBack = false; m_f32RollBackTime = 0; } else if(m_f32MoveBottom > (-m_f32RollBackPosY)) { m_f32RollBackTime -= f32Delta; if(m_f32RollBackTime > 0) { VeFloat32 f32Offset = VeCosf((m_f32RollBackTime / ROLLBACK_TIME) * VE_MATH_PI_2_F); m_pkInnerNode->setPositionY(VeFloorf(VeLerp(f32Offset, m_f32RollBackPosY, -m_f32MoveBottom))); } else { m_f32RollBackTime = 0; m_bRollBack = false; m_pkInnerNode->setPositionY(VeFloorf(-m_f32MoveBottom)); } } else if(((-m_f32RollBackPosY) > m_f32MoveTop)) { m_f32RollBackTime -= f32Delta; if(m_f32RollBackTime > 0) { VeFloat32 f32Offset = VeCosf((m_f32RollBackTime / ROLLBACK_TIME) * VE_MATH_PI_2_F); m_pkInnerNode->setPositionY(VeFloorf(VeLerp(f32Offset, m_f32RollBackPosY, -m_f32MoveTop))); } else { m_f32RollBackTime = 0; m_bRollBack = false; m_pkInnerNode->setPositionY(VeFloorf(-m_f32MoveTop)); } } else { m_bRollBack = false; m_f32RollBackTime = 0; } UpdateScrollBar(); } else if(m_bShowScrollBar) { if(m_fHideScrollBarPass < SCROLLBAR_HIDE) { m_fHideScrollBarPass = VE_MIN(m_fHideScrollBarPass + f32Delta, SCROLLBAR_HIDE); VeFloat32 f32Rate = 1.0f - (m_fHideScrollBarPass / SCROLLBAR_HIDE); m_apkScrollBarV[0]->setOpacity(m_ubyOpacity * f32Rate); m_apkScrollBarV[1]->setOpacity(m_ubyOpacity * f32Rate); m_apkScrollBarV[2]->setOpacity(m_ubyOpacity * f32Rate); } else { m_pkScrollBarV->setVisible(false); m_bShowScrollBar = false; } } } }