Posts Tagged ‘macOS’

October 2018 Development Update

Sunday, November 11th, 2018 by fireclaw

PyWeek

Two weeks ago, the semi-annual PyWeek challenge was held. In case you are not familiar with PyWeek, it’s a challenge to create a game within only seven days. The contestants are free to use any engine as long the game is written mostly in Python. Before the challenge begins, contestants vote on a theme in order to inspire and challenge the entrants’ creativity. The theme for the October challenge was “Flow”.

In this 26th PyWeek, two contestants have used Panda3D for their submissions. We’d like to highlight some of the challenges they faced and show how Panda3D helped them to finish their games in such a short time. They both used development builds of the upcoming Panda3D 1.10, which made for a great opportunity to test the new features, and the new deployment system in particular. Being able to quickly install Panda3D using pip has also been a very welcome feature for PyWeek, since installing Panda3D has been a stumbling block for PyWeek users in the past.

Chart of Flowrock

Chart of Flowrock

This entry was created by our community member wezu. It is an original take on the dungeon crawler game using only three keyboard buttons where possible moves are represented with a flowchart diagram at the bottom of the screen.
One feature from the Panda3D engine that helped wezu getting this game done was the intervals. These are functions to manipulate values—such as an object’s position and rotation—over a given period of time without the need to use tasks to manage those updates manually. Using intervals, he was able to quickly develop convincing walking animations with head bob and tilting when turning.

The game’s impressive graphical style was achieved thanks to a shader framework wezu developed, which is publicly available at GitHub. It has been made as a drop-in replacement for the built-in Cg-based ShaderGenerator, implementing various modern effects using GLSL 1.30. This proved to be a bit of a challenge in testing: while GLSL 1.30 shaders are typically usable on most platforms, OpenGL support has always been a bit behind on macOS, and has in fact even been deprecated by Apple as discussed in a previous blog post. This forced him to implement a special “potato mode” for low end and macOS systems that wouldn’t utilize these shaders. In this mode, the game would still be playable, just without those fancy graphics.
Working on an improved shader pipeline that avoids some of the driver-specific compatibility issues is high on the agenda for the Panda3D developers, which will help making shader-based game work reliably on multiple platforms without requiring extensive testing and tweaking the shaders for different drivers.

Chart of Flowrock won silver rating in the Production category and ranked sixth overall among the individual entries.

Let There Be Light

Let There Be Light

Our second entry that has been made for PyWeek was created by our main engine developer rdb. This game is a kind of strategic puzzle building game where you have to build an energy grid in order to supply cities with power and enable them to grow. The energy demand of the cities grows over time so you have to carefully plan your network so that your wires don’t overheat. For this game rdb decided to take a less heavily graphics-focused approach, instead going for a minimalistic art style with flat colors, low-poly models and simple lighting. The game employed numpy for calculating the currents through the nodes of the energy grid.

As the power lines were one of the most important elements of the game, some attention to detail was given with how they are rendered. The LineSegs class made it easy to draw nice catenaries between the pylons. Panda3D made the math rather easy to ensure that the wires connected up properly to the pylons regardless of their orientation: dummy points were added to the pylon models indicating the points where the wires should attach, so it was only necessary to use getRelativePoint() to determine the correct two points to draw the arc between.

As the player interacts with the game primarily using the mouse, extra attention was given to ensure a good user interface so that it is clear to the player what to do. Panda3D’s text nodes and billboard effects made it particularly easy to add labels in the 3D scene to clearly communicate where the user needs to click and what will happen when they click it, and intervals made it easy to give the important labels a nice animation to draw the eye. The free Font Awesome icon font was used to easily render crisp icons.

The sound and music had to be pushed off to the last few hours of the final day, but fortunately loading and playing spatialized sounds in Panda3D takes only a few lines of code. Having sound effects can really help with the user experience like this by giving direct feedback to the player’s actions. Smoothly adjusting the play rate of the music depending on the game speed was a nice touch appreciated by the reviewers, which took only a few minutes to implement using Panda3D.

Let There Be Light won gold ratings in the Fun and Production categories, Silver in the Innovation category and became the winner of PyWeek 26 among the individual entries.

Engine Developments

Despite the distraction of PyWeek, development of the engine has not remained idle. Plenty of bugfixes and stability improvements bring the engine ever closer towards the upcoming 1.10 release. We’ll give you a small selection of the many changes that have happened.

