2021-10-12 15:07:00 +04:00

112 lines
3.3 KiB
Swift

import Foundation
import QuartzCore
/**
The base class for a child layer of CompositionContainer
*/
class MyCompositionLayer {
var bounds: CGRect = CGRect()
let transformNode: LayerTransformNode
//let contentsLayer: CALayer = CALayer()
let maskLayer: MyMaskContainerLayer?
let matteType: MatteType?
var matteLayer: MyCompositionLayer? {
didSet {
//NOTE
/*if let matte = matteLayer {
if let type = matteType, type == .invert {
mask = InvertedMatteLayer(inputMatte: matte)
} else {
mask = matte
}
} else {
mask = nil
}*/
}
}
let inFrame: CGFloat
let outFrame: CGFloat
let startFrame: CGFloat
let timeStretch: CGFloat
init(layer: LayerModel, size: CGSize) {
self.transformNode = LayerTransformNode(transform: layer.transform)
if let masks = layer.masks {
maskLayer = MyMaskContainerLayer(masks: masks)
} else {
maskLayer = nil
}
self.matteType = layer.matte
self.inFrame = layer.inFrame.cgFloat
self.outFrame = layer.outFrame.cgFloat
self.timeStretch = layer.timeStretch.cgFloat
self.startFrame = layer.startTime.cgFloat
//NOTE
//self.anchorPoint = .zero
//NOTE
/*contentsLayer.anchorPoint = .zero
contentsLayer.bounds = CGRect(origin: .zero, size: size)
contentsLayer.actions = [
"opacity" : NSNull(),
"transform" : NSNull(),
"bounds" : NSNull(),
"anchorPoint" : NSNull(),
"sublayerTransform" : NSNull(),
"hidden" : NSNull()
]
addSublayer(contentsLayer)
if let maskLayer = maskLayer {
contentsLayer.mask = maskLayer
}*/
}
private(set) var isHidden = false
final func displayWithFrame(frame: CGFloat, forceUpdates: Bool) {
transformNode.updateTree(frame, forceUpdates: forceUpdates)
let layerVisible = frame.isInRangeOrEqual(inFrame, outFrame)
/// Only update contents if current time is within the layers time bounds.
if layerVisible {
displayContentsWithFrame(frame: frame, forceUpdates: forceUpdates)
maskLayer?.updateWithFrame(frame: frame, forceUpdates: forceUpdates)
}
self.isHidden = !layerVisible
//NOTE
/*contentsLayer.transform = transformNode.globalTransform
contentsLayer.opacity = transformNode.opacity
contentsLayer.isHidden = !layerVisible*/
}
func displayContentsWithFrame(frame: CGFloat, forceUpdates: Bool) {
/// To be overridden by subclass
}
func captureGeometry() -> CapturedGeometryNode {
return CapturedGeometryNode(
transform: self.transformNode.globalTransform,
alpha: CGFloat(self.transformNode.opacity),
isHidden: self.isHidden,
displayItem: self.captureDisplayItem(),
subnodes: self.captureChildren()
)
}
func captureDisplayItem() -> CapturedGeometryNode.DisplayItem? {
preconditionFailure()
}
func captureChildren() -> [CapturedGeometryNode] {
preconditionFailure()
}
}