コード例 #1
0
        public void ApplyTo(ImageMeta id)
        {
            var fromRt = (tex2D.Count == 0) || ((rTex.Count > 0) && (tex2D [tex2D.Count - 1].order < rTex [rTex.Count - 1].order));

            var toRt = id.destination == TexTarget.RenderTexture;

            var toClear = id.recordedStrokesForUndoRedo.Count;

            if (toRt)
            {
                otherDirection.BackupRenderTexture(int.MaxValue, id);
            }
            else
            {
                otherDirection.BackupTexture2D(int.MaxValue, id);
            }

            var rtBackup  = fromRt ? TakeRenderTexture() : null;
            var pixBackup = fromRt ? null : TakeTexture2D();
            var backup    = fromRt ? rtBackup : (TextureBackup)pixBackup;

            if (!isUndo)
            {
                id.recordedStrokes.AddRange(backup.strokeRecord);
            }
            else
            {
                id.recordedStrokes.RemoveLast(toClear);
            }

            id.recordedStrokesForUndoRedo = backup.strokeRecord;

            if (!fromRt)
            {
                id.Pixels = pixBackup.pixels;
                id.SetAndApply();
            }

            if (toRt)
            {
                if (fromRt)
                {
                    Rtp.Render(rtBackup.rt, id);
                }
                else
                {
                    Rtp.Render(id.texture2D, id);
                }
            }
            else if (fromRt)
            {
                id.texture2D.CopyFrom(rtBackup.rt);
                id.PixelsFromTexture2D(id.texture2D);

                var converted = false;

                if ((PainterCamera.Inst.isLinearColorSpace) && !rtBackup.exclusive)
                {
                    converted = true;
                    id.PixelsToGamma();
                }

                if (converted)
                {
                    id.SetAndApply();
                }
                else
                {
                    id.texture2D.Apply(true);
                }
            }

            if (fromRt)
            {
                rtBackup.DestroyRtex();
            }
        }