From 71017a57bedcbb2737288f705ba5e56b77f8353a Mon Sep 17 00:00:00 2001 From: Evan Pratten Date: Tue, 29 Mar 2022 12:51:31 -0400 Subject: [PATCH] anim stitcher docs --- automation/anim_stitcher/stitcher.py | 7 +++++- automation/anim_stitcher/ui.py | 12 ++++++++++- docs/anim-stitcher.md | 20 ++++++++++++++++++ docs/anim_stitcher_gui.png | Bin 0 -> 28621 bytes .../chr_testFox/chr_testFox.anim_meta.json | 3 ++- requirements.txt | 3 ++- 6 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 docs/anim_stitcher_gui.png diff --git a/automation/anim_stitcher/stitcher.py b/automation/anim_stitcher/stitcher.py index f22f55ee..055fa611 100644 --- a/automation/anim_stitcher/stitcher.py +++ b/automation/anim_stitcher/stitcher.py @@ -33,7 +33,7 @@ def check_sprite_exists(sprite_type: str, sprite_name: str) -> bool: return os.path.isdir(sprite_path) -def stitch_images_and_write_to_disk(sprite_type: str, sprite_name: str, images: List[str], quantize: bool, fps: float) -> None: +def stitch_images_and_write_to_disk(sprite_type: str, sprite_name: str, images: List[str], quantize: bool, fps: float, reverse_order: bool) -> None: # Load all the images images_to_stitch = [] @@ -70,9 +70,14 @@ def stitch_images_and_write_to_disk(sprite_type: str, sprite_name: str, images: "sheet_width": total_width, "published_at": time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()), "published_by": getpass.getuser(), + "fps": fps, "frames": [] } + # Handle reverse order + if reverse_order: + images_to_stitch.reverse() + # Add the metadata for each image x_offset = 0 for image in images_to_stitch: diff --git a/automation/anim_stitcher/ui.py b/automation/anim_stitcher/ui.py index 43cfa7e4..1d9b8884 100644 --- a/automation/anim_stitcher/ui.py +++ b/automation/anim_stitcher/ui.py @@ -95,6 +95,15 @@ class AnimStitcherWindow(QtWidgets.QWidget): self.fps_layout.addWidget(self.fps_input) self.layout().addLayout(self.fps_layout) + # Add a checkbox to reverse the image order + self.reverse_layout = QtWidgets.QHBoxLayout() + self.reverse_label = QtWidgets.QLabel("Reverse Image Order") + self.reverse_layout.addWidget(self.reverse_label) + self.reverse_checkbox = QtWidgets.QCheckBox() + self.reverse_checkbox.setEnabled(False) + self.reverse_layout.addWidget(self.reverse_checkbox) + self.layout().addLayout(self.reverse_layout) + # Add a seperator self.layout().addWidget(qt_lines.QHLine()) @@ -133,6 +142,7 @@ class AnimStitcherWindow(QtWidgets.QWidget): self.stitch_button.setEnabled(True) self.optimization_dropdown.setEnabled(True) self.fps_input.setEnabled(True) + self.reverse_checkbox.setEnabled(True) # Save the selected files self.selected_files = file_dialog.selectedFiles() @@ -194,7 +204,7 @@ class AnimStitcherWindow(QtWidgets.QWidget): # Perform the actual stitching action stitcher.stitch_images_and_write_to_disk( - sprite_type, sprite_name, self.selected_files, self.optimization_dropdown.currentText() == "Size", float(self.fps_input.text())) + sprite_type, sprite_name, self.selected_files, self.optimization_dropdown.currentText() == "Size", float(self.fps_input.text()), self.reverse_checkbox.isChecked()) # Close the window self.close() diff --git a/docs/anim-stitcher.md b/docs/anim-stitcher.md index 24523981..0f6e2155 100644 --- a/docs/anim-stitcher.md +++ b/docs/anim-stitcher.md @@ -4,6 +4,26 @@ ## Usage +To launch `anim_stitcher`, you must first have all the Python dependencies installed. This means installing Python and pip, then running the following in the root of the project: + +```sh +python3 -m pip install -r requirements.txt +``` + +*For help with this, contact Evan.* + +### Launching the tool + +If you are on a Linux system, you can launch the tool with `./launch_anim_stitcher.sh`. + +Otherwise, open the project root folder, and run the `launch_anim_stitcher.bat` script. This will show a window similar to the following: + +![Anim Stitcher GUI](./anim_stitcher_gui.png) + +As you can see, I have already filled everything out for the `testFox` asset. + +**When selecting PNGs:** Make sure you shift-click to select multiple files. You don't want a spritesheet with only one frame in it. + ## Technical information `anim_stitcher` exports spritesheets to `game/dist/assets/anm/...`. Each spritesheet also has a metadata JSON file beside it. The filepaths are automatically chosen based on input in the GUI. diff --git a/docs/anim_stitcher_gui.png b/docs/anim_stitcher_gui.png new file mode 100644 index 0000000000000000000000000000000000000000..476ec2d056109e2649fcf56cafb2dc569cab7f4f GIT binary patch literal 28621 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