Ejemplo n.º 1
0
        static void AddShapeInstanceToFrame(
            SwfLibrary library,
            SwfDisplayShapeInstance inst,
            Matrix4x4 inst_matrix,
            SwfBlendModeData inst_blend_mode,
            SwfColorTransData inst_color_transform,
            ushort parent_masked,
            ushort parent_mask,
            List <SwfInstanceData> parent_masks,
            List <SwfInstanceData> self_masks,
            SwfFrameData frame)
        {
            var shape_def = library.FindDefine <SwfLibraryShapeDefine>(inst.Id);

            if (shape_def != null)
            {
                for (var i = 0; i < shape_def.Bitmaps.Length; ++i)
                {
                    var bitmap_id     = shape_def.Bitmaps[i];
                    var bitmap_matrix = i < shape_def.Matrices.Length ? shape_def.Matrices[i] : SwfMatrix.identity;
                    var bitmap_def    = library.FindDefine <SwfLibraryBitmapDefine>(bitmap_id);
                    if (bitmap_def != null)
                    {
                        var frame_inst_type =
                            (parent_mask > 0 || inst.ClipDepth > 0)
                                                                ? SwfInstanceData.Types.Mask
                                                                : (parent_masked > 0 || self_masks.Count > 0)
                                                                        ? SwfInstanceData.Types.Masked
                                                                        : SwfInstanceData.Types.Group;
                        var frame_inst_clip_depth =
                            (parent_mask > 0)
                                                                ? parent_mask
                                                                : (inst.ClipDepth > 0)
                                                                        ? inst.ClipDepth
                                                                        : parent_masked + self_masks.Count;
                        frame.Instances.Add(new SwfInstanceData {
                            Type       = frame_inst_type,
                            ClipDepth  = (ushort)frame_inst_clip_depth,
                            Bitmap     = bitmap_id,
                            Matrix     = SwfMatrixData.FromUMatrix(inst_matrix * bitmap_matrix.ToUMatrix()),
                            BlendMode  = inst_blend_mode,
                            ColorTrans = inst_color_transform
                        });
                        if (parent_mask > 0)
                        {
                            parent_masks.Add(frame.Instances[frame.Instances.Count - 1]);
                        }
                        else if (inst.ClipDepth > 0)
                        {
                            self_masks.Add(frame.Instances[frame.Instances.Count - 1]);
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        static void AddBitmapInstanceToFrame(
            SwfLibrary library,
            SwfDisplayBitmapInstance inst,
            Matrix4x4 inst_matrix,
            SwfBlendModeData inst_blend_mode,
            SwfColorTransData inst_color_transform,
            ushort parent_masked,
            ushort parent_mask,
            List <SwfInstanceData> parent_masks,
            List <SwfInstanceData> self_masks,
            SwfFrameData frame)
        {
            var bitmap_def = library.FindDefine <SwfLibraryBitmapDefine>(inst.Id);

            if (bitmap_def != null)
            {
                var frame_inst_type =
                    (parent_mask > 0 || inst.ClipDepth > 0)
                                                ? SwfInstanceData.Types.Mask
                                                : (parent_masked > 0 || self_masks.Count > 0)
                                                        ? SwfInstanceData.Types.Masked
                                                        : SwfInstanceData.Types.Group;
                var frame_inst_clip_depth =
                    (parent_mask > 0)
                                                ? parent_mask
                                                : (inst.ClipDepth > 0)
                                                        ? inst.ClipDepth
                                                        : parent_masked + self_masks.Count;
                frame.Instances.Add(new SwfInstanceData {
                    Type       = frame_inst_type,
                    ClipDepth  = (ushort)frame_inst_clip_depth,
                    Bitmap     = inst.Id,
                    Matrix     = SwfMatrixData.FromUMatrix(inst_matrix * Matrix4x4.Scale(new Vector3(20, 20, 1))),
                    BlendMode  = inst_blend_mode,
                    ColorTrans = inst_color_transform
                });
                if (parent_mask > 0)
                {
                    parent_masks.Add(frame.Instances[frame.Instances.Count - 1]);
                }
                else if (inst.ClipDepth > 0)
                {
                    self_masks.Add(frame.Instances[frame.Instances.Count - 1]);
                }
            }
        }
Ejemplo n.º 3
0
 static void CheckSelfMasks(
     List <SwfInstanceData> masks,
     ushort depth,
     SwfFrameData frame)
 {
     foreach (var mask in masks)
     {
         if (mask.ClipDepth < depth)
         {
             frame.Instances.Add(new SwfInstanceData {
                 Type       = SwfInstanceData.Types.MaskReset,
                 ClipDepth  = 0,
                 Bitmap     = mask.Bitmap,
                 Matrix     = mask.Matrix,
                 BlendMode  = mask.BlendMode,
                 ColorTrans = mask.ColorTrans
             });
         }
     }
     masks.RemoveAll(p => p.ClipDepth < depth);
 }
        static SwfFrameData LoadSymbolFrameData(
            SwfLibrary library, SwfDisplayList display_list)
        {
            var frame = new SwfFrameData {
                Anchor = display_list.FrameAnchors.Count > 0
                                        ? display_list.FrameAnchors[0]
                                        : string.Empty,
                Labels = new List <string>(display_list.FrameLabels)
            };

            return(AddDisplayListToFrame(
                       library,
                       display_list,
                       Matrix4x4.identity,
                       SwfBlendModeData.identity,
                       SwfColorTransData.identity,
                       0,
                       0,
                       null,
                       frame));
        }
Ejemplo n.º 5
0
        static void AddSpriteInstanceToFrame(
            SwfLibrary library,
            SwfDisplaySpriteInstance inst,
            Matrix4x4 inst_matrix,
            SwfBlendModeData inst_blend_mode,
            SwfColorTransData inst_color_transform,
            ushort parent_masked,
            ushort parent_mask,
            List <SwfInstanceData> parent_masks,
            List <SwfInstanceData> self_masks,
            SwfFrameData frame,
            System.Action <string> warning_log)
        {
            var sprite_def = library.FindDefine <SwfLibrarySpriteDefine>(inst.Id);

            if (sprite_def != null)
            {
                AddDisplayListToFrame(
                    library,
                    inst.DisplayList,
                    inst_matrix,
                    inst_blend_mode,
                    inst_color_transform,
                    (ushort)(parent_masked + self_masks.Count),
                    (ushort)(parent_mask > 0
                                                ? parent_mask
                                                : (inst.ClipDepth > 0
                                                        ? inst.ClipDepth
                                                        : (ushort)0)),
                    parent_mask > 0
                                                ? parent_masks
                                                : (inst.ClipDepth > 0
                                                        ? self_masks
                                                        : null),
                    frame,
                    warning_log);
            }
        }
        static SwfClipAsset.Frame BakeClipFrame(
            SwfAsset asset, SwfAssetData data, SwfFrameData frame)
        {
            List <uint>       baked_uvs       = new List <uint>();
            List <uint>       baked_mulcolors = new List <uint>();
            List <uint>       baked_addcolors = new List <uint>();
            List <Vector2>    baked_vertices  = new List <Vector2>();
            List <BakedGroup> baked_groups    = new List <BakedGroup>();
            List <Material>   baked_materials = new List <Material>();

            foreach (var inst in frame.Instances)
            {
                var bitmap = inst != null
                                        ? FindBitmapFromAssetData(data, inst.Bitmap)
                                        : null;

                while (bitmap != null && bitmap.Redirect > 0)
                {
                    bitmap = FindBitmapFromAssetData(data, bitmap.Redirect);
                }
                if (bitmap != null)
                {
                    var br = asset.Settings.BitmapTrimming
                                                ? bitmap.TrimmedRect
                                                : new SwfRectIntData(bitmap.RealWidth, bitmap.RealHeight);

                    var v0 = new Vector2(br.xMin, br.yMin);
                    var v1 = new Vector2(br.xMax, br.yMin);
                    var v2 = new Vector2(br.xMax, br.yMax);
                    var v3 = new Vector2(br.xMin, br.yMax);

                    var matrix =
                        Matrix4x4.Scale(new Vector3(1.0f, -1.0f, 1.0f) / asset.Settings.PixelsPerUnit) *
                        inst.Matrix.ToUMatrix() *
                        Matrix4x4.Scale(new Vector3(1.0f / 20.0f, 1.0f / 20.0f, 1.0f));

                    baked_vertices.Add(matrix.MultiplyPoint3x4(v0));
                    baked_vertices.Add(matrix.MultiplyPoint3x4(v1));
                    baked_vertices.Add(matrix.MultiplyPoint3x4(v2));
                    baked_vertices.Add(matrix.MultiplyPoint3x4(v3));

                    var source_rect = bitmap.SourceRect;
                    baked_uvs.Add(SwfEditorUtils.PackUV(source_rect.xMin, source_rect.yMin));
                    baked_uvs.Add(SwfEditorUtils.PackUV(source_rect.xMax, source_rect.yMax));

                    uint mul_pack0, mul_pack1;
                    SwfEditorUtils.PackFColorToUInts(
                        inst.ColorTrans.mulColor.ToUVector4(),
                        out mul_pack0, out mul_pack1);
                    baked_mulcolors.Add(mul_pack0);
                    baked_mulcolors.Add(mul_pack1);

                    uint add_pack0, add_pack1;
                    SwfEditorUtils.PackFColorToUInts(
                        inst.ColorTrans.addColor.ToUVector4(),
                        out add_pack0, out add_pack1);
                    baked_addcolors.Add(add_pack0);
                    baked_addcolors.Add(add_pack1);

                    if (baked_groups.Count == 0 ||
                        baked_groups[baked_groups.Count - 1].Type != inst.Type ||
                        baked_groups[baked_groups.Count - 1].BlendMode != inst.BlendMode.type ||
                        baked_groups[baked_groups.Count - 1].ClipDepth != inst.ClipDepth)
                    {
                        baked_groups.Add(new BakedGroup {
                            Type          = inst.Type,
                            BlendMode     = inst.BlendMode.type,
                            ClipDepth     = inst.ClipDepth,
                            StartVertex   = baked_vertices.Count - 4,
                            TriangleCount = 0,
                            Material      = null
                        });
                    }

                    baked_groups.Last().TriangleCount += 6;
                }
            }

            for (var i = 0; i < baked_groups.Count; ++i)
            {
                var group = baked_groups[i];
                switch (group.Type)
                {
                case SwfInstanceData.Types.Mask:
                    group.Material = SwfMaterialCache.GetIncrMaskMaterial();
                    break;

                case SwfInstanceData.Types.Group:
                    group.Material = SwfMaterialCache.GetSimpleMaterial(group.BlendMode);
                    break;

                case SwfInstanceData.Types.Masked:
                    group.Material = SwfMaterialCache.GetMaskedMaterial(group.BlendMode, group.ClipDepth);
                    break;

                case SwfInstanceData.Types.MaskReset:
                    group.Material = SwfMaterialCache.GetDecrMaskMaterial();
                    break;

                default:
                    throw new UnityException(string.Format(
                                                 "SwfAssetPostprocessor. Incorrect instance type: {0}",
                                                 group.Type));
                }
                if (group.Material)
                {
                    baked_materials.Add(group.Material);
                }
                else
                {
                    throw new UnityException(string.Format(
                                                 "SwfAssetPostprocessor. Material for baked group ({0}) not found",
                                                 group.Type));
                }
            }

            var mesh_data = new SwfClipAsset.MeshData {
                SubMeshes = baked_groups
                            .Select(p => new SwfClipAsset.SubMeshData {
                    StartVertex = p.StartVertex,
                    IndexCount  = p.TriangleCount
                })
                            .ToArray(),
                Vertices  = baked_vertices.ToArray(),
                UVs       = baked_uvs.ToArray(),
                AddColors = baked_addcolors.ToArray(),
                MulColors = baked_mulcolors.ToArray()
            };

            return(new SwfClipAsset.Frame(
                       frame.Labels.ToArray(),
                       mesh_data,
                       baked_materials.ToArray()));
        }
Ejemplo n.º 7
0
        static SwfFrameData AddDisplayListToFrame(
            SwfLibrary library,
            SwfDisplayList display_list,
            Matrix4x4 parent_matrix,
            SwfBlendModeData parent_blend_mode,
            SwfColorTransData parent_color_transform,
            ushort parent_masked,
            ushort parent_mask,
            List <SwfInstanceData> parent_masks,
            SwfFrameData frame,
            System.Action <string> warning_log)
        {
            if (warning_log != null)
            {
                var inst_filter_types = display_list.Instances.Values
                                        .Where(p => p.Visible && p.FilterList.Filters.Count > 0)
                                        .SelectMany(p => p.FilterList.Filters)
                                        .Select(p => p.Type)
                                        .Distinct();
                foreach (var filter_type in inst_filter_types)
                {
                    warning_log(string.Format(
                                    "Unsupported filter type '{0}'",
                                    filter_type));
                }
            }
            var self_masks = new List <SwfInstanceData>();

            foreach (var inst in display_list.Instances.Values.Where(p => p.Visible))
            {
                CheckSelfMasks(self_masks, inst.Depth, frame);
                var child_matrix          = parent_matrix * inst.Matrix.ToUMatrix();
                var child_blend_mode      = parent_blend_mode * inst.BlendMode.ToBlendModeData(warning_log);
                var child_color_transform = parent_color_transform * inst.ColorTransform.ToColorTransData();
                switch (inst.Type)
                {
                case SwfDisplayInstanceType.Shape:
                    AddShapeInstanceToFrame(
                        library,
                        inst as SwfDisplayShapeInstance,
                        child_matrix,
                        child_blend_mode,
                        child_color_transform,
                        parent_masked,
                        parent_mask,
                        parent_masks,
                        self_masks,
                        frame);
                    break;

                case SwfDisplayInstanceType.Bitmap:
                    AddBitmapInstanceToFrame(
                        library,
                        inst as SwfDisplayBitmapInstance,
                        child_matrix,
                        child_blend_mode,
                        child_color_transform,
                        parent_masked,
                        parent_mask,
                        parent_masks,
                        self_masks,
                        frame);
                    break;

                case SwfDisplayInstanceType.Sprite:
                    AddSpriteInstanceToFrame(
                        library,
                        inst as SwfDisplaySpriteInstance,
                        child_matrix,
                        child_blend_mode,
                        child_color_transform,
                        parent_masked,
                        parent_mask,
                        parent_masks,
                        self_masks,
                        frame,
                        warning_log);
                    break;

                default:
                    throw new UnityException(string.Format(
                                                 "unsupported SwfDisplayInstanceType: {0}", inst.Type));
                }
            }
            CheckSelfMasks(self_masks, ushort.MaxValue, frame);
            return(frame);
        }