Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 49 additions & 3 deletions amulet_map_editor/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ def _on_error(e):
import time
import wx
import platformdirs
from typing import NoReturn
from types import TracebackType
import threading
import faulthandler

if sys.platform == "linux" and wx.VERSION >= (4, 1, 1):
# bug 247
Expand All @@ -64,11 +68,13 @@ def _init_log():

debug = "--amulet-debug" in sys.argv

file_handler = logging.FileHandler(
log_file = open(
os.path.join(logs_path, f"amulet_{os.getpid()}.log"),
"w",
encoding="utf-8",
)

file_handler = logging.StreamHandler(log_file)
file_handler.setFormatter(
logging.Formatter("%(asctime)s - %(levelname)s - %(name)s - %(message)s")
)
Expand All @@ -88,8 +94,29 @@ def _init_log():
force=True,
)

log = logging.getLogger(__name__)

def error_handler(
exc_type: type[BaseException],
exc_value: BaseException | None,
exc_tb: TracebackType | None,
) -> None:
if exc_value is None:
return
log.error("Unhandled exception", exc_info=(exc_type, exc_value, exc_tb))

sys.excepthook = error_handler

def thread_error_handler(args: threading.ExceptHookArgs) -> None:
error_handler(args.exc_type, args.exc_value, args.exc_traceback)

threading.excepthook = thread_error_handler

# When running via pythonw the stderr is None so log directly to the log file
faulthandler.enable(log_file)


def main():
def main() -> NoReturn:
try:
# Initialise default paths.
data_dir = platformdirs.user_data_dir("AmuletMapEditor", "AmuletTeam")
Expand All @@ -106,16 +133,35 @@ def main():
)

_init_log()
log = logging.getLogger(__name__)
log.debug("Importing numpy")
import numpy

log.debug("Importing amulet_nbt")
import amulet_nbt

log.debug("Importing leveldb")
import leveldb

log.debug("Importing PyMCTranslate and amulet")
import PyMCTranslate
import amulet

log.debug("Importing minecraft_model_reader")
import minecraft_model_reader

log.debug("Importing amulet_map_editor")
from amulet_map_editor.api.framework import AmuletApp

log.debug("Finished importing")

except Exception as e:
_on_error(e)
else:
try:
app = AmuletApp(0)
app.MainLoop()
except Exception as e:
log = logging.getLogger(__name__)
log.critical(
f"Amulet Crashed. Sorry about that. Please report it to a developer if you think this is an issue. \n{traceback.format_exc()}"
)
Expand Down
52 changes: 49 additions & 3 deletions amulet_map_editor/__main_debug__.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ def _on_error(e):
import time
import wx
import platformdirs
from typing import NoReturn
from types import TracebackType
import threading
import faulthandler

if sys.platform == "linux" and wx.VERSION >= (4, 1, 1):
# bug 247
Expand All @@ -62,11 +66,13 @@ def _init_log():
):
os.remove(path)

file_handler = logging.FileHandler(
log_file = open(
os.path.join(logs_path, f"amulet_{os.getpid()}.log"),
"w",
encoding="utf-8",
)

file_handler = logging.StreamHandler(log_file)
file_handler.setFormatter(
logging.Formatter("%(asctime)s - %(levelname)s - %(name)s - %(message)s")
)
Expand All @@ -82,8 +88,29 @@ def _init_log():
force=True,
)

log = logging.getLogger(__name__)

def error_handler(
exc_type: type[BaseException],
exc_value: BaseException | None,
exc_tb: TracebackType | None,
) -> None:
if exc_value is None:
return
log.error("Unhandled exception", exc_info=(exc_type, exc_value, exc_tb))

sys.excepthook = error_handler

def thread_error_handler(args: threading.ExceptHookArgs) -> None:
error_handler(args.exc_type, args.exc_value, args.exc_traceback)

threading.excepthook = thread_error_handler

# When running via pythonw the stderr is None so log directly to the log file
faulthandler.enable(log_file)


def main():
def main() -> NoReturn:
try:
# Initialise default paths.
data_dir = platformdirs.user_data_dir("AmuletMapEditor", "AmuletTeam")
Expand All @@ -100,16 +127,35 @@ def main():
)

