Merge branch 'master' of gitlab.com:peter-iakovlev/telegram-ios

This commit is contained in:
Ilya Laktyushin 2024-07-26 15:05:25 +02:00
commit cedabe3a3c
3 changed files with 47 additions and 32 deletions

View File

@ -254,7 +254,7 @@ static NSString *const STCMeshLayerInstanceDelayAnimationKey = @"STCMeshLayerIns
- (CGPoint)_anchorPointAtIndex:(NSUInteger)index
{
CGPoint anchorPoint = CGPointMake(0.5, 0.5);
CGPoint anchorPoint = CGPointMake(0.0, 0.0);
if (_instanceAnchorPoints != NULL) {
anchorPoint = _instanceAnchorPoints[index];

View File

@ -92,7 +92,7 @@ private struct RippleParams {
}
}
private func transformCoordinate(
private func rippleOffset(
position: CGPoint,
origin: CGPoint,
time: CGFloat,
@ -122,6 +122,10 @@ private func transformCoordinate(
} else {
rippleAmount = absRippleAmount
}
if distance <= 60.0 {
rippleAmount *= 0.4
}
// A vector of length `amplitude` that points away from position.
let n: CGPoint
@ -132,8 +136,7 @@ private func transformCoordinate(
//
// This new position moves toward or away from `origin` based on the
// sign and magnitude of `rippleAmount`.
let newPosition = position - n * rippleAmount
return newPosition
return n * (-rippleAmount)
}
func transformToFitQuad2(frame: CGRect, topLeft tl: CGPoint, topRight tr: CGPoint, bottomLeft bl: CGPoint, bottomRight br: CGPoint) -> (frame: CGRect, transform: CATransform3D) {
@ -147,7 +150,7 @@ func transformToFitQuad2(frame: CGRect, topLeft tl: CGPoint, topRight tr: CGPoin
quadBR: CGPoint(x: br.x - frameTopLeft.x, y: br.y - frameTopLeft.y)
)
let anchorPoint = frame.center
let anchorPoint = frame.origin
let anchorOffset = CGPoint(x: anchorPoint.x - frame.origin.x, y: anchorPoint.y - frame.origin.y)
let transPos = CATransform3DMakeTranslation(anchorOffset.x, anchorOffset.y, 0)
let transNeg = CATransform3DMakeTranslation(-anchorOffset.x, -anchorOffset.y, 0)
@ -196,21 +199,6 @@ private func boundingBox(forQuadWithTR tr: CGPoint, tl: CGPoint, bl: CGPoint, br
}
func rectToQuad(rect: CGRect, quadTL topLeft: CGPoint, quadTR topRight: CGPoint, quadBL bottomLeft: CGPoint, quadBR bottomRight: CGPoint) -> CATransform3D {
/*if "".isEmpty {
let destination = Perspective(Quadrilateral(
topLeft,
topRight,
bottomLeft,
bottomRight
))
// Starting perspective is the current overlay frame or could be another 4 points.
let start = Perspective(Quadrilateral(rect.origin, rect.size))
// Caclulate CATransform3D from start to destination
return start.projectiveTransform(destination: destination)
}*/
return rectToQuad(rect: rect, quadTLX: topLeft.x, quadTLY: topLeft.y, quadTRX: topRight.x, quadTRY: topRight.y, quadBLX: bottomLeft.x, quadBLY: bottomLeft.y, quadBRX: bottomRight.x, quadBRY: bottomRight.y)
}
@ -263,6 +251,15 @@ public protocol SpaceWarpNode: ASDisplayNode {
}
open class SpaceWarpNodeImpl: ASDisplayNode, SpaceWarpNode {
private final class Shockwave {
let startPoint: CGPoint
var timeValue: CGFloat = 0.0
init(startPoint: CGPoint) {
self.startPoint = startPoint
}
}
public var contentNode: ASDisplayNode {
return self.contentNodeSource
}
@ -281,9 +278,8 @@ open class SpaceWarpNodeImpl: ASDisplayNode, SpaceWarpNode {
#endif
private var link: SharedDisplayLinkDriver.Link?
private var startPoint: CGPoint?
private var timeValue: CGFloat = 0.0
private var shockwaves: [Shockwave] = []
private var resolution: (x: Int, y: Int)?
private var layoutParams: (size: CGSize, cornerRadius: CGFloat)?
@ -311,15 +307,19 @@ open class SpaceWarpNodeImpl: ASDisplayNode, SpaceWarpNode {
}
public func triggerRipple(at point: CGPoint) {
self.startPoint = point
self.timeValue = 0.0
self.shockwaves.append(Shockwave(startPoint: point))
if self.shockwaves.count > 8 {
self.shockwaves.removeFirst()
}
if self.link == nil {
self.link = SharedDisplayLinkDriver.shared.add(framesPerSecond: .max, { [weak self] deltaTime in
guard let self else {
return
}
self.timeValue += deltaTime * (1.0 / CGFloat(UIView.animationDurationFactor()))
for shockwave in self.shockwaves {
shockwave.timeValue += deltaTime * (1.0 / CGFloat(UIView.animationDurationFactor()))
}
if let (size, cornerRadius) = self.layoutParams {
self.update(size: size, cornerRadius: cornerRadius, transition: .immediate)
@ -377,9 +377,15 @@ open class SpaceWarpNodeImpl: ASDisplayNode, SpaceWarpNode {
let maxEdge = (max(size.width, size.height) * 0.5) * 2.0
let maxDistance = sqrt(maxEdge * maxEdge + maxEdge * maxEdge)
let maxDelay = maxDistance / params.speed
guard let startPoint = self.startPoint, self.timeValue < maxDelay else {
for i in (0 ..< self.shockwaves.count).reversed() {
if self.shockwaves[i].timeValue >= maxDelay {
self.shockwaves.remove(at: i)
}
}
guard !self.shockwaves.isEmpty else {
if let link = self.link {
self.link = nil
link.invalidate()
@ -396,7 +402,6 @@ open class SpaceWarpNodeImpl: ASDisplayNode, SpaceWarpNode {
self.debugLayers.removeAll()
self.resolution = nil
self.startPoint = nil
self.backgroundView.isHidden = true
self.contentNodeSource.clipsToBounds = false
self.contentNodeSource.layer.cornerRadius = 0.0
@ -473,10 +478,16 @@ open class SpaceWarpNodeImpl: ASDisplayNode, SpaceWarpNode {
var bottomLeft = initialBottomLeft
var bottomRight = initialBottomRight
topLeft = transformCoordinate(position: topLeft, origin: startPoint, time: self.timeValue, params: params)
for shockwave in self.shockwaves {
topLeft = topLeft + rippleOffset(position: initialTopLeft, origin: shockwave.startPoint, time: shockwave.timeValue, params: params)
topRight = topRight + rippleOffset(position: initialTopRight, origin: shockwave.startPoint, time: shockwave.timeValue, params: params)
bottomLeft = bottomLeft + rippleOffset(position: initialBottomLeft, origin: shockwave.startPoint, time: shockwave.timeValue, params: params)
bottomRight = bottomRight + rippleOffset(position: initialBottomRight, origin: shockwave.startPoint, time: shockwave.timeValue, params: params)
}
/*topLeft = transformCoordinate(position: topLeft, origin: startPoint, time: self.timeValue, params: params)
topRight = transformCoordinate(position: topRight, origin: startPoint, time: self.timeValue, params: params)
bottomLeft = transformCoordinate(position: bottomLeft, origin: startPoint, time: self.timeValue, params: params)
bottomRight = transformCoordinate(position: bottomRight, origin: startPoint, time: self.timeValue, params: params)
bottomRight = transformCoordinate(position: bottomRight, origin: startPoint, time: self.timeValue, params: params)*/
let distanceTopLeft = length(topLeft - initialTopLeft)
let distanceTopRight = length(topRight - initialTopRight)
@ -493,7 +504,7 @@ open class SpaceWarpNodeImpl: ASDisplayNode, SpaceWarpNode {
}
instanceBounds.append(frame)
instancePositions.append(frame.center)
instancePositions.append(frame.origin)
instanceTransforms.append(transform)
}

View File

@ -1772,7 +1772,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
}) {
let _ = (strongSelf.context.engine.stickers.resolveInlineStickers(fileIds: [MessageReaction.starsReactionId])
|> deliverOnMainQueue).start(next: { [weak strongSelf] files in
|> deliverOnMainQueue).start(next: { [weak strongSelf, weak itemNode] files in
guard let strongSelf, let file = files[MessageReaction.starsReactionId] else {
return
}
@ -1780,6 +1780,10 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
strongSelf.present(UndoOverlayController(presentationData: strongSelf.presentationData, content: .starsSent(context: strongSelf.context, file: file, amount: 1, title: "Star Sent", text: "Long tap on {star} to select custom quantity of stars."), elevatedLayout: false, action: { _ in
return false
}), in: .current)
if let itemNode = itemNode, let targetView = itemNode.targetReactionView(value: chosenReaction) {
strongSelf.chatDisplayNode.wrappingNode.triggerRipple(at: targetView.convert(targetView.bounds.center, to: strongSelf.chatDisplayNode.view))
}
})
}
}