Esempio n. 1
0
    private static ACT.Animation ReadLayers(ACT act, BinaryReader data)
    {
        var count   = data.ReadULong();
        var layers  = new ACT.Layer[count];
        var version = double.Parse(act.version);

        for (int i = 0; i < count; i++)
        {
            var layer = layers[i] = new ACT.Layer()
            {
                pos      = new Vector2Int(data.ReadLong(), data.ReadLong()),
                index    = data.ReadLong(),
                isMirror = data.ReadLong(),
                scale    = Vector2.one,
                color    = Color.white
            };

            if (version >= 2.0)
            {
                layer.color[0] = data.ReadUByte() / 255f;
                layer.color[1] = data.ReadUByte() / 255f;
                layer.color[2] = data.ReadUByte() / 255f;
                layer.color[3] = data.ReadUByte() / 255f;
                layer.scale[0] = data.ReadFloat();
                layer.scale[1] = version <= 2.3 ? layer.scale[0] : data.ReadFloat();
                layer.angle    = data.ReadLong();
                layer.sprType  = data.ReadLong();

                if (version >= 2.5)
                {
                    layer.width  = data.ReadLong();
                    layer.height = data.ReadLong();
                }
            }
        }

        var soundId = version >= 2.0 ? data.ReadLong() : -1;

        Vector2Int[] pos = null;

        if (version >= 2.3)
        {
            pos = new Vector2Int[data.ReadLong()];
            for (int i = 0; i < pos.Length; i++)
            {
                data.Seek(4, System.IO.SeekOrigin.Current);
                pos[i] = new Vector2Int(data.ReadLong(), data.ReadLong());
                data.Seek(4, System.IO.SeekOrigin.Current);
            }
        }

        return(new ACT.Animation()
        {
            layers = layers,
            soundId = soundId,
            pos = pos
        });
    }
Esempio n. 2
0
    private void CalculateSpritePositionScale(ACT.Layer layer, Sprite sprite, out Vector3 scale, out Vector3 newPos, out Quaternion rotation)
    {
        rotation = Quaternion.Euler(0, 0, -layer.angle);
        scale    = new Vector3(layer.scale.x * (layer.isMirror ? -1 : 1), -(layer.scale.y), 1);
        var offsetX = (Mathf.RoundToInt(sprite.rect.width) % 2 == 1) ? 0.5f : 0f;
        var offsetY = (Mathf.RoundToInt(sprite.rect.height) % 2 == 1) ? 0.5f : 0f;

        newPos = new Vector3(layer.pos.x - offsetX, -(layer.pos.y) + offsetY) / sprite.pixelsPerUnit;
    }
Esempio n. 3
0
        private static ACT.Frame ReadLayers(ACT act, MemoryStreamReader data)
        {
            var count   = data.ReadUInt();
            var layers  = new ACT.Layer[count];
            var version = double.Parse(act.version, CultureInfo.InvariantCulture);

            for (int i = 0; i < count; i++)
            {
                var layer = layers[i] = new ACT.Layer()
                {
                    pos      = new Vector2Int(data.ReadInt(), data.ReadInt()),
                    index    = data.ReadInt(),
                    isMirror = data.ReadInt() != 0,
                    scale    = Vector2.one,
                    color    = Color.white
                };

                // RoRebuild checks if only if it's greater
                if (version > 2.0)
                {
                    layer.color[0] = data.ReadByte() / 255f; //r
                    layer.color[1] = data.ReadByte() / 255f; //g
                    layer.color[2] = data.ReadByte() / 255f; //b
                    layer.color[3] = data.ReadByte() / 255f; //a

                    layer.scale[0] = data.ReadFloat();
                    layer.scale[1] = version <= 2.3 ? layer.scale[0] : data.ReadFloat();

                    layer.angle   = data.ReadInt();
                    layer.sprType = data.ReadInt();

                    if (version >= 2.5)
                    {
                        layer.width  = data.ReadInt();
                        layer.height = data.ReadInt();
                    }
                }
            }

            var soundId = version >= 2.0 ? data.ReadInt() : -1;

            Vector2Int[] pos = null;

            if (version >= 2.3)
            {
                pos = new Vector2Int[data.ReadInt()];
                for (int i = 0; i < pos.Length; i++)
                {
                    data.Seek(4, System.IO.SeekOrigin.Current);
                    pos[i] = new Vector2Int(data.ReadInt(), data.ReadInt());
                    data.Seek(4, System.IO.SeekOrigin.Current);
                }
            }

            return(new ACT.Frame()
            {
                layers = layers.Where(t => t.index >= 0).ToArray(),
                soundId = soundId,
                pos = pos
            });
        }