_init_log()
log = logging.getLogger(__name__)
log.debug("Importing numpy")
import numpy

log.debug("Importing amulet_nbt")
import amulet_nbt

log.debug("Importing leveldb")
import leveldb

log.debug("Importing PyMCTranslate and amulet")
import PyMCTranslate
import amulet

log.debug("Importing minecraft_model_reader")
import minecraft_model_reader

log.debug("Importing amulet_map_editor")
from amulet_map_editor.api.framework import AmuletApp

log.debug("Finished importing")

except Exception as e:
_on_error(e)
else:
try:
app = AmuletApp(0)
app.MainLoop()
except Exception as e:
log = logging.getLogger(__name__)
log.critical(
f"Amulet Crashed. Sorry about that. Please report it to a developer if you think this is an issue. \n{traceback.format_exc()}"
)
Expand Down
11 changes: 8 additions & 3 deletions amulet_map_editor/api/opengl/canvas/canvas.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,14 @@ def context_identifier(self) -> str:
return str(id(self._context))

def _on_show(self, evt: wx.ShowEvent):
if not self._init and evt.IsShown():
self._init = True
self._init_opengl()
try:
if not self._init and evt.IsShown():
self._init = True
log.debug("Initialising OpenGL")
self._init_opengl()
log.debug("Finished initialising OpenGL")
except Exception as e:
log.exception(f"Failed initialising OpenGL: {e}")

