public override void Destroy(MultiReferentialConstraintJob job)
 {
     job.sources.Dispose();
     job.sourceBindTx.Dispose();
     job.offsetTx.Dispose();
     job.cache.Dispose();
 }
 public override void Update(MultiReferentialConstraintJob job, ref T data)
 {
     if (data.driver != (int)job.cache.GetRaw(job.driverIdx))
     {
         job.cache.SetRaw(data.driver, job.driverIdx);
         job.UpdateOffsets();
     }
 }
        public override MultiReferentialConstraintJob Create(Animator animator, ref T data, Component component)
        {
            var job = new MultiReferentialConstraintJob();

            var sources = data.sourceObjects;

            job.driver       = IntProperty.Bind(animator, component, data.driverIntProperty);
            job.sources      = new NativeArray <ReadWriteTransformHandle>(sources.Length, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
            job.sourceBindTx = new NativeArray <AffineTransform>(sources.Length, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
            job.offsetTx     = new NativeArray <AffineTransform>(sources.Length - 1, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);

            for (int i = 0; i < sources.Length; ++i)
            {
                job.sources[i]      = ReadWriteTransformHandle.Bind(animator, sources[i].transform);
                job.sourceBindTx[i] = new AffineTransform(sources[i].position, sources[i].rotation);
            }

            job.UpdateOffsets(data.driverValue);

            return(job);
        }
        public override MultiReferentialConstraintJob Create(Animator animator, ref T data)
        {
            var job          = new MultiReferentialConstraintJob();
            var cacheBuilder = new AnimationJobCacheBuilder();

            job.driverIdx = cacheBuilder.Add(data.driver);

            var sources = data.sourceObjects;

            job.sources      = new NativeArray <TransformHandle>(sources.Length, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
            job.sourceBindTx = new NativeArray <AffineTransform>(sources.Length, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
            job.offsetTx     = new NativeArray <AffineTransform>(sources.Length - 1, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);

            for (int i = 0; i < sources.Length; ++i)
            {
                job.sources[i]      = TransformHandle.Bind(animator, sources[i].transform);
                job.sourceBindTx[i] = new AffineTransform(sources[i].position, sources[i].rotation);
            }
            job.cache = cacheBuilder.Build();
            job.UpdateOffsets();

            return(job);
        }