Git Product home page Git Product logo

amulet-editor's People

Contributors

gentlegiantjgc avatar jevexendo avatar

Stargazers

 avatar

Watchers

 avatar  avatar  avatar

amulet-editor's Issues

Fix Tool Unloading

Currently, when a project is either opened or closed, tools are both loaded and unloaded, however, when tools are unloaded, their corresponding pages and panels are left to accumulate.

The cleanup system needs to be improved to properly dispose of these widgets. This might be done by adding a dataclass to keep track of all widgets connected to a given tool so that these connections are easier to keep track of and thus delete during cleanup.

Errror on Linux ARM64

Platform - Debian bullseye ARM64.

Amulet-Editor requires Pyside 6. there is no compiled Pyside 6 for ARM64, which is why need to perform these actions first: https://gitlab.com/-/snippets/2432339
Amulet-Team/Amulet-Core#233 (comment)

After this qt example start works:
Amulet-Team/Amulet-Map-Editor#127 (comment)
https://youtu.be/438FJJjgkT8

after that, the Amulet-Editor worked for a while:
Screenshot_2023-02-06-14-13-40-310_com realvnc viewer android

then it stopped working correctly:
#42

now, after some time, the Amulet-Editor at least shows an error in the terminal, and not just does not show the ui without error log:
Screenshot_2023-08-04-10-15-38-028_com realvnc viewer android
QSocketNotifier: Can only be used with threads started with QThread

Traceback (most recent call last):?? File "/usr/local/lib/python3.10/site-packages/amulet_editor/__main__.py", line 54, in main?? app_main()?? File "/usr/local/lib/python3.10/site-packages/amulet_editor/application/_app.py", line 104, in app_main?? rpc.init_rpc(is_broker)?? File "/usr/local/lib/python3.10/site-packages/amulet_editor/data/_rpc.py", line 339, in init_rpc?? raise Exception(msg)??Exception: QLocalServer::listen: Address in use

windows with errors appear again and again and there are a lot of them.

Implement Extensions

The current editor is only capable of loading tools that are hard-coded into the application.

There needs to be a way to have extensions loaded dynamically, and these can come in a variety of forms:

  • Tools
    • A high-level extension that is intended to offer the most power and flexibility
    • Located in the toolbar (vertical sidebar)
    • Should have the ability to load further extensions (plugins) to expand on the given functionality
  • Plugins
    • An extension designed to extend the functionality of existing tools
    • Implementation details are left to the tool creator
  • Themes
    • Color palette that can be applied to the entirety of the application
    • May contain icon-packs or other such graphical features to change the appearance of certain resources

World Selection Improvement

There are parts of your world select UI that I like however I think overall it could do with some work.

In order to select a world I need to

  1. Click on the select world box to populate the right panel
  2. Click on the world I want to open
  3. Click finish

This seems a little clunky and is unintuitive to new users.

Here is my proposal for an improved world selection UI. This was quickly thrown together in an image editor so I am sure there are issues I haven't thought of and places for improvement.

It takes some inspiration from the Github issue selection page and Minecraft Java edition's world page.

image

Further thoughts

The open mechanic should mimic the Java UI where you click to select and click again to open or just click the arrow that appears on hover.
I am undecided if the back button should remain as a cancel button at the bottom or an arrow at the top.
Perhaps we should keep an open button at the bottom as well as the previous open mechanics.

The right hand panel could be used as a quick access in the main menu and open world page to display levels that have been opened recently so that the user does not have to go through the world select UI each time.

Edit: I am also open to implementing some of the other buttons that Java edition has along the bottom of the world selection UI but these can come later.

FBS

I understand how useful the build system part of FBS is (the part that generates the installer file) however the overall FBS project structure seems very unpythonic.

My understanding of PyInstaller is that it should take a program that is runnable on its own and package it. The FBS structure needs another piece of code to set it up correctly to run from source which seems rather janky.

I would prefer the requirements to be defined in a setup.cfg file which is the standard for modern python packaging. requirements.txt files are rather dated. That would allow you to just pip install the source code and run it. I am not sure how users would install from the fbs structure. setup.cfg files also have the benefit of separating development, install and runtime requirements. Without this I don't know how we would generate documentation automatically for example.

Do we have any use for platform dependent files? I understand that some projects may have a need for this but I don't see any use for us beyond the icon files. Normally in python projects you store files within the modules that they are going to be used in and reference them relative to __file__ as suggested in the pyinstaller docs. This would also reduce the chance of orphan files or accidentally deleting required files because they are more closely linked to the code that uses them. I assume FBS stores them separately to make them easier to include in the installed version.

