/// <summary> /// Add a new texture or return the existing one /// </summary> public PAImage AddImage(PAFrame frame, PALayer layer) { var image = FindImage(frame, layer); if (null != image) { return(image); } var texture = new Texture2D(width, height, TextureFormat.RGBA32, false); texture.filterMode = FilterMode.Point; texture.Clear(Color.clear); texture.Apply(); image = new PAImage { frame = frame, layer = layer, texture = texture }; images.Add(image); return(image); }
/// <summary> /// Render the given frame into a new texture /// </summary> public Texture2D RenderFrame(PAFrame frame) { var renderTarget = new Texture2D(width, height, TextureFormat.RGBA32, false); renderTarget.filterMode = FilterMode.Point; RenderFrame(frame, renderTarget); renderTarget.Apply(); return(renderTarget); }
/// <summary> /// Return the frame that is next in the frame sequence for the animation /// </summary> public PAFrame FindNextFrame(PAFrame prevFrame, bool loop = true) { var frame = frames.Where(f => f.animation == prevFrame.animation && f.order == prevFrame.order + 1).FirstOrDefault(); if (null == frame && loop) { frame = frames.Where(f => f.animation == prevFrame.animation).OrderBy(f => f.order).FirstOrDefault(); } return(frame); }
/// <summary> /// Add a new frame to the given animation /// </summary> public PAFrame AddFrame(PAAnimation animation) { var frame = new PAFrame(this) { id = System.Guid.NewGuid().ToString(), animation = animation, order = frames.Count }; frames.Add(frame); return(frame); }
public PAFrameItem(PAFrame frame) { Frame = frame; Frame.Item = this; AddToClassList("frame"); _preview = new Image { image = frame.Render() }; Add(_preview); }
/// <summary> /// Render the given frame into the given texture /// </summary> public void RenderFrame(PAFrame frame, Texture2D renderTarget) { renderTarget.Clear(Color.clear); foreach (var image in images.Where(t => t.frame == frame).OrderBy(t => t.layer.order)) { if (image.layer.visible && image.texture != null) { renderTarget.Blend(image.texture, image.layer.opacity); } } renderTarget.Apply(); }
/// <summary> /// Remove a frame from the file /// </summary> public void DeleteFrame(PAFrame remove) { // Remove all textures that reference the frame images = images.Where(t => t.frame != remove).ToList(); // Adjust the order for all frames after the frame being removed foreach (var frame in frames) { if (frame.order > remove.order) { frame.order--; } } // Remove the frame from the list frames.Remove(remove); }
/// <summary> /// Find the texture for the given frame and layer /// </summary> /// <returns></returns> public PAImage FindImage(PAFrame frame, PALayer layer) => images.Where(t => t.frame == frame && t.layer == layer).FirstOrDefault();
/// <summary> /// Load a pixel edtior file from the given filename /// </summary> public static PAFile Load(string filename) { var file = new PAFile { name = Path.GetFileNameWithoutExtension(filename) }; using (var reader = new BinaryReader(File.OpenRead(filename))) { file.version = reader.ReadInt32(); file.width = reader.ReadInt32(); file.height = reader.ReadInt32(); var textureSize = 4 * file.width * file.height; // Read the layers var layerCount = reader.ReadInt32(); for (var layerIndex = 0; layerIndex < layerCount; layerIndex++) { var layer = new PALayer(file); layer.id = reader.ReadString(); layer.name = reader.ReadString(); layer.opacity = reader.ReadSingle(); layer.order = reader.ReadInt32(); layer.visible = reader.ReadBoolean(); file.layers.Add(layer); } // Read the animations var animationCount = reader.ReadInt32(); for (var animationIndex = 0; animationIndex < animationCount; animationIndex++) { var animation = new PAAnimation(); animation.id = reader.ReadString(); animation.name = reader.ReadString(); if (file.version < 3) { animation.fps = 10; } else { animation.fps = reader.ReadInt32(); } file.animations.Add(animation); } // Read the frames var frameCount = reader.ReadInt32(); for (var frameIndex = 0; frameIndex < frameCount; frameIndex++) { var frame = new PAFrame(file); frame.id = reader.ReadString(); frame.animation = file.FindAnimation(reader.ReadString()); frame.order = reader.ReadInt32(); file.frames.Add(frame); } // Read the textures var imageCount = reader.ReadInt32(); for (var imageIndex = 0; imageIndex < imageCount; imageIndex++) { var image = new PAImage(); image.frame = file.FindFrame(reader.ReadString()); image.layer = file.FindLayer(reader.ReadString()); if (reader.ReadBoolean()) { image.texture = new Texture2D(file.width, file.height, TextureFormat.RGBA32, false); image.texture.LoadRawTextureData(reader.ReadBytes(textureSize)); image.texture.filterMode = FilterMode.Point; image.texture.Apply(); } file.images.Add(image); } } return(file); }
public void RefreshPreview(PAFrame frame) { _preview.image = frame.File.FindImage(frame, Layer)?.texture; _preview.MarkDirtyRepaint(); }