├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ └── build.yml ├── .gitignore ├── LICENSE ├── README.md ├── art ├── custom_icons.afdesign ├── custom_icons.svg ├── logo.afdesign └── logo.svg ├── docs ├── changelog.md ├── contributing.md ├── file_format.md ├── i18n.md ├── manuals │ ├── manual_v0.1.0.md │ ├── manual_v0.2.0.md │ ├── manual_v0.3.0.md │ ├── manual_v0.4.0.md │ ├── manual_v0.5.0.md │ ├── manual_v0.6.0.md │ └── manual_v0.7.0.md └── roadmap.md ├── images ├── lorien.png ├── lorien.svg └── lorien_demo.png ├── lorien ├── Assets │ ├── Cursors │ │ ├── move_cursor.png │ │ └── move_cursor.png.import │ ├── I18n │ │ ├── ar.txt │ │ ├── de.txt │ │ ├── en.txt │ │ ├── es.txt │ │ ├── fr.txt │ │ ├── it.txt │ │ ├── ko.txt │ │ ├── pt-BR.txt │ │ ├── ru.txt │ │ ├── tr.txt │ │ ├── uk.txt │ │ ├── zh-CN.txt │ │ └── zh-TW.txt │ ├── Icons │ │ ├── add.png │ │ ├── add.png.import │ │ ├── brush_tool.png │ │ ├── brush_tool.png.import │ │ ├── canvas_color_tool.png │ │ ├── canvas_color_tool.png.import │ │ ├── circle_tool.png │ │ ├── circle_tool.png.import │ │ ├── clear_canvas.png │ │ ├── clear_canvas.png.import │ │ ├── close.png │ │ ├── close.png.import │ │ ├── color_picker.png │ │ ├── color_picker.png.import │ │ ├── copy.png │ │ ├── copy.png.import │ │ ├── cursor_icon.png │ │ ├── cursor_icon.png.import │ │ ├── delete.png │ │ ├── delete.png.import │ │ ├── edit.png │ │ ├── edit.png.import │ │ ├── eraser_tool.png │ │ ├── eraser_tool.png.import │ │ ├── fullscreen.png │ │ ├── fullscreen.png.import │ │ ├── grid.png │ │ ├── grid.png.import │ │ ├── line_tool.png │ │ ├── line_tool.png.import │ │ ├── menu.png │ │ ├── menu.png.import │ │ ├── move_tool.png │ │ ├── move_tool.png.import │ │ ├── new_file.png │ │ ├── new_file.png.import │ │ ├── open_file.png │ │ ├── open_file.png.import │ │ ├── plus.png │ │ ├── plus.png.import │ │ ├── rectangle_tool.png │ │ ├── rectangle_tool.png.import │ │ ├── redo.png │ │ ├── redo.png.import │ │ ├── save_file.png │ │ ├── save_file.png.import │ │ ├── selection_tool.png │ │ ├── selection_tool.png.import │ │ ├── tools.png │ │ ├── tools.png.import │ │ ├── undo.png │ │ └── undo.png.import │ ├── Player │ │ ├── p1_duck.png │ │ ├── p1_duck.png.import │ │ ├── p1_front.png │ │ ├── p1_front.png.import │ │ ├── p1_hurt.png │ │ ├── p1_hurt.png.import │ │ ├── p1_jump.png │ │ ├── p1_jump.png.import │ │ ├── p1_stand.png │ │ ├── p1_stand.png.import │ │ └── p1_walk │ │ │ ├── Thumbs.db │ │ │ ├── p1_walk01.png │ │ │ ├── p1_walk01.png.import │ │ │ ├── p1_walk02.png │ │ │ ├── p1_walk02.png.import │ │ │ ├── p1_walk03.png │ │ │ ├── p1_walk03.png.import │ │ │ ├── p1_walk04.png │ │ │ ├── p1_walk04.png.import │ │ │ ├── p1_walk05.png │ │ │ ├── p1_walk05.png.import │ │ │ ├── p1_walk06.png │ │ │ ├── p1_walk06.png.import │ │ │ ├── p1_walk07.png │ │ │ ├── p1_walk07.png.import │ │ │ ├── p1_walk08.png │ │ │ ├── p1_walk08.png.import │ │ │ ├── p1_walk09.png │ │ │ ├── p1_walk09.png.import │ │ │ ├── p1_walk10.png │ │ │ ├── p1_walk10.png.import │ │ │ ├── p1_walk11.png │ │ │ └── p1_walk11.png.import │ ├── Textures │ │ ├── arrow_right.png │ │ ├── arrow_right.png.import │ │ ├── dot.png │ │ ├── dot.png.import │ │ ├── palette_button.png │ │ ├── palette_button.png.import │ │ ├── palette_button_outline.png │ │ ├── palette_button_outline.png.import │ │ ├── scrollbar.png │ │ ├── scrollbar.png.import │ │ ├── scrollbar_bg.png │ │ ├── scrollbar_bg.png.import │ │ ├── scrollbar_hl.png │ │ ├── scrollbar_hl.png.import │ │ ├── selection_cursor.png │ │ ├── selection_cursor.png.import │ │ ├── slider_knob_white.png │ │ ├── slider_knob_white.png.import │ │ ├── switch_off.png │ │ ├── switch_off.png.import │ │ ├── switch_on.png │ │ └── switch_on.png.import │ ├── icon.ico │ ├── icon.png │ └── icon.png.import ├── BrushStroke │ ├── BrushStroke.gd │ ├── BrushStroke.tscn │ ├── BrushStrokeOptimizer.gd │ └── BrushStrokeTexture.gd ├── Config.gd ├── InfiniteCanvas │ ├── Cursor │ │ ├── BaseCursor.gd │ │ ├── BrushCursor │ │ │ ├── BrushCursor.gd │ │ │ └── BrushCursor.tscn │ │ ├── SelectionCursor │ │ │ ├── SelectionCursor.gd │ │ │ └── SelectionCursor.tscn │ │ └── cursor.gdshader │ ├── DebugDraw.gd │ ├── InfiniteCanvas.gd │ ├── InfiniteCanvas.tscn │ ├── InfiniteCanvasGrid.gd │ ├── PanZoomCamera.gd │ ├── Tools │ │ ├── BrushTool.gd │ │ ├── CanvasTool.gd │ │ ├── CircleTool.gd │ │ ├── EraserTool.gd │ │ ├── LineTool.gd │ │ ├── RectangleTool.gd │ │ ├── SelectionRectangle.gd │ │ ├── SelectionTool.gd │ │ └── selection_rectangle.gdshader │ ├── constant_pressure_curve.tres │ └── default_pressure_curve.tres ├── Main.gd ├── Main.tscn ├── Misc │ ├── GlobalSignals.gd │ ├── I18nParser.gd │ ├── KeybindingsManager.gd │ ├── Player │ │ ├── Player.gd │ │ └── Player.tscn │ ├── Settings.gd │ ├── StatePersistence.gd │ ├── SvgExporter.gd │ ├── Types.gd │ └── Utils.gd ├── Palette │ ├── Palette.gd │ ├── PaletteManager.gd │ └── default_palette.tres ├── ProjectManager │ ├── Project.gd │ ├── ProjectManager.gd │ ├── ProjectMetadata.gd │ └── Serializer.gd ├── UI │ ├── ColorPalettePicker.gd │ ├── ColorPalettePicker.tscn │ ├── Components │ │ ├── FlatTextureButton.gd │ │ ├── KeybindItem.gd │ │ ├── KeybindItem.tscn │ │ ├── PaletteButton.gd │ │ └── PaletteButton.tscn │ ├── Dialogs │ │ ├── AboutDialog.gd │ │ ├── AboutDialog.tscn │ │ ├── AddKeyDialog.tscn │ │ ├── AlertDialog.gd │ │ ├── AlertDialog.tscn │ │ ├── DeletePaletteDialog.gd │ │ ├── DeletePaletteDialog.tscn │ │ ├── EditPaletteDialog.gd │ │ ├── EditPaletteDialog.tscn │ │ ├── ExitDialog.tscn │ │ ├── NewPaletteDialog.gd │ │ ├── NewPaletteDialog.tscn │ │ ├── SettingsDialog.gd │ │ ├── SettingsDialog.tscn │ │ ├── UnsavedChangesDialog.gd │ │ └── UnsavedChangesDialog.tscn │ ├── MainMenu.gd │ ├── MainMenu.tscn │ ├── Menubar.gd │ ├── Menubar.tscn │ ├── Statusbar.gd │ ├── Statusbar.tscn │ ├── Themes │ │ ├── tab_active_dark.tres │ │ ├── tab_inactive_dark.tres │ │ ├── theme_dark.tres │ │ └── toolbar_dark.tres │ ├── Toolbar.gd │ └── Toolbar.tscn ├── export_presets.cfg └── project.godot └── public └── linux ├── com.github.mbrlabs.Lorien.desktop ├── com.github.mbrlabs.Lorien.metainfo.xml └── x-lorien-canvas.mimetype.xml /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | ko_fi: mbrlabs 2 | custom: https://www.paypal.me/mbrlabs 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Report a bug in Lorien 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | --- 8 | 11 | 12 | **Lorien version:** 13 | 14 | 15 | 16 | **OS/device including version:** 17 | 18 | 19 | 20 | **Issue description:** 21 | 22 | 23 | 24 | **Steps to reproduce:** -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature/enhancement request 3 | about: Request a new feature or enhancement in Lorien 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | --- 8 | 11 | 12 | **Feature/enhancement description:** 13 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: "build" 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | 9 | env: 10 | GODOT_VERSION: 4.3 11 | EXPORT_NAME: Lorien 12 | LORIEN_VERSION: v0.7.0-dev 13 | 14 | jobs: 15 | windows-export: 16 | name: Windows Export 17 | runs-on: ubuntu-latest 18 | container: 19 | image: docker://barichello/godot-ci:4.3 20 | steps: 21 | - name: Checkout 22 | uses: actions/checkout@v4 23 | - name: Setup 24 | run: | 25 | mkdir -v -p build/${EXPORT_NAME}_${LORIEN_VERSION}_Windows 26 | mkdir -v -p ~/.local/share/godot/export_templates 27 | mv /root/.local/share/godot/export_templates/${GODOT_VERSION}.stable ~/.local/share/godot/export_templates/${GODOT_VERSION}.stable 28 | - name: Build 29 | run: | 30 | cd lorien 31 | godot --headless -v --export-release "Windows Desktop" ../build/${EXPORT_NAME}_${LORIEN_VERSION}_Windows/${EXPORT_NAME}_${LORIEN_VERSION}.exe 32 | - name: Upload Artifact 33 | uses: actions/upload-artifact@v4 34 | with: 35 | name: Lorien Windows 36 | path: build/${{ env.EXPORT_NAME }}_${{ env.LORIEN_VERSION }}_Windows 37 | retention-days: 14 38 | 39 | linux-export: 40 | name: Linux Export 41 | runs-on: ubuntu-latest 42 | container: 43 | image: docker://barichello/godot-ci:4.3 44 | steps: 45 | - name: Checkout 46 | uses: actions/checkout@v4 47 | - name: Setup 48 | run: | 49 | mkdir -v -p build/${EXPORT_NAME}_${LORIEN_VERSION}_Linux 50 | mkdir -v -p ~/.local/share/godot/export_templates 51 | mv /root/.local/share/godot/export_templates/${GODOT_VERSION}.stable ~/.local/share/godot/export_templates/${GODOT_VERSION}.stable 52 | - name: Build 53 | run: | 54 | cd lorien 55 | godot --headless -v --export-release "Linux" ../build/${EXPORT_NAME}_${LORIEN_VERSION}_Linux/${EXPORT_NAME}_${LORIEN_VERSION}.x86_64 56 | - name: Upload Artifact 57 | uses: actions/upload-artifact@v4 58 | with: 59 | name: Lorien Linux 60 | path: build/${{ env.EXPORT_NAME }}_${{ env.LORIEN_VERSION }}_Linux 61 | retention-days: 14 62 | 63 | mac-export: 64 | name: Mac Export 65 | runs-on: ubuntu-latest 66 | container: 67 | image: docker://barichello/godot-ci:4.3 68 | steps: 69 | - name: Checkout 70 | uses: actions/checkout@v4 71 | - name: Setup 72 | run: | 73 | mkdir -v -p build/${EXPORT_NAME}_${LORIEN_VERSION}_Mac 74 | mkdir -v -p ~/.local/share/godot/export_templates 75 | mv /root/.local/share/godot/export_templates/${GODOT_VERSION}.stable ~/.local/share/godot/export_templates/${GODOT_VERSION}.stable 76 | - name: Build 77 | run: | 78 | cd lorien 79 | godot --headless -v --export-release "macOS" ../build/${EXPORT_NAME}_${LORIEN_VERSION}_Mac/${EXPORT_NAME}_${LORIEN_VERSION}.zip 80 | - name: Upload Artifact 81 | uses: actions/upload-artifact@v4 82 | with: 83 | name: Lorien Mac 84 | path: build/${{ env.EXPORT_NAME }}_${{ env.LORIEN_VERSION }}_Mac 85 | retention-days: 14 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Godot-specific ignores 2 | .import/ 3 | .godot/ 4 | 5 | # Mono-specific ignores 6 | .mono/ 7 | data_*/ 8 | 9 | # Visual Studio Code-specific ignores 10 | .vscode/ 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021-2025 Marcus Brummer 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Lorien 4 |

5 | 6 | Build Passing 7 | 8 | 9 | License 10 | 11 |