What does the fbs runtime include that we couldn't easily write ourselves? Overall I feel that FBS is more embedded than it really needs to be. I personally think we should write our own pyinstaller spec file and use the installer generation from FBS and do the rest ourselves.

OpenGL Rendering

The OpenGL 3D editor is a core feature of Amulet Editor and needs to be ported from the existing implementation.

Ideally, the majority of the rendering utility will be contained within the core application instead of the specialized editor tool so that third-party tools and plugins can leverage it as well.

The rendering process should also run in a Qt Thread so that rendering can not cause the application to freeze.

Inter-process communication (IPC) implementation

I am working through how IPC will be implemented for Amulet.

IPC is required to notify all processes that a plugin has been globally enabled or disabled as well as transferring data between the processes as required.

Multiprocessing.Queue

The current implementation transmits data with a multiprocessing Queue object initialised by the parent process and passed to the child's initialiser. There is no way to initialised this connection after the process has started.

The implementation has a single parent process and all other processes are direct children of that process.
Child processes can launch more processes by calling up to the parent process.

This implementation only allows for communication between the parent and child because it is not known which child processes will need to communicate.

If the user ran the Amulet executable again it would not be aware of the first instance and would have no way to interact with it.

Sockets

Sockets use TCP to communicate between processes. They can be opened and closed as required making them easier to work with.
Objects would need to be manually serialised to bytes or a subclass wrapper written to handle that.
We would need a mechanism to find the address of each process so that a connection can be made. This could be implemented with either a file on disk or a manager process at a fixed address.

Multiprocessing Client and Listener

I have just come across these classes that are a higher level implementation of sockets that handle pickling objects.

QLocalServer and QLocalSocket

These are classes implemented by Qt.
They offer some benefits over the first party options.

  1. Connections are made by an arbitrary string. The world path could be used for this simplifying connection.
  2. It is push based using Qt's signal system to notify when new data comes in.

Extra thoughts

It would be nice to be able to execute Amulet multiple times and have them interact with previous instances like they are all the same.
We would need to consider how it would work if different versions of Amulet were launched at the same time for compatibility reasons.

File Format Support

The Project Tool is designed as a file editor and should to support the modification of Minecraft file formats such as .dat, .mca, and .mcfunction.

This can be done through the use of a text editor for files encoded in a traditional text format. Alternatively, if a file uses a non-standard encoding like .dat, the Project Tool should be able to display custom editor widgets to allow the modification of these kinds of files.

For plugin compatibility, Amulet Editor should allow users to implement their own syntax highlighters for text files as well as their own specialized editor widgets.

Some new error

this error appeared recently after changing the source code. it didn't exist before and the program worked without problems.

If run as root:

