├── .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 |
7 |
8 |
9 |
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 | 
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 |
--------------------------------------------------------------------------------