Esempio n. 4
0
    public static Mesh BuildColliderMesh(ACT.Layer layer, Sprite[] sprites)
    {
        meshBuildCount++;

        outNormals.Clear();
        outVertices.Clear();
        outTris.Clear();
        outUvs.Clear();
        outColors.Clear();

        var mesh = new Mesh();

        var tIndex = 0;

        var min = new Vector2(-0.2f, -0.2f);
        var max = new Vector2(0.2f, 0.2f);

        if (layer.index < 0)
        {
            return(null);
        }

        var sprite = sprites[layer.index];
        var verts  = sprite.vertices;
        var uvs    = sprite.uv;

        var rotation = Quaternion.Euler(0, 0, -layer.angle);
        var scale    = new Vector3(layer.scale.x * (layer.isMirror ? -1 : 1), layer.scale.y, 1);

        var offsetX = (Mathf.RoundToInt(sprite.rect.width) % 2 == 1) ? 0.5f : 0f;
        var offsetY = (Mathf.RoundToInt(sprite.rect.height) % 2 == 1) ? 0.5f : 0f;

        for (var j = 0; j < verts.Length; j++)
        {
            var v    = rotation * (verts[j] * scale);
            var vert = v + new Vector3(layer.pos.x - offsetX, -(layer.pos.y) + offsetY) / SPR.PIXELS_PER_UNIT;

            if (min.x > vert.x)
            {
                min.x = vert.x;
            }
            if (min.y > vert.y)
            {
                min.y = vert.y;
            }

            if (max.x < vert.x)
            {
                max.x = vert.x;
            }
            if (max.y < vert.y)
            {
                max.y = vert.y;
            }
        }

        var xSize  = max.x - min.x;
        var ySize  = max.y - min.y;
        var xBoost = 0.1f;
        var yBoost = 0.1f;

        if (xSize < 0.5f)
        {
            xBoost += 0.2f;
        }
        if (xSize < 1f)
        {
            xBoost += 0.1f;
        }


        if (ySize < 0.5f)
        {
            yBoost += 0.2f;
        }
        if (ySize < 1f)
        {
            yBoost += 0.1f;
        }


        min -= new Vector2(xBoost, yBoost);
        max += new Vector2(xBoost, yBoost);

        outVertices.Add(new Vector3(min.x, max.y));
        outVertices.Add(new Vector3(max.x, max.y));
        outVertices.Add(new Vector3(min.x, min.y));
        outVertices.Add(new Vector3(max.x, min.y));

        outTris.Add(tIndex);
        outTris.Add(tIndex + 1);
        outTris.Add(tIndex + 2);
        outTris.Add(tIndex + 1);
        outTris.Add(tIndex + 3);
        outTris.Add(tIndex + 2);

        mesh.vertices  = outVertices.ToArray();
        mesh.triangles = outTris.ToArray();

        mesh.Optimize();

        return(mesh);
    }
Esempio n. 5
0
    public static Mesh BuildSpriteMesh(ACT.Layer layer, Sprite[] sprites)
    {
        meshBuildCount++;

        outNormals.Clear();
        outVertices.Clear();
        outTris.Clear();
        outUvs.Clear();
        outColors.Clear();

        var mesh = new Mesh();

        var tIndex = 0;

        if (layer.index < 0)
        {
            return(null);
        }

        var sprite = sprites[layer.index];
        var verts  = sprite.vertices;
        var uvs    = sprite.uv;

        var rotation = Quaternion.Euler(0, 0, -layer.angle);
        var scale    = new Vector3(layer.scale.x * (layer.isMirror ? -1 : 1), layer.scale.y, 1);

        var offsetX = (Mathf.RoundToInt(sprite.rect.width) % 2 == 1) ? 0.5f : 0f;
        var offsetY = (Mathf.RoundToInt(sprite.rect.height) % 2 == 1) ? 0.5f : 0f;

        for (var j = 0; j < verts.Length; j++)
        {
            var v = rotation * (verts[j] * scale);
            outVertices.Add(v + new Vector3(layer.pos.x - offsetX, (layer.pos.y) + offsetY) / SPR.PIXELS_PER_UNIT);
            outUvs.Add(uvs[j]);
            outColors.Add(layer.color);
            outNormals.Add(new Vector3(0, 0, -1));
        }

        if (layer.isMirror)
        {
            outTris.Add(tIndex + 2);
            outTris.Add(tIndex + 1);
            outTris.Add(tIndex);
            outTris.Add(tIndex + 2);
            outTris.Add(tIndex + 3);
            outTris.Add(tIndex + 1);
        }
        else
        {
            outTris.Add(tIndex);
            outTris.Add(tIndex + 1);
            outTris.Add(tIndex + 2);
            outTris.Add(tIndex + 1);
            outTris.Add(tIndex + 3);
            outTris.Add(tIndex + 2);
        }

        tIndex += 4;

        mesh.vertices  = outVertices.ToArray();
        mesh.uv        = outUvs.ToArray();
        mesh.triangles = outTris.ToArray();
        mesh.colors    = outColors.ToArray();
        mesh.normals   = outNormals.ToArray();

        return(mesh);
    }