12 | 13 | Lorien is an **infinite canvas drawing/note-taking app that is focused on performance, small savefiles and simplicity**. It's not based on bitmap images like Krita, Gimp or Photoshop; it rather saves brush strokes as a collection of points and renders them at runtime (kind of like SVG). It's primarily designed to be used as a digital notebook and as brainstorming tool. While it can totally be used to make small sketches and diagrams, it is not meant to replace traditional art programs that operate on bitmap images. It is entirely written in the [Godot Game Engine](https://godotengine.org/). For an overview on how to use Lorien have a look [at the manual](docs/manuals/manual_v0.6.0.md). 14 | 15 | ![Lorien demo](https://raw.githubusercontent.com/mbrlabs/Lorien/main/images/lorien_demo.png) 16 | 17 | ⚠ **This is very much a WIP and still a bit rough around the edges** ⚠. The savefile format *might* also change in the future. Contributions (be it bug reports, code, art or [translations](docs/i18n.md)) are very welcome. 18 | 19 | ## Features as of v0.7.0-dev: 20 | - Infinite canvas 21 | - Infinite undo/redo 22 | - (Almost) Infinite zoom 23 | - Infinite grid 24 | - Zen mode (toggles the UI on/off) 25 | - Extremely small savefiles ([File format specs](docs/file_format.md)) 26 | - Work on multiple documents simultaneously 27 | - [Tools](docs/manuals/manual_v0.7.0.md): Freehand brush, eraser, line tool, rectangle tool, circle/ellipse tool, selection tool 28 | - Move and delete selected brush strokes 29 | - SVG export 30 | - Rebindable keyboard shortcuts 31 | - Built-in and custom color palettes 32 | - Designed to be used with a drawing tablet (Wacom, etc.). It also supports pressure sensitivity 33 | - A little Surprise Mechanic™ when pressing F12 34 | - Runs on Windows, Linux & macOS 35 | - Localizations: German, English, Spanish, French, Italian, Korean, Brasilian Portuguese, Russian, Turkish, Ukrainian, Chinese 36 | 37 | ## Download 38 | You can download the latest stable releases on [Github](https://github.com/mbrlabs/Lorien/releases). 39 | 40 | If you want to check out the bleeding edge main branch without building the project yourself you can also check out the [CI builds](https://github.com/mbrlabs/Lorien/actions). But make sure to backup your files and be prepared for bugs if you do that. 41 | 42 | ## More information 43 | - [Contributing Guide](docs/contributing.md) 44 | - [Localization](docs/i18n.md) 45 | - [Changelog](docs/changelog.md) 46 | - [Roadmap](docs/roadmap.md) 47 | 48 | ## Credits 49 | - Brush stroke antialiasing: [godot-antialiased-line2d](https://github.com/godot-extended-libraries/godot-antialiased-line2d) 50 | - Icons used for the UI: [Remix Icon](https://remixicon.com/) 51 | - Blurred background image of demo screenshot: https://unsplash.com/photos/nO0V_T0g2fM 52 | -------------------------------------------------------------------------------- /art/custom_icons.afdesign: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/art/custom_icons.afdesign -------------------------------------------------------------------------------- /art/logo.afdesign: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/art/logo.afdesign -------------------------------------------------------------------------------- /art/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /docs/contributing.md: -------------------------------------------------------------------------------- 1 | # How to contribute 2 | 3 | ## General 4 | This guide is loosly based on [Godot's contributing guidelines](https://github.com/godotengine/godot/blob/master/CONTRIBUTING.md): 5 | - We use Godot 4.3-stable 6 | - If you want to implement a big feature, open an issue or a [Github discussion](https://github.com/mbrlabs/Lorien/discussions) so we can talk about it first 7 | - Format your commit messages with readability in mind 8 | 9 | ## Codestyle 10 | - Adapt to the project's coding style 11 | - Use C-style logical operators: `&&`, `||`, `!` instead of `and`, `or`, `not` 12 | - Use function separators (see any `.gd` file in this repository for examples) 13 | - Always use static typing 14 | -------------------------------------------------------------------------------- /docs/file_format.md: -------------------------------------------------------------------------------- 1 | # File Format 2 | 3 | TODO because not final. 4 | See: https://github.com/mbrlabs/Lorien/blob/main/lorien/ProjectManager/Serializer.gd -------------------------------------------------------------------------------- /docs/i18n.md: -------------------------------------------------------------------------------- 1 | # Localization 2 | 3 | ### How Lorien handles localization 4 | 5 | Godot has two ways to handle multiple languages right now: 6 | - Putting all translations into one CSV file 7 | - Gettext (.po files) 8 | 9 | The CSV file way of doing things is fine if you work alone, but once you have multiple people working on translations you will get lot's of merge conflicts. 10 | Gettext is more powerful and splits translations into seperate files, but i don't like the format. 11 | 12 | However, you can add translations in code by using the TranslationServer. My localization files are simple `.txt` files. This makes translating strings really easy. The file format is very straight forward: One translation per line; then a key followed by the translation (sperated by at least one whitespace). The first key **must be** `LANGUAGE_NAME` followed by the language's name (in that same language, not in english). Here is an example for `English`: 13 | 14 | `en.txt`: 15 | 16 | ``` 17 | LANGUAGE_NAME English 18 | 19 | GREETING Hello World! 20 | SAVE Save 21 | 22 | # This is a comment 23 | 24 | SAVE_AS Save as.. # This is also a comment 25 | TOOL_BRUSH Brush Tool 26 | 27 | ``` 28 | 29 | ### How to add new translations 30 | 31 | If you want to add more translations all you need to do is: 32 | - Create a new translation file in `Assets/i18n/` using an external text editor 33 | - That's it. The `.txt` file will be loaded automatically. -------------------------------------------------------------------------------- /docs/manuals/manual_v0.1.0.md: -------------------------------------------------------------------------------- 1 | # Lorien Manual v0.1.0 2 | 3 | Drawing tablets are supported and recommended, but you can also just use Keyboard+Mouse. 4 | 5 | ## Basic Usage 6 | - Draw with the left mouse button or with your drawing tablet's pen 7 | - Pan/drag across the canvas with the middle mouse button (i recommend to map a button on your pen to the middle mouse button for easy navigation) 8 | - Zoom with mouse wheel 9 | 10 | ## Keyboard shortcuts 11 | - Ctrl + S: Saves the current file 12 | - Ctrl + N: Open a new file 13 | - Ctrl + O: Open a new empty tab 14 | - Ctrl + Z: Undo a brush stroke 15 | - Ctrl + Y: Redo a brush stroke 16 | - B: Brush tool 17 | - E: Eraser tool 18 | - L: Line tool 19 | - C: Color picker tool -------------------------------------------------------------------------------- /docs/manuals/manual_v0.2.0.md: -------------------------------------------------------------------------------- 1 | # Lorien Manual v0.2.0 2 | 3 | Drawing tablets are supported and recommended, but you can also just use Keyboard+Mouse. 4 | 5 | ## Basic Usage 6 | - Draw with the left mouse button (LMB) or with your drawing tablet's pen 7 | - Pan/drag across the canvas with the middle mouse button (i recommend to map a button on your pen to the middle mouse button for easy navigation) 8 | - Zoom with mouse wheel 9 | 10 | ## Selection Tool 11 | - With the Selection tool you can select a number of brush strokes by dragging across the screen with your LMB pressed. Brush strokes which are considered inside the selection recatangle will be added to the current selection. You can add more strokes to your current selection by holding down Shift while dragging. 12 | - You can deselect your current selection by pressing RMB or Esc. 13 | - To move the selected strokes simply drag them while holding down LMB. If you did not move your mouse while pressing LMB, everything will be deselected automatically. 14 | - Press Delete to delete the current selection 15 | 16 | ## Line Tool 17 | - You can hold down Shift while using the line tool to snap the line in 15° increments 18 | 19 | ## Keyboard shortcuts 20 | - Ctrl + S: Saves the current file 21 | - Ctrl + N: Open a new file 22 | - Ctrl + O: Open a new empty tab 23 | - Ctrl + Z: Undo a brush stroke 24 | - Ctrl + Y: Redo a brush stroke 25 | - B: Brush tool 26 | - E: Eraser tool 27 | - L: Line tool 28 | - C: Color picker tool 29 | - S: Selection tool 30 | - Esc or RMB: Deselect everything 31 | - Delete: Deletes selected brush strokes -------------------------------------------------------------------------------- /docs/manuals/manual_v0.3.0.md: -------------------------------------------------------------------------------- 1 | # Lorien Manual v0.3.0 2 | 3 | Drawing tablets are supported and recommended, but you can also just use Keyboard+Mouse. 4 | 5 | ## Basic Usage 6 | - Draw with the left mouse button (LMB) or with your drawing tablet's pen 7 | - Pan/drag across the canvas with the middle mouse button (I recommend to map a button on your pen to the middle mouse button for easy navigation) 8 | - Zoom with mouse wheel 9 | - You can open files by dragging them into the window or by opening it via the menu (Shortcut CTRL + O) 10 | 11 | ## Selection Tool 12 | - With the Selection tool you can select a number of brush strokes by dragging across the screen with your LMB pressed. Brush strokes which are considered inside the selection recatangle will be added to the current selection. You can add more strokes to your current selection by holding down Shift while dragging. 13 | - You can deselect your current selection by pressing RMB or Esc. 14 | - To move the selected strokes simply drag them while holding down LMB. If you did not move your mouse while pressing LMB, everything will be deselected automatically. 15 | - Press Delete to delete the current selection 16 | - Press CTRL + C to copy the current selection 17 | - Press CTRL + V to paste the copied brush strokes 18 | - Press CTRL + D to duplicate the current selection 19 | 20 | ## Line Tool 21 | - You can hold down Shift while using the line tool to snap the line in 15° increments 22 | 23 | ## Keyboard shortcuts 24 | - Ctrl + S: Saves the current file 25 | - Ctrl + N: Open a new file 26 | - Ctrl + O: Open a new empty tab 27 | - Ctrl + Z: Undo a brush stroke 28 | - Ctrl + Y: Redo a brush stroke 29 | - Ctrl + C: Copy selected brush strokes 30 | - Ctrl + V: Paste copied brush strokes 31 | - Ctrl + D: Duplicate selected brush strokes 32 | - B: Brush tool 33 | - E: Eraser tool 34 | - L: Line tool 35 | - C: Color picker tool 36 | - S: Selection tool 37 | - Esc or RMB: Deselect everything 38 | - Delete: Deletes selected brush strokes 39 | -------------------------------------------------------------------------------- /docs/manuals/manual_v0.4.0.md: -------------------------------------------------------------------------------- 1 | # Lorien Manual v0.4.0 2 | 3 | Drawing tablets are supported and recommended, but you can also just use Keyboard+Mouse. 4 | 5 | ## Basic Usage 6 | - Draw with the left mouse button (LMB) or with your drawing tablet's pen 7 | - Pan/drag across the canvas with the middle mouse button (i recommend to map a button on your pen to the middle mouse button for easy navigation) 8 | - Zoom with mouse wheel 9 | - You can open files by dragging them into the window or by opening it via the menu (Shortcut CTRL + O) 10 | 11 | ## Tools 12 | Lorien provides you with different tools which you can find in the toolbar. If you want to enable a tool all you have to do is click on it or use the keyboard shortcut. If you hover over the icons you can also see a short description including the keyboard shortcut. 13 | 14 | ### Brush Tool 15 | - The brush tool is selected by default. It allows you to freely draw on the canvas with your mouse or drawing tablet. 16 | - You can change the brush size with the adjuster in the toolbar 17 | - The brush color can be changed by clicking on the colored button in the toolbar next to the brush size adjuster 18 | - It is pressure sensitve 19 | 20 | ### Rectangle Tool 21 | - You can use the rectangle tool to create perfect (unfilled) rectagles 22 | - Not pressure sensitive 23 | 24 | ### Line Tool 25 | - Allows you to draw perfect lines 26 | - You can hold down Shift while using the line tool to snap the line in 15° increments 27 | - Not pressure sensitve 28 | 29 | ### Eraser Tool 30 | - Allows you to erease any brush stroke 31 | - Otherwise behaves like the brush tool 32 | 33 | ### Selection Tool 34 | - With the Selection tool you can select a number of brush strokes by dragging across the screen with your LMB pressed. Brush strokes which are considered inside the selection recatangle will be added to the current selection. You can add more strokes to your current selection by holding down Shift while dragging. 35 | - You can deselect your current selection by pressing RMB or Esc. 36 | - To move the selected strokes simply drag them while holding down LMB. If you did not move your mouse while pressing LMB, everything will be deselected automatically. 37 | - Press Delete to delete the current selection 38 | - Press CTRL + C to copy the current selection 39 | - Press CTRL + V to paste the copied brush strokes 40 | - Press CTRL + D to duplicate the current selection 41 | 42 | ## Color Palettes 43 | - Color palettes allow you to easily switch between different pre-defined colors. To open the pallete you have to click on the colored button in the toolbar next to the brush size adjsuter. 44 | - You can add/edit/delete custom color palettes 45 | - The default color palette can't be edited or deleted. If you want to customize it you can can make a copy of it and edit that instead. 46 | 47 | ## Keyboard shortcuts 48 | - Ctrl + S: Saves the current file 49 | - Ctrl + N: Open a new file 50 | - Ctrl + O: Open a new empty tab 51 | - Ctrl + Z: Undo a brush stroke 52 | - Ctrl + Y: Redo a brush stroke 53 | - Ctrl + C: Copy selected brush strokes 54 | - Ctrl + V: Paste copied brush strokes 55 | - Ctrl + D: Duplicate selected brush strokes 56 | - B: Brush tool 57 | - R: Rectangle tool 58 | - E: Eraser tool 59 | - L: Line tool 60 | - S: Selection tool 61 | - Esc or RMB: Deselect everything 62 | - Delete: Deletes selected brush strokes 63 | - Tab: enter/exit distraction free mode (no UI) 64 | - F12: Spwans a playable character at the mouse position who can walk on the drawn lines (easteregg) 65 | -------------------------------------------------------------------------------- /docs/manuals/manual_v0.5.0.md: -------------------------------------------------------------------------------- 1 | # Lorien Manual v0.5.0 2 | 3 | Drawing tablets are supported and recommended, but you can also just use Keyboard+Mouse. 4 | 5 | ## Basic Usage 6 | - Draw with the left mouse button (LMB) or with your drawing tablet's pen 7 | - Pan/drag across the canvas with the middle mouse button (i recommend to map a button on your pen to the middle mouse button for easy navigation) 8 | - Zoom with the mouse wheel. You can also zoom while holding CTRL and the middle mouse button MMB while moving the mose up/down. This is especially useful when using a drawing tablet with a pen. 9 | - You can open files by dragging them into the window or by opening it via the menu (Shortcut CTRL + O) 10 | 11 | ## Tools 12 | Lorien provides you with different tools which you can find in the toolbar. If you want to enable a tool all you have to do is click on it or use the keyboard shortcut. If you hover over the icons you can also see a short description including the keyboard shortcut. 13 | 14 | ### Brush Tool 15 | - The brush tool is selected by default. It allows you to freely draw on the canvas with your mouse or drawing tablet. 16 | - You can change the brush size with the adjuster in the toolbar 17 | - The brush color can be changed by clicking on the colored button in the toolbar next to the brush size adjuster 18 | - It is pressure sensitve 19 | 20 | ### Rectangle Tool 21 | - You can use the rectangle tool to create perfect (unfilled) rectagles 22 | - Not pressure sensitive 23 | 24 | ### Line Tool 25 | - Allows you to draw perfect lines 26 | - You can hold down Shift while using the line tool to snap the line in 15° increments 27 | - Not pressure sensitve 28 | 29 | ### Circle Tool 30 | - Allows you to draw perfect ellipses and circles 31 | - You can hold down Shift while using the circle tool to draw perfect circles. Otherwise it defaults to ellipses 32 | - Not pressure sensitve 33 | 34 | ### Eraser Tool 35 | - Allows you to erease brush strokes by drawing over it. Once the eraser intersects with a brush stroke, the whole brush stroke will be removed 36 | - The brush size affects the area of effect 37 | 38 | ### Selection Tool 39 | - With the Selection tool you can select a number of brush strokes by dragging across the screen with your LMB pressed. Brush strokes which are considered inside the selection recatangle will be added to the current selection. You can add more strokes to your current selection by holding down Shift while dragging. 40 | - You can deselect your current selection by pressing RMB or Esc. 41 | - To move the selected strokes simply drag them while holding down LMB. If you did not move your mouse while pressing LMB, everything will be deselected automatically. 42 | - Press Delete to delete the current selection 43 | - Press CTRL + C to copy the current selection 44 | - Press CTRL + V to paste the copied brush strokes 45 | - Press CTRL + D to duplicate the current selection 46 | 47 | ## Color Palettes 48 | - Color palettes allow you to easily switch between different pre-defined colors. To open the pallete you have to click on the colored button in the toolbar next to the brush size adjsuter. 49 | - You can add/edit/delete custom color palettes 50 | - The default color palette can't be edited or deleted. If you want to customize it you can can make a copy of it and edit that instead. 51 | 52 | ## Keyboard shortcuts 53 | - Ctrl + S: Saves the current file 54 | - Ctrl + N: Open a new file 55 | - Ctrl + O: Open a new empty tab 56 | - Ctrl + E: Opens the SVG export dialog 57 | - Ctrl + Z: Undo a brush stroke 58 | - Ctrl + Y: Redo a brush stroke 59 | - Ctrl + C: Copy selected brush strokes 60 | - Ctrl + V: Paste copied brush strokes 61 | - Ctrl + D: Duplicate selected brush strokes 62 | - SPACE: Center the canvas based on current mouse position 63 | - B: Brush tool 64 | - R: Rectangle tool 65 | - E: Eraser tool 66 | - L: Line tool 67 | - C: Circle tool 68 | - S: Selection tool 69 | - Esc or RMB: Deselect everything 70 | - Delete: Deletes selected brush strokes 71 | - Tab: enter/exit distraction free mode (no UI) 72 | - F12: Spwans a playable character at the mouse position who can walk on the drawn lines (easteregg) 73 | -------------------------------------------------------------------------------- /docs/roadmap.md: -------------------------------------------------------------------------------- 1 | # Roadmap 2 | 3 | The old roadmap is for the most part implemented or obsolete. 4 | So this needs to be updated at some point :) -------------------------------------------------------------------------------- /images/lorien.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/images/lorien.png -------------------------------------------------------------------------------- /images/lorien.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /images/lorien_demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/images/lorien_demo.png -------------------------------------------------------------------------------- /lorien/Assets/Cursors/move_cursor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Cursors/move_cursor.png -------------------------------------------------------------------------------- /lorien/Assets/Cursors/move_cursor.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cynvq1tyvqx67" 6 | path="res://.godot/imported/move_cursor.png-443b66feec64cf631c7817838e2e4aaa.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Cursors/move_cursor.png" 14 | dest_files=["res://.godot/imported/move_cursor.png-443b66feec64cf631c7817838e2e4aaa.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/add.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/add.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bbdkcvds2nxg7" 6 | path="res://.godot/imported/add.png-3520d3bd6bbe6551666d487ef1026a75.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/add.png" 14 | dest_files=["res://.godot/imported/add.png-3520d3bd6bbe6551666d487ef1026a75.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/brush_tool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/brush_tool.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/brush_tool.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cs5qdaf401w45" 6 | path="res://.godot/imported/brush_tool.png-35459a2a76c7d070175c90bd375b03f3.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/brush_tool.png" 14 | dest_files=["res://.godot/imported/brush_tool.png-35459a2a76c7d070175c90bd375b03f3.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/canvas_color_tool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/canvas_color_tool.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/canvas_color_tool.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://i3rocgvfk221" 6 | path="res://.godot/imported/canvas_color_tool.png-f7543959b94b6430741ede0ff6a667ed.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/canvas_color_tool.png" 14 | dest_files=["res://.godot/imported/canvas_color_tool.png-f7543959b94b6430741ede0ff6a667ed.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/circle_tool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/circle_tool.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/circle_tool.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://0qicbkag5jd3" 6 | path="res://.godot/imported/circle_tool.png-01eaf4eb2971e0fa5b01c7cff0734ad5.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/circle_tool.png" 14 | dest_files=["res://.godot/imported/circle_tool.png-01eaf4eb2971e0fa5b01c7cff0734ad5.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/clear_canvas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/clear_canvas.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/clear_canvas.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://di3rucqyq5bk7" 6 | path="res://.godot/imported/clear_canvas.png-008945759847e1530ab7844b2e476645.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/clear_canvas.png" 14 | dest_files=["res://.godot/imported/clear_canvas.png-008945759847e1530ab7844b2e476645.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/close.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/close.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bp1yka17gbjtu" 6 | path="res://.godot/imported/close.png-70dea5968a1cec9ee14e5d97f8f6de68.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/close.png" 14 | dest_files=["res://.godot/imported/close.png-70dea5968a1cec9ee14e5d97f8f6de68.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/color_picker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/color_picker.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/color_picker.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://tcovt1vw06tr" 6 | path="res://.godot/imported/color_picker.png-a70b82c0caa965b9d941049c337ec552.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/color_picker.png" 14 | dest_files=["res://.godot/imported/color_picker.png-a70b82c0caa965b9d941049c337ec552.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/copy.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/copy.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://ci340bpx1hg78" 6 | path="res://.godot/imported/copy.png-0e9e4610337c18e7d6f1c2a6ba468c12.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/copy.png" 14 | dest_files=["res://.godot/imported/copy.png-0e9e4610337c18e7d6f1c2a6ba468c12.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/cursor_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/cursor_icon.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/cursor_icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cv4jae3ml8jlh" 6 | path="res://.godot/imported/cursor_icon.png-a8679cce6d1a6159233d7f1c06150c08.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/cursor_icon.png" 14 | dest_files=["res://.godot/imported/cursor_icon.png-a8679cce6d1a6159233d7f1c06150c08.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/delete.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/delete.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c3maqrdnsjgiq" 6 | path="res://.godot/imported/delete.png-4df4b82a76375b3514503a0b1ebc142f.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/delete.png" 14 | dest_files=["res://.godot/imported/delete.png-4df4b82a76375b3514503a0b1ebc142f.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/edit.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/edit.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bu10tixbxmwus" 6 | path="res://.godot/imported/edit.png-0fa3be9dd51a3426e6079c23f2ce4e0a.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/edit.png" 14 | dest_files=["res://.godot/imported/edit.png-0fa3be9dd51a3426e6079c23f2ce4e0a.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/eraser_tool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/eraser_tool.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/eraser_tool.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bynefqnt8pdby" 6 | path="res://.godot/imported/eraser_tool.png-948df7d00cff64fa0f88c54b8ca606f6.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/eraser_tool.png" 14 | dest_files=["res://.godot/imported/eraser_tool.png-948df7d00cff64fa0f88c54b8ca606f6.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/fullscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/fullscreen.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/fullscreen.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://b4mgx1os6mdeg" 6 | path="res://.godot/imported/fullscreen.png-ca23a29924a680b1c411d77abca7d86c.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/fullscreen.png" 14 | dest_files=["res://.godot/imported/fullscreen.png-ca23a29924a680b1c411d77abca7d86c.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/grid.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/grid.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bup7ms7nmbw0m" 6 | path="res://.godot/imported/grid.png-8bfff87b3cd26042e7eaa81bab15f4d5.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/grid.png" 14 | dest_files=["res://.godot/imported/grid.png-8bfff87b3cd26042e7eaa81bab15f4d5.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/line_tool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/line_tool.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/line_tool.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bn1qdw0v30np0" 6 | path="res://.godot/imported/line_tool.png-978e848631c8b06d1f4ac691060d1cfa.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/line_tool.png" 14 | dest_files=["res://.godot/imported/line_tool.png-978e848631c8b06d1f4ac691060d1cfa.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/menu.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/menu.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://r233fnxk5qkf" 6 | path="res://.godot/imported/menu.png-db6d009b9768ab59af57af2bf2ca45ed.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/menu.png" 14 | dest_files=["res://.godot/imported/menu.png-db6d009b9768ab59af57af2bf2ca45ed.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/move_tool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/move_tool.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/move_tool.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bnh02pwlrohcf" 6 | path="res://.godot/imported/move_tool.png-6e9cc52d7f4431c276fbf2caf71da662.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/move_tool.png" 14 | dest_files=["res://.godot/imported/move_tool.png-6e9cc52d7f4431c276fbf2caf71da662.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/new_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/new_file.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/new_file.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://b14r0skgpftxj" 6 | path="res://.godot/imported/new_file.png-0d6707e486bc6975c117bb30bfd5c390.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/new_file.png" 14 | dest_files=["res://.godot/imported/new_file.png-0d6707e486bc6975c117bb30bfd5c390.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/open_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/open_file.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/open_file.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dxi6gc6npiskq" 6 | path="res://.godot/imported/open_file.png-c88db8352e7590761a7dba8acd66f21e.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/open_file.png" 14 | dest_files=["res://.godot/imported/open_file.png-c88db8352e7590761a7dba8acd66f21e.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/plus.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/plus.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bmutnbt040e0b" 6 | path="res://.godot/imported/plus.png-4323aaa71e210eccf34db655d7faed75.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/plus.png" 14 | dest_files=["res://.godot/imported/plus.png-4323aaa71e210eccf34db655d7faed75.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/rectangle_tool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/rectangle_tool.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/rectangle_tool.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://7a3xk8n0q24k" 6 | path="res://.godot/imported/rectangle_tool.png-7c5bfe4509f7bc9fee57927aff38ed97.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/rectangle_tool.png" 14 | dest_files=["res://.godot/imported/rectangle_tool.png-7c5bfe4509f7bc9fee57927aff38ed97.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/redo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/redo.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/redo.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://see51v4hg68f" 6 | path="res://.godot/imported/redo.png-9fc31f44732cd3d5afb37980266dc473.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/redo.png" 14 | dest_files=["res://.godot/imported/redo.png-9fc31f44732cd3d5afb37980266dc473.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/save_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/save_file.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/save_file.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c4kv3i7fmom58" 6 | path="res://.godot/imported/save_file.png-9cd5cd8db86ab83f81b7066aab1c2cbb.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/save_file.png" 14 | dest_files=["res://.godot/imported/save_file.png-9cd5cd8db86ab83f81b7066aab1c2cbb.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/selection_tool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/selection_tool.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/selection_tool.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://ddxis8f7tvg66" 6 | path="res://.godot/imported/selection_tool.png-821d418c0802c9f715d085b14601297e.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/selection_tool.png" 14 | dest_files=["res://.godot/imported/selection_tool.png-821d418c0802c9f715d085b14601297e.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/tools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/tools.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/tools.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://byk2mc1luvjki" 6 | path="res://.godot/imported/tools.png-91965a13da00c51e3e1274b2607929b4.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/tools.png" 14 | dest_files=["res://.godot/imported/tools.png-91965a13da00c51e3e1274b2607929b4.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Icons/undo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Icons/undo.png -------------------------------------------------------------------------------- /lorien/Assets/Icons/undo.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://h54g8ofkc3p8" 6 | path="res://.godot/imported/undo.png-b391b6f2827b70101f94b911ec554a50.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Icons/undo.png" 14 | dest_files=["res://.godot/imported/undo.png-b391b6f2827b70101f94b911ec554a50.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_duck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Player/p1_duck.png -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_duck.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://b122l270v6tvm" 6 | path="res://.godot/imported/p1_duck.png-673d1b2e46cd96165aa6df6f70a50cdc.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Player/p1_duck.png" 14 | dest_files=["res://.godot/imported/p1_duck.png-673d1b2e46cd96165aa6df6f70a50cdc.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_front.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Player/p1_front.png -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_front.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://ha8dl8gprvvr" 6 | path="res://.godot/imported/p1_front.png-4778b4f024a65b74547bfe007fbe2b6d.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Player/p1_front.png" 14 | dest_files=["res://.godot/imported/p1_front.png-4778b4f024a65b74547bfe007fbe2b6d.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_hurt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Player/p1_hurt.png -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_hurt.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://rnedtmq7m02m" 6 | path="res://.godot/imported/p1_hurt.png-fc969a10c1eb8e351ab66c9a9e314703.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Player/p1_hurt.png" 14 | dest_files=["res://.godot/imported/p1_hurt.png-fc969a10c1eb8e351ab66c9a9e314703.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_jump.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Player/p1_jump.png -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_jump.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cqyukg3uuycf4" 6 | path="res://.godot/imported/p1_jump.png-ee55cd964296a5e5be6a3ceb0bc52fe7.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Player/p1_jump.png" 14 | dest_files=["res://.godot/imported/p1_jump.png-ee55cd964296a5e5be6a3ceb0bc52fe7.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_stand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Player/p1_stand.png -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_stand.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://ffgv0s7vrro5" 6 | path="res://.godot/imported/p1_stand.png-81ae6f47c8239fa1b5dae57da65475b4.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Player/p1_stand.png" 14 | dest_files=["res://.godot/imported/p1_stand.png-81ae6f47c8239fa1b5dae57da65475b4.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/Thumbs.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Player/p1_walk/Thumbs.db -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Player/p1_walk/p1_walk01.png -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk01.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://byicebm3xqqvf" 6 | path="res://.godot/imported/p1_walk01.png-9d637418594112831067c04af91b869d.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Player/p1_walk/p1_walk01.png" 14 | dest_files=["res://.godot/imported/p1_walk01.png-9d637418594112831067c04af91b869d.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Player/p1_walk/p1_walk02.png -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk02.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c0b2kwqc11hmp" 6 | path="res://.godot/imported/p1_walk02.png-ecb66a024f5088b726573c2f531eb50d.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Player/p1_walk/p1_walk02.png" 14 | dest_files=["res://.godot/imported/p1_walk02.png-ecb66a024f5088b726573c2f531eb50d.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Player/p1_walk/p1_walk03.png -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk03.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c0a6dcqg7ifki" 6 | path="res://.godot/imported/p1_walk03.png-9363f71812014a8617ecacd615964bb0.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Player/p1_walk/p1_walk03.png" 14 | dest_files=["res://.godot/imported/p1_walk03.png-9363f71812014a8617ecacd615964bb0.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Player/p1_walk/p1_walk04.png -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk04.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cfltcpca42j7y" 6 | path="res://.godot/imported/p1_walk04.png-2a587477805c897fa2dbb99d54429f90.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Player/p1_walk/p1_walk04.png" 14 | dest_files=["res://.godot/imported/p1_walk04.png-2a587477805c897fa2dbb99d54429f90.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Player/p1_walk/p1_walk05.png -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk05.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dnc8qra7ik1og" 6 | path="res://.godot/imported/p1_walk05.png-3d30d9d934d726b8e884c14a8e19905e.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Player/p1_walk/p1_walk05.png" 14 | dest_files=["res://.godot/imported/p1_walk05.png-3d30d9d934d726b8e884c14a8e19905e.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Player/p1_walk/p1_walk06.png -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk06.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://col76yk5anc3w" 6 | path="res://.godot/imported/p1_walk06.png-9168aef074459d1e1823494be76eb553.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Player/p1_walk/p1_walk06.png" 14 | dest_files=["res://.godot/imported/p1_walk06.png-9168aef074459d1e1823494be76eb553.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Player/p1_walk/p1_walk07.png -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk07.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://di3s8n8y1er54" 6 | path="res://.godot/imported/p1_walk07.png-ba80ffef40f84442121c516e8ab1ea1b.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Player/p1_walk/p1_walk07.png" 14 | dest_files=["res://.godot/imported/p1_walk07.png-ba80ffef40f84442121c516e8ab1ea1b.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Player/p1_walk/p1_walk08.png -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk08.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dwuysgyc8j82w" 6 | path="res://.godot/imported/p1_walk08.png-a3dab989144b0b58fa0d2d5c24174b5b.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Player/p1_walk/p1_walk08.png" 14 | dest_files=["res://.godot/imported/p1_walk08.png-a3dab989144b0b58fa0d2d5c24174b5b.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Player/p1_walk/p1_walk09.png -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk09.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://danut7sqbg40s" 6 | path="res://.godot/imported/p1_walk09.png-29971744c5cd89e82f3749b21a0a05a2.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Player/p1_walk/p1_walk09.png" 14 | dest_files=["res://.godot/imported/p1_walk09.png-29971744c5cd89e82f3749b21a0a05a2.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Player/p1_walk/p1_walk10.png -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk10.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://b8cmwiibg70sy" 6 | path="res://.godot/imported/p1_walk10.png-7843a5167854808b6449923c6f0d42f2.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Player/p1_walk/p1_walk10.png" 14 | dest_files=["res://.godot/imported/p1_walk10.png-7843a5167854808b6449923c6f0d42f2.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Player/p1_walk/p1_walk11.png -------------------------------------------------------------------------------- /lorien/Assets/Player/p1_walk/p1_walk11.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dy4wi0nvwge3k" 6 | path="res://.godot/imported/p1_walk11.png-6aa52d789eeb1f1d49d7e66cedd01eca.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Player/p1_walk/p1_walk11.png" 14 | dest_files=["res://.godot/imported/p1_walk11.png-6aa52d789eeb1f1d49d7e66cedd01eca.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Textures/arrow_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Textures/arrow_right.png -------------------------------------------------------------------------------- /lorien/Assets/Textures/arrow_right.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://f75au3rhdj7d" 6 | path="res://.godot/imported/arrow_right.png-10caef975eb4713cb62e858128e8aa09.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Textures/arrow_right.png" 14 | dest_files=["res://.godot/imported/arrow_right.png-10caef975eb4713cb62e858128e8aa09.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Textures/dot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Textures/dot.png -------------------------------------------------------------------------------- /lorien/Assets/Textures/dot.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cllsvja6j2npu" 6 | path="res://.godot/imported/dot.png-b21ef9585338c4335a449b7945e77989.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Textures/dot.png" 14 | dest_files=["res://.godot/imported/dot.png-b21ef9585338c4335a449b7945e77989.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Textures/palette_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Textures/palette_button.png -------------------------------------------------------------------------------- /lorien/Assets/Textures/palette_button.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bb2kaiahpvl5m" 6 | path="res://.godot/imported/palette_button.png-fd335e0dbb703bd94af22f96bfff0f31.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Textures/palette_button.png" 14 | dest_files=["res://.godot/imported/palette_button.png-fd335e0dbb703bd94af22f96bfff0f31.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Textures/palette_button_outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Textures/palette_button_outline.png -------------------------------------------------------------------------------- /lorien/Assets/Textures/palette_button_outline.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://d2x4s44tq3fd3" 6 | path="res://.godot/imported/palette_button_outline.png-1dde46a159e7ac04bf8f4d8211981e2d.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Textures/palette_button_outline.png" 14 | dest_files=["res://.godot/imported/palette_button_outline.png-1dde46a159e7ac04bf8f4d8211981e2d.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Textures/scrollbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Textures/scrollbar.png -------------------------------------------------------------------------------- /lorien/Assets/Textures/scrollbar.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dijv04a2yoqh2" 6 | path="res://.godot/imported/scrollbar.png-eadd7aad7ff0b21abf904a8ffd9a0d17.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Textures/scrollbar.png" 14 | dest_files=["res://.godot/imported/scrollbar.png-eadd7aad7ff0b21abf904a8ffd9a0d17.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Textures/scrollbar_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Textures/scrollbar_bg.png -------------------------------------------------------------------------------- /lorien/Assets/Textures/scrollbar_bg.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://rn8146pf73a8" 6 | path="res://.godot/imported/scrollbar_bg.png-3cbfdbe3f3545d9e0b439db7f8ef5b9f.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Textures/scrollbar_bg.png" 14 | dest_files=["res://.godot/imported/scrollbar_bg.png-3cbfdbe3f3545d9e0b439db7f8ef5b9f.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Textures/scrollbar_hl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Textures/scrollbar_hl.png -------------------------------------------------------------------------------- /lorien/Assets/Textures/scrollbar_hl.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dpy8q7l3et7er" 6 | path="res://.godot/imported/scrollbar_hl.png-8a162faa1f983be213b07295471fc0ec.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Textures/scrollbar_hl.png" 14 | dest_files=["res://.godot/imported/scrollbar_hl.png-8a162faa1f983be213b07295471fc0ec.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Textures/selection_cursor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Textures/selection_cursor.png -------------------------------------------------------------------------------- /lorien/Assets/Textures/selection_cursor.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dobdco0am2obq" 6 | path="res://.godot/imported/selection_cursor.png-c4d243d49e4bdda5af5ac45f72f7778f.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Textures/selection_cursor.png" 14 | dest_files=["res://.godot/imported/selection_cursor.png-c4d243d49e4bdda5af5ac45f72f7778f.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Textures/slider_knob_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Textures/slider_knob_white.png -------------------------------------------------------------------------------- /lorien/Assets/Textures/slider_knob_white.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bq4dsmdix16kd" 6 | path="res://.godot/imported/slider_knob_white.png-3e114d323795e813365f68173837837b.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Textures/slider_knob_white.png" 14 | dest_files=["res://.godot/imported/slider_knob_white.png-3e114d323795e813365f68173837837b.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Textures/switch_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Textures/switch_off.png -------------------------------------------------------------------------------- /lorien/Assets/Textures/switch_off.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://baw4u2ij0ftpe" 6 | path="res://.godot/imported/switch_off.png-3338dccdaecfa98b3d52f0fdbc42a09f.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Textures/switch_off.png" 14 | dest_files=["res://.godot/imported/switch_off.png-3338dccdaecfa98b3d52f0fdbc42a09f.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/Textures/switch_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/Textures/switch_on.png -------------------------------------------------------------------------------- /lorien/Assets/Textures/switch_on.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://vbj8ub3j37ih" 6 | path="res://.godot/imported/switch_on.png-fff765fdb0aaf21336651f1a319abb80.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/Textures/switch_on.png" 14 | dest_files=["res://.godot/imported/switch_on.png-fff765fdb0aaf21336651f1a319abb80.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/Assets/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/icon.ico -------------------------------------------------------------------------------- /lorien/Assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mbrlabs/Lorien/ea4e038d2a504927d55211b07afb8f416b23b6d4/lorien/Assets/icon.png -------------------------------------------------------------------------------- /lorien/Assets/icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://b6io62g8b730e" 6 | path="res://.godot/imported/icon.png-ec880de02d5dab0aa15458af9d6c53ed.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://Assets/icon.png" 14 | dest_files=["res://.godot/imported/icon.png-ec880de02d5dab0aa15458af9d6c53ed.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /lorien/BrushStroke/BrushStroke.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=3 uid="uid://c4qnqdrb1kmv7"] 2 | 3 | [ext_resource type="Script" path="res://BrushStroke/BrushStroke.gd" id="1"] 4 | 5 | [node name="BrushStroke" type="Node2D"] 6 | script = ExtResource("1") 7 | 8 | [node name="VisibleOnScreenNotifier2D" type="VisibleOnScreenNotifier2D" parent="."] 9 | 10 | [node name="Line2D" type="Line2D" parent="."] 11 | texture_filter = 6 12 | texture_mode = 2 13 | joint_mode = 2 14 | -------------------------------------------------------------------------------- /lorien/BrushStroke/BrushStrokeOptimizer.gd: -------------------------------------------------------------------------------- 1 | class_name BrushStrokeOptimizer 2 | 3 | # ------------------------------------------------------------------------------------------------- 4 | const ANGLE_THRESHOLD := 0.5 5 | const MIN_DISTANCE := 4.0 6 | 7 | # ------------------------------------------------------------------------------------------------- 8 | var points_removed := 0 9 | 10 | # ------------------------------------------------------------------------------------------------- 11 | func reset() -> void: 12 | points_removed = 0 13 | 14 | # ------------------------------------------------------------------------------------------------- 15 | func optimize(s: BrushStroke) -> void: 16 | 17 | if s.points.size() < 8: 18 | return 19 | 20 | var filtered_points: Array[Vector2] 21 | var filtered_pressures: Array[float] 22 | 23 | filtered_points.append(s.points.front()) 24 | filtered_pressures.append(s.pressures.front()) 25 | 26 | var previous_angle := 0.0 27 | 28 | for i: int in range(1, s.points.size()): 29 | var prev_point := s.points[i-1] 30 | var point := s.points[i] 31 | var pressure := s.pressures[i] 32 | 33 | # Distance between 2 points must be greater than x 34 | var distance := prev_point.distance_to(point) 35 | 36 | # Angle between points must be beigger than x deg 37 | var angle := rad_to_deg(prev_point.angle_to_point(point)) 38 | var angle_diff: float = abs(abs(angle) - abs(previous_angle)) 39 | previous_angle = angle 40 | 41 | if distance > MIN_DISTANCE || angle_diff >= ANGLE_THRESHOLD: 42 | filtered_points.append(point) 43 | filtered_pressures.append(pressure) 44 | else: 45 | points_removed += 1 46 | 47 | # add back last point 48 | if !filtered_points.back().is_equal_approx(s.points.back()): 49 | filtered_points.append(s.points.back()) 50 | filtered_pressures.append(s.pressures.back()) 51 | 52 | s.points = filtered_points 53 | s.pressures = filtered_pressures 54 | -------------------------------------------------------------------------------- /lorien/BrushStroke/BrushStrokeTexture.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | # ------------------------------------------------------------------------------------------------- 4 | # Note: 5 | # 6 | # This code is taken from: https://github.com/godot-extended-libraries/godot-antialiased-line2d 7 | # which has been released under the MIT license 8 | # ------------------------------------------------------------------------------------------------- 9 | 10 | # Generates the antialiased Line2D texture that will be used by the various nodes. 11 | # We do this in a singleton to perform this generation once at load, rather than once 12 | # for every AntialiasedLine2D node. This generation can take several dozen milliseconds, 13 | # so it would cause stuttering if performed during gameplay. 14 | 15 | var texture: ImageTexture 16 | 17 | func _ready() -> void: 18 | # Generate a texture with custom mipmaps (1-pixel feather on the top and bottom sides). 19 | # The texture must be square for mipmaps to work correctly. The texture's in-memory size is still 20 | # pretty low (less than 200 KB), so this should not cause any performance problems. 21 | var data := PackedByteArray() 22 | for mipmap: int in [256, 128, 64, 32, 16, 8, 4, 2, 1]: 23 | for y: int in mipmap: 24 | for x: int in mipmap: 25 | # White. If you need a different color for the Line2D, change the `default_color` property. 26 | data.push_back(255) 27 | 28 | # The last two mips are very thin. They require special handling to prevent lines 29 | # from disappearing entirely. 30 | if mipmap >= 4: 31 | if y == 0 or y == mipmap - 1: 32 | # Fully transparent. 33 | data.push_back(0) 34 | else: 35 | # Fully opaque. 36 | data.push_back(255) 37 | elif mipmap == 2: 38 | # Line will be a bit misaligned, but it'll look smoother than using lower alpha 39 | # for both pixels. 40 | if y == 1: 41 | # Fully transparent. 42 | data.push_back(0) 43 | else: 44 | # Fully opaque. 45 | data.push_back(255) 46 | else: # mipmap == 1 47 | # Average of 0 and 255 (there is only one pixel). 48 | data.push_back(128) 49 | 50 | var image := Image.create_from_data(256, 256, true, Image.FORMAT_LA8, data) 51 | texture = ImageTexture.create_from_image(image) 52 | -------------------------------------------------------------------------------- /lorien/Config.gd: -------------------------------------------------------------------------------- 1 | class_name Config 2 | 3 | const VERSION_MAJOR := 0 4 | const VERSION_MINOR := 7 5 | const VERSION_PATCH := 0 6 | const VERSION_STATUS := "-beta1" 7 | static var VERSION_STRING := "%d.%d.%d%s" % [VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, VERSION_STATUS] 8 | const CONFIG_PATH := "user://settings_v4.cfg" 9 | const PALETTES_PATH := "user://palettes.cfg" 10 | const STATE_PATH := "user://state.cfg" 11 | const MAX_PALETTE_SIZE := 40 12 | const MIN_PALETTE_SIZE := 1 13 | const BACKGROUND_IDLE_TIME_THRESHOLD := 250 # in ms 14 | const MIN_WINDOW_SIZE := Vector2(320, 256) 15 | const DEFAULT_CANVAS_COLOR := Color("202124") 16 | const DEFAULT_BRUSH_COLOR := Color.WHITE 17 | const DEFAULT_BRUSH_SIZE := 10 18 | const DEFAULT_PRESSURE_SENSITIVITY := 1.0 19 | const DEFAULT_CONSTANT_PRESSURE := false 20 | const DEFAULT_TOOL_PRESSURE := 0.5 21 | const DEFAULT_STABILIZER_STRENGTH := 0.5 22 | const DEFAULT_SELECTION_COLOR := Color("#2a967c") 23 | const DEFAULT_FOREGROUND_FPS := 144 24 | const DEFAULT_BACKGROUND_FPS := 10 25 | const DEFAULT_BRUSH_ROUNDING := Types.BrushRoundingType.ROUNDED 26 | const DEFAULT_UI_SCALE_MODE := Types.UIScale.AUTO 27 | const DEFAULT_UI_SCALE := 1.0 28 | const DEFAULT_GRID_PATTERN := Types.GridPattern.DOTS 29 | const DEFAULT_GRID_SIZE := 25.0 30 | -------------------------------------------------------------------------------- /lorien/InfiniteCanvas/Cursor/BaseCursor.gd: -------------------------------------------------------------------------------- 1 | @icon("res://Assets/Icons/cursor_icon.png") 2 | class_name BaseCursor 3 | extends Sprite2D 4 | 5 | # ------------------------------------------------------------------------------------------------- 6 | var _brush_size: int 7 | var _pressure := 1.0 8 | 9 | @onready var _camera: Camera2D = get_viewport().get_node("Camera2D") 10 | 11 | # ------------------------------------------------------------------------------------------------- 12 | func _input(event: InputEvent) -> void: 13 | if event is InputEventMouseMotion: 14 | update_position() 15 | 16 | # ------------------------------------------------------------------------------------------------- 17 | func update_position() -> void: 18 | global_position = _camera.get_global_mouse_position() 19 | 20 | # ------------------------------------------------------------------------------------------------- 21 | func set_pressure(pressure: float) -> void: 22 | _pressure = pressure 23 | 24 | # ------------------------------------------------------------------------------------------------- 25 | func change_size(value: int) -> void: 26 | _brush_size = value 27 | 28 | # ------------------------------------------------------------------------------------------------- 29 | func _on_canvas_position_changed(pos: Vector2) -> void: 30 | update_position() 31 | 32 | # ------------------------------------------------------------------------------------------------- 33 | func _on_zoom_changed(value: float) -> void: 34 | pass 35 | -------------------------------------------------------------------------------- /lorien/InfiniteCanvas/Cursor/BrushCursor/BrushCursor.gd: -------------------------------------------------------------------------------- 1 | class_name BrushCursor 2 | extends BaseCursor 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | func _draw() -> void: 6 | var radius := _brush_size/2.0 7 | draw_arc(Vector2.ZERO, radius*_pressure, 0, PI*2, 32, Color.BLACK, 0.5, true) 8 | #draw_circle(Vector2.ZERO, radius*0.08, Color.BLACK) 9 | 10 | # ------------------------------------------------------------------------------------------------- 11 | func set_pressure(pressure: float) -> void: 12 | if pressure <= 1.0: 13 | _pressure = pressure 14 | queue_redraw() 15 | 16 | # ------------------------------------------------------------------------------------------------- 17 | func change_size(brush_size: int) -> void: 18 | super(brush_size) 19 | queue_redraw() 20 | -------------------------------------------------------------------------------- /lorien/InfiniteCanvas/Cursor/BrushCursor/BrushCursor.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=3 uid="uid://cf3j2vavqos04"] 2 | 3 | [ext_resource type="Shader" path="res://InfiniteCanvas/Cursor/cursor.gdshader" id="1"] 4 | [ext_resource type="Script" path="res://InfiniteCanvas/Cursor/BrushCursor/BrushCursor.gd" id="2"] 5 | 6 | [sub_resource type="ShaderMaterial" id="1"] 7 | shader = ExtResource("1") 8 | 9 | [node name="BrushCursor" type="Sprite2D"] 10 | material = SubResource("1") 11 | script = ExtResource("2") 12 | -------------------------------------------------------------------------------- /lorien/InfiniteCanvas/Cursor/SelectionCursor/SelectionCursor.gd: -------------------------------------------------------------------------------- 1 | class_name SelectionCursor 2 | extends BaseCursor 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | const MOVE_TEXTURE = preload("res://Assets/Cursors/move_cursor.png") 6 | const SELECT_TEXTURE = preload("res://Assets/Textures/selection_cursor.png") 7 | 8 | enum Mode { 9 | MOVE, 10 | SELECT 11 | } 12 | 13 | # ------------------------------------------------------------------------------------------------- 14 | var mode := Mode.SELECT: get = get_mode, set = set_mode 15 | 16 | # ------------------------------------------------------------------------------------------------- 17 | func _on_zoom_changed(zoom_value: float) -> void: 18 | scale = Vector2.ONE / zoom_value 19 | 20 | # ------------------------------------------------------------------------------------------------- 21 | func set_mode(m: Mode) -> void: 22 | mode = m 23 | match mode: 24 | Mode.MOVE: texture = MOVE_TEXTURE 25 | _: texture = SELECT_TEXTURE 26 | 27 | # ------------------------------------------------------------------------------------------------- 28 | func get_mode() -> int: 29 | return mode 30 | -------------------------------------------------------------------------------- /lorien/InfiniteCanvas/Cursor/SelectionCursor/SelectionCursor.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://InfiniteCanvas/Cursor/SelectionCursor/SelectionCursor.gd" type="Script" id=1] 4 | [ext_resource path="res://InfiniteCanvas/Cursor/cursor.gdshader" type="Shader" id=2] 5 | 6 | [sub_resource type="ShaderMaterial" id=1] 7 | shader = ExtResource( 2 ) 8 | 9 | [node name="SelectionCursor" type="Sprite2D"] 10 | material = SubResource( 1 ) 11 | script = ExtResource( 1 ) 12 | -------------------------------------------------------------------------------- /lorien/InfiniteCanvas/Cursor/cursor.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | 3 | uniform sampler2D SCREEN_TEXTURE: hint_screen_texture, filter_linear_mipmap; 4 | 5 | void fragment() { 6 | vec4 background_color = texture(SCREEN_TEXTURE, SCREEN_UV); 7 | vec4 texture_color = texture(TEXTURE, UV); 8 | 9 | vec3 inverted = vec3(texture_color.rgb - background_color.rgb); 10 | float grayscale = (inverted.r + inverted.g + inverted.b) / 3.0; 11 | grayscale = min(1.0, grayscale*1.25); 12 | 13 | COLOR = vec4(grayscale, grayscale, grayscale, texture_color.a); 14 | } -------------------------------------------------------------------------------- /lorien/InfiniteCanvas/DebugDraw.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | # 4 | # This is used to draw debug stuff like bounding boxes etc. 5 | # 6 | 7 | # ------------------------------------------------------------------------------------------------- 8 | var _bounding_boxes: Array[Rect2] 9 | 10 | # ------------------------------------------------------------------------------------------------- 11 | func set_bounding_boxes(boxes: Array[Rect2]) -> void: 12 | _bounding_boxes = boxes 13 | queue_redraw() 14 | 15 | # ------------------------------------------------------------------------------------------------- 16 | func _draw() -> void: 17 | for box in _bounding_boxes: 18 | draw_rect(box, Color.RED, false) 19 | -------------------------------------------------------------------------------- /lorien/InfiniteCanvas/InfiniteCanvas.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=17 format=3 uid="uid://c4u5gk5n2aiom"] 2 | 3 | [ext_resource type="Script" path="res://InfiniteCanvas/InfiniteCanvas.gd" id="1"] 4 | [ext_resource type="Script" path="res://InfiniteCanvas/PanZoomCamera.gd" id="2"] 5 | [ext_resource type="Curve" uid="uid://bgd7v60kyywsk" path="res://InfiniteCanvas/default_pressure_curve.tres" id="3"] 6 | [ext_resource type="PackedScene" uid="uid://cf3j2vavqos04" path="res://InfiniteCanvas/Cursor/BrushCursor/BrushCursor.tscn" id="4"] 7 | [ext_resource type="Script" path="res://InfiniteCanvas/Tools/BrushTool.gd" id="5"] 8 | [ext_resource type="Script" path="res://InfiniteCanvas/Tools/LineTool.gd" id="6"] 9 | [ext_resource type="Script" path="res://InfiniteCanvas/Tools/SelectionTool.gd" id="7"] 10 | [ext_resource type="PackedScene" path="res://InfiniteCanvas/Cursor/SelectionCursor/SelectionCursor.tscn" id="8"] 11 | [ext_resource type="Script" path="res://InfiniteCanvas/Tools/SelectionRectangle.gd" id="9"] 12 | [ext_resource type="Shader" path="res://InfiniteCanvas/Tools/selection_rectangle.gdshader" id="10"] 13 | [ext_resource type="Script" path="res://InfiniteCanvas/Tools/RectangleTool.gd" id="11"] 14 | [ext_resource type="Script" path="res://InfiniteCanvas/InfiniteCanvasGrid.gd" id="12"] 15 | [ext_resource type="Script" path="res://InfiniteCanvas/Tools/CircleTool.gd" id="13"] 16 | [ext_resource type="Script" path="res://InfiniteCanvas/Tools/EraserTool.gd" id="14"] 17 | [ext_resource type="Script" path="res://InfiniteCanvas/DebugDraw.gd" id="15"] 18 | 19 | [sub_resource type="ShaderMaterial" id="1"] 20 | shader = ExtResource("10") 21 | shader_parameter/background_color = null 22 | 23 | [node name="InfiniteCanvas" type="SubViewportContainer"] 24 | anchors_preset = 15 25 | anchor_right = 1.0 26 | anchor_bottom = 1.0 27 | script = ExtResource("1") 28 | 29 | [node name="BrushTool" type="Node" parent="."] 30 | script = ExtResource("5") 31 | pressure_curve = ExtResource("3") 32 | cursor_path = NodePath("../SubViewport/BrushCursor") 33 | 34 | [node name="RectangleTool" type="Node" parent="."] 35 | script = ExtResource("11") 36 | pressure_curve = ExtResource("3") 37 | cursor_path = NodePath("../SubViewport/BrushCursor") 38 | 39 | [node name="CircleTool" type="Node" parent="."] 40 | script = ExtResource("13") 41 | pressure_curve = ExtResource("3") 42 | cursor_path = NodePath("../SubViewport/BrushCursor") 43 | 44 | [node name="EraserTool" type="Node" parent="."] 45 | script = ExtResource("14") 46 | cursor_path = NodePath("../SubViewport/BrushCursor") 47 | 48 | [node name="LineTool" type="Node" parent="."] 49 | script = ExtResource("6") 50 | pressure_curve = ExtResource("3") 51 | cursor_path = NodePath("../SubViewport/BrushCursor") 52 | 53 | [node name="SelectionTool" type="Node" parent="."] 54 | script = ExtResource("7") 55 | selection_rectangle_path = NodePath("../SubViewport/SelectionRectangle") 56 | cursor_path = NodePath("../SubViewport/SelectionCursor") 57 | 58 | [node name="SubViewport" type="SubViewport" parent="."] 59 | handle_input_locally = false 60 | size = Vector2i(1920, 1080) 61 | render_target_update_mode = 4 62 | 63 | [node name="Camera2D" type="Camera2D" parent="SubViewport"] 64 | anchor_mode = 0 65 | script = ExtResource("2") 66 | 67 | [node name="Grid" type="Node2D" parent="SubViewport"] 68 | script = ExtResource("12") 69 | camera_path = NodePath("../Camera2D") 70 | 71 | [node name="Strokes" type="Node2D" parent="SubViewport"] 72 | 73 | [node name="DebugDraw" type="Node2D" parent="SubViewport"] 74 | script = ExtResource("15") 75 | 76 | [node name="SelectionRectangle" type="Node2D" parent="SubViewport"] 77 | material = SubResource("1") 78 | script = ExtResource("9") 79 | 80 | [node name="BrushCursor" parent="SubViewport" instance=ExtResource("4")] 81 | 82 | [node name="SelectionCursor" parent="SubViewport" instance=ExtResource("8")] 83 | -------------------------------------------------------------------------------- /lorien/InfiniteCanvas/InfiniteCanvasGrid.gd: -------------------------------------------------------------------------------- 1 | class_name InfiniteCanvasGrid 2 | extends Node2D 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | @export var camera_path: NodePath 6 | 7 | var _pattern: int = Types.GridPattern.DOTS 8 | var _camera: Camera2D 9 | var _grid_size := Config.DEFAULT_GRID_SIZE 10 | var _grid_color: Color 11 | 12 | # ------------------------------------------------------------------------------------------------- 13 | func _ready() -> void: 14 | _grid_size = Settings.get_value(Settings.APPEARANCE_GRID_SIZE, Config.DEFAULT_GRID_SIZE) 15 | _pattern = Settings.get_value(Settings.APPEARANCE_GRID_PATTERN, Config.DEFAULT_GRID_PATTERN) 16 | 17 | _camera = get_node(camera_path) 18 | _camera.zoom_changed.connect(_on_zoom_changed) 19 | _camera.position_changed.connect(_on_position_changed) 20 | get_viewport().size_changed.connect(_on_viewport_size_changed) 21 | 22 | # ------------------------------------------------------------------------------------------------- 23 | func enable(e: bool) -> void: 24 | set_process(e) 25 | visible = e 26 | 27 | # ------------------------------------------------------------------------------------------------- 28 | func _on_zoom_changed(zoom: float) -> void: queue_redraw() 29 | func _on_position_changed(pos: Vector2) -> void: queue_redraw() 30 | func _on_viewport_size_changed() -> void: queue_redraw() 31 | 32 | # ------------------------------------------------------------------------------------------------- 33 | func set_grid_size(size: int) -> void: 34 | _grid_size = size 35 | queue_redraw() 36 | 37 | # ------------------------------------------------------------------------------------------------- 38 | func set_grid_pattern(pattern: int) -> void: 39 | _pattern = pattern 40 | queue_redraw() 41 | 42 | # ------------------------------------------------------------------------------------------------- 43 | func set_canvas_color(c: Color) -> void: 44 | _grid_color = c * 1.25 45 | queue_redraw() 46 | 47 | # ------------------------------------------------------------------------------------------------- 48 | func _draw() -> void: 49 | var zoom := (Vector2.ONE / _camera.zoom).x 50 | var size := Vector2(get_viewport().size.x, get_viewport().size.y) * zoom 51 | var offset := _camera.offset 52 | var grid_size := int(ceil((_grid_size * pow(zoom, 0.75)))) 53 | 54 | match _pattern: 55 | Types.GridPattern.DOTS: 56 | var dot_size := int(ceil(grid_size * 0.12)) 57 | var x_start := int(offset.x / grid_size) - 1 58 | var x_end := int((size.x + offset.x) / grid_size) + 1 59 | var y_start := int(offset.y / grid_size) - 1 60 | var y_end := int((size.y + offset.y) / grid_size) + 1 61 | 62 | for x in range(x_start, x_end): 63 | for y in range(y_start, y_end): 64 | var pos := Vector2(x, y) * grid_size 65 | draw_rect(Rect2(pos.x, pos.y, dot_size, dot_size), _grid_color) 66 | Types.GridPattern.LINES: 67 | # Vertical lines 68 | var start_index := int(offset.x / grid_size) - 1 69 | var end_index := int((size.x + offset.x) / grid_size) + 1 70 | for i in range(start_index, end_index): 71 | draw_line(Vector2(i * grid_size, offset.y + size.y), Vector2(i * grid_size, offset.y - size.y), _grid_color) 72 | 73 | # Horizontal lines 74 | start_index = int(offset.y / grid_size) - 1 75 | end_index = int((size.y + offset.y) / grid_size) + 1 76 | for i in range(start_index, end_index): 77 | draw_line(Vector2(offset.x + size.x, i * grid_size), Vector2(offset.x - size.x, i * grid_size), _grid_color) 78 | -------------------------------------------------------------------------------- /lorien/InfiniteCanvas/Tools/CircleTool.gd: -------------------------------------------------------------------------------- 1 | class_name CircleTool 2 | extends CanvasTool 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | const STEP_IN_MOTION := 15 6 | const STEP_STATIC := 4 7 | 8 | # ------------------------------------------------------------------------------------------------- 9 | @export var pressure_curve: Curve 10 | var _start_position_top_left: Vector2 11 | 12 | # ------------------------------------------------------------------------------------------------- 13 | var sin_arr : Array[float] 14 | var cos_arr : Array[float] 15 | 16 | # ------------------------------------------------------------------------------------------------- 17 | func _init() -> void: 18 | sin_arr.resize(360) 19 | cos_arr.resize(360) 20 | for i: int in 360: 21 | sin_arr[i] = sin(deg_to_rad(i)) 22 | cos_arr[i] = cos(deg_to_rad(i)) 23 | 24 | # ------------------------------------------------------------------------------------------------- 25 | func tool_event(event: InputEvent) -> void: 26 | _cursor.set_pressure(1.0) 27 | var pressure : float = Settings.get_value( 28 | Settings.GENERAL_TOOL_PRESSURE, 29 | Config.DEFAULT_TOOL_PRESSURE 30 | ) 31 | 32 | var should_draw_circle := Input.is_key_pressed(KEY_SHIFT) 33 | 34 | if event is InputEventMouseMotion: 35 | if performing_stroke: 36 | _cursor.set_pressure(event.pressure) 37 | remove_all_stroke_points() 38 | _make_ellipse(pressure, STEP_IN_MOTION, should_draw_circle) 39 | 40 | # Start + End 41 | elif event is InputEventMouseButton && !disable_stroke: 42 | if event.button_index == MOUSE_BUTTON_LEFT: 43 | if event.pressed: 44 | start_stroke() 45 | _start_position_top_left = _cursor.global_position 46 | remove_all_stroke_points() 47 | _make_ellipse(pressure, STEP_IN_MOTION, should_draw_circle) 48 | elif !event.pressed && performing_stroke: 49 | remove_all_stroke_points() 50 | _make_ellipse(pressure, STEP_STATIC, should_draw_circle) 51 | end_stroke() 52 | 53 | # ------------------------------------------------------------------------------------------------- 54 | func _make_ellipse(pressure: float, step: int, should_draw_circle: bool) -> void: 55 | pressure = pressure_curve.sample(pressure) 56 | 57 | var r1: float = 0.5 * abs(_cursor.global_position.x - _start_position_top_left.x) 58 | var r2: float = 0.5 * abs(_cursor.global_position.y - _start_position_top_left.y) 59 | 60 | if should_draw_circle: 61 | r1 = max(r1, r2) 62 | r2 = r1 63 | 64 | var dir := (_cursor.global_position -_start_position_top_left); 65 | var center: Vector2 66 | 67 | if dir.x >= 0 && dir.y >= 0: 68 | center = _start_position_top_left + Vector2(r1, r2) 69 | elif dir.x <= 0 && dir.y >= 0: 70 | center = _start_position_top_left + Vector2(-r1, r2) 71 | elif dir.x <= 0 && dir.y <= 0: 72 | center = _start_position_top_left + Vector2(-r1, -r2) 73 | else: 74 | center = _start_position_top_left + Vector2(r1, -r2) 75 | 76 | for i: int in range(0, 360, step): 77 | var point := Vector2( 78 | center.x + r1 * sin_arr[i], 79 | center.y + r2 * cos_arr[i] 80 | ) 81 | add_stroke_point(point, pressure) 82 | 83 | add_stroke_point(Vector2(center.x, center.y + r2), pressure) 84 | 85 | add_stroke_point( 86 | Vector2( 87 | center.x + r1 * sin_arr[1], 88 | center.y + r2 * cos_arr[1] 89 | ), 90 | pressure 91 | ) 92 | -------------------------------------------------------------------------------- /lorien/InfiniteCanvas/Tools/EraserTool.gd: -------------------------------------------------------------------------------- 1 | class_name EraserTool 2 | extends CanvasTool 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | const OVERLAP_THRESHOLD := 0.95 6 | const BOUNDING_BOX_MARGIN := 20.0 7 | 8 | # ------------------------------------------------------------------------------------------------- 9 | var _last_mouse_position: Vector2 10 | var _removed_strokes: Array[BrushStroke] 11 | var _bounding_box_cache := {} # BrushStroke -> Rect2 12 | 13 | # ------------------------------------------------------------------------------------------------- 14 | func tool_event(event: InputEvent) -> void: 15 | if event is InputEventMouseMotion: 16 | _last_mouse_position = _cursor.global_position 17 | if event is InputEventMouseButton && !disable_stroke: 18 | if event.button_index == MOUSE_BUTTON_LEFT: 19 | if event.pressed: 20 | if _bounding_box_cache.is_empty(): 21 | _update_bounding_boxes() 22 | performing_stroke = true 23 | elif !event.pressed: 24 | reset() 25 | 26 | # ------------------------------------------------------------------------------------------------- 27 | func _process(delta: float) -> void: 28 | if performing_stroke: 29 | _remove_stroke(_last_mouse_position) 30 | _add_undoredo_action_for_erased_strokes() 31 | 32 | # ------------------------------------------------------------------------------------------------ 33 | func _stroke_intersects_circle(stroke: BrushStroke, circle_position: Vector2) -> bool: 34 | # Check if the cursor is inside bounding box; if it's not, there is no way we are intersecting the stroke 35 | var bounding_box: Rect2 = _bounding_box_cache[stroke] 36 | if !bounding_box.has_point(_last_mouse_position): 37 | return false 38 | # Check every segment of the brush stroke for an intersection with the curser 39 | var eraser_brush_radius := float(_cursor._brush_size) * 0.5 40 | for i: int in stroke.points.size() - 1: 41 | var pressure := float(stroke.pressures[i] + stroke.pressures[i+1]) / 2.0 42 | var segment_radius := (pressure / float(BrushStroke.MAX_PRESSURE_VALUE)) * float(stroke.size) * 0.5 43 | var radius := segment_radius + eraser_brush_radius 44 | var start := stroke.position + stroke.points[i] 45 | var end := stroke.position + stroke.points[i+1] 46 | 47 | if Geometry2D.segment_intersects_circle(start, end, circle_position, radius*OVERLAP_THRESHOLD) >= 0: 48 | return true 49 | 50 | if Geometry2D.is_point_in_circle(stroke.points[i], circle_position, radius*OVERLAP_THRESHOLD): 51 | return true 52 | 53 | return false 54 | 55 | # ------------------------------------------------------------------------------------------------- 56 | func _remove_stroke(brush_position: Vector2) -> void: 57 | for stroke: BrushStroke in _canvas.get_strokes_in_camera_frustrum(): 58 | if !_removed_strokes.has(stroke) && _stroke_intersects_circle(stroke, brush_position): 59 | _removed_strokes.append(stroke) 60 | 61 | # ------------------------------------------------------------------------------------------------ 62 | func _add_undoredo_action_for_erased_strokes() -> void: 63 | var project: Project = ProjectManager.get_active_project() 64 | if _removed_strokes.size(): 65 | project.undo_redo.create_action("Erase Stroke") 66 | for stroke: BrushStroke in _removed_strokes: 67 | _removed_strokes.erase(stroke) 68 | project.undo_redo.add_do_method(Callable(_canvas, "_do_delete_stroke").bind(stroke)) 69 | project.undo_redo.add_undo_method(Callable(_canvas, "_undo_delete_stroke").bind(stroke)) 70 | project.undo_redo.commit_action() 71 | project.dirty = true 72 | 73 | # ------------------------------------------------------------------------------------------------ 74 | func _update_bounding_boxes() -> void: 75 | var strokes := _canvas.get_all_strokes() 76 | _bounding_box_cache = Utils.calculte_bounding_boxes(strokes, BOUNDING_BOX_MARGIN) 77 | #$"../Viewport/DebugDraw".set_bounding_boxes(_bounding_box_cache.values()) 78 | 79 | # ------------------------------------------------------------------------------------------------ 80 | func reset() -> void: 81 | super() 82 | _bounding_box_cache.clear() 83 | performing_stroke = false 84 | -------------------------------------------------------------------------------- /lorien/InfiniteCanvas/Tools/LineTool.gd: -------------------------------------------------------------------------------- 1 | class_name LineTool 2 | extends CanvasTool 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | const SNAP_STEP := deg_to_rad(90.0 / 6.0) # = 15 deg 6 | 7 | # ------------------------------------------------------------------------------------------------- 8 | @export var pressure_curve: Curve 9 | var _snapping_enabled := false 10 | var _head: Vector2 11 | var _tail: Vector2 12 | 13 | # ------------------------------------------------------------------------------------------------- 14 | func tool_event(event: InputEvent) -> void: 15 | _cursor.set_pressure(1.0) 16 | var pressure : float = Settings.get_value( 17 | Settings.GENERAL_TOOL_PRESSURE, 18 | Config.DEFAULT_TOOL_PRESSURE 19 | ) 20 | 21 | # Snap modifier 22 | if event is InputEventKey: 23 | if event.keycode == KEY_SHIFT: 24 | _snapping_enabled = event.pressed 25 | 26 | # Moving the tail 27 | elif event is InputEventMouseMotion: 28 | if performing_stroke: 29 | _cursor.set_pressure(event.pressure) 30 | remove_last_stroke_point() 31 | if _snapping_enabled: 32 | _tail = _add_point_at_snap_pos(pressure) 33 | else: 34 | _tail = _add_point_at_mouse_pos(pressure) 35 | 36 | # Start + End 37 | elif event is InputEventMouseButton && !disable_stroke: 38 | if event.button_index == MOUSE_BUTTON_LEFT: 39 | if event.pressed: 40 | start_stroke() 41 | _head = _add_point_at_mouse_pos(pressure) 42 | _tail = _add_point_at_mouse_pos(pressure) 43 | elif !event.pressed && performing_stroke: 44 | remove_last_stroke_point() 45 | add_subdivided_line(_head, _tail, pressure_curve.sample(pressure)) 46 | end_stroke() 47 | 48 | # ------------------------------------------------------------------------------------------------- 49 | func _add_point_at_mouse_pos(pressure: float) -> Vector2: 50 | var brush_position := _cursor.global_position 51 | pressure = pressure_curve.sample(pressure) 52 | add_stroke_point(brush_position, pressure) 53 | return brush_position 54 | 55 | # ------------------------------------------------------------------------------------------------- 56 | func _add_point_at_snap_pos(pressure: float) -> Vector2: 57 | var mouse_angle := _head.angle_to_point(_cursor.global_position) + (SNAP_STEP / 2.0) 58 | var snapped_angle: float = floor(mouse_angle / SNAP_STEP) * SNAP_STEP 59 | var line_length := _head.distance_to(_cursor.global_position) 60 | var new_tail := Vector2(line_length, 0).rotated(snapped_angle) + _head 61 | pressure = pressure_curve.sample(pressure) 62 | add_stroke_point(new_tail, pressure) 63 | return new_tail 64 | -------------------------------------------------------------------------------- /lorien/InfiniteCanvas/Tools/RectangleTool.gd: -------------------------------------------------------------------------------- 1 | class_name RectangleTool 2 | extends CanvasTool 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | @export var pressure_curve: Curve 6 | var _start_position_top_left: Vector2 7 | 8 | # ------------------------------------------------------------------------------------------------- 9 | func tool_event(event: InputEvent) -> void: 10 | _cursor.set_pressure(1.0) 11 | var pressure : float = Settings.get_value( 12 | Settings.GENERAL_TOOL_PRESSURE, 13 | Config.DEFAULT_TOOL_PRESSURE 14 | ) 15 | 16 | if event is InputEventMouseMotion: 17 | if performing_stroke: 18 | _cursor.set_pressure(event.pressure) 19 | remove_all_stroke_points() 20 | _make_rectangle(pressure) 21 | 22 | # Start + End 23 | elif event is InputEventMouseButton && !disable_stroke: 24 | if event.button_index == MOUSE_BUTTON_LEFT: 25 | if event.pressed: 26 | start_stroke() 27 | _start_position_top_left = _cursor.global_position 28 | _make_rectangle(pressure) 29 | elif !event.pressed && performing_stroke: 30 | remove_all_stroke_points() 31 | _make_rectangle(pressure) 32 | end_stroke() 33 | 34 | # ------------------------------------------------------------------------------------------------- 35 | func _make_rectangle(pressure: float) -> void: 36 | pressure = pressure_curve.sample(pressure) 37 | 38 | var bottom_right_point := _cursor.global_position 39 | # draw a square if Shift is pressed 40 | if Input.is_key_pressed(KEY_SHIFT): 41 | var drag_dir := _cursor.global_position - _start_position_top_left 42 | bottom_right_point = _start_position_top_left + drag_dir.project(sign(drag_dir)) 43 | var height := bottom_right_point.y - _start_position_top_left.y 44 | var width := bottom_right_point.x - _start_position_top_left.x 45 | var top_right_point := _start_position_top_left + Vector2(width, 0) 46 | var bottom_left_point := _start_position_top_left + Vector2(0, height) 47 | 48 | var w_offset := width*0.02 49 | var h_offset := height*0.02 50 | 51 | add_subdivided_line(_start_position_top_left, top_right_point - Vector2(w_offset, 0), pressure) 52 | add_subdivided_line(top_right_point, bottom_right_point - Vector2(0, h_offset), pressure) 53 | add_subdivided_line(bottom_right_point, bottom_left_point + Vector2(w_offset, 0), pressure) 54 | add_subdivided_line(bottom_left_point, _start_position_top_left + Vector2(0, h_offset), pressure) 55 | add_subdivided_line(_start_position_top_left, _start_position_top_left + Vector2(w_offset, 0), pressure) 56 | -------------------------------------------------------------------------------- /lorien/InfiniteCanvas/Tools/SelectionRectangle.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | class_name SelectionRectangle 3 | 4 | const OUTLINE_COLOR = Color.WHITE 5 | const FILL_COLOR = Color(1.0, 1.0, 1.0, 0.05) 6 | 7 | # ------------------------------------------------------------------------------------------------- 8 | @onready var _canvas: Control = $"../../" 9 | var start_position: Vector2 10 | var end_position: Vector2 11 | 12 | # ------------------------------------------------------------------------------------------------- 13 | func reset() -> void: 14 | start_position = Vector2.ZERO 15 | end_position = Vector2.ZERO 16 | 17 | # ------------------------------------------------------------------------------------------------- 18 | func _draw() -> void: 19 | if !(start_position - end_position).is_zero_approx(): 20 | material.set_shader_parameter("background_color", _canvas.get_background_color()) 21 | draw_rect(Rect2(start_position, end_position - start_position), FILL_COLOR) 22 | draw_rect(Rect2(start_position, end_position - start_position), OUTLINE_COLOR, false, 1.0) 23 | -------------------------------------------------------------------------------- /lorien/InfiniteCanvas/Tools/selection_rectangle.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | 3 | uniform vec4 background_color; 4 | 5 | void fragment() { 6 | vec3 inverted = vec3(1.0) - background_color.rgb; 7 | float grayscale = (inverted.r + inverted.g + inverted.b) / 3.0; 8 | grayscale = min(1.0, grayscale*1.25); 9 | 10 | COLOR = vec4(grayscale, grayscale, grayscale, COLOR.a); 11 | } -------------------------------------------------------------------------------- /lorien/InfiniteCanvas/constant_pressure_curve.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Curve" format=2] 2 | 3 | [resource] 4 | _data = [ Vector2( 0, 1 ), 0.0, 0.210526, 0, 0 ] 5 | -------------------------------------------------------------------------------- /lorien/InfiniteCanvas/default_pressure_curve.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Curve" format=3 uid="uid://bgd7v60kyywsk"] 2 | 3 | [resource] 4 | _data = [Vector2(0, 0.252555), 0.0, 0.747445, 0, 1, Vector2(1, 1), 0.747445, 0.0, 1, 0] 5 | point_count = 2 6 | -------------------------------------------------------------------------------- /lorien/Misc/GlobalSignals.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | # ------------------------------------------------------------------------------------------------- 4 | signal language_changed 5 | signal keybinding_changed(action: KeybindingsManager.Action) 6 | -------------------------------------------------------------------------------- /lorien/Misc/I18nParser.gd: -------------------------------------------------------------------------------- 1 | class_name I18nParser 2 | 3 | # ------------------------------------------------------------------------------------------------- 4 | const I18N_FOLDER := "res://Assets/I18n/" 5 | 6 | # ------------------------------------------------------------------------------------------------- 7 | var _first_load := true 8 | 9 | # ------------------------------------------------------------------------------------------------- 10 | func reload_locales() -> ParseResult: 11 | TranslationServer.clear() 12 | return load_files() 13 | 14 | # ------------------------------------------------------------------------------------------------- 15 | class ParseResult: 16 | extends RefCounted 17 | 18 | var locales := PackedStringArray() 19 | var language_names := PackedStringArray() 20 | 21 | func append(locale: String, lang_name: String) -> void: 22 | locales.append(locale) 23 | language_names.append(lang_name) 24 | 25 | # ------------------------------------------------------------------------------------------------- 26 | func load_files() -> ParseResult: 27 | var result := ParseResult.new() 28 | for f: String in _get_i18n_files(): 29 | var file := FileAccess.open(f, FileAccess.READ) 30 | if file != null: 31 | var position := Translation.new() 32 | position.locale = f.get_file().get_basename() 33 | 34 | # Language name 35 | var name := file.get_line().strip_edges() 36 | if !name.begins_with("LANGUAGE_NAME"): 37 | printerr("The file must start with 'LANGUAGE_NAME' key.") 38 | continue 39 | name = name.trim_prefix("LANGUAGE_NAME").strip_edges() 40 | 41 | # Key value pairs 42 | while !file.eof_reached(): 43 | var line := file.get_line().strip_edges() 44 | if line.length() == 0 || line.begins_with("#"): 45 | continue 46 | 47 | var split_index := line.find(" ") 48 | if split_index >= 0: 49 | var key := line.substr(0, split_index) 50 | var value := line.substr(split_index, line.length() - 1) 51 | 52 | # Remove inline comments 53 | var comment_index := value.find("#") 54 | if comment_index >= 0: 55 | value = value.substr(0, comment_index) 56 | 57 | value = value.strip_edges() 58 | value = value.replace("\\n", "\n") 59 | position.add_message(key, value) 60 | else: 61 | printerr("Key not found (make sure to use spaces; not tabs): %s" % line) 62 | TranslationServer.add_translation(position) 63 | result.append(position.locale, name) 64 | if _first_load: 65 | print("Loaded i18n file: %s" % f) 66 | file.close() 67 | _first_load = false 68 | return result 69 | 70 | # ------------------------------------------------------------------------------------------------- 71 | func _i18n_filter_shortcut_list(action_name: String) -> String: 72 | if ! InputMap.has_action(action_name): 73 | printerr("_i18n_filter_shortcut_list: substituiton of invlaid action name: '%s'" % action_name) 74 | return "INVALID_ACTION %s" % action_name 75 | 76 | var keybindings := PackedStringArray() 77 | for e: InputEvent in InputMap.action_get_events(action_name): 78 | if e is InputEventKey: 79 | keybindings.append(OS.get_keycode_string(e.get_keycode_with_modifiers())) 80 | 81 | if len(keybindings) == 0: 82 | return "" 83 | else: 84 | return "(%s)" % ", ".join(keybindings) 85 | 86 | # ------------------------------------------------------------------------------------------------- 87 | func _get_i18n_files() -> Array[String]: 88 | var files: Array[String] 89 | var dir := DirAccess.open(I18N_FOLDER) 90 | if dir != null: 91 | dir.list_dir_begin() 92 | var file_name := dir.get_next() 93 | while file_name != "": 94 | if !dir.current_is_dir(): 95 | files.append(I18N_FOLDER.path_join(file_name)) 96 | file_name = dir.get_next() 97 | else: 98 | printerr("Failed to list i18n files") 99 | 100 | return files 101 | -------------------------------------------------------------------------------- /lorien/Misc/KeybindingsManager.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | # ------------------------------------------------------------------------------------------------- 4 | class Action: 5 | var name: String 6 | var display_name: String 7 | var event: InputEventKey 8 | 9 | func event_label() -> String: 10 | return event.as_text_keycode() 11 | 12 | # ------------------------------------------------------------------------------------------------- 13 | var _actions: Array[Action] 14 | 15 | # ------------------------------------------------------------------------------------------------- 16 | func _ready() -> void: 17 | for action in get_actions(): 18 | var event := Settings.get_keybinding(action.name, action.event) 19 | rebind_action(action, event) 20 | 21 | # ------------------------------------------------------------------------------------------------- 22 | func get_actions() -> Array[Action]: 23 | if _actions.is_empty(): 24 | for action_name: String in InputMap.get_actions(): 25 | if !action_name.begins_with("ui_") && !action_name.begins_with("player_"): 26 | var events := InputMap.action_get_events(action_name) 27 | if events.size() > 0: 28 | var event := events[0] 29 | event = Settings.get_keybinding(action_name, event) 30 | 31 | var action := Action.new() 32 | action.event = event 33 | action.name = action_name 34 | action.display_name = tr("ACTION_" + action_name) 35 | _actions.append(action) 36 | 37 | return _actions 38 | 39 | # ------------------------------------------------------------------------------------------------- 40 | func get_action(action_name: String) -> Action: 41 | for action: Action in _actions: 42 | if action.name == action_name: 43 | return action 44 | return null 45 | 46 | # ------------------------------------------------------------------------------------------------- 47 | func get_action_map() -> Dictionary: 48 | var dict: Dictionary 49 | for action: Action in _actions: 50 | dict[action.name] = action 51 | 52 | return dict 53 | 54 | # ------------------------------------------------------------------------------------------------- 55 | func rebind_action(action: Action, event: InputEventKey) -> void: 56 | action.event = event 57 | InputMap.action_erase_events(action.name) 58 | InputMap.action_add_event(action.name, event) 59 | -------------------------------------------------------------------------------- /lorien/Misc/Player/Player.gd: -------------------------------------------------------------------------------- 1 | class_name Player 2 | extends CharacterBody2D 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | @export var speed: float = 600 6 | @export var jump_power: float = 1000 7 | @export var gravity: float = 60 8 | 9 | @onready var _sprite: AnimatedSprite2D = $AnimatedSprite2D 10 | @onready var _col_shape_normal: CollisionShape2D = $CollisionShapeNormal 11 | @onready var _col_shape_crouching: CollisionShape2D = $CollisionShapeCrouching 12 | 13 | # ------------------------------------------------------------------------------------------------- 14 | func _physics_process(delta: float) -> void: 15 | var is_crouching := false 16 | velocity.y += gravity 17 | if Input.is_action_pressed("player_crouch"): 18 | is_crouching = true 19 | _sprite.play("crouch") 20 | elif Input.is_action_pressed("player_move_left"): 21 | velocity.x = -speed 22 | _sprite.play("walk") 23 | _sprite.flip_h = true 24 | elif Input.is_action_pressed("player_move_right"): 25 | velocity.x = speed 26 | _sprite.play("walk") 27 | _sprite.flip_h = false 28 | elif is_on_floor(): 29 | velocity.x = 0 30 | _sprite.play("idle") 31 | 32 | if is_on_floor() && Input.is_action_just_pressed("player_jump"): 33 | velocity.y -= jump_power 34 | _sprite.play("jump") 35 | 36 | _col_shape_crouching.disabled = !is_crouching 37 | _col_shape_normal.disabled = is_crouching 38 | 39 | move_and_slide() 40 | 41 | # ------------------------------------------------------------------------------------------------- 42 | func reset(global_pos: Vector2) -> void: 43 | global_position = global_pos 44 | velocity = Vector2.ZERO 45 | -------------------------------------------------------------------------------- /lorien/Misc/Player/Player.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=20 format=3 uid="uid://dsfivcktd8k5d"] 2 | 3 | [ext_resource type="Script" path="res://Misc/Player/Player.gd" id="1"] 4 | [ext_resource type="Texture2D" uid="uid://ffgv0s7vrro5" path="res://Assets/Player/p1_stand.png" id="2"] 5 | [ext_resource type="Texture2D" uid="uid://cqyukg3uuycf4" path="res://Assets/Player/p1_jump.png" id="3"] 6 | [ext_resource type="Texture2D" uid="uid://dwuysgyc8j82w" path="res://Assets/Player/p1_walk/p1_walk08.png" id="4"] 7 | [ext_resource type="Texture2D" uid="uid://danut7sqbg40s" path="res://Assets/Player/p1_walk/p1_walk09.png" id="5"] 8 | [ext_resource type="Texture2D" uid="uid://cfltcpca42j7y" path="res://Assets/Player/p1_walk/p1_walk04.png" id="6"] 9 | [ext_resource type="Texture2D" uid="uid://b8cmwiibg70sy" path="res://Assets/Player/p1_walk/p1_walk10.png" id="7"] 10 | [ext_resource type="Texture2D" uid="uid://byicebm3xqqvf" path="res://Assets/Player/p1_walk/p1_walk01.png" id="8"] 11 | [ext_resource type="Texture2D" uid="uid://dy4wi0nvwge3k" path="res://Assets/Player/p1_walk/p1_walk11.png" id="9"] 12 | [ext_resource type="Texture2D" uid="uid://col76yk5anc3w" path="res://Assets/Player/p1_walk/p1_walk06.png" id="10"] 13 | [ext_resource type="Texture2D" uid="uid://dnc8qra7ik1og" path="res://Assets/Player/p1_walk/p1_walk05.png" id="11"] 14 | [ext_resource type="Texture2D" uid="uid://di3s8n8y1er54" path="res://Assets/Player/p1_walk/p1_walk07.png" id="12"] 15 | [ext_resource type="Texture2D" uid="uid://c0b2kwqc11hmp" path="res://Assets/Player/p1_walk/p1_walk02.png" id="13"] 16 | [ext_resource type="Texture2D" uid="uid://c0a6dcqg7ifki" path="res://Assets/Player/p1_walk/p1_walk03.png" id="14"] 17 | [ext_resource type="Texture2D" uid="uid://rnedtmq7m02m" path="res://Assets/Player/p1_hurt.png" id="15"] 18 | [ext_resource type="Texture2D" uid="uid://b122l270v6tvm" path="res://Assets/Player/p1_duck.png" id="16"] 19 | 20 | [sub_resource type="SpriteFrames" id="3"] 21 | animations = [{ 22 | "frames": [{ 23 | "duration": 1.0, 24 | "texture": ExtResource("16") 25 | }], 26 | "loop": false, 27 | "name": &"crouch", 28 | "speed": 5.0 29 | }, { 30 | "frames": [{ 31 | "duration": 1.0, 32 | "texture": ExtResource("3") 33 | }], 34 | "loop": false, 35 | "name": &"falling", 36 | "speed": 5.0 37 | }, { 38 | "frames": [{ 39 | "duration": 1.0, 40 | "texture": ExtResource("15") 41 | }], 42 | "loop": false, 43 | "name": &"hurt", 44 | "speed": 5.0 45 | }, { 46 | "frames": [{ 47 | "duration": 1.0, 48 | "texture": ExtResource("2") 49 | }], 50 | "loop": false, 51 | "name": &"idle", 52 | "speed": 5.0 53 | }, { 54 | "frames": [{ 55 | "duration": 1.0, 56 | "texture": ExtResource("3") 57 | }], 58 | "loop": false, 59 | "name": &"jump", 60 | "speed": 5.0 61 | }, { 62 | "frames": [{ 63 | "duration": 1.0, 64 | "texture": ExtResource("8") 65 | }, { 66 | "duration": 1.0, 67 | "texture": ExtResource("13") 68 | }, { 69 | "duration": 1.0, 70 | "texture": ExtResource("14") 71 | }, { 72 | "duration": 1.0, 73 | "texture": ExtResource("6") 74 | }, { 75 | "duration": 1.0, 76 | "texture": ExtResource("11") 77 | }, { 78 | "duration": 1.0, 79 | "texture": ExtResource("10") 80 | }, { 81 | "duration": 1.0, 82 | "texture": ExtResource("12") 83 | }, { 84 | "duration": 1.0, 85 | "texture": ExtResource("4") 86 | }, { 87 | "duration": 1.0, 88 | "texture": ExtResource("5") 89 | }, { 90 | "duration": 1.0, 91 | "texture": ExtResource("7") 92 | }, { 93 | "duration": 1.0, 94 | "texture": ExtResource("9") 95 | }], 96 | "loop": true, 97 | "name": &"walk", 98 | "speed": 12.0 99 | }] 100 | 101 | [sub_resource type="CapsuleShape2D" id="1"] 102 | radius = 33.0 103 | height = 98.0 104 | 105 | [sub_resource type="CapsuleShape2D" id="4"] 106 | radius = 30.0 107 | height = 70.0 108 | 109 | [node name="Player" type="CharacterBody2D"] 110 | script = ExtResource("1") 111 | 112 | [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] 113 | sprite_frames = SubResource("3") 114 | animation = &"walk" 115 | 116 | [node name="CollisionShapeNormal" type="CollisionShape2D" parent="."] 117 | shape = SubResource("1") 118 | 119 | [node name="CollisionShapeCrouching" type="CollisionShape2D" parent="."] 120 | shape = SubResource("4") 121 | disabled = true 122 | -------------------------------------------------------------------------------- /lorien/Misc/Settings.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | # ------------------------------------------------------------------------------------------------- 4 | const SETTINGS_SECTION := "settings" 5 | const KEYBINDINGS_SECTION := "keybindings" 6 | 7 | # ------------------------------------------------------------------------------------------------- 8 | const GENERAL_PRESSURE_SENSITIVITY := "general_pressure_sensitvity" 9 | const GENERAL_CONSTANT_PRESSURE := "general_constant_pressure" 10 | const GENERAL_STABILIZER_STRENGTH := "general_stabilizer_strength" 11 | const GENERAL_DEFAULT_BRUSH_SIZE := "general_default_brush_size" 12 | const GENERAL_DEFAULT_PROJECT_DIR := "general_default_project_dir" 13 | const GENERAL_LANGUAGE := "general_language" 14 | const GENERAL_TOOL_PRESSURE := "general_tool_pressure" 15 | const GENERAL_TABLET_DRIVER := "general_tablet_driver" 16 | const COLOR_PALETTE_UUID_LAST_USED := "general_color_palette_uuid_last_used" # TODO: move this to state.cfg 17 | 18 | # ------------------------------------------------------------------------------------------------- 19 | const APPEARANCE_THEME := "appearance_theme" 20 | const APPEARANCE_UI_SCALE_MODE := "appearance_ui_scale_mode" 21 | const APPEARANCE_UI_SCALE := "appearance_ui_scale" 22 | const APPEARANCE_GRID_PATTERN := "appearance_grid_pattern" 23 | const APPEARANCE_GRID_SIZE := "appearance_grid_size" 24 | const APPEARANCE_CANVAS_COLOR := "appearance_canvas_color" 25 | 26 | # ------------------------------------------------------------------------------------------------- 27 | const RENDERING_FOREGROUND_FPS := "rendering_foreground_fps" 28 | const RENDERING_BACKGROUND_FPS := "rendering_background_fps" 29 | const RENDERING_BRUSH_ROUNDING := "rendering_brush_rounding" 30 | 31 | # ------------------------------------------------------------------------------------------------- 32 | var _config_file := ConfigFile.new() 33 | var _i18n := I18nParser.new() 34 | var locales: PackedStringArray 35 | var language_names: PackedStringArray 36 | 37 | # ------------------------------------------------------------------------------------------------- 38 | func _ready() -> void: 39 | _config_file = ConfigFile.new() 40 | _load_settings() 41 | reload_locales() 42 | 43 | # ------------------------------------------------------------------------------------------------- 44 | func reload_locales() -> void: 45 | var parse_result := _i18n.reload_locales() 46 | TranslationServer.set_locale(get_value(SETTINGS_SECTION, "en")) 47 | locales = parse_result.locales 48 | language_names = parse_result.language_names 49 | 50 | # ------------------------------------------------------------------------------------------------- 51 | func _load_settings() -> int: 52 | var err := _config_file.load(Config.CONFIG_PATH) 53 | if err == ERR_FILE_NOT_FOUND: 54 | pass 55 | elif err != OK: 56 | printerr("Failed to load settings file") 57 | 58 | return err 59 | 60 | # ------------------------------------------------------------------------------------------------- 61 | func _save_settings() -> int: 62 | var err := _config_file.save(Config.CONFIG_PATH) 63 | if err == ERR_FILE_NOT_FOUND: 64 | pass 65 | elif err != OK: 66 | printerr("Failed to save settings file") 67 | 68 | return err 69 | 70 | # ------------------------------------------------------------------------------------------------- 71 | func get_value(key: String, default_value: Variant = null) -> Variant: 72 | return _config_file.get_value(SETTINGS_SECTION, key, default_value) 73 | 74 | # ------------------------------------------------------------------------------------------------- 75 | func set_value(key: String, value: Variant = null) -> void: 76 | _config_file.set_value(SETTINGS_SECTION, key, value) 77 | _save_settings() 78 | 79 | # ------------------------------------------------------------------------------------------------- 80 | func get_keybinding(action_name: String, default_value: Variant = null) -> InputEventKey: 81 | return _config_file.get_value(KEYBINDINGS_SECTION, action_name, default_value) 82 | 83 | # ------------------------------------------------------------------------------------------------- 84 | func set_keybinding(action_name: String, event: InputEventKey) -> void: 85 | _config_file.set_value(KEYBINDINGS_SECTION, action_name, event) 86 | _save_settings() 87 | -------------------------------------------------------------------------------- /lorien/Misc/StatePersistence.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | # ------------------------------------------------------------------------------------------------- 4 | const DEFAULT_SECTION := "states" 5 | const WINDOW_SIZE := "window_size" 6 | const WINDOW_MAXIMIZED := "window_maximized" 7 | const OPEN_PROJECTS := "open_projects" 8 | const ACTIVE_PROJECT := "active_project" 9 | 10 | # ------------------------------------------------------------------------------------------------- 11 | var _config_file := ConfigFile.new() 12 | 13 | # ------------------------------------------------------------------------------------------------- 14 | func _ready() -> void: 15 | _config_file = ConfigFile.new() 16 | _load_state() 17 | 18 | # ------------------------------------------------------------------------------------------------- 19 | func _load_state() -> int: 20 | var err := _config_file.load(Config.STATE_PATH) 21 | if err == ERR_FILE_NOT_FOUND: 22 | pass 23 | elif err != OK: 24 | printerr("Failed to load state file") 25 | 26 | return err 27 | 28 | # ------------------------------------------------------------------------------------------------- 29 | func _save_state() -> int: 30 | var err := _config_file.save(Config.STATE_PATH) 31 | if err == ERR_FILE_NOT_FOUND: 32 | pass 33 | elif err != OK: 34 | printerr("Failed to load state file") 35 | 36 | return err 37 | 38 | # ------------------------------------------------------------------------------------------------- 39 | func get_value(key: String, default_value: Variant = null) -> Variant: 40 | return _config_file.get_value(DEFAULT_SECTION, key, default_value) 41 | 42 | # ------------------------------------------------------------------------------------------------- 43 | func set_value(key: String, value: Variant = null) -> void: 44 | _config_file.set_value(DEFAULT_SECTION, key, value) 45 | _save_state() 46 | -------------------------------------------------------------------------------- /lorien/Misc/SvgExporter.gd: -------------------------------------------------------------------------------- 1 | class_name SvgExporter 2 | extends RefCounted 3 | 4 | # TODOs 5 | # - Stroke width / pressue data 6 | 7 | # ------------------------------------------------------------------------------------------------- 8 | const EDGE_MARGIN := 0.025 9 | 10 | # ------------------------------------------------------------------------------------------------- 11 | func export_svg(strokes: Array[BrushStroke], background: Color, path: String) -> void: 12 | var start_time := Time.get_ticks_msec() 13 | 14 | # Open file 15 | var file := FileAccess.open(path, FileAccess.WRITE) 16 | if file == null: 17 | printerr("Failed to open file for writing") 18 | return 19 | 20 | # Calculate total canvas dimensions 21 | var max_dim := BrushStroke.MIN_VECTOR2 22 | var min_dim := BrushStroke.MAX_VECTOR2 23 | for stroke: BrushStroke in strokes: 24 | min_dim.x = min(min_dim.x, stroke.top_left_pos.x + stroke.global_position.x) 25 | min_dim.y = min(min_dim.y, stroke.top_left_pos.y + stroke.global_position.y) 26 | max_dim.x = max(max_dim.x, stroke.bottom_right_pos.x + stroke.global_position.x) 27 | max_dim.y = max(max_dim.y, stroke.bottom_right_pos.y + stroke.global_position.y) 28 | var size := max_dim - min_dim 29 | var margin_size := size * EDGE_MARGIN 30 | size += margin_size*2.0 31 | var origin := min_dim - margin_size 32 | 33 | # Write svg to file 34 | _svg_start(file, origin, size) 35 | _svg_rect(file, origin, size, background) 36 | for stroke: BrushStroke in strokes: 37 | _svg_polyline(file, stroke) 38 | _svg_end(file) 39 | 40 | # Flush and close the file 41 | file.flush() 42 | file.close() 43 | print("Exported %s in %d ms" % [path, (Time.get_ticks_msec() - start_time)]) 44 | 45 | # ------------------------------------------------------------------------------------------------- 46 | func _svg_start(file: FileAccess, origin: Vector2, size: Vector2) -> void: 47 | var params := [origin.x, origin.y, size.x, size.y] 48 | var svg := "\n" % params 49 | file.store_string(svg) 50 | 51 | # ------------------------------------------------------------------------------------------------- 52 | func _svg_end(file: FileAccess) -> void: 53 | file.store_string("") 54 | 55 | # ------------------------------------------------------------------------------------------------- 56 | func _svg_rect(file: FileAccess, origin: Vector2, size: Vector2, color: Color) -> void: 57 | var params := [origin.x, origin.y, size.x, size.y, color.to_html(false)] 58 | var rect := "\n" % params 59 | file.store_string(rect) 60 | 61 | # ------------------------------------------------------------------------------------------------- 62 | func _svg_polyline(file: FileAccess, stroke: BrushStroke) -> void: 63 | file.store_string("\n" % stroke.color.to_html(false)) 74 | -------------------------------------------------------------------------------- /lorien/Misc/Types.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | class_name Types 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | enum Tool { 6 | BRUSH, 7 | RECTANGLE, 8 | CIRCLE, 9 | LINE, 10 | ERASER, 11 | SELECT, 12 | } 13 | 14 | # ------------------------------------------------------------------------------------------------- 15 | enum GridPattern { 16 | DOTS, 17 | LINES, 18 | NONE 19 | } 20 | 21 | # ------------------------------------------------------------------------------------------------- 22 | enum UITheme { 23 | DARK, 24 | LIGHT 25 | } 26 | 27 | # ------------------------------------------------------------------------------------------------- 28 | enum BrushRoundingType { 29 | FLAT = 0, 30 | ROUNDED = 1 31 | } 32 | 33 | # ------------------------------------------------------------------------------------------------- 34 | enum UIScale { 35 | AUTO, 36 | CUSTOM 37 | } 38 | 39 | # ------------------------------------------------------------------------------------------------- 40 | class CanvasInfo: 41 | var point_count: int 42 | var stroke_count: int 43 | var current_pressure: float 44 | var selected_lines : int 45 | var pen_inverted : bool 46 | -------------------------------------------------------------------------------- /lorien/Palette/Palette.gd: -------------------------------------------------------------------------------- 1 | class_name Palette 2 | extends Resource 3 | 4 | @export var name: String 5 | @export var uuid: String 6 | @export var builtin: bool 7 | @export var colors: PackedColorArray 8 | -------------------------------------------------------------------------------- /lorien/Palette/default_palette.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://Palette/Palette.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | name = "Default Palette" 8 | uuid = "defaultpalette" 9 | builtin = true 10 | colors = PackedColorArray( 1, 1, 1, 1, 0, 0, 0, 1, 1, 0.34902, 0.34902, 1, 1, 0.470588, 0.929412, 1, 0.784314, 0.423529, 1, 1, 0.341176, 0.517647, 1, 1, 0.345098, 0.854902, 1, 1, 0.329412, 1, 0.92549, 1, 0.321569, 1, 0.698039, 1, 0.380392, 1, 0.435294, 1, 1, 0.878431, 0.317647, 1, 1, 0.952941, 0.219608, 1, 1, 0.65098, 0.317647, 1, 1, 0.584314, 0, 1 ) 11 | -------------------------------------------------------------------------------- /lorien/ProjectManager/Project.gd: -------------------------------------------------------------------------------- 1 | class_name Project 2 | 3 | # Emitted whenever something marks the project as dirty, even if it's already dirty. 4 | signal dirtied 5 | 6 | var id: int # this is used at runtime only and will not be persisted; project ids are not garanteed to be the same between restarts 7 | var undo_redo: UndoRedo 8 | 9 | var dirty := false: 10 | set(value): 11 | dirty = value 12 | if value == true: 13 | dirtied.emit() 14 | 15 | var loaded := false 16 | 17 | var filepath: String 18 | var meta_data: Dictionary 19 | var strokes: Array[BrushStroke] 20 | 21 | # ------------------------------------------------------------------------------------------------- 22 | func _init() -> void: 23 | undo_redo = UndoRedo.new() 24 | 25 | # ------------------------------------------------------------------------------------------------- 26 | func _notification(what: int) -> void: 27 | if what == NOTIFICATION_PREDELETE: 28 | if undo_redo != null: 29 | undo_redo.free() 30 | 31 | # ------------------------------------------------------------------------------------------------- 32 | func clear() -> void: 33 | undo_redo.free() 34 | undo_redo = null 35 | meta_data.clear() 36 | strokes.clear() 37 | 38 | # ------------------------------------------------------------------------------------------------- 39 | func add_stroke(stroke: BrushStroke) -> void: 40 | strokes.append(stroke) 41 | dirty = true 42 | 43 | # ------------------------------------------------------------------------------------------------- 44 | func remove_last_stroke() -> void: 45 | if !strokes.is_empty(): 46 | strokes.pop_back() 47 | 48 | # ------------------------------------------------------------------------------------------------- 49 | func get_scene_file_path() -> String: 50 | if filepath.is_empty(): 51 | return "Untitled" 52 | return filepath.get_file() 53 | 54 | # ------------------------------------------------------------------------------------------------- 55 | func _to_string() -> String: 56 | return "%s: id: %d, loaded: %s, dirty: %s" % [filepath, id, loaded, dirty] 57 | -------------------------------------------------------------------------------- /lorien/ProjectManager/ProjectMetadata.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | # ------------------------------------------------------------------------------------------------- 4 | const CAMERA_ZOOM := "camera_zoom" 5 | const CAMERA_OFFSET_X := "camera_offset_x" 6 | const CAMERA_OFFSET_Y := "camera_offset_y" 7 | 8 | # ------------------------------------------------------------------------------------------------- 9 | func make_dict(canvas: InfiniteCanvas) -> Dictionary: 10 | var cam: Camera2D = canvas.get_camera_3d() 11 | 12 | return { 13 | CAMERA_OFFSET_X: str(cam.offset.x), 14 | CAMERA_OFFSET_Y: str(cam.offset.y), 15 | CAMERA_ZOOM: str(cam.zoom.x), 16 | } 17 | 18 | # ------------------------------------------------------------------------------------------------- 19 | func apply_from_dict(meta_data: Dictionary, canvas: InfiniteCanvas) -> void: 20 | var cam: Camera2D = canvas.get_camera_3d() 21 | 22 | var new_cam_zoom_str: String = meta_data.get(CAMERA_ZOOM, "1.0") 23 | var new_cam_offset_x_str: String = meta_data.get(CAMERA_OFFSET_X, "0.0") 24 | var new_cam_offset_y_str: String = meta_data.get(CAMERA_OFFSET_Y, "0.0") 25 | 26 | cam.offset = Vector2(float(new_cam_offset_x_str), float(new_cam_offset_y_str)) 27 | cam.set_zoom_level(float(new_cam_zoom_str)) 28 | -------------------------------------------------------------------------------- /lorien/UI/ColorPalettePicker.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=11 format=3 uid="uid://dsxmmndtd4r2c"] 2 | 3 | [ext_resource type="Theme" uid="uid://u5qnpgxqykiv" path="res://UI/Themes/theme_dark.tres" id="1"] 4 | [ext_resource type="Script" path="res://UI/ColorPalettePicker.gd" id="2"] 5 | [ext_resource type="Texture2D" uid="uid://bu10tixbxmwus" path="res://Assets/Icons/edit.png" id="3"] 6 | [ext_resource type="Texture2D" uid="uid://bmutnbt040e0b" path="res://Assets/Icons/plus.png" id="4"] 7 | [ext_resource type="Texture2D" uid="uid://ci340bpx1hg78" path="res://Assets/Icons/copy.png" id="5"] 8 | [ext_resource type="Texture2D" uid="uid://c3maqrdnsjgiq" path="res://Assets/Icons/delete.png" id="6"] 9 | [ext_resource type="Script" path="res://UI/Components/FlatTextureButton.gd" id="7"] 10 | 11 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_eth5b"] 12 | bg_color = Color(0.12549, 0.129412, 0.141176, 1) 13 | border_width_left = 1 14 | border_width_top = 1 15 | border_width_right = 1 16 | border_width_bottom = 1 17 | border_color = Color(0.207843, 0.211765, 0.227451, 1) 18 | corner_radius_top_left = 6 19 | corner_radius_top_right = 6 20 | corner_radius_bottom_right = 6 21 | corner_radius_bottom_left = 6 22 | 23 | [sub_resource type="StyleBoxLine" id="1"] 24 | color = Color(0.4, 0.407843, 0.443137, 1) 25 | grow_begin = -4.0 26 | grow_end = -4.0 27 | vertical = true 28 | 29 | [sub_resource type="StyleBoxEmpty" id="2"] 30 | 31 | [node name="ColorPalettePicker" type="PanelContainer"] 32 | custom_minimum_size = Vector2(358, 78) 33 | offset_right = 358.0 34 | offset_bottom = 78.0 35 | theme = ExtResource("1") 36 | theme_override_styles/panel = SubResource("StyleBoxFlat_eth5b") 37 | script = ExtResource("2") 38 | 39 | [node name="MarginContainer" type="MarginContainer" parent="."] 40 | layout_mode = 2 41 | theme_override_constants/margin_left = 6 42 | theme_override_constants/margin_top = 6 43 | theme_override_constants/margin_right = 6 44 | theme_override_constants/margin_bottom = 6 45 | 46 | [node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] 47 | layout_mode = 2 48 | theme = ExtResource("1") 49 | 50 | [node name="Buttons" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] 51 | layout_mode = 2 52 | theme_override_constants/separation = 8 53 | 54 | [node name="PaletteSelectionButton" type="OptionButton" parent="MarginContainer/VBoxContainer/Buttons"] 55 | layout_mode = 2 56 | 57 | [node name="AddPaletteButton" type="TextureButton" parent="MarginContainer/VBoxContainer/Buttons"] 58 | layout_mode = 2 59 | size_flags_vertical = 4 60 | tooltip_text = "COLOR_PALETTE_PICKER_HINT_NEW" 61 | texture_normal = ExtResource("4") 62 | script = ExtResource("7") 63 | hover_tint = Color(0.662745, 0.945098, 0.87451, 1) 64 | pressed_tint = Color(0.572549, 1, 0.894118, 1) 65 | 66 | [node name="EditColorButton" type="TextureButton" parent="MarginContainer/VBoxContainer/Buttons"] 67 | layout_mode = 2 68 | size_flags_vertical = 4 69 | tooltip_text = "COLOR_PALETTE_PICKER_HINT_EDIT" 70 | texture_normal = ExtResource("3") 71 | script = ExtResource("7") 72 | hover_tint = Color(0.662745, 0.945098, 0.87451, 1) 73 | pressed_tint = Color(0.572549, 1, 0.894118, 1) 74 | 75 | [node name="DuplicatePaletteButton" type="TextureButton" parent="MarginContainer/VBoxContainer/Buttons"] 76 | layout_mode = 2 77 | size_flags_vertical = 4 78 | tooltip_text = "COLOR_PALETTE_PICKER_HINT_DUPLICATE" 79 | texture_normal = ExtResource("5") 80 | script = ExtResource("7") 81 | hover_tint = Color(0.662745, 0.945098, 0.87451, 1) 82 | pressed_tint = Color(0.572549, 1, 0.894118, 1) 83 | 84 | [node name="VSeparator" type="VSeparator" parent="MarginContainer/VBoxContainer/Buttons"] 85 | layout_mode = 2 86 | theme_override_styles/separator = SubResource("1") 87 | 88 | [node name="DeletePaletteButton" type="TextureButton" parent="MarginContainer/VBoxContainer/Buttons"] 89 | layout_mode = 2 90 | size_flags_vertical = 4 91 | tooltip_text = "COLOR_PALETTE_PICKER_HINT_DELETE" 92 | texture_normal = ExtResource("6") 93 | script = ExtResource("7") 94 | hover_tint = Color(1, 0.431373, 0.431373, 1) 95 | pressed_tint = Color(1, 0.266667, 0.266667, 1) 96 | 97 | [node name="HSeparator" type="HSeparator" parent="MarginContainer/VBoxContainer"] 98 | layout_mode = 2 99 | theme_override_constants/separation = 2 100 | theme_override_styles/separator = SubResource("2") 101 | 102 | [node name="ColorGrid" type="GridContainer" parent="MarginContainer/VBoxContainer"] 103 | layout_mode = 2 104 | size_flags_horizontal = 3 105 | size_flags_vertical = 3 106 | columns = 10 107 | -------------------------------------------------------------------------------- /lorien/UI/Components/FlatTextureButton.gd: -------------------------------------------------------------------------------- 1 | class_name FlatTextureButton 2 | extends TextureButton 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | @export var hover_tint := Color.WHITE 6 | @export var pressed_tint := Color.WHITE 7 | @export var disabled_tint := Color(0.4, 0.4, 0.4) 8 | var _normal_tint: Color 9 | 10 | # ------------------------------------------------------------------------------------------------- 11 | func _ready() -> void: 12 | _normal_tint = self_modulate 13 | mouse_entered.connect(_on_mouse_entered) 14 | mouse_exited.connect(_on_mouse_exited) 15 | toggled.connect(_on_toggled) 16 | _update_tint() 17 | 18 | # ------------------------------------------------------------------------------------------------- 19 | func _exit_tree() -> void: 20 | mouse_entered.disconnect(_on_mouse_entered) 21 | mouse_exited.disconnect(_on_mouse_exited) 22 | toggled.disconnect(_on_toggled) 23 | 24 | # ------------------------------------------------------------------------------------------------- 25 | func _on_mouse_entered() -> void: 26 | call_deferred("_update_tint") 27 | 28 | # ------------------------------------------------------------------------------------------------- 29 | func _on_mouse_exited() -> void: 30 | call_deferred("_update_tint") 31 | 32 | # ------------------------------------------------------------------------------------------------- 33 | func toggle() -> void: 34 | button_pressed = !button_pressed 35 | 36 | # ------------------------------------------------------------------------------------------------- 37 | func _on_toggled(_toggled_on: bool) -> void: 38 | _update_tint() 39 | 40 | # ------------------------------------------------------------------------------------------------- 41 | func set_is_disabled(value: bool) -> void: 42 | disabled = value 43 | _update_tint() 44 | 45 | # ------------------------------------------------------------------------------------------------- 46 | func _update_tint() -> void: 47 | if disabled: 48 | self_modulate = disabled_tint 49 | elif button_pressed: 50 | self_modulate = pressed_tint 51 | elif is_hovered(): 52 | self_modulate = hover_tint 53 | else: 54 | self_modulate = _normal_tint 55 | -------------------------------------------------------------------------------- /lorien/UI/Components/KeybindItem.gd: -------------------------------------------------------------------------------- 1 | class_name KeybindItem 2 | extends HBoxContainer 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | signal action_rebind_requested(action: KeybindingsManager.Action, event: InputEventKey) 6 | 7 | # ------------------------------------------------------------------------------------------------- 8 | @onready var _label: Label = $Label 9 | @onready var _button: Button = $Button 10 | 11 | var _action: KeybindingsManager.Action = null 12 | var _rebinding := false 13 | var _pressed_key_counter := 0 14 | var _last_event: InputEventKey = null 15 | 16 | # ------------------------------------------------------------------------------------------------- 17 | func _ready() -> void: 18 | _button.pressed.connect(func() -> void: 19 | _last_event = null 20 | _rebinding = true 21 | _button.text = "Press buttons to rebind..." 22 | ) 23 | 24 | # ------------------------------------------------------------------------------------------------- 25 | func set_action(action: KeybindingsManager.Action) -> void: 26 | _label.text = action.display_name 27 | _button.text = OS.get_keycode_string(action.event.get_keycode_with_modifiers()) 28 | _action = action 29 | 30 | # ------------------------------------------------------------------------------------------------- 31 | func _update_button_text() -> void: 32 | var code := _last_event.get_key_label_with_modifiers() 33 | _button.text = OS.get_keycode_string(code) 34 | 35 | # ------------------------------------------------------------------------------------------------- 36 | func _do_rebind() -> void: 37 | _update_button_text() 38 | action_rebind_requested.emit(_action, _last_event) 39 | 40 | # ------------------------------------------------------------------------------------------------- 41 | func _input(event: InputEvent) -> void: 42 | if _rebinding && event is InputEventKey: 43 | if event.is_pressed(): 44 | _pressed_key_counter += 1 45 | _last_event = event 46 | _update_button_text() 47 | else: 48 | _pressed_key_counter -= 1 49 | 50 | if _pressed_key_counter == 0: 51 | _rebinding = false 52 | _do_rebind() 53 | -------------------------------------------------------------------------------- /lorien/UI/Components/KeybindItem.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://ct7pvupldkei5"] 2 | 3 | [ext_resource type="Script" path="res://UI/Components/KeybindItem.gd" id="1_1rkxe"] 4 | [ext_resource type="Theme" uid="uid://u5qnpgxqykiv" path="res://UI/Themes/theme_dark.tres" id="1_cuavq"] 5 | 6 | [node name="KeybindItem" type="HBoxContainer"] 7 | offset_right = 170.0 8 | offset_bottom = 29.0 9 | theme = ExtResource("1_cuavq") 10 | script = ExtResource("1_1rkxe") 11 | 12 | [node name="Label" type="Label" parent="."] 13 | layout_mode = 2 14 | size_flags_horizontal = 3 15 | text = "Action Name" 16 | 17 | [node name="Button" type="Button" parent="."] 18 | layout_mode = 2 19 | size_flags_horizontal = 3 20 | text = "Press buttons to rebind..." 21 | -------------------------------------------------------------------------------- /lorien/UI/Components/PaletteButton.gd: -------------------------------------------------------------------------------- 1 | class_name PaletteButton 2 | extends Control 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | signal pressed 6 | 7 | # ------------------------------------------------------------------------------------------------- 8 | @onready var _color_texture: TextureRect = $Color 9 | @onready var _selection_texture: TextureRect = $Selection 10 | 11 | var selected := false: set = set_selected 12 | var color := Color.WHITE: set = set_color 13 | 14 | # ------------------------------------------------------------------------------------------------- 15 | func _ready() -> void: 16 | _color_texture.modulate.a = 0 17 | 18 | gui_input.connect(_on_PaletteButton_gui_input) 19 | mouse_entered.connect(_on_PaletteButton_mouse_entered) 20 | mouse_exited.connect(_on_PaletteButton_mouse_exited) 21 | 22 | # ------------------------------------------------------------------------------------------------- 23 | func set_selected(s: bool) -> void: 24 | selected = s 25 | _selection_texture.modulate = _get_selection_color() if selected else color 26 | 27 | # ------------------------------------------------------------------------------------------------- 28 | func clear_hover_state() -> void: 29 | if !selected: 30 | _selection_texture.modulate = color 31 | 32 | # ------------------------------------------------------------------------------------------------- 33 | func set_color(c: Color) -> void: 34 | color = c 35 | _color_texture.modulate = c 36 | if !selected: 37 | _selection_texture.modulate = c 38 | 39 | # ------------------------------------------------------------------------------------------------- 40 | func _get_selection_color() -> Color: 41 | return Color.BLACK 42 | 43 | # ------------------------------------------------------------------------------------------------- 44 | func _get_hover_color() -> Color: 45 | return Color.BLACK 46 | 47 | # ------------------------------------------------------------------------------------------------- 48 | func _on_PaletteButton_gui_input(event: InputEvent) -> void: 49 | if event is InputEventMouseButton && !event.pressed && event.button_index == MOUSE_BUTTON_LEFT: 50 | pressed.emit() 51 | 52 | # ------------------------------------------------------------------------------------------------- 53 | func _on_PaletteButton_mouse_entered() -> void: 54 | if !selected: 55 | _selection_texture.modulate = _get_hover_color() 56 | 57 | # ------------------------------------------------------------------------------------------------- 58 | func _on_PaletteButton_mouse_exited() -> void: 59 | _selection_texture.modulate = _get_selection_color() if selected else color 60 | -------------------------------------------------------------------------------- /lorien/UI/Components/PaletteButton.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://Assets/Textures/palette_button_outline.png" type="Texture2D" id=1] 4 | [ext_resource path="res://Assets/Textures/palette_button.png" type="Texture2D" id=2] 5 | [ext_resource path="res://UI/Components/PaletteButton.gd" type="Script" id=3] 6 | 7 | [node name="PaletteButton" type="Control"] 8 | anchor_right = 1.0 9 | anchor_bottom = 1.0 10 | offset_right = -1889.0 11 | offset_bottom = -1049.0 12 | custom_minimum_size = Vector2( 31, 31 ) 13 | script = ExtResource( 3 ) 14 | 15 | [node name="Color" type="TextureRect" parent="."] 16 | anchor_left = 0.5 17 | anchor_top = 0.5 18 | anchor_right = 0.5 19 | anchor_bottom = 0.5 20 | offset_left = -16.0 21 | offset_top = -16.0 22 | offset_right = 16.0 23 | offset_bottom = 16.0 24 | custom_minimum_size = Vector2( 32, 32 ) 25 | texture = ExtResource( 2 ) 26 | expand = true 27 | stretch_mode = 6 28 | __meta__ = { 29 | "_edit_use_anchors_": false 30 | } 31 | 32 | [node name="Selection" type="TextureRect" parent="."] 33 | anchor_right = 1.0 34 | anchor_bottom = 1.0 35 | texture = ExtResource( 1 ) 36 | expand = true 37 | stretch_mode = 4 38 | __meta__ = { 39 | "_edit_use_anchors_": false 40 | } 41 | -------------------------------------------------------------------------------- /lorien/UI/Dialogs/AboutDialog.gd: -------------------------------------------------------------------------------- 1 | class_name AboutDialog 2 | extends PanelContainer 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | func _ready() -> void: 6 | get_parent().close_requested.connect(get_parent().hide) 7 | %VersionLabel.text = "Lorien v%s" % Config.VERSION_STRING 8 | %GithubLinkButton.pressed.connect(func() -> void: OS.shell_open("https://github.com/mbrlabs/Lorien")) 9 | %LicenseButton.pressed.connect(func() -> void: OS.shell_open("https://github.com/mbrlabs/Lorien/blob/main/LICENSE")) 10 | %GodotButton.pressed.connect(func() -> void: OS.shell_open("https://godotengine.org/")) 11 | %KennyButton.pressed.connect(func() -> void: OS.shell_open("https://www.kenney.nl/assets/platformer-art-deluxe")) 12 | %RemixIconsButton.pressed.connect(func() -> void: OS.shell_open("https://remixicon.com/")) 13 | -------------------------------------------------------------------------------- /lorien/UI/Dialogs/AboutDialog.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=3 uid="uid://dug4jmvhrb3t1"] 2 | 3 | [ext_resource type="Theme" uid="uid://u5qnpgxqykiv" path="res://UI/Themes/theme_dark.tres" id="1_usj82"] 4 | [ext_resource type="Script" path="res://UI/Dialogs/AboutDialog.gd" id="2"] 5 | [ext_resource type="Texture2D" uid="uid://b6io62g8b730e" path="res://Assets/icon.png" id="3"] 6 | 7 | [sub_resource type="StyleBoxEmpty" id="1"] 8 | 9 | [node name="AboutDialog" type="PanelContainer"] 10 | offset_right = 347.0 11 | offset_bottom = 180.0 12 | size_flags_horizontal = 4 13 | theme = ExtResource("1_usj82") 14 | script = ExtResource("2") 15 | 16 | [node name="VBoxContainer" type="VBoxContainer" parent="."] 17 | layout_mode = 2 18 | 19 | [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] 20 | layout_mode = 2 21 | size_flags_horizontal = 3 22 | 23 | [node name="TextureRect" type="TextureRect" parent="VBoxContainer/HBoxContainer"] 24 | layout_mode = 2 25 | texture = ExtResource("3") 26 | stretch_mode = 4 27 | 28 | [node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/HBoxContainer"] 29 | layout_mode = 2 30 | size_flags_horizontal = 3 31 | size_flags_vertical = 3 32 | theme_override_constants/margin_left = 12 33 | theme_override_constants/margin_top = 2 34 | theme_override_constants/margin_right = 12 35 | 36 | [node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer/MarginContainer"] 37 | layout_mode = 2 38 | alignment = 1 39 | 40 | [node name="VersionLabel" type="Label" parent="VBoxContainer/HBoxContainer/MarginContainer/VBoxContainer"] 41 | unique_name_in_owner = true 42 | layout_mode = 2 43 | text = "Lorien vX.Y.Z" 44 | 45 | [node name="CopyrightLabel" type="Label" parent="VBoxContainer/HBoxContainer/MarginContainer/VBoxContainer"] 46 | layout_mode = 2 47 | text = "ABOUT_DIALOG_COPYRIGHT" 48 | 49 | [node name="GithubLinkButton" type="LinkButton" parent="VBoxContainer/HBoxContainer/MarginContainer/VBoxContainer"] 50 | unique_name_in_owner = true 51 | layout_mode = 2 52 | size_flags_horizontal = 0 53 | text = "github.com/mbrlabs/Lorien" 54 | 55 | [node name="HSeparator2" type="HSeparator" parent="VBoxContainer"] 56 | layout_mode = 2 57 | theme_override_constants/separation = 4 58 | theme_override_styles/separator = SubResource("1") 59 | 60 | [node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"] 61 | layout_mode = 2 62 | 63 | [node name="Label" type="Label" parent="VBoxContainer/HBoxContainer2"] 64 | layout_mode = 2 65 | text = "ABOUT_DIALOG_LICSENSE" 66 | 67 | [node name="LicenseButton" type="LinkButton" parent="VBoxContainer/HBoxContainer2"] 68 | unique_name_in_owner = true 69 | layout_mode = 2 70 | text = "MIT License" 71 | 72 | [node name="HSeparator" type="HSeparator" parent="VBoxContainer"] 73 | layout_mode = 2 74 | theme_override_constants/separation = 20 75 | 76 | [node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer"] 77 | layout_mode = 2 78 | 79 | [node name="Label" type="Label" parent="VBoxContainer/HBoxContainer3"] 80 | layout_mode = 2 81 | text = "ABOUT_DIALOG_BASED_ON" 82 | 83 | [node name="GodotButton" type="LinkButton" parent="VBoxContainer/HBoxContainer3"] 84 | unique_name_in_owner = true 85 | layout_mode = 2 86 | focus_mode = 2 87 | text = "Godot Game Engine" 88 | 89 | [node name="HBoxContainer5" type="HBoxContainer" parent="VBoxContainer"] 90 | layout_mode = 2 91 | 92 | [node name="Label" type="Label" parent="VBoxContainer/HBoxContainer5"] 93 | layout_mode = 2 94 | text = "ABOUT_DIALOG_EASTEREGG" 95 | 96 | [node name="KennyButton" type="LinkButton" parent="VBoxContainer/HBoxContainer5"] 97 | unique_name_in_owner = true 98 | layout_mode = 2 99 | focus_mode = 2 100 | text = "Kenny's Platformer Art Deluxe" 101 | 102 | [node name="HBoxContainer4" type="HBoxContainer" parent="VBoxContainer"] 103 | layout_mode = 2 104 | 105 | [node name="Label" type="Label" parent="VBoxContainer/HBoxContainer4"] 106 | layout_mode = 2 107 | text = "Icon set:" 108 | 109 | [node name="RemixIconsButton" type="LinkButton" parent="VBoxContainer/HBoxContainer4"] 110 | unique_name_in_owner = true 111 | layout_mode = 2 112 | focus_mode = 2 113 | text = "Remix Icon" 114 | -------------------------------------------------------------------------------- /lorien/UI/Dialogs/AddKeyDialog.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://d37dx0p100hbv"] 2 | 3 | [sub_resource type="GDScript" id="GDScript_ljttw"] 4 | script/source = "extends Window 5 | 6 | # ------------------------------------------------------------------------------------------------- 7 | var _MODIFIER_KEYS := [KEY_CTRL, KEY_SHIFT, KEY_META, KEY_ALT] 8 | 9 | # ------------------------------------------------------------------------------------------------- 10 | @export var action_name := \"\" 11 | @export var readable_action_name := \"\": set = _set_readable_action_name 12 | 13 | @onready var _confirm_rebind_dialog := $ConfirmRebind 14 | 15 | var _pending_bind_event = null 16 | 17 | # ------------------------------------------------------------------------------------------------- 18 | func _ready() -> void: 19 | _update_event_text() 20 | GlobalSignals.language_changed.connect(_update_event_text) 21 | 22 | # ------------------------------------------------------------------------------------------------- 23 | func _set_readable_action_name(s: String): 24 | readable_action_name = s 25 | _update_event_text() 26 | 27 | # ------------------------------------------------------------------------------------------------- 28 | func _update_event_text() -> void: 29 | $VBoxContainer/EventText.text = tr( 30 | \"KEYBINDING_DIALOG_BIND_ACTION\" 31 | ).format({\"action\": readable_action_name}) 32 | 33 | # ------------------------------------------------------------------------------------------------- 34 | func _action_for_event(event: InputEvent): 35 | for action in Utils.bindable_actions(): 36 | if InputMap.action_has_event(action, event): 37 | return action 38 | return null 39 | 40 | # ------------------------------------------------------------------------------------------------- 41 | func _input(event: InputEvent) -> void: 42 | if ! visible || _confirm_rebind_dialog.visible: 43 | return 44 | if event is InputEventKey && event.is_pressed(): 45 | get_viewport().set_input_as_handled() 46 | 47 | if event.keycode in _MODIFIER_KEYS: 48 | return 49 | 50 | var event_type := InputEventKey.new() 51 | event_type.keycode = event.keycode 52 | event_type.alt_pressed = event.alt_pressed 53 | event_type.shift_pressed = event.shift_pressed 54 | event_type.ctrl_pressed = event.ctrl_pressed 55 | event_type.meta_pressed = event.meta_pressed 56 | 57 | var _conflicting_action = _action_for_event(event_type) 58 | 59 | _pending_bind_event = event_type 60 | if _conflicting_action is String && _conflicting_action != action_name: 61 | _confirm_rebind_dialog.dialog_text = tr(\"KEYBINDING_DIALOG_REBIND_MESSAGE\").format({ 62 | \"event\": OS.get_keycode_string(event_type.get_keycode_with_modifiers()), 63 | \"action\": Utils.translate_action(_conflicting_action) 64 | }) 65 | _confirm_rebind_dialog.popup_centered() 66 | else: 67 | _finish_rebind() 68 | 69 | # ------------------------------------------------------------------------------------------------- 70 | func _on_ConfirmRebind_confirmed() -> void: 71 | _finish_rebind() 72 | 73 | # ------------------------------------------------------------------------------------------------- 74 | func _finish_rebind() -> void: 75 | for action in Utils.bindable_actions(): 76 | if InputMap.action_has_event(action, _pending_bind_event): 77 | InputMap.action_erase_event(action, _pending_bind_event) 78 | InputMap.action_add_event(action_name, _pending_bind_event) 79 | visible = false 80 | " 81 | 82 | [sub_resource type="StyleBoxLine" id="1"] 83 | color = Color(0, 0, 0, 0) 84 | 85 | [node name="AddKeyDialog" type="Window"] 86 | initial_position = 2 87 | size = Vector2i(300, 100) 88 | exclusive = true 89 | script = SubResource("GDScript_ljttw") 90 | 91 | [node name="VBoxContainer" type="VBoxContainer" parent="."] 92 | anchors_preset = 13 93 | anchor_left = 0.5 94 | anchor_right = 0.5 95 | anchor_bottom = 1.0 96 | offset_left = -105.5 97 | offset_right = 105.5 98 | alignment = 1 99 | 100 | [node name="EventText" type="Label" parent="VBoxContainer"] 101 | layout_mode = 2 102 | text = "Action: ..." 103 | horizontal_alignment = 1 104 | 105 | [node name="Panel" type="HSeparator" parent="VBoxContainer"] 106 | layout_mode = 2 107 | theme_override_constants/separation = 39 108 | theme_override_styles/separator = SubResource("1") 109 | 110 | [node name="PressKeyMessage" type="Label" parent="VBoxContainer"] 111 | layout_mode = 2 112 | text = "(Press a button to bind)" 113 | horizontal_alignment = 1 114 | -------------------------------------------------------------------------------- /lorien/UI/Dialogs/AlertDialog.gd: -------------------------------------------------------------------------------- 1 | extends AcceptDialog 2 | 3 | # ------------------------------------------------------------------------------------------------ 4 | func _ready() -> void: 5 | close_requested.connect(hide) 6 | -------------------------------------------------------------------------------- /lorien/UI/Dialogs/AlertDialog.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://bi7pkm1cg1s4w"] 2 | 3 | [ext_resource type="Theme" uid="uid://u5qnpgxqykiv" path="res://UI/Themes/theme_dark.tres" id="1"] 4 | [ext_resource type="Script" path="res://UI/Dialogs/AlertDialog.gd" id="2_a4x41"] 5 | 6 | [node name="AlertDialog" type="AcceptDialog"] 7 | initial_position = 2 8 | size = Vector2i(360, 100) 9 | theme = ExtResource("1") 10 | dialog_close_on_escape = false 11 | dialog_autowrap = true 12 | script = ExtResource("2_a4x41") 13 | -------------------------------------------------------------------------------- /lorien/UI/Dialogs/DeletePaletteDialog.gd: -------------------------------------------------------------------------------- 1 | class_name DeletePaletteDialog 2 | extends MarginContainer 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | signal palette_deleted 6 | 7 | # ------------------------------------------------------------------------------------------------- 8 | @onready var _text: Label = $Container/Label 9 | @onready var _delete_button: Button = $Container/HBoxContainer/DeleteButton 10 | @onready var _cancel_button: Button = $Container/HBoxContainer/CancelButton 11 | 12 | # ------------------------------------------------------------------------------------------------- 13 | func _ready() -> void: 14 | get_parent().about_to_popup.connect(_on_about_to_popup) 15 | _delete_button.pressed.connect(_on_delete_pressed) 16 | _cancel_button.pressed.connect(_on_cancel_pressed) 17 | 18 | # ------------------------------------------------------------------------------------------------- 19 | func _on_about_to_popup() -> void: 20 | var palette := PaletteManager.get_active_palette() 21 | _text.text = tr("DELETE_PALETTE_DIALOG_TEXT") + " " + palette.name 22 | get_parent().hide() 23 | 24 | # ------------------------------------------------------------------------------------------------- 25 | func _on_delete_pressed() -> void: 26 | var palette := PaletteManager.get_active_palette() 27 | if !palette.builtin: 28 | PaletteManager.remove_palette(palette) 29 | PaletteManager.save() 30 | palette_deleted.emit() 31 | get_parent().hide() 32 | 33 | # ------------------------------------------------------------------------------------------------- 34 | func _on_cancel_pressed() -> void: 35 | get_parent().hide() 36 | -------------------------------------------------------------------------------- /lorien/UI/Dialogs/DeletePaletteDialog.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=3 uid="uid://bl2x4yif2wrml"] 2 | 3 | [ext_resource type="Script" path="res://UI/Dialogs/DeletePaletteDialog.gd" id="2"] 4 | 5 | [node name="DeletePaletteDialog" type="MarginContainer"] 6 | anchors_preset = 15 7 | anchor_right = 1.0 8 | anchor_bottom = 1.0 9 | theme_override_constants/margin_left = 12 10 | theme_override_constants/margin_top = 12 11 | theme_override_constants/margin_right = 12 12 | theme_override_constants/margin_bottom = 12 13 | script = ExtResource("2") 14 | 15 | [node name="Container" type="Control" parent="."] 16 | layout_mode = 2 17 | 18 | [node name="Label" type="Label" parent="Container"] 19 | layout_mode = 0 20 | anchor_right = 1.0 21 | offset_bottom = 21.0 22 | text = "DELETE_PALETTE_DIALOG_TEXT" 23 | 24 | [node name="HBoxContainer" type="HBoxContainer" parent="Container"] 25 | layout_mode = 0 26 | anchor_top = 1.0 27 | anchor_right = 1.0 28 | anchor_bottom = 1.0 29 | offset_top = -25.0 30 | size_flags_vertical = 0 31 | 32 | [node name="DeleteButton" type="Button" parent="Container/HBoxContainer"] 33 | layout_mode = 2 34 | size_flags_horizontal = 3 35 | text = "DELETE" 36 | 37 | [node name="CancelButton" type="Button" parent="Container/HBoxContainer"] 38 | layout_mode = 2 39 | size_flags_horizontal = 3 40 | text = "CANCEL" 41 | -------------------------------------------------------------------------------- /lorien/UI/Dialogs/ExitDialog.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://by1hug8oa5vft"] 2 | 3 | [ext_resource type="Script" path="res://UI/Dialogs/UnsavedChangesDialog.gd" id="1"] 4 | [ext_resource type="Theme" uid="uid://u5qnpgxqykiv" path="res://UI/Themes/theme_dark.tres" id="3"] 5 | 6 | [node name="ExitDialog" type="Window"] 7 | title = "Unsaved Changes" 8 | initial_position = 2 9 | size = Vector2i(405, 100) 10 | theme = ExtResource("3") 11 | script = ExtResource("1") 12 | 13 | [node name="HBoxContainer" type="HBoxContainer" parent="."] 14 | anchors_preset = 12 15 | anchor_top = 1.0 16 | anchor_right = 1.0 17 | anchor_bottom = 1.0 18 | offset_top = -34.4615 19 | offset_bottom = -9.4615 20 | theme_override_constants/separation = 20 21 | alignment = 1 22 | 23 | [node name="SaveButton" type="Button" parent="HBoxContainer"] 24 | layout_mode = 2 25 | text = "SAVE" 26 | 27 | [node name="DiscardButton" type="Button" parent="HBoxContainer"] 28 | layout_mode = 2 29 | text = "DISCARD" 30 | 31 | [node name="CancelButton" type="Button" parent="HBoxContainer"] 32 | layout_mode = 2 33 | text = "CANCEL" 34 | 35 | [node name="Label" type="Label" parent="."] 36 | anchors_preset = 5 37 | anchor_left = 0.5 38 | anchor_right = 0.5 39 | offset_left = -145.5 40 | offset_right = 145.5 41 | offset_bottom = 51.0 42 | text = "EXIT_DIALOG_TEXT" 43 | vertical_alignment = 1 44 | -------------------------------------------------------------------------------- /lorien/UI/Dialogs/NewPaletteDialog.gd: -------------------------------------------------------------------------------- 1 | class_name NewPaletteDialog 2 | extends MarginContainer 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | signal new_palette_created(palette: Palette) 6 | 7 | # ------------------------------------------------------------------------------------------------- 8 | @onready var _line_edit: LineEdit = $Container/LineEdit 9 | @onready var _save_button: Button = $Container/HBoxContainer/SaveButton 10 | @onready var _cancel_button: Button = $Container/HBoxContainer/CancelButton 11 | 12 | var duplicate_current_palette := false 13 | 14 | # ------------------------------------------------------------------------------------------------- 15 | func _ready() -> void: 16 | _save_button.pressed.connect(_on_SaveButton_pressed) 17 | _cancel_button.pressed.connect(_on_CancelButton_pressed) 18 | 19 | get_parent().about_to_popup.connect(_on_about_to_popup) 20 | get_parent().close_requested.connect(_on_close_requested) 21 | 22 | # ------------------------------------------------------------------------------------------------- 23 | func _on_SaveButton_pressed() -> void: 24 | var pallete_name := _line_edit.text 25 | if !pallete_name.is_empty(): 26 | var palette: Palette 27 | if duplicate_current_palette: 28 | palette = PaletteManager.duplicate_palette(PaletteManager.get_active_palette(), pallete_name) 29 | else: 30 | palette = PaletteManager.create_custom_palette(pallete_name) 31 | 32 | if palette != null: 33 | PaletteManager.save() 34 | new_palette_created.emit(palette) 35 | duplicate_current_palette = false 36 | get_parent().hide() 37 | 38 | # ------------------------------------------------------------------------------------------------- 39 | func _on_CancelButton_pressed() -> void: 40 | _line_edit.clear() 41 | get_parent().hide() 42 | 43 | # ------------------------------------------------------------------------------------------------- 44 | func _on_close_requested() -> void: 45 | _line_edit.clear() 46 | get_parent().hide() 47 | 48 | # ------------------------------------------------------------------------------------------------- 49 | func _on_about_to_popup() -> void: 50 | # Set title 51 | if duplicate_current_palette: 52 | get_parent().title = tr("NEW_PALETTE_DIALOG_DUPLICATE_TITLE") 53 | else: 54 | get_parent().title = tr("NEW_PALETTE_DIALOG_CREATE_TITLE") 55 | 56 | # TODO: Grab focus 57 | -------------------------------------------------------------------------------- /lorien/UI/Dialogs/NewPaletteDialog.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=3 uid="uid://jow4q8tm6qro"] 2 | 3 | [ext_resource type="Script" path="res://UI/Dialogs/NewPaletteDialog.gd" id="2"] 4 | 5 | [node name="NewPaletteDialog" type="MarginContainer"] 6 | anchors_preset = 15 7 | anchor_right = 1.0 8 | anchor_bottom = 1.0 9 | grow_horizontal = 2 10 | grow_vertical = 2 11 | theme_override_constants/margin_left = 12 12 | theme_override_constants/margin_top = 12 13 | theme_override_constants/margin_right = 12 14 | theme_override_constants/margin_bottom = 12 15 | script = ExtResource("2") 16 | 17 | [node name="Container" type="Control" parent="."] 18 | layout_mode = 2 19 | 20 | [node name="HBoxContainer" type="HBoxContainer" parent="Container"] 21 | layout_mode = 0 22 | anchor_top = 1.0 23 | anchor_right = 1.0 24 | anchor_bottom = 1.0 25 | offset_top = -25.0 26 | size_flags_vertical = 0 27 | 28 | [node name="SaveButton" type="Button" parent="Container/HBoxContainer"] 29 | layout_mode = 2 30 | size_flags_horizontal = 3 31 | text = "SAVE" 32 | 33 | [node name="CancelButton" type="Button" parent="Container/HBoxContainer"] 34 | layout_mode = 2 35 | size_flags_horizontal = 3 36 | text = "CANCEL" 37 | 38 | [node name="LineEdit" type="LineEdit" parent="Container"] 39 | layout_mode = 0 40 | anchor_right = 1.0 41 | offset_bottom = 21.0 42 | placeholder_text = "NEW_PALETTE_DIALOG_PLACEHOLDER" 43 | -------------------------------------------------------------------------------- /lorien/UI/Dialogs/UnsavedChangesDialog.gd: -------------------------------------------------------------------------------- 1 | class_name UnsavedChangesDialog 2 | extends PanelContainer 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | signal save_changes 6 | signal discard_changes 7 | 8 | @onready var _save_button: Button = %SaveButton 9 | @onready var _discard_button: Button = %DiscardButton 10 | 11 | # ------------------------------------------------------------------------------------------------- 12 | func _ready() -> void: 13 | get_parent().close_requested.connect(get_parent().hide) 14 | 15 | _save_button.pressed.connect(func() -> void: 16 | get_parent().hide() 17 | save_changes.emit() 18 | ) 19 | 20 | _discard_button.pressed.connect(func() -> void: 21 | get_parent().hide() 22 | discard_changes.emit() 23 | ) 24 | 25 | # ------------------------------------------------------------------------------------------------- 26 | func set_text(text: String) -> void: 27 | $Label.text = text 28 | -------------------------------------------------------------------------------- /lorien/UI/Dialogs/UnsavedChangesDialog.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=3 uid="uid://ct2b6hxxjlc6h"] 2 | 3 | [ext_resource type="Script" path="res://UI/Dialogs/UnsavedChangesDialog.gd" id="1"] 4 | [ext_resource type="Theme" uid="uid://u5qnpgxqykiv" path="res://UI/Themes/theme_dark.tres" id="3"] 5 | 6 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ythkr"] 7 | 8 | [node name="UnsavedChangesDialog" type="PanelContainer"] 9 | anchors_preset = 15 10 | anchor_right = 1.0 11 | anchor_bottom = 1.0 12 | grow_horizontal = 2 13 | grow_vertical = 2 14 | theme = ExtResource("3") 15 | script = ExtResource("1") 16 | 17 | [node name="VBoxContainer" type="VBoxContainer" parent="."] 18 | layout_mode = 2 19 | 20 | [node name="Label" type="Label" parent="VBoxContainer"] 21 | layout_mode = 2 22 | text = "UNSAVED_CHANGES_DIALOG_TEXT" 23 | horizontal_alignment = 1 24 | vertical_alignment = 1 25 | 26 | [node name="HSeparator" type="HSeparator" parent="VBoxContainer"] 27 | layout_mode = 2 28 | theme_override_constants/separation = 12 29 | theme_override_styles/separator = SubResource("StyleBoxEmpty_ythkr") 30 | 31 | [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] 32 | layout_mode = 2 33 | size_flags_vertical = 10 34 | theme_override_constants/separation = 12 35 | alignment = 1 36 | 37 | [node name="SaveButton" type="Button" parent="VBoxContainer/HBoxContainer"] 38 | unique_name_in_owner = true 39 | layout_mode = 2 40 | text = "SAVE" 41 | 42 | [node name="DiscardButton" type="Button" parent="VBoxContainer/HBoxContainer"] 43 | unique_name_in_owner = true 44 | layout_mode = 2 45 | text = "DISCARD" 46 | -------------------------------------------------------------------------------- /lorien/UI/MainMenu.gd: -------------------------------------------------------------------------------- 1 | class_name MainMenu 2 | extends PopupMenu 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | signal open_about_dialog 6 | signal open_settings_dialog 7 | signal open_url(url: String) 8 | signal open_project(filepath: String) 9 | signal save_project 10 | signal save_project_as 11 | signal export_svg 12 | signal quit 13 | 14 | # ------------------------------------------------------------------------------------------------- 15 | const ITEM_OPEN := 0 16 | const ITEM_SAVE := 1 17 | const ITEM_SAVE_AS := 2 18 | const ITEM_EXPORT := 3 19 | const ITEM_SETTINGS := 4 20 | const ITEM_MANUAL := 5 21 | const ITEM_BUG_TRACKER := 6 22 | const ITEM_ABOUT := 7 23 | const ITEM_QUIT := 8 24 | 25 | # ------------------------------------------------------------------------------------------------- 26 | @export var file_dialog_path: NodePath 27 | 28 | # ------------------------------------------------------------------------------------------------- 29 | func _ready() -> void: 30 | _set_items() 31 | 32 | id_pressed.connect(_on_item_pressed) 33 | GlobalSignals.language_changed.connect(_set_items) 34 | GlobalSignals.keybinding_changed.connect(func(action: KeybindingsManager.Action) -> void: 35 | _set_items() 36 | ) 37 | 38 | # ------------------------------------------------------------------------------------------------- 39 | func _set_items() -> void: 40 | clear() 41 | 42 | var open_action := KeybindingsManager.get_action("shortcut_open_project") 43 | var save_action := KeybindingsManager.get_action("shortcut_save_project") 44 | var export_action := KeybindingsManager.get_action("shortcut_export_project") 45 | var quit_action := KeybindingsManager.get_action("shortcut_quit") 46 | 47 | add_item(tr("MENU_OPEN"), ITEM_OPEN, open_action.event.get_keycode_with_modifiers()) 48 | add_item(tr("MENU_SAVE"), ITEM_SAVE, save_action.event.get_keycode_with_modifiers()) 49 | add_item(tr("MENU_SAVE_AS"), ITEM_SAVE_AS) 50 | add_item(tr("MENU_EXPORT"), ITEM_EXPORT, export_action.event.get_keycode_with_modifiers()) 51 | add_item(tr("MENU_SETTINGS"), ITEM_SETTINGS) 52 | add_separator() 53 | add_item(tr("MENU_MANUAL"), ITEM_MANUAL) 54 | add_item(tr("MENU_BUG_TRACKER"), ITEM_BUG_TRACKER) 55 | add_item(tr("MENU_ABOUT"), ITEM_ABOUT) 56 | add_item(tr("MENU_QUIT"), ITEM_QUIT, quit_action.event.get_keycode_with_modifiers()) 57 | 58 | # ------------------------------------------------------------------------------------------------- 59 | func _on_item_pressed(id: int) -> void: 60 | match id: 61 | ITEM_OPEN: _on_open_project() 62 | ITEM_SAVE: save_project.emit() 63 | ITEM_SAVE_AS: save_project_as.emit() 64 | ITEM_EXPORT: export_svg.emit() 65 | ITEM_SETTINGS: open_settings_dialog.emit() 66 | ITEM_MANUAL: open_url.emit("https://github.com/mbrlabs/lorien/blob/main/docs/manuals/manual_v0.6.0.md") 67 | ITEM_BUG_TRACKER: open_url.emit("https://github.com/mbrlabs/lorien/issues") 68 | ITEM_ABOUT: open_about_dialog.emit() 69 | ITEM_QUIT: quit.emit() 70 | 71 | # ------------------------------------------------------------------------------------------------- 72 | func _on_open_project() -> void: 73 | var file_dialog: FileDialog = get_node(file_dialog_path) 74 | file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE 75 | file_dialog.file_selected.connect(_on_project_selected_to_open) 76 | file_dialog.close_requested.connect(_on_file_dialog_closed) 77 | file_dialog.invalidate() 78 | file_dialog.popup_centered() 79 | 80 | # ------------------------------------------------------------------------------------------------- 81 | func _on_project_selected_to_open(filepath: String) -> void: 82 | open_project.emit(filepath) 83 | 84 | # ------------------------------------------------------------------------------------------------- 85 | func _on_file_dialog_closed() -> void: 86 | var file_dialog: FileDialog = get_node(file_dialog_path) 87 | Utils.remove_signal_connections(file_dialog, "file_selected") 88 | Utils.remove_signal_connections(file_dialog, "close_requested") 89 | -------------------------------------------------------------------------------- /lorien/UI/MainMenu.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://c41oe1lt7u6r8"] 2 | 3 | [ext_resource type="Theme" uid="uid://u5qnpgxqykiv" path="res://UI/Themes/theme_dark.tres" id="1"] 4 | [ext_resource type="Script" path="res://UI/MainMenu.gd" id="2"] 5 | 6 | [node name="MainMenu" type="PopupMenu"] 7 | visible = true 8 | unfocusable = true 9 | theme = ExtResource("1") 10 | submenu_popup_delay = 0.01 11 | script = ExtResource("2") 12 | -------------------------------------------------------------------------------- /lorien/UI/Menubar.gd: -------------------------------------------------------------------------------- 1 | class_name Menubar 2 | extends Panel 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | signal project_selected(project_id: int) 6 | signal project_closed(project_id: int) 7 | signal create_new_project 8 | 9 | # ------------------------------------------------------------------------------------------------- 10 | @onready var _menu_button: TextureButton = $Left/MenuButton 11 | @onready var _new_file_button: TextureButton = $Left/NewFileButton 12 | @onready var _tab_bar: TabBar = $Left/TabBar 13 | 14 | @export var _main_menu_path: NodePath 15 | 16 | # ------------------------------------------------------------------------------------------------- 17 | func _ready() -> void: 18 | _menu_button.pressed.connect(_on_menu_button_pressed) 19 | 20 | _new_file_button.pressed.connect(func() -> void: 21 | create_new_project.emit() 22 | ) 23 | 24 | _tab_bar.tab_close_pressed.connect(func(index: int) -> void: 25 | var project := _tab_bar.get_tab_metadata(index) as Project 26 | _tab_bar.remove_tab(index) 27 | project_closed.emit(project.id) 28 | ) 29 | 30 | _tab_bar.tab_clicked.connect(func(index: int) -> void: 31 | var project := _tab_bar.get_tab_metadata(index) as Project 32 | project_selected.emit(project.id) 33 | ) 34 | 35 | # ------------------------------------------------------------------------------------------------- 36 | func make_tab(project: Project) -> void: 37 | _tab_bar.add_tab(project.get_scene_file_path()) 38 | _tab_bar.set_tab_metadata(_tab_bar.tab_count - 1, project) 39 | _update_tabbar_size() 40 | 41 | # ------------------------------------------------------------------------------------------------ 42 | func has_tab(project: Project) -> bool: 43 | for i: int in _tab_bar.tab_count: 44 | var p := _tab_bar.get_tab_metadata(i) as Project 45 | if project == p: 46 | return true 47 | return false 48 | 49 | # ------------------------------------------------------------------------------------------------ 50 | func remove_tab(project: Project) -> void: 51 | for i: int in _tab_bar.tab_count: 52 | var p := _tab_bar.get_tab_metadata(i) as Project 53 | if project == p: 54 | _tab_bar.remove_tab(i) 55 | _update_tabbar_size() 56 | return 57 | 58 | 59 | # ------------------------------------------------------------------------------------------------ 60 | func remove_all_tabs() -> void: 61 | _tab_bar.clear_tabs() 62 | _update_tabbar_size() 63 | 64 | # ------------------------------------------------------------------------------------------------ 65 | func update_tab_title(project: Project) -> void: 66 | for i: int in _tab_bar.tab_count: 67 | var p := _tab_bar.get_tab_metadata(i) as Project 68 | if project == p: 69 | var new_title := project.get_scene_file_path() 70 | if project.dirty: 71 | new_title += " (*)" 72 | _tab_bar.set_tab_title(i, new_title) 73 | _update_tabbar_size() 74 | return 75 | 76 | # ------------------------------------------------------------------------------------------------ 77 | func set_tab_active(project: Project) -> void: 78 | for i: int in _tab_bar.tab_count: 79 | var p := _tab_bar.get_tab_metadata(i) as Project 80 | if project == p: 81 | _tab_bar.current_tab = i 82 | return 83 | 84 | # ------------------------------------------------------------------------------------------------- 85 | func _on_menu_button_pressed() -> void: 86 | var menu: MainMenu = get_node(_main_menu_path) 87 | menu.popup_on_parent(_menu_button.get_rect()) 88 | 89 | # ------------------------------------------------------------------------------------------------- 90 | func get_first_project_id() -> int: 91 | if _tab_bar.tab_count == 0: 92 | return -1 93 | else: 94 | var project := _tab_bar.get_tab_metadata(0) as Project 95 | return project.id 96 | 97 | # ------------------------------------------------------------------------------------------------- 98 | func _update_tabbar_size() -> void: 99 | var width := 0 100 | for i: int in _tab_bar.tab_count: 101 | width += _tab_bar.get_tab_rect(i).size.x 102 | 103 | _tab_bar.custom_minimum_size.x = min(width, get_viewport_rect().size.x - 128) 104 | -------------------------------------------------------------------------------- /lorien/UI/Menubar.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=8 format=3 uid="uid://e4oiel4oqq0b"] 2 | 3 | [ext_resource type="Theme" uid="uid://u5qnpgxqykiv" path="res://UI/Themes/theme_dark.tres" id="1"] 4 | [ext_resource type="Script" path="res://UI/Menubar.gd" id="2"] 5 | [ext_resource type="Texture2D" uid="uid://r233fnxk5qkf" path="res://Assets/Icons/menu.png" id="3"] 6 | [ext_resource type="Script" path="res://UI/Components/FlatTextureButton.gd" id="4"] 7 | [ext_resource type="Texture2D" uid="uid://bbdkcvds2nxg7" path="res://Assets/Icons/add.png" id="5_4fxbm"] 8 | 9 | [sub_resource type="StyleBoxEmpty" id="1"] 10 | 11 | [sub_resource type="StyleBoxEmpty" id="2"] 12 | 13 | [node name="Menubar" type="Panel"] 14 | custom_minimum_size = Vector2(0, 38) 15 | anchors_preset = 10 16 | anchor_right = 1.0 17 | offset_bottom = 38.0 18 | grow_horizontal = 2 19 | theme = ExtResource("1") 20 | script = ExtResource("2") 21 | 22 | [node name="Left" type="HBoxContainer" parent="."] 23 | layout_mode = 0 24 | anchor_right = 1.0 25 | anchor_bottom = 1.0 26 | size_flags_horizontal = 3 27 | size_flags_vertical = 3 28 | theme_override_constants/separation = 4 29 | 30 | [node name="VSeparator3" type="VSeparator" parent="Left"] 31 | layout_mode = 2 32 | size_flags_horizontal = 4 33 | mouse_filter = 2 34 | theme_override_constants/separation = 12 35 | theme_override_styles/separator = SubResource("1") 36 | 37 | [node name="MenuButton" type="TextureButton" parent="Left"] 38 | modulate = Color(0.776471, 0.776471, 0.776471, 1) 39 | layout_mode = 2 40 | size_flags_horizontal = 4 41 | size_flags_vertical = 6 42 | texture_normal = ExtResource("3") 43 | stretch_mode = 3 44 | script = ExtResource("4") 45 | hover_tint = Color(0.313726, 1, 0.839216, 1) 46 | 47 | [node name="VSeparator2" type="VSeparator" parent="Left"] 48 | layout_mode = 2 49 | size_flags_horizontal = 4 50 | mouse_filter = 2 51 | theme_override_constants/separation = 12 52 | theme_override_styles/separator = SubResource("2") 53 | 54 | [node name="TabBar" type="TabBar" parent="Left"] 55 | layout_mode = 2 56 | size_flags_vertical = 8 57 | tab_close_display_policy = 2 58 | drag_to_rearrange_enabled = true 59 | scroll_to_selected = false 60 | 61 | [node name="NewFileButton" type="TextureButton" parent="Left"] 62 | custom_minimum_size = Vector2(32, 26) 63 | layout_mode = 2 64 | size_flags_vertical = 8 65 | texture_normal = ExtResource("5_4fxbm") 66 | stretch_mode = 3 67 | -------------------------------------------------------------------------------- /lorien/UI/Statusbar.gd: -------------------------------------------------------------------------------- 1 | extends Panel 2 | class_name Statusbar 3 | 4 | # ------------------------------------------------------------------------------------------------- 5 | @onready var _strokes_label: Label = $MarginContainer/HBoxContainer/Right/StrokesLabel 6 | @onready var _points_label: Label = $MarginContainer/HBoxContainer/Right/PointsLabel 7 | @onready var _pressure_label: Label = $MarginContainer/HBoxContainer/Left/PressureLabel 8 | @onready var _position_label: Label = $MarginContainer/HBoxContainer/Left/PositionLabel 9 | @onready var _zoom_label: Label = $MarginContainer/HBoxContainer/Left/ZoomLabel 10 | @onready var _fps_label: Label = $MarginContainer/HBoxContainer/Left/FpsLabel 11 | 12 | var _str_position: String 13 | var _str_zoom: String 14 | var _str_pressure: String 15 | var _str_fps: String 16 | var _str_stroke_count: String 17 | var _str_point_count: String 18 | 19 | # ------------------------------------------------------------------------------------------------- 20 | func _ready() -> void: 21 | _apply_language() 22 | GlobalSignals.language_changed.connect(_apply_language) 23 | 24 | # ------------------------------------------------------------------------------------------------- 25 | func _apply_language() -> void: 26 | _str_position = tr("STATUSBAR_POSITION") 27 | _str_zoom = tr("STATUSBAR_ZOOM") 28 | _str_pressure = tr("STATUSBAR_PRESSURE") 29 | _str_fps = tr("STATUSBAR_FPS") 30 | _str_stroke_count = tr("STATUSBAR_STROKES") 31 | _str_point_count = tr("STATUSBAR_POINTS") 32 | 33 | # ------------------------------------------------------------------------------------------------- 34 | func set_camera_position(pos: Vector2) -> void: 35 | _position_label.text = "%s: %d, %d" % [_str_position, pos.x, pos.y] 36 | 37 | # ------------------------------------------------------------------------------------------------- 38 | func set_camera_zoom(zoom: float) -> void: 39 | _zoom_label.text = "%s: %.1f" % [_str_zoom, zoom] 40 | 41 | # ------------------------------------------------------------------------------------------------- 42 | func set_fps(fps: int) -> void: 43 | _fps_label.text = "%s: %d" % [_str_fps, Engine.get_frames_per_second()] 44 | 45 | # ------------------------------------------------------------------------------------------------- 46 | func set_pressure(pressure: float) -> void: 47 | if pressure >= 0.01: 48 | _pressure_label.text = "%s: %.2f" % [_str_pressure, pressure] 49 | else: 50 | _pressure_label.text = "%s: -" % _str_pressure 51 | 52 | # ------------------------------------------------------------------------------------------------- 53 | func set_stroke_count(brush_stroke_count: int) -> void: 54 | _strokes_label.text = "%s: %d" % [_str_stroke_count, brush_stroke_count] 55 | 56 | # ------------------------------------------------------------------------------------------------- 57 | func set_point_count(point_count: int) -> void: 58 | _points_label.text = "%s: %d" % [_str_point_count, point_count] 59 | -------------------------------------------------------------------------------- /lorien/UI/Statusbar.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://bwer12t6vfkg1"] 2 | 3 | [ext_resource type="Theme" uid="uid://u5qnpgxqykiv" path="res://UI/Themes/theme_dark.tres" id="1"] 4 | [ext_resource type="Script" path="res://UI/Statusbar.gd" id="2"] 5 | 6 | [node name="Statusbar" type="Panel"] 7 | custom_minimum_size = Vector2(0, 24) 8 | anchors_preset = 10 9 | anchor_right = 1.0 10 | offset_bottom = 24.0 11 | theme = ExtResource("1") 12 | script = ExtResource("2") 13 | 14 | [node name="MarginContainer" type="MarginContainer" parent="."] 15 | layout_mode = 0 16 | anchor_right = 1.0 17 | anchor_bottom = 1.0 18 | theme_override_constants/margin_left = 10 19 | theme_override_constants/margin_right = 10 20 | 21 | [node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"] 22 | layout_mode = 2 23 | 24 | [node name="Left" type="HBoxContainer" parent="MarginContainer/HBoxContainer"] 25 | layout_mode = 2 26 | size_flags_horizontal = 3 27 | size_flags_vertical = 3 28 | theme_override_constants/separation = 0 29 | 30 | [node name="PositionLabel" type="Label" parent="MarginContainer/HBoxContainer/Left"] 31 | layout_mode = 2 32 | text = "Position: -" 33 | 34 | [node name="Sep" type="Label" parent="MarginContainer/HBoxContainer/Left"] 35 | layout_mode = 2 36 | text = "|" 37 | 38 | [node name="ZoomLabel" type="Label" parent="MarginContainer/HBoxContainer/Left"] 39 | layout_mode = 2 40 | text = "Zoom: -" 41 | 42 | [node name="Sep2" type="Label" parent="MarginContainer/HBoxContainer/Left"] 43 | layout_mode = 2 44 | text = "|" 45 | 46 | [node name="PressureLabel" type="Label" parent="MarginContainer/HBoxContainer/Left"] 47 | layout_mode = 2 48 | text = "Pressure: -" 49 | 50 | [node name="Sep3" type="Label" parent="MarginContainer/HBoxContainer/Left"] 51 | layout_mode = 2 52 | text = "|" 53 | 54 | [node name="FpsLabel" type="Label" parent="MarginContainer/HBoxContainer/Left"] 55 | layout_mode = 2 56 | text = "FPS: -" 57 | 58 | [node name="Right" type="HBoxContainer" parent="MarginContainer/HBoxContainer"] 59 | layout_mode = 2 60 | size_flags_horizontal = 3 61 | size_flags_vertical = 3 62 | theme_override_constants/separation = 0 63 | alignment = 2 64 | 65 | [node name="StrokesLabel" type="Label" parent="MarginContainer/HBoxContainer/Right"] 66 | layout_mode = 2 67 | text = "Strokes: 0" 68 | 69 | [node name="Sep" type="Label" parent="MarginContainer/HBoxContainer/Right"] 70 | layout_mode = 2 71 | text = "|" 72 | 73 | [node name="PointsLabel" type="Label" parent="MarginContainer/HBoxContainer/Right"] 74 | layout_mode = 2 75 | text = "Points: 0" 76 | -------------------------------------------------------------------------------- /lorien/UI/Themes/tab_active_dark.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://dtn7ehcyfik4a"] 2 | 3 | [resource] 4 | content_margin_left = 8.0 5 | content_margin_top = 6.0 6 | content_margin_right = 8.0 7 | content_margin_bottom = 6.0 8 | bg_color = Color(0.207843, 0.211765, 0.227451, 1) 9 | border_color = Color(1, 1, 1, 0.75) 10 | corner_radius_top_left = 6 11 | corner_radius_top_right = 6 12 | -------------------------------------------------------------------------------- /lorien/UI/Themes/tab_inactive_dark.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://kdduww61cjw"] 2 | 3 | [resource] 4 | content_margin_left = 8.0 5 | content_margin_top = 6.0 6 | content_margin_right = 8.0 7 | content_margin_bottom = 6.0 8 | bg_color = Color(0.6, 0.6, 0.6, 0) 9 | -------------------------------------------------------------------------------- /lorien/UI/Themes/toolbar_dark.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StyleBoxFlat" format=3 uid="uid://bv2204gysvy56"] 2 | 3 | [resource] 4 | bg_color = Color(0.207843, 0.211765, 0.227451, 1) 5 | -------------------------------------------------------------------------------- /public/linux/com.github.mbrlabs.Lorien.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=Application 3 | Name=Lorien 4 | GenericName=Note Taking 5 | Comment=Infinite canvas drawing/whiteboarding app 6 | Comment[de]=Freie Zeichen- und Whiteboard-App 7 | Icon=com.github.mbrlabs.Lorien 8 | Exec=Lorien %U 9 | Terminal=false 10 | MimeType=application/lorien 11 | Categories=Graphics; 12 | Keywords=Drawing;Handwriting;Whiteboard 13 | StartupWMClass=Lorien -------------------------------------------------------------------------------- /public/linux/com.github.mbrlabs.Lorien.metainfo.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | com.github.mbrlabs.Lorien 4 | 5 | Lorien 6 | Infinite canvas drawing/whiteboarding app 7 | Freie Zeichen- und Whiteboard-App 8 | 9 | https://github.com/mbrlabs/Lorien 10 | https://github.com/mbrlabs/Lorien/issues 11 | https://github.com/mbrlabs/Lorien/blob/main/docs/manuals 12 | https://ko-fi.com/mbrlabs 13 | https://github.com/mbrlabs/Lorien/blob/main/docs/i18n.md 14 | 15 | CC0-1.0 16 | MIT 17 | 18 | 19 | com.github.mbrlabs.Lorien.desktop 20 | 21 | 22 |

Lorien is an infinite canvas drawing/note-taking app that is focused on performance, small savefiles and simplicity.

23 |

It's not based on bitmap images like Krita, Gimp or Photoshop; it rather saves brush strokes as a collection of points and renders them at runtime (kind of like SVG).

24 |

It's primarily designed to be used as a digital notebook and as brainstorming tool.

25 |

While it can totally be used to make small sketches and diagrams, it is not meant to replace traditional art programs that operate on bitmap images.

26 |

It is entirely written in the Godot Game Engine.

27 |
28 | 29 | 30 | 31 | https://raw.githubusercontent.com/mbrlabs/Lorien/main/images/lorien_demo.png 32 | 33 | 34 | 35 | 36 | 37 | 38 |
-------------------------------------------------------------------------------- /public/linux/x-lorien-canvas.mimetype.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Lorien Canvas file 5 | Lorien Zeichnung 6 | 7 | 8 | 9 | --------------------------------------------------------------------------------