def _init_opengl(self):
"""Set up the OpenGL state after the window is first shown."""
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from typing import TYPE_CHECKING
import logging
import wx
from OpenGL.GL import (
glClear,
Expand Down Expand Up @@ -26,6 +27,9 @@
from amulet.api.level import BaseLevel


log = logging.getLogger(__name__)


class DefaultOperationUI(OperationUI):
"""An extension of the base OperationUI that adds camera, static selection and some other controls."""

Expand Down Expand Up @@ -54,15 +58,18 @@ def bind_events(self):
self.canvas.Bind(EVT_INPUT_PRESS, self._on_input_press)

def _on_draw(self, evt):
self.canvas.renderer.start_draw()
if self.canvas.camera.projection_mode == Projection.PERSPECTIVE:
self.canvas.renderer.draw_sky_box()
glClear(GL_DEPTH_BUFFER_BIT)
self.canvas.renderer.draw_level()
self._selection.draw()
if self._show_pointer:
self._pointer.draw()
self.canvas.renderer.end_draw()
try:
self.canvas.renderer.start_draw()
if self.canvas.camera.projection_mode == Projection.PERSPECTIVE:
self.canvas.renderer.draw_sky_box()
glClear(GL_DEPTH_BUFFER_BIT)
self.canvas.renderer.draw_level()
self._selection.draw()
if self._show_pointer:
self._pointer.draw()
self.canvas.renderer.end_draw()
except Exception as e:
log.exception(f"Failed painting: {e}")

def _on_input_press(self, evt: InputPressEvent):
if evt.action_id == ACT_BOX_CLICK:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,15 @@ def bind_events(self):

def _on_draw(self, evt):
"""The render loop for this tool."""
self.canvas.renderer.start_draw()
if self.canvas.camera.projection_mode == Projection.PERSPECTIVE:
self.canvas.renderer.draw_sky_box()
glClear(GL_DEPTH_BUFFER_BIT)
self.canvas.renderer.draw_level()
self.canvas.renderer.end_draw()
try:
self.canvas.renderer.start_draw()
if self.canvas.camera.projection_mode == Projection.PERSPECTIVE:
self.canvas.renderer.draw_sky_box()
glClear(GL_DEPTH_BUFFER_BIT)
self.canvas.renderer.draw_level()
self.canvas.renderer.end_draw()
except Exception as e:
log.exception(f"Failed painting: {e}")

def _on_drop_files(self, evt: wx.DropFilesEvent):
"""Logic to run when a file is dropped into the canvas."""
Expand Down
44 changes: 26 additions & 18 deletions amulet_map_editor/programs/edit/plugins/tools/chunk.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
from typing import TYPE_CHECKING, Dict, Tuple, Optional
import logging

import wx
from OpenGL.GL import (
glClear,
Expand Down Expand Up @@ -26,6 +28,9 @@
from amulet_map_editor.programs.edit.api.canvas import EditCanvas


log = logging.getLogger(__name__)


class ChunkTool(wx.BoxSizer, DefaultBaseToolUI):
def __init__(self, canvas: "EditCanvas"):
wx.BoxSizer.__init__(self, wx.HORIZONTAL)
Expand Down Expand Up @@ -250,21 +255,24 @@ def _prune_chunks(self, evt):
)

def _on_draw(self, evt):
self.canvas.renderer.start_draw()
if self.canvas.camera.projection_mode == Projection.PERSPECTIVE:
self.canvas.renderer.draw_sky_box()
glClear(GL_DEPTH_BUFFER_BIT)
self.canvas.renderer.draw_level()
if self.canvas.camera.projection_mode == Projection.PERSPECTIVE:
self._selection.draw()
else:
depth_state = glGetBoolean(GL_DEPTH_TEST)
if depth_state:
glDisable(GL_DEPTH_TEST)
clip = self.canvas.camera.orthographic_clipping
self.canvas.camera.orthographic_clipping = -(10**5), 10**5
self._selection.draw()
self.canvas.camera.orthographic_clipping = clip
if depth_state:
glEnable(GL_DEPTH_TEST)
self.canvas.renderer.end_draw()
try:
self.canvas.renderer.start_draw()
if self.canvas.camera.projection_mode == Projection.PERSPECTIVE:
self.canvas.renderer.draw_sky_box()
glClear(GL_DEPTH_BUFFER_BIT)
self.canvas.renderer.draw_level()
if self.canvas.camera.projection_mode == Projection.PERSPECTIVE:
self._selection.draw()
else:
depth_state = glGetBoolean(GL_DEPTH_TEST)
if depth_state:
glDisable(GL_DEPTH_TEST)
clip = self.canvas.camera.orthographic_clipping
self.canvas.camera.orthographic_clipping = -(10**5), 10**5
self._selection.draw()
self.canvas.camera.orthographic_clipping = clip
if depth_state:
glEnable(GL_DEPTH_TEST)
self.canvas.renderer.end_draw()
except Exception as e:
log.exception(f"Failed painting: {e}")
29 changes: 18 additions & 11 deletions amulet_map_editor/programs/edit/plugins/tools/paste.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import wx
from typing import TYPE_CHECKING, Tuple, Union, Type
import logging
import math
import numpy
import weakref

from OpenGL.GL import (
glClear,
GL_DEPTH_BUFFER_BIT,
)
import math
import numpy
import weakref

from amulet.api.data_types import PointCoordinates
from amulet.api.level import BaseLevel
Expand Down Expand Up @@ -46,6 +48,8 @@
if TYPE_CHECKING:
from amulet_map_editor.programs.edit.api.canvas import EditCanvas

log = logging.getLogger(__name__)

BottomLeftRight = wx.BOTTOM | wx.LEFT | wx.RIGHT
BottomLeftRightCentre = BottomLeftRight | wx.ALIGN_CENTER_HORIZONTAL
BottomLeftRightExpand = BottomLeftRight | wx.EXPAND
Expand Down Expand Up @@ -679,11 +683,14 @@ def _paste_confirm(self, evt):
self.canvas.run_operation(self._paste_operation)

def _on_draw(self, evt):
self.canvas.renderer.start_draw()
if self.canvas.camera.projection_mode == Projection.PERSPECTIVE:
self.canvas.renderer.draw_sky_box()
glClear(GL_DEPTH_BUFFER_BIT)
self.canvas.renderer.draw_level()
self.canvas.renderer.draw_fake_levels()
self._selection.draw()
self.canvas.renderer.end_draw()
try:
self.canvas.renderer.start_draw()
if self.canvas.camera.projection_mode == Projection.PERSPECTIVE:
self.canvas.renderer.draw_sky_box()
glClear(GL_DEPTH_BUFFER_BIT)
self.canvas.renderer.draw_level()
self.canvas.renderer.draw_fake_levels()
self._selection.draw()
self.canvas.renderer.end_draw()
except Exception as e:
log.exception(f"Failed painting: {e}")
Loading