- Reorganized the project using pyproject.toml
- Upgraded docs dependencies
- Added
--backend
option to specify context backend. This is mostly for the headless window to enable EGL. - Window now has a
backend
property containing the name of the context backend - Window now has a
headless
boolean property to check if the window is headless. This is useful for adding headless only paths in your code. - Added stencil bits to window framebuffers by default
- Fix compatibility with moderngl 5.8.x
- Camera now has keymap support (QWERTY, AZERTY etc)
- Allow toggling vsync and runtime for most windows
- Allow rendering with imgui in headless mode
- Fixed a crash when using fullscreen mode with glfw
- Support moving OrbitCamera
- Added SSAO example
- Added
on_generic_event
callback for pygame user events - Fixed zoom sensitivity getter returning the wrong value
- Fixed several typos
- Bumped several dependencies to reasonable versions
Thanks to @Rafale25, @n3onUser, @erikstrand (Erik Strand), @sheepman4267 and @dbs4261 (Daniel Simon) for contributions to this release.
- Experimental support for ffmpeg capture
- Event callbacks can now be assigned in WindowConfig.init
- Initial support for confirming window close (glfw)
- Fixed a crash when closing a pyglet window
- Remove some spammy prints in the text writer
Thanks to @DavideRuzza, @wk39 and @joehalliwell for their contributions to this release.
Python 3.5 is no longer supported from this version.
New Features
- Experimental: New simple 2D text writer
- Various smaller improvements
- F11 now toggles fullscreen mode by default
- Window modules are now fetched from
moderngl_window.WINDOW_CLASSES
as a fallback. This is necessary in some environments. - Absolute paths will now bypass all registered resource directories and load the specified file directly.
Bug Fixes
- Varying names can now be passed in when loading a program. Since the auto detection of out attributes is far from perfect this can be needed for more complex shaders.
- Missing python 3.9 classifier in setup.py
- SDL2 window should now also process since change events
- GLFW: Fixed some incorrect key mappings
- Fixed an issue with timers causing the first frame to have negative frame time
- Fixed a pixel scale issue in the imgui integration. This was especially an issue with tiling window managers
New Features
- Added a simple Scheduler (Thanks to @Leterax)
- Added support for toggling fullscreen
- Added support for setting window icon
TextureDescription
now supports flipping the texture on x and y- The pyglet window now supports dragging in files
- Added
BaseWindow.convert_window_coordinates
for converting mouse coordinates - Added more examples
Bug Fixes
- BaseWindow now references WindowConfig using a weakref
- Overriding the timer in
run_window_config
had no effect - Numpad keys was not mapped correctly in some instances
- Timers should return 0 when not started
- glfw window close callback did now work
- glfw now respects content scaling on windows and X11
- Added some missing methods in docs
- Fixed various doc typos
- imgui integration no longer relies on pyopengl
- Bug: Properly parse
out
attributes with layout qualifiers - Bug: Do not cache system shaders at module level. We now cache them in the context to better support multiple windows.
- Bug: OrbitCameraWindow - Fixed radians/degree issue
- Bug: A window can now be closed from inside
render()
- Fixed several issues causing the window close callback not being called
- Fixed incorrect mouse button mapping in mouse drag events
- imgui renderer now supports moderngl textures. This opens up for both displaying images and animated framebuffer textures into imgui.
- Scene: Fixed several issues related to shader assigning based on material properties. This especially affected wavefront/obj files.
- OrbitCamera: Fixed translation issue (@Leterax)
- OrbitCamera: Now using degrees instead of radians (@Leterax)
- Bumped pyglet version to minimum 1.5.6. This version solves several issue with window events for MacBooks with Touch Bar
WindowConfig
now supports overriding the default arugment parser. A classmethodadd_arguments
can be implemented to add additional arguments. The parsed arguments are available inself.argv
- Added in
Scene.draw_wireframe
rendering a scene in wire frame mode Scene.draw_bbox
now support passing in acolor
Scene
should now have better support for all the vertex formats wavefront/obj files may have.- Addded
WindowConfig.clear_color
attribute so uses can control the clear color of the screen. The value can be set toNone
to disable screen clearing (@Leterax) - Added
OrbitCamera
(@Leterax) - Allow setting camera rotation (@Leterax)
VAO
should now give better feedback if the buffers and program attributes are not compatibleModernGLRenderer
(imgui renderer) should not rely on moderngl-window (@minuJeong)Scene
should now cache default shaders internally so they are not loaded for every scene- Several typos in docs (@dawid-januszkiewicz)
WindowConfig.load_compute_shader
missing in docs- Bumped pygame to
2.0.0.dev10
Thanks to @Leterax, @minuJeong and @dawid-januszkiewicz for the contributions to this release
and @mtbouchard for input on WindowConfig
and Scene
changes.
- Optimized the imgui renderer using
ctypes
instead ofnumpy
for handling vertex data (@aforren1) - Added support for ALT key modifier in all window backends and other improvements to key handling (@OKaluza)
WindowConfig
now supports afullscreen
attribute
Thanks to Alex Forrence (@aforren1) and Owen Kaluza (@OKaluza) for the contributions to this release.
New Features
- moderngl and moderngl-window integration for imgui thought the pyimgui project. This is fairly experimental and the rendered should probably be moved to the pyimgui project soon
Dear ImGui is a bloat-free graphical user interface library for C++. It outputs optimized vertex buffers that you can render anytime in your 3D-pipeline enabled application. It is fast, portable, renderer agnostic and self-contained (no external dependencies)
- Compute shader support.
WindowConfig.load_compute_shader
and addedcompute_shader
parameter forProgramDescription
. - Shaders now support
#include
up to a maximum of 100 levels - Added support for gif anim. This can be loaded as a
Texture
orTextureArray
- Added support for loading cube maps
WindowConfig.run()
shortcut- Each window backend now has a
name
property so the user can easily detect what window type they are given WindowConfig
now as avsync
property so the user can easily control this from python code- Scene: New methods to find materials and node by name
Slightly Breaking Changes
- All windows now use 0 samples (MSAA) by default. The default
samples = 4
caused way too much issues for people with older integrated gpus and when doing headless rendering when multisampling is not supported.
Bug fixes
- Fixed several issues with glft2 scenes and object orientation
- pyglet window: Fixed incorrect mouse position on retina screens and windows with pixel ratio > 1.
- sdl2: mouse press/release events was reversed
- pygame2: Fix broken mouse wheel reading
- glfw: Incorrect mapping of BACKSPACE key
- glfw: Fixed an issue not setting vsync properly¨
- headless: We now call
ctx.finish()
inswap_buffers
- Shader errors should now report the error line more accurately
- Various typo fixes
Improvements
- Windows now has an
exit_key
property that can be used to change or disable the exit key. This key isESCAPE
by default and can be disabled by setting the property toNone
. This is useful for users that don't want the default exit key behavior. - Log consumed glerrors after context creation as warnings
Bug fixes
- Pyglet mouse coordinates was translated wrong in cases were the framebuffer size is larger that then window. The mouse position should always use window coordinates.
- VAOs should now properly support 64 bit floats / dvec
- VAOs should be better at detecting/ignoring built in attributes
Camera.look_at
had broken input validation when passing in a vector- Various typos in docstrings
Resolved an issue with version constraints causing some dependencies to install pre-release versions
- Missing
WindowConfig.close
method and support for close callback for all window types - Bug: KeyboardCamera's matrix is now always returned as a 32bit floats
- Bug: Projection3D's matrix is now always returned as a 32bit floats
- Example cleanup and improvements
- Bug: An
INVALID_ENUM
glerror triggered after querying context info is now consumed.
Bug fixes
- SDL2 window now allows highdpi framebuffers when available
- pygame2 window should only initialize the display module
mouse_position_event
signature has changed from(x, y)
to(x, y, dx, dy)
. This means you will also be getting the relative position change.mouse_drag_event
signature has changed from(x, y)
to(x, y, dx, dy)
. This means you will also be getting the relative position change.KeyboardCamera.rot_state
now takes dx and dy instead of x and y
- Python 3.8 support (PySide2 will take a few more months. SDL2 has issues on windows)
- Added pygame2 window
- Added window callback
iconify
for all window types that will be called when a window is minimized or restored - Window property
mouse_exclusivity
added for all window types. When enabled the mouse cursor is invisible and mouse position changes are only reported through the dx and dy values. - Window property
size
is now assignable for all window types - Window property
position
is now assignable for all window types - Window property
title
is now assignable for all window types - Window property
cursor
is now assignable for all window types - The
KeyboardCamera
class should now be better at reducing the chance of rotation and movement popping - All windows now properly separate viewport calculations when using fixed and free viewport (derived from window size)
- The window
aspect_ratio
property should always return the a value based on if the aspect ratio is fixed or free - Added window
fixed_aspect_ratio
property so users can freely control this after window creation
- Added window property
position
for getting and setting window position for all window types - Added window properties:
viewport_size
,viewport_width
,viewport_height
- Upgraded dependency for tkinter window.
pyopengltk>=0.0.3
- Loosened up most of the requirements
- Bug: Missing call to
tk.destroy()
in tk window
- Upgraded dependency for tkinter window.
pyopengltk==0.0.2
.
- Added experimental support for tkinter window. Relies on Jon Wright's pyopengltk package: https://github.com/jonwright/pyopengltk. Currently only supports windows and linux, but that might change in the future.
- KeyboardCamera: Exposed
mouse_sensitivity
,velocity
andprojection
attributes - Various missing docstring and docstring improvements
- Various missing type hints
- Added support for mouse_drag events for all window types
- Added support for unicode_char_entered (text input) for all windows
- Added support for mouse wheel events for all window types
- Fixed several issue related to python 3.5 support
- Upgraded to pywavefront 1.2.x
- Renamed some modules and classes to better reflect their capabiltities
- Renamed some inconsistent parameter names in the codebase
- Complete overhaul of docstrings in the entire codebase
- Added missing type hints
- Revived the STL loader
- Documentation
- Added
moderngl_window.__version__
attribute
- GL errors during window creation is now consumed. This is to avoid confusion when this state is set in the rendering loop.
- Default anisotropy for textures loaders is now 1.0 (disabled, isotropy)
- Mipmaps are no longer generated by default. You must explicitly enable this in parameters.
- WindowConfig.load_texture_2d now exposes more parameters
- WindowConfig.load_texture_array now exposes more parameters
- WindowConfig.load_scene now exposes more parameters
- Texture loaders supports specifying mipmap levels
- Texture loaders supports specifying anisotropy
- VAO wrapper supports normalized float/uint/int
- More tests
- Supported buffer formats in the VAO wrapper now matches moderngl better
- VAO wrapper now uses buffer format strings matching moderngl including divisors
- Fixed some logging issues
Initial release