If you have ever tried loading models in a model format other than Panda3D’s own bam or egg formats, you may have already come across the Assimp loader, which has been in the Panda3D source for a while but was considered experimental. This uses the Assimp library, which supports most of the 3D formats in common use. This importer is now enabled by default and can be used in recent development builds.

On the graphical side were a few fixes and enhancements too. A big change was made in the rendering system to resolve some inconsistencies in how colors and material were being applied in the absence of lighting. It is normally the case that materials are not visible unless you have a light applied to the model, but in some cases (such as in the presence of a color scale), the material colors could show up anyway. It was also not always clear when vertex colors would show up or when they would be suppressed by the material. These behaviors have now been made consistent between the different rendering back-ends and the shader generator. If these changes are affecting your game, just let us know and we can help you resolve these problems.

As of 1.9.0, Panda3D has a GLSL preprocessor which among other things allows #include statements to include other files within the current shader. This is crucial for games that rely heavily on shaders, as functions often need to be shared between different shaders or just separated for better code organisation. It has recently seen some improvements, such as the ability to use it with procedurally generated shaders that are passed into Shader.make(), some optimizations to reduce the preprocessed size, and some parsing fixes.

There also have been some improvements on the Windows front. It is now possible to change the undecorated and fixed-size attributes of already-opened windows. There have also been some improvements in the build time when compiling with Eigen support on Windows.

The deploy-ng system has received a new feature: it can now use an optimized version of the Panda3D binaries, stripped of debug information and safety checks, when deploying a game. deploy-ng can make use of an optimized version of the Panda3D wheels that are available on our pip mirror under a special +opt tag. This allows deployed games to be smaller and faster while still providing the benefit of all the debug features and safety checks in the SDK.

June 2018 Development Update

Tuesday, July 31st, 2018 by fireclaw

Due to the vacation period, this post is somewhat delayed, but the wait is finally at an end. Here is the new update with a selection of the developments in June.

OpenGL on macOS

At the Apple WWDC in June of this year, Apple formally announced the deprecation of the OpenGL graphics API, in favor of an Apple-only graphics API called Metal. This move puzzled many as a lot of software is relying on OpenGL for macOS support, including Panda3D, and investing significant resources into developing a whole new rendering back-end to support just a relatively small segment of the market is hard to justify.

While it seems likely that—despite the deprecation notice—Apple will continue to include OpenGL support as a part of macOS, we will need to start looking at another approach for maintaining first-class support for high-end graphics on macOS. It would be nice if there were one next-gen graphics API that would be well-supported on all platforms going forward.

Enter MoltenVK. This is an implementation of the cross-platform Vulkan API for macOS and iOS, implemented as a wrapper layer on top of Apple’s Metal API. It has recently been open sourced by the Khronos group, in an effort to make Vulkan available on every operating system. Despite being a wrapper layer, it was still found by Valve to have increased performance benefits over plain OpenGL. This will let us focus our efforts on implementing Vulkan and thereby support all platforms.

Accordingly, we have increased the priority towards developing a Vulkan renderer, and it has made several strides forward in the past months. It is still not quite able to render more than the simplest of sample programs, however. We will keep you updated as developments unfold.

Mouselook smoothness improved

In order to implement camera movement using the mouse, many applications use move_pointer to reset the cursor to the center of the window every frame. However, when the frame rate gets low, the mouse movement can become choppy. This is usually only an issue occurring on Windows as other platforms support the M_relative mouse mode, which obviates the need to reset the mouse cursor. For all those who can’t or don’t use this mode, a significant improvement in smoothing this movement has now been worked out.
In previous versions, small movements that occurred between the last iteration of the event loop and the call to move_pointer could have been ignored, causing the mouselook to become choppy. This has been fixed by changing the get_pointer() method to always obtain the latest mouse cursor position from the operating system, resulting in more accurate mouse tracking. In the future, we will further improve on this by emulating relative mouse mode on Windows and perhaps even adding a new interface for handling mouselook.

Grayscale and grayscale-alpha support with FFmpeg

Panda3D’s implementation of FFmpeg now gained the ability to load videos that only contain grayscale colours more efficiently, greatly reducing the memory usage compared to the previous approach of converting all videos to full RGB. This is also extended to videos that have a grayscale channel as well as an alpha channel for transparency. Do note, however, that not all video formats support grayscale pixel formats.

Removing ‘using namespace std’ from Panda3D headers