INFO - PyMCTranslate Version 208
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
ERROR - 'code' object has no attribute 'co_qualname'
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 381, in scan_plugins
    mod = import_module(plugin_uid.identifier)
  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1005, in _find_and_load
  File "/usr/local/lib/python3.9/_collections_abc.py", line 762, in get
    return self[key]
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 219, in __getitem__
    _validate_import(imported_name, frame)
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 154, in _validate_import
    if frame.f_globals.get("__name__") == __name__ and frame.f_code.co_qualname in {
AttributeError: 'code' object has no attribute 'co_qualname'
ERROR - 'code' object has no attribute 'co_qualname'
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 381, in scan_plugins
    mod = import_module(plugin_uid.identifier)
  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1005, in _find_and_load
  File "/usr/local/lib/python3.9/_collections_abc.py", line 762, in get
    return self[key]
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 219, in __getitem__
    _validate_import(imported_name, frame)
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 154, in _validate_import
    if frame.f_globals.get("__name__") == __name__ and frame.f_code.co_qualname in {
AttributeError: 'code' object has no attribute 'co_qualname'
ERROR - 'code' object has no attribute 'co_qualname'
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 381, in scan_plugins
    mod = import_module(plugin_uid.identifier)
  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1005, in _find_and_load
  File "/usr/local/lib/python3.9/_collections_abc.py", line 762, in get
    return self[key]
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 219, in __getitem__
    _validate_import(imported_name, frame)
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 154, in _validate_import
    if frame.f_globals.get("__name__") == __name__ and frame.f_code.co_qualname in {
AttributeError: 'code' object has no attribute 'co_qualname'
ERROR - 'code' object has no attribute 'co_qualname'
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 381, in scan_plugins
    mod = import_module(plugin_uid.identifier)
  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1005, in _find_and_load
  File "/usr/local/lib/python3.9/_collections_abc.py", line 762, in get
    return self[key]
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 219, in __getitem__
    _validate_import(imported_name, frame)
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 154, in _validate_import
    if frame.f_globals.get("__name__") == __name__ and frame.f_code.co_qualname in {
AttributeError: 'code' object has no attribute 'co_qualname'
ERROR - 'code' object has no attribute 'co_qualname'
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 381, in scan_plugins
    mod = import_module(plugin_uid.identifier)
  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1005, in _find_and_load
  File "/usr/local/lib/python3.9/_collections_abc.py", line 762, in get
    return self[key]
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 219, in __getitem__
    _validate_import(imported_name, frame)
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 154, in _validate_import
    if frame.f_globals.get("__name__") == __name__ and frame.f_code.co_qualname in {
AttributeError: 'code' object has no attribute 'co_qualname'
ERROR - 'code' object has no attribute 'co_qualname'
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 381, in scan_plugins
    mod = import_module(plugin_uid.identifier)
  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1005, in _find_and_load
  File "/usr/local/lib/python3.9/_collections_abc.py", line 762, in get
    return self[key]
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 219, in __getitem__
    _validate_import(imported_name, frame)
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 154, in _validate_import
    if frame.f_globals.get("__name__") == __name__ and frame.f_code.co_qualname in {
AttributeError: 'code' object has no attribute 'co_qualname'
ERROR - 'code' object has no attribute 'co_qualname'
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 381, in scan_plugins
    mod = import_module(plugin_uid.identifier)
  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1005, in _find_and_load
  File "/usr/local/lib/python3.9/_collections_abc.py", line 762, in get
    return self[key]
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 219, in __getitem__
    _validate_import(imported_name, frame)
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 154, in _validate_import
    if frame.f_globals.get("__name__") == __name__ and frame.f_code.co_qualname in {
AttributeError: 'code' object has no attribute 'co_qualname'

If run without root:

INFO - PyMCTranslate Version 208
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-Max'
ERROR - 'code' object has no attribute 'co_qualname'
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 381, in scan_plugins
    mod = import_module(plugin_uid.identifier)
  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1005, in _find_and_load
  File "/usr/local/lib/python3.9/_collections_abc.py", line 762, in get
    return self[key]
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 219, in __getitem__
    _validate_import(imported_name, frame)
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 154, in _validate_import
    if frame.f_globals.get("__name__") == __name__ and frame.f_code.co_qualname in {
AttributeError: 'code' object has no attribute 'co_qualname'
ERROR - 'code' object has no attribute 'co_qualname'
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 381, in scan_plugins
    mod = import_module(plugin_uid.identifier)
  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1005, in _find_and_load
  File "/usr/local/lib/python3.9/_collections_abc.py", line 762, in get
    return self[key]
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 219, in __getitem__
    _validate_import(imported_name, frame)
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 154, in _validate_import
    if frame.f_globals.get("__name__") == __name__ and frame.f_code.co_qualname in {
AttributeError: 'code' object has no attribute 'co_qualname'
ERROR - 'code' object has no attribute 'co_qualname'
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 381, in scan_plugins
    mod = import_module(plugin_uid.identifier)
  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1005, in _find_and_load
  File "/usr/local/lib/python3.9/_collections_abc.py", line 762, in get
    return self[key]
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 219, in __getitem__
    _validate_import(imported_name, frame)
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 154, in _validate_import
    if frame.f_globals.get("__name__") == __name__ and frame.f_code.co_qualname in {
AttributeError: 'code' object has no attribute 'co_qualname'
ERROR - 'code' object has no attribute 'co_qualname'
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 381, in scan_plugins
    mod = import_module(plugin_uid.identifier)
  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1005, in _find_and_load
  File "/usr/local/lib/python3.9/_collections_abc.py", line 762, in get
    return self[key]
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 219, in __getitem__
    _validate_import(imported_name, frame)
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 154, in _validate_import
    if frame.f_globals.get("__name__") == __name__ and frame.f_code.co_qualname in {
AttributeError: 'code' object has no attribute 'co_qualname'
ERROR - 'code' object has no attribute 'co_qualname'
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 381, in scan_plugins
    mod = import_module(plugin_uid.identifier)
  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1005, in _find_and_load
  File "/usr/local/lib/python3.9/_collections_abc.py", line 762, in get
    return self[key]
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 219, in __getitem__
    _validate_import(imported_name, frame)
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 154, in _validate_import
    if frame.f_globals.get("__name__") == __name__ and frame.f_code.co_qualname in {
AttributeError: 'code' object has no attribute 'co_qualname'
ERROR - 'code' object has no attribute 'co_qualname'
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 381, in scan_plugins
    mod = import_module(plugin_uid.identifier)
  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1005, in _find_and_load
  File "/usr/local/lib/python3.9/_collections_abc.py", line 762, in get
    return self[key]
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 219, in __getitem__
    _validate_import(imported_name, frame)
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 154, in _validate_import
    if frame.f_globals.get("__name__") == __name__ and frame.f_code.co_qualname in {
AttributeError: 'code' object has no attribute 'co_qualname'
ERROR - 'code' object has no attribute 'co_qualname'
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 381, in scan_plugins
    mod = import_module(plugin_uid.identifier)
  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1005, in _find_and_load
  File "/usr/local/lib/python3.9/_collections_abc.py", line 762, in get
    return self[key]
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 219, in __getitem__
    _validate_import(imported_name, frame)
  File "/usr/local/lib/python3.9/site-packages/amulet_editor/data/plugin/_manager.py", line 154, in _validate_import
    if frame.f_globals.get("__name__") == __name__ and frame.f_code.co_qualname in {
AttributeError: 'code' object has no attribute 'co_qualname'

Pop out arrow for side panels

It is currently possible to drag the side panels and make them disappear but no indicator that they are still there.
There should be some kind of indicator that the panels are still there and can be expanded again.

image
image

There should be some kind of indicator arrow like blender has to show that there is a hidden panel there
image
image

function request - On-screen control for touch devices + need native compiled build for Windows ARM64

function request - On-screen control for touch devices.

(windows Arm on touchscreen or Linux devices). a similar thing is implemented in PojavLauncher where the user can configure the control himself and add/configure buttons.
how to activate:

add a function in the settings of the amulet that will trigger on-screen control with WASD, shift, space, etc.

customizable:

if one py file is responsible for on-screen control, then the user can change it by adding their own buttons or configuring them. and configuration selection - if there are several on-screen control configurations in the folder for management, then the user can select needed one from the list.

area selector issue:

since devices with a touch screen and without a keyboard do not have a pc mouse cursor, they need another method to select the area/move the imported building. there are several ways to solve the problem.

1) if the user double-clicked on the block, then the area selector is activated, then without releasing the finger from the screen, stretch the area to the desired point and release the finger, then the area is highlighted. since the second hand is free, the user will be able to move using the on-screen buttons WASD, shift, space and even rotate the camera head. with the same doubleclick, the user will be able to move the edges of the selected parralelipiped, as well as move the building that was imported into the world.

2) the button X name does not matter. the meaning of the button is that when the user clicks on the first block, then presses the X button and pulls his finger to another point, then the area will stand out. you can also make the X button as a switch, since it is inconvenient to hold it constantly and will prevent you from using WASD, shift, space and rotating the camera head. and also this button will work on moving the imported building or moving the faces of the selected parralelipiped.

RMB, LMB issue:

since clicking on the touch screen basically means the right mouse button, then you need to make it possible to use it as the left mouse button. To do this, you can use: to use the left button, use a double click or hold your finger for 2 seconds. another option is to make a switch that will change the mouse button.

this will all work on touch screens, but it will not work on Android via Linux Deploy because Linux deploy works with VNC, which means there is already emulation of the keyboard and mouse cursor (not very convenient)

there is also a problem that there is no compiled build for Windows ARM. Idk maybe if installed from source code, it will compile itself on ARM in Windows ARM.

x86 and x64 can also work in Win ARM through an instruction translator, but this is slower than a native program.

Processes

So far the application has been implemented as once process per world and one process for the landing window.
This has its advantages and disadvantages and I want to formally discuss them before continuing forward.

One process per world

Advantages

Not limited by the GIL

Each process has its own GIL making it faster to run operations on two or more worlds at the same time.

World based variables

World based variables can be global making it easier to interact with them.

Disadvantages

Unique Memory

Each process has its own memory making it difficult and slow to transfer data between the processes.
Eg if a user wanted to copy a selection between open worlds the first process would need to load the data and send it to the second process

Synchronisation

The state of plugins and other data would need to be synchronised between the many processes which could be difficult to manage.

One process for all worlds

Advantages

Shared memory

All memory is shared between worlds making it possible to pull data from one world and apply it to another without the need to pickle and send the data between processes.
This means that any inter-level interaction would be faster.

Shared plugins

One plugin instance would manage all worlds making it easier to enable and disable plugins.

Disadvantages

Limited by the GIL

No two python functions could be run at the same time making the program run slower.
Running operations on more than one world at the same time would take N times as long.
Bottleneck code could be rewritten in Cython to remove this issue.

World based variables

World based variables would need to be stored in a more complex fashion because multiple worlds would be open in the same process.

Conclusion

Both solutions have their advantages and disadvantages.
One process for all worlds would be easier to implement because inter-process communication would not be required.
It would be slower for multi-world parallel editing unless a significant portion of the world editing library was rewritten in C.
There are vague talks of removing the GIL however if it does happen it won't be for a number of years.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.