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 }); }
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; }
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 }); }
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); }
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); }