C++ users, take note: besides the changes to add better C++11 support, we have also eliminated the bad practice of having using namespace std; in the public Panda3D headers. This prevents the entire std namespace from being pulled in and causing namespace clashes. If your codebase relied on being able to use standard types without an explicit std:: prefix, you may need to add using namespace std to your own headers. It would be even better to fully qualify your references to standard types and functions with an std:: prefix or—where appropriate—pull in specific types with individual using std::x; statements.

Bullet Vehicle chassis-to-wheel synchronisation

Using Bullet’s BulletVehicle class to simulate car physics had a problem with syncing the wheels to the chassis if the wheels were parented to the the vehicle’s RigidBodyNode. The wheel models would always be one frame ahead of the chassis model, resulting in visible artifacts as the wheels would appear to move away from the chassis. Especially if the vehicle accelerates to a significant speed, the wheels may appear to drift quite far from the vehicle. This bug was fixed thanks to a contributor.

March 2018 Development Update

Friday, April 20th, 2018 by fireclaw

Winter is over and it’s time for a spring-cleaning. Many issues have been fixed this month and we’ve also completely refreshed the forum system. Also, changes have been made towards cleaning up the codebase and removing obsolete code. Keep an eye open for the awesome things our developers have in store for later this year!

Forum

The forums got a complete overhaul and has been moved over to Discourse, a 100% free and open source discussion board with plenty of neat features and a modern look. It has become quite a popular system of late, so it may appear familiar to some. The new software is considerably better at preventing spam and the increased mobile usability, code highlighting support and better notifications are welcome features as well. However, due to the conversion to Markdown, some formatting in old forum posts may not have been converted correctly.
If you have any trouble or concerns using the new forum, let us know! We’ll do our best to make the transition as smooth as possible.

Adjacency Geometry

Silhoutte rendering using a geometry shader. Model by Christophe Seux.

Silhoutte rendering using a geometry shader (click to enlarge). Model by Christophe Seux.

Support has been added to the OpenGL renderer for adjacency information. This is primarily useful for geometry shaders that need to access information about vertices connected to the primitive that is being processed, which is useful when implementing effects such as silhouette rendering (as seen in the screenshot to the right). Panda3D can automatically generate adjacency information for existing meshes, but can also take precomputed adjacency information.

Logging in deploy-ng

A new addition to deploy-ng which could help with debugging deployed apps—especially on Windows—is the possibility to provide a path to a log file to which a packaged app will automatically write all of its output. As GUI applications on Windows can’t write to the console, this new way of logging can be used to easily reroute the output to a log file without having to write an extra logging mechanism in your application.
To enable this feature for your application, you simply have to set the log_filename variable in your setup.py script. For an example, take a look at the setup script in the asteroids example in the deploy-ng branch. By default the log file will be rewritten every time, but with a simple switch of the log_append variable, you can preserve the previous content.

Dropping support for MSVC 2010

Since we are continuing to take greater advantage of C++11 features in the Panda3D codebase, we can no longer support the Microsoft Visual C++ 2010 compiler. The 2015 version has been made the new default for building Panda3D from source on Windows systems, and we intend to cease supporting 2010 very soon. If this is causing issues for you or your team, please make your voice heard as soon as possible on the corresponding GitHub issue!

Dropping Mac OS X 10.6 “Snow Leopard” support

Furthermore, we also intend to stop supporting Mac OS X 10.6 “Snow Leopard” due to the limits it imposes on how much of the C++11 standard can be used in the Panda3D codebase. However, if your application is still targeting this version of macOS, please give your opinion on the corresponding GitHub issue.

Video4Linux

Panda3D now supports the grayscale pixel format on Linux which is used for example by some infrared (IR) cameras. Additionally, the reading of video frames from the camera is now done asynchronously, meaning that the framerate of the application is no longer locked to the framerate of the camera in Augmented Reality applications. The previous behaviour can be restored by enabling the v4l-blocking configuration variable.

Better Python 3 Support

Support for Python 3 has been enhanced by replacing usage of the C++ string type with vector_uchar where it is used to refer to binary data. Since all strings are seen as UTF-8 now, this avoids exceptions which were raised due to confusion about whether buffers contained UTF-8 strings or binary data. Convenience functions have been added for efficiently dealing with the new way of representing binary buffers.

Media decoding and playing

CFSworks, who regularly contributes to the project, has done some work on various parts of the audio system, among many other changes. Firstly, he implemented workarounds for some rare OpenAL implementation bugs which are particularly prevalent on the Apple implementation. He also helped to clean up use of deprecated APIs in the FFMpeg integration and implemented features available to newer versions of this library. We are very grateful to him for his continued contributions.