| 372 | } |
| 373 | |
| 374 | void SpriteHandlePoint::moveTo( |
| 375 | const Transform::UnitVector& position, const Transform::UnitVector& camera) |
| 376 | { |
| 377 | m_dp = m_sprite.getPositionTransformer()(position, -camera, m_sprite.getLayer()); |
| 378 | if (m_type == SpriteHandlePointType::ScaleHandle) |
| 379 | { |
| 380 | const Transform::UnitVector pos |
| 381 | = m_sprite.getPosition(m_referential).to<Transform::Units::ScenePixels>(); |
| 382 | const Transform::UnitVector oppositePos |
| 383 | = m_sprite.getPosition(m_referential.flip()) |
| 384 | .to<Transform::Units::ScenePixels>(); |
| 385 | |
| 386 | if (m_referential.isOnCorner()) |
| 387 | { |
| 388 | const Transform::UnitVector centerSpritePos |
| 389 | = m_sprite.getPosition(Transform::Referential::Center); |
| 390 | const double spriteAngle = m_sprite.getRotation(); |
| 391 | const Transform::UnitVector oppositePosInRef |
| 392 | = oppositePos.rotate(spriteAngle, centerSpritePos); |
| 393 | const Transform::UnitVector posInRef |
| 394 | = pos.rotate(spriteAngle, centerSpritePos); |
| 395 | const Transform::UnitVector cursorInRef |
| 396 | = m_dp.rotate(spriteAngle, centerSpritePos); |
| 397 | const Transform::UnitVector scaleVector |
| 398 | = (cursorInRef - oppositePosInRef) / (posInRef - oppositePosInRef); |
| 399 | const double vScale = std::max(scaleVector.x, scaleVector.y); |
| 400 | if ((cursorInRef - oppositePosInRef).x != 0 |
| 401 | && (cursorInRef - oppositePosInRef).y != 0) |
| 402 | m_sprite.scale( |
| 403 | Transform::UnitVector(vScale, vScale, m_sprite.getSize().unit), |
| 404 | m_referential.flip()); |
| 405 | } |
| 406 | else |
| 407 | { |
| 408 | const Transform::UnitVector e1 = oppositePos - pos; |
| 409 | const Transform::UnitVector e2 = m_dp - pos; |
| 410 | |
| 411 | const double valDp = e1.x * e2.x + e1.y * e2.y; |
| 412 | const double len = e1.x * e1.x + e1.y * e1.y; |
| 413 | |
| 414 | /*m_dp.x = pos.x + (valDp * e1.x) / len; |
| 415 | m_dp.y = pos.y + (valDp * e1.y) / len;*/ |
| 416 | const Transform::UnitVector npp(pos.x + (valDp * e1.x) / len, |
| 417 | pos.y + (valDp * e1.y) / len, m_dp.unit); |
| 418 | m_sprite.setPointPosition(npp, m_referential); |
| 419 | } |
| 420 | } |
| 421 | else |
| 422 | { |
| 423 | const Transform::UnitVector center |
| 424 | = m_sprite.getPosition(Transform::Referential::Center) |
| 425 | .to<Transform::Units::ScenePixels>(); |
| 426 | const double n = (90 + ((m_sprite.getScaleFactor().y < 0) ? 180 : 0)) |
| 427 | - (std::atan2(center.y - m_dp.y, center.x - m_dp.x)) * 180.0 |
| 428 | / obe::Utils::Math::pi; |
| 429 | |
| 430 | m_sprite.setRotation(std::fmod(n, 360)); |
| 431 | } |
nothing calls this directly
no test coverage detected