Powerful, mature open-source cross-platform game engine for Python and C++, developed by Disney and CMU

Build Status OpenCollective OpenCollective

Panda3D

Panda3D is a game engine, a framework for 3D rendering and game development for Python and C++ programs. Panda3D is open-source and free for any purpose, including commercial ventures, thanks to its liberal license. To learn more about Panda3D's capabilities, visit the gallery and the feature list. To learn how to use Panda3D, check the documentation resources. If you get stuck, ask for help from our active community.

Panda3D is licensed under the Modified BSD License. See the LICENSE file for more details.

Installing Panda3D

The latest Panda3D SDK can be downloaded from this page. If you are familiar with installing Python packages, you can use the following command:

pip install panda3d

The easiest way to install the latest development build of Panda3D into an existing Python installation is using the following command:

pip install --pre --extra-index-url https://archive.panda3d.org/ panda3d

If this command fails, please make sure your version of pip is up-to-date.

If you prefer to install the full SDK with all tools, the latest development builds can be obtained from this page.

These are automatically kept up-to-date with the latest GitHub version of Panda.

Building Panda3D

Windows

You can build Panda3D with the Microsoft Visual C++ 2015, 2017 or 2019 compiler, which can be downloaded for free from the Visual Studio site. You will also need to install the Windows 10 SDK, and if you intend to target Windows Vista, you will also need the Windows 8.1 SDK.

You will also need to have the third-party dependency libraries available for the build scripts to use. These are available from one of these two URLs, depending on whether you are on a 32-bit or 64-bit system, or you can click here for instructions on building them from source.

After acquiring these dependencies, you can build Panda3D from the command prompt using the following command. Change the --msvc-version option based on your version of Visual C++; 2019 is 14.2, 2017 is 14.1, and 2015 is 14. Remove the --windows-sdk=10 option if you need to support Windows Vista, which requires the Windows 8.1 SDK.

makepanda\makepanda.bat --everything --installer --msvc-version=14.2 --windows-sdk=10 --no-eigen --threads=2

When the build succeeds, it will produce an .exe file that you can use to install Panda3D on your system.

Note: you may choose to remove --no-eigen and build with Eigen support in order to improve runtime performance. However, this will cause the build to take hours to complete, as Eigen is a heavily template-based library, and the the MSVC compiler does not perform well under these circumstances.

Linux

Building Panda3D on Linux is easy. All you need is to invoke the makepanda script using the version of Python that you want Panda3D to be built against.

Run makepanda.py with the --help option to see which options are available. Usually, you will want to specify the --everything option (which builds with support for all features for which it detects the prerequisite dependencies) and the --installer option (which produces an installable .deb or .rpm file for you to install, depending on your distribution).

The following command illustrates how to build Panda3D with some common options:

python3 makepanda/makepanda.py --everything --installer --no-egl --no-gles --no-gles2 --no-opencv

You will probably see some warnings saying that it's unable to find several dependency packages. You should determine which ones you want to include in your build and install the respective development packages. You may visit this manual page for an overview of the various dependencies.

If you are on Ubuntu, this command should cover the most frequently used third-party packages:

sudo apt-get install build-essential pkg-config fakeroot python3-dev libpng-dev libjpeg-dev libtiff-dev zlib1g-dev libssl-dev libx11-dev libgl1-mesa-dev libxrandr-dev libxxf86dga-dev libxcursor-dev bison flex libfreetype6-dev libvorbis-dev libeigen3-dev libopenal-dev libode-dev libbullet-dev nvidia-cg-toolkit libgtk2.0-dev libassimp-dev libopenexr-dev

Once Panda3D has built, you can either install the .deb or .rpm package that is produced, depending on which Linux distribution you are using. For example, to install the package on Debian or Ubuntu, use this:

sudo dpkg -i panda3d*.deb

If you are not using a Linux distribution that supports .deb or .rpm packages, you may have to use the installpanda.py script instead, which will directly copy the files into the appropriate locations on your computer. You may have to run the ldconfig tool in order to update your library cache after installing Panda3D.

Alternatively, you can add the --wheel option, which will produce a .whl file that can be installed into a Python installation using pip.

macOS

On macOS, you will need to download a set of precompiled thirdparty packages in order to compile Panda3D, which can be acquired from here.

After placing the thirdparty directory inside the panda3d source directory, you may build Panda3D using a command like the following:

python makepanda/makepanda.py --everything --installer

You may target a specific minimum macOS version using the --osxtarget flag followed by the release number, eg. 10.9 or 10.14.

If the build was successful, makepanda will have generated a .dmg file in the source directory containing the installer. Simply open it and run the package file in order to install the SDK onto your system.

FreeBSD

Building on FreeBSD is very similar to building on Linux. You will need to install the requisite packages using the system package manager. To install the recommended set of dependencies, you can use this command:

pkg install pkgconf bison png jpeg-turbo tiff freetype2 harfbuzz eigen squish openal opusfile libvorbis libX11 mesa-libs ode bullet assimp openexr

You will also need to choose which version of Python you want to use. Install the appropriate package for it (such as python37 or python38) and run the makepanda script with your chosen Python version:

python3.7 makepanda/makepanda.py --everything --installer --no-egl --no-gles --no-gles2

If successful, this will produce a .pkg file in the root of the source directory which you can install using pkg install.

Android

Note: building on Android is very experimental and not guaranteed to work.

You can experimentally build the Android Python runner via the termux shell. You will need to install Termux and Termux API from the Play Store. Many of the dependencies can be installed by running the following command in the Termux shell:

pkg install python ndk-sysroot clang bison freetype harfbuzz libpng eigen openal-soft opusfile libvorbis assimp libopus ecj dx patchelf aapt apksigner libcrypt openssl pkg-config

Then, you can build the .apk using this command:

python makepanda/makepanda.py --everything --target android-21 --no-tiff --installer

You can install the generated panda3d.apk by browsing to the panda3d folder using a file manager. You may need to copy it to /sdcard to be able to access it from other apps.

To launch a Python program from Termux, you can use the run_python.sh script inside the panda/src/android directory. It will launch Python in a separate activity, load it with the Python script you passed as argument, and use a socket for returning the command-line output to the Termux shell. Do note that this requires the Python application to reside on the SD card and that Termux needs to be set up with access to the SD card (using the termux-setup-storage command).

Running Tests

Install PyTest and run the pytest command. If you have not installed Panda3D, you will need to configure your environment by pointing the PYTHONPATH variable at the built directory. On Linux, you will also need to point the LD_LIBRARY_PATH variable at the built/lib directory.

As a convenience, you can alternatively pass the --tests option to makepanda.

Reporting Issues

If you encounter any bugs when using Panda3D, please report them in the bug tracker. This is hosted at:

https://github.com/panda3d/panda3d/issues

Make sure to first use the search function to see if the bug has already been reported. When filling out a bug report, make sure that you include as much information as possible to help the developers track down the issue, such as your version of Panda3D, operating system, architecture, and any code and models that are necessary for the developers to reproduce the issue.

If you're not sure whether you've encountered a bug, feel free to ask about it in the forums or the IRC channel first.

Supporting the Project

If you would like to support the project financially, visit our campaign on OpenCollective. Your contributions help us accelerate the development of Panda3D.

For the list of backers, see the BACKERS.md file or visit the Sponsors page on our web site. Thank you to everyone who has donated!

Gold Sponsors

Owner
Panda3D
Panda3D is an open-source, cross-platform game engine designed for Python and C++ programming.
Panda3D
Comments
  • Display information inaccurate under Ubuntu

    Display information inaccurate under Ubuntu

    Under Ubuntu 18.04.2, "base.pipe.getDisplayInformation()" returns only a single available display mode, and that seems to match the full "desktop area" of the system--even when that spans two monitors.

    (I had thought that this was specific to a dual-(or perhaps multi-)monitor setup, but quickly unplugging my HDMI cable suggests that it still occurs with only a single monitor present.)

    When using a dual-monitor setup, the single available display mode is larger than either monitor alone--indeed, its horizontal resolution seems to be the sum of the horizontal resolutions of the two monitors.

    That is, with my laptop monitor having a resolution of 1366x768, and my external monitor having a resolution of 1280x1024, calling "print (base.pipe.getDisplayWidth(), base.pipe.getDisplayHeight())" produces the output "2646 1058".

    It is possible that this is an issue on my side--a bad driver, or some such. I'm using a Dell Inspiron 15 laptop with a GeForce 840M/PCIe/SSE2, and proprietary drivers installed.

    A simple program that shows the issue on my machine:

    from direct.showbase import ShowBase as showBase
    
    class game(showBase.ShowBase):
    
        def __init__(self):
            showBase.ShowBase.__init__(self)
    
            self.accept("escape", self.userExit)
    
            info = base.pipe.getDisplayInformation()
            print (info.getTotalDisplayModes())
            print (info.getDisplayModeWidth(0), info.getDisplayModeHeight(0))
            print (base.pipe.getDisplayWidth(), base.pipe.getDisplayHeight())
    
    app = game()
    app.run()
    
  • Having a significant amount of Actors causes massive fps dropage

    Having a significant amount of Actors causes massive fps dropage

    In games like Toontown, having as much as like 8 toons in the area, causes the fps to go down from what would be normally around 80-90 in an area, down to about 30. This is the biggest place the engine needs optimization in if you ask me.

  • ((Dtool_PyInstDef *)self)->_signature not defined when creating ShowBase

    ((Dtool_PyInstDef *)self)->_signature not defined when creating ShowBase

    Running the demo shader-terrain with valgrind, he complains that "Conditional jump or move depends on uninitialised value(s)". Apparently this is caused by : ((Dtool_PyInstDef *)self)->_signature not being defined for some object. (used in py_panda.h in DtoolInstance_Check() )

    I tried to remove as much code as possible from the demo, and in fact just creating the ShowBase object already triggers the error:

    from direct.showbase.ShowBase import ShowBase demo = ShowBase()

  • Physics Crash: Force-related vector holding “not a number”

    Physics Crash: Force-related vector holding “not a number”

    Every so often–very seldom, in fact–and usually when something else is going wrong (such as extraneous circumstances causing an extremely low frame-rate) a crash occurs in what seems to be physics logic.

    I only have the most recent such crash to hand, I think, and it’s been long enough since the last one that I don’t know whether it was the same.

    That said, here is that most-recent crash:

    Traceback (most recent call last):
      File "/usr/local/lib/python3.6/dist-packages/direct/showbase/ShowBase.py", line 1815, in updateManagers
        self.physicsMgr.doPhysics(dt)
    AssertionError: !child_vector.is_nan() at line 59 of panda/src/physics/linearForce.cxx
    Traceback (most recent call last):
      File "GameCore.py", line 1471, in <module>
        gameFramework.run()
      File "/usr/local/lib/python3.6/dist-packages/direct/showbase/ShowBase.py", line 3152, in run
        self.taskMgr.run()
      File "/usr/local/lib/python3.6/dist-packages/direct/task/Task.py", line 537, in run
        self.step()
      File "/usr/local/lib/python3.6/dist-packages/direct/task/Task.py", line 491, in step
        self.mgr.poll()
      File "/usr/local/lib/python3.6/dist-packages/direct/showbase/ShowBase.py", line 1815, in updateManagers
        self.physicsMgr.doPhysics(dt)
    AssertionError: !child_vector.is_nan() at line 59 of panda/src/physics/linearForce.cxx
    

    As you can see, the issue seems to occur in “doPhysics”, and seems to result from some vector being “not a number”.

    My project uses Bullet for physics, rather than Panda's internal physics system--but it does also use particles, and so enables Panda's physics.

    I'm afraid that I don't currently have a reliable way to reproduce this issue. (Which is a bit of a concern for me, too, as it means that I don't know how to test whether the issue is still present, or whether any of my own code is prompting it.)

    This comes from a thread on the forum, linked here: https://discourse.panda3d.org/t/physics-crash-force-related-vector-holding-not-a-number

    (It's been pointed out to me that the physics-manager indicated in the error above does seem to be related to the call to "enableParticles", so I've retracted my expression of suspicion that the issue might be Bullet-related.)

  • Unable to install in default location on Catalina

    Unable to install in default location on Catalina

    Attempting to click the continue button on the install location screen results in this message from Catalina which promptly closes the installer.

    This package is incompatible with  this version of macOS.
    The version is trying to install content to the system volume. Contact the software manufacturer for assistance
    

    Quick surface look suggests this is because Catalinas system volume is read only with only a few links to its secondary partition that is read/write. Currently if you do not have more then one drive in your Mac machine you cannot install Panda with anything other then pip.

  • Loading an .egg file using load_sync causes buffer overrun

    Loading an .egg file using load_sync causes buffer overrun

    Using environment:

    • Windows 10
    • Panda version 1.9.4
    • Visual Studio Community 2015
    • Visual C++ 2015

    I have a project that was set up as described in the Panda3D manual here.

    Within the project, the load_sync call as shown below consistently produces a buffer overrun once the calling function returns. When placed in a a main() by itself, it sometimes causes a heap corruption. This heap corruption also occasionally occurs within the larger application.

    Loader* loader = new Loader();
    PT(PandaNode) node = loader->load_sync("/c/collision/models/box.egg");
    

    The buffer overrun is caught by the GS buffer security check. The error messages are below.

    Unhandled exception at 0x7717D95C (ntdll.dll) in myProject.exe: 0xC0000374: A heap has been corrupted (parameters: 0x771A0878). Unhandled exception at 0x003C12A4 in myProject.exe: Stack cookie instrumentation code detected a stack-based buffer overrun.

  • Unable to compile on big sur using opencv and fmod third party packages

    Unable to compile on big sur using opencv and fmod third party packages

    Description

    I expected it to compile but it fails.

    Version: 1.11.0
    Platform: macosx-10.16-x86_64
    Using Python 3.8 build located at /Library/Frameworks/Python.framework/Versions/3.8/Headers
    Using compiler: GCC
    Host OS: darwin
    Host arch: x86_64
    Target OS: darwin
    Target arch: x86_64
    System library search path:
      /usr/lib
      /usr/local/lib
      /Library/Developer/CommandLineTools/usr/lib/clang/12.0.0
    System include search path:
      /usr/local/include
      /Library/Developer/CommandLineTools/usr/include/c++/v1
      /Library/Developer/CommandLineTools/usr/lib/clang/12.0.0/include
      /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include
      /Library/Developer/CommandLineTools/usr/include
    Using thirdparty directory: thirdparty/darwin-libs-a/
    Couldn't find library libfftw3
    Couldn't find header file fftw.h
    WARNING: Could not locate thirdparty package fftw, excluding from build
    Couldn't find the framework OpenGLES
    Couldn't find library libGLESv1_CM
    Couldn't find header file GLES/gl.h
    WARNING: Could not locate thirdparty package gles, excluding from build
    Couldn't find library libGLESv2
    Couldn't find header file GLES2/gl2.h
    WARNING: Could not locate thirdparty package gles2, excluding from build
    Couldn't find library libEGL
    Couldn't find header file EGL/egl.h
    WARNING: Could not locate thirdparty package egl, excluding from build
    WARNING: Could not locate pkg-config package gtk+-2.0, excluding from build
    Writing built/pandac/extension_native_helpers.py
    Removing file built/Frameworks/Cg.framework/Cg
    Removing file built/Frameworks/Cg.framework/Resources
    Removing file built/Frameworks/Cg.framework/Versions/Current
    Removing file built/Frameworks/Cg.framework/Headers
    Removing file built/lib/libopencv_highgui.2.4.dylib
    install_name_tool -id @loader_path/../lib/libopencv_core.2.4.3.dylib built/lib/libopencv_core.2.4.3.dylib
    error: /Library/Developer/CommandLineTools/usr/bin/install_name_tool: in swap_object_headers(): malformed load command 0 (cmdsize not a multiple of 4)
    fatal error: /Library/Developer/CommandLineTools/usr/bin/install_name_tool: internal error: swap_object_headers() failed
    Process exited with exit status 0 and signal code 1
    Storing dependency cache.
    Elapsed Time: 1 sec
    The following command returned a non-zero value: install_name_tool -id @loader_path/../lib/libopencv_core.2.4.3.dylib built/lib/libopencv_core.2.4.3.dylib
    Build terminated.
    
    

    Steps to Reproduce

    The latest commit the source I use is from september 1st,. So checkout 6c8066bb619d263527e870c4a8148201ba9e3a3a then try to compile on big sur.

    Environment

    • Operating system: Mac OS 11.0, Macbook Air 2017
    • System architecture: 64 bit
    • Panda3D version: 1.11.0
    • Installation method: built from source
    • Python version (if using Python): python 3.8.6
    • Compiler (if using C++): clang 6.0 i believe
  • Unable to install panda3d with pipenv on macOS 11

    Unable to install panda3d with pipenv on macOS 11

    Description

    Hi there, I'm having trouble installing panda3d using pipenv. I was hoping to try out Ursina Engine but the installation keeps failing for panda3d.

    Even if I try to explicitly install panda3d==1.10.9 I have the same problem.

    The error I see is:

    Installing panda3d==1.10.9...
    Error:  An error occurred while installing panda3d==1.10.9!
    Error text: 
    ERROR: Could not find a version that satisfies the requirement panda3d==1.10.9 (from -r /var/folders/v7/l6w8wpbs7g5d3q3w6p4_c8dw0000gn/T/pipenv-rl3r4pyi-requirements/pipenv-zd_sbelv-requirement.txt (line 1)) (from versions: none)
    ERROR: No matching distribution found for panda3d==1.10.9 (from -r /var/folders/v7/l6w8wpbs7g5d3q3w6p4_c8dw0000gn/T/pipenv-rl3r4pyi-requirements/pipenv-zd_sbelv-requirement.txt (line 1))
    
    ✘ Installation Failed 
    

    Steps to Reproduce

    To reproduce this, you'll have to have pipenv installed and Python 3.8.8.

    Then run:

    $ pipenv install "panda3d==1.10.9"
    

    Environment

    • Operating system: MacOS 11.2.3 (20D91)
    • Panda3D version: Trying to install 1.10.9
    • Installation method: (eg. pip, wheel, SDK, built from source) pipenv
    • Python version (if using Python): 3.8.8
    • Compiler (if using C++): N/A
  • Python 3 Datagram invalid start byte

    Python 3 Datagram invalid start byte

    When using datagrams with valid data in them on Python 3 any call to get_message results in the following error

    UnicodeDecodeError: 'utf-8' codec can't decode byte 0x84 in position 10: invalid start byte
    
  • Video driver reports shaders are not supported M1 macOS.

    Video driver reports shaders are not supported M1 macOS.

    Description

    I've been trying to implement shadow mapping and bloom filters with an M1 MacBook Pro 13 with no success. When trying to run the example shadows (provided by panda3d team) a message is displayed that says: Shadow Demo: Video driver reports that shaders are not supported. Which is activated by the function base.win.getGsg().getSupportsBasicShaders()

    Screen Shot 2021-03-28 at 18 02 44

    Steps to Reproduce

    I currently have installed panda3d version 1.11.0.dev1953 In a M1 apple device run the basic.py script located in the samples folder.

    Environment

    • Operating system: macOS Big Sur 11.2.3
    • System architecture: Apple M1
    • Panda3D version: 1.11.0.dev1953
    • Installation method: pip3 install --pre --extra-index-url https://archive.panda3d.org/ panda3d
    • Python version (if using Python): Python 3.9.2
    • Compiler (if using C++): No
  • Simpler particle birth-offset, and again plus a

    Simpler particle birth-offset, and again plus a "_tics_since_birth" getter

    As with #766, this pull request is intended to allow one to start a particle effect with a slight offset to particle birthing.

    However, where that previous version introduced a new variable, "_initial_birth_offset", this one makes do without. Instead, it modifies the "soft_start" method to take an optional parameter that is used in setting "_tics_since_birth", where before it was being set to "0.0f", if I'm not much mistaken.

    The optional parameter has a default value of "0.0f", intended to result in extant code still producing the same effects.

    There are then similar changes to related Python classes, allowing this offset to be passed in to the C++ "soft_start" method.

    And as before, a "getter" method has been exposed to allow querying of the "_tics_since_birth" variable.

    Finally, a simple demonstrative program for these changes:

    from direct.showbase.ShowBase import ShowBase
    from direct.particles.ParticleEffect import ParticleEffect
    from panda3d.core import Vec4
    
    class Game(ShowBase):
    
        def __init__(self):
            ShowBase.__init__(self)
            self.enableParticles()
            self.win.setClearColor(Vec4(0, 0, 0, 1))
    
            self.accept("escape", base.userExit)
    
            self.basicEffect = ParticleEffect()
            self.basicEffect.loadConfig("testParticles.ptf")
            self.basicEffect.setPos(0.75, 5, -0.3)
    
            self.offsetEffect = ParticleEffect()
            self.offsetEffect.loadConfig("testParticles.ptf")
            self.offsetEffect.setPos(-0.75, 5, -0.3)
    
            self.basicEffect.start(parent = render, renderParent = render)
            self.offsetEffect.start(parent = render, renderParent = render)
            
            print (self.offsetEffect.getParticlesList()[0].getTicsSinceBirth())
    
            self.offsetEffect.softStart(firstBirthOffset = -0.25)
    
            print (self.offsetEffect.getParticlesList()[0].getTicsSinceBirth())
    
    app = Game()
    app.run()
    

    "testParticles.ptf" is the same as in the previous version, being is a simple point-particle effect:

    self.reset()
    self.setPos(0.000, 0.000, 0.000)
    self.setHpr(0.000, 0.000, 0.000)
    self.setScale(1.000, 1.000, 1.000)
    p0 = Particles.Particles('particles-1')
    # Particles parameters
    p0.setFactory("PointParticleFactory")
    p0.setRenderer("PointParticleRenderer")
    p0.setEmitter("SphereSurfaceEmitter")
    p0.setPoolSize(1024)
    p0.setBirthRate(2.0000)
    p0.setLitterSize(100)
    p0.setLitterSpread(0)
    p0.setSystemLifespan(0.0000)
    p0.setLocalVelocityFlag(1)
    p0.setSystemGrowsOlderFlag(0)
    # Factory parameters
    p0.factory.setLifespanBase(0.5000)
    p0.factory.setLifespanSpread(0.0000)
    p0.factory.setMassBase(1.0000)
    p0.factory.setMassSpread(0.0000)
    p0.factory.setTerminalVelocityBase(400.0000)
    p0.factory.setTerminalVelocitySpread(0.0000)
    # Point factory parameters
    # Renderer parameters
    p0.renderer.setAlphaMode(BaseParticleRenderer.PRALPHAOUT)
    p0.renderer.setUserAlpha(1.00)
    # Point parameters
    p0.renderer.setPointSize(1.00)
    p0.renderer.setStartColor(Vec4(1.00, 1.00, 1.00, 1.00))
    p0.renderer.setEndColor(Vec4(1.00, 1.00, 1.00, 1.00))
    p0.renderer.setBlendType(PointParticleRenderer.PPONECOLOR)
    p0.renderer.setBlendMethod(BaseParticleRenderer.PPNOBLEND)
    # Emitter parameters
    p0.emitter.setEmissionType(BaseParticleEmitter.ETRADIATE)
    p0.emitter.setAmplitude(1.0000)
    p0.emitter.setAmplitudeSpread(0.0000)
    p0.emitter.setOffsetForce(Vec3(0.0000, 0.0000, 1.0000))
    p0.emitter.setExplicitLaunchVector(Vec3(1.0000, 0.0000, 0.0000))
    p0.emitter.setRadiateOrigin(Point3(0.0000, 0.0000, 0.0000))
    # Sphere Surface parameters
    p0.emitter.setRadius(0.1000)
    self.addParticles(p0)
    

    Screenshot from 2019-11-01 21-37-47

  • Texture loading issues

    Texture loading issues

    Description

    I'm working on a project that uses Panda3D for the engine. Upon pulling changes since commit d7717727e7f32148b4a7f3a3075d1ac75b33c1ae and building from source, our project noticed that after running our game for a bit, textures would end up looking off, as if we were using low-res textures. I was also able to reproduce something similar in Roaming Ralph. Before our project pulled the latest changes, this issue would only happen rarely, if at all.

    Steps to Reproduce

    The easiest way to reproduce this is to edit main.py for the Roaming Ralph sample, and adding the following lines to the top of the file:

    from panda3d.core import loadPrcFileData
    loadPrcFileData('', 'graphics-memory-limit 1048576') # use any small value here to speed up the reproduction of the bug
    

    After doing that, run Roaming Ralph, and start moving Ralph and the camera around a bit (in such a way that the trees and boulders are no longer in scene, then reloaded into it).

    Environment

    • Operating system: Any
    • System architecture: Any
    • Panda3D version: 1.11.0
    • Installation method: built from source
    • Python version (if using Python): Any
    • Compiler (if using C++): Any
  • Sanity of DirectGUI properties

    Sanity of DirectGUI properties

    Description

    Some properties of DirectGUI widgets are not always returning sane defaults or expected results

    Problematic properties are: |Property|Problem| |-|-| | frameSize | If not explicitly defined it will return None even if a visible frame is there | | image | can be defined as string but will return an object (loaded image) | | geom | can be defined as string but will return an object (loaded geom) |

    Will update the list as I come across others.

    Use Case

    Having the ability to get a sane value for all properties will simplify the use of DirectGUI and make it less unpredictable. Especially the frameSize property can be used to easily calculate positions programmatically when placing things next to each other without having to rely on bounds which may also not include border and padding at the end or may not be set at all.

  • Designer friendly GUI modelling language

    Designer friendly GUI modelling language

    Description

    At the moment DirectGUI is created via a code only setup. While it is not that hard for a developer to create GUIs in such a way, it will not be the preferred way for designers which may be more keen to things like xml, html, json or the like.

    How exactly a standardized design language for Panda3D could look like will be up for discussion. Inspiration can probably be drawn by the many existing UI toolkits that are available like GTK, Qt, etc.

    Use Case

    Having a dedicated design language will aside of attracting and help more designers, also simplify creating visual editors tailored for ones application or general GUI designers like my DirectGUI Designer which currently uses a custom JSON format.

  • DirectGUI non-mouse interactability

    DirectGUI non-mouse interactability

    Description

    Introducing a system that enable DirectGUI to be used with all input methods provided by Panda3D, not only the mouse and (in some cases like text entries) keyboard.

    This system should not interfere with existing behaviors and application hence either be implemented for Panda3D 2 or as non-breaking change with the need for it to be explicitly activated by the developer.

    Due to the complexity of UIs that can be created with DirectGUI, there has to be made a few considerations while implementing this feature.

    1. There should be a simple to use default behavior, probably similar to exiting modern GUI toolkits with tabstop definitions and a way to define what input will trigger UI navigation
    2. For more complex UIs navigation should be customizable for example if the navigation doesn't follow a linear but more tree like path
    3. If possible, at best this feature has to be implemented in the core PG system to be available for all UI widgets, even if they are custom ones and also from the C++ side of Panda3D

    Use Case

    Navigating GUIs created within Panda3D with other input methods than the Mouse will help make the engine and games developed by the engine more controller/keyboard friendly and also simplifies developing accessible applications for people unable to use the mouse.

  • DirectGUI Property overhaul

    DirectGUI Property overhaul

    Description

    The property definition for DirectGUI elements is a very flexible and easy to use system though there are things that should be enhanced.

    Those points are most problematic and partly are intertwined

    1. Not all properties can be used through the index style referencing. Most prominent here are the ones defined as initopt (see list below), but also others like the entered text in a DirectEntry.

    Unable to get and/or set through properties |Property/Description|Widgets| |-|-| |Entered text|DirectEntry| |sort|Any| |transparency|Any|

    1. Some properties can only be set during initialization. Ideally all properties can be changed after initialization. For some properties this may require special update methods to correctly handle the changed value. Others may just require a mapping to already existing methods. In the end this will make the work with DirectGUI much more predictable and friendly for programmatic changes to the UI.

    A list of DGG.INITOPT properties: |property|widgets| |-|-| |pressEffect|DirectButton, DirectCheckBox, DirectOptionMenu| |guiId|DirectGuiWidget| |pos|DirectGuiWidget| |hpr|DirectGuiWidget| |scale|DirectGuiWidget| |color|DirectGuiWidget| |suppressMouse|DirectGuiWidget| |suppressKeys|DirectGuiWidget| |enableEdit|DirectGuiWidget| |buttonTextList|DirectDialog, *Dialog| |buttonGeomList|DirectDialog| |buttonImageList|DirectDialog| |buttonValueList|DirectDialog, *Dialog| |buttonHotKeyList|DirectDialog| |buttonSize|DirectDialog| |topPad|DirectDialog| |midPad|DirectDialog| |sidePad|DirectDialog| |buttonPadSF|DirectDialog| |entryFont|DirectEntry| |initialText|DirectEntry| |initialitem|DirectOptionMenu| |itemsAlign|DirectScrolledList| |itemsWordwrap|DirectScrolledList|

    Use Case

    Aside of simplifying the use of DirectGUI as a whole, this will also benefit developers who want to programmatically change GUI widgets. It will also greatly simplify workarounds I had to create for the DirectGUI designer.

  • Support for PlayStation Gamepad

    Support for PlayStation Gamepad

    Description

    There doesn't seem to be support for PlayStation controllers ( ie Dualshock 4)

    Use Case

    When I connect a PlayStation Controller and open the Device Tester sample, the controler is recognized as "Wireless Controller" but does not accept any input.

A powerful free cross-platform RTS game engine

Spring RTS game engine README Spring (formerly TASpring) is an Open Source Real Time Strategy game engine. Visit our project homepage for help, sugges

Aug 17, 2022
Open-source, cross-platform, C++ game engine for creating 2D/3D games.

GamePlay v3.0.0 GamePlay is an open-source, cross-platform, C++ game framework/engine for creating 2D/3D mobile and desktop games. Website Wiki API De

Aug 11, 2022
KlayGE is a cross-platform open source game engine with plugin-based architecture.

KlayGE KlayGE is a cross-platform open source game engine with plugin-based architecture. It's started since 2003. The explicit goal of KlayGE is: to

Aug 8, 2022
One framework for creating powerful cross-platform games.

MonoGame One framework for creating powerful cross-platform games. The spiritual successor to XNA with thousands of titles shipped across desktop, mob

Aug 6, 2022
OpenMW is an open-source open-world RPG game engine that supports playing Morrowind.

OpenMW is an open-source open-world RPG game engine that supports playing Morrowind.

Aug 15, 2022
Improved version of the X-Ray Engine, the game engine used in the world-famous S.T.A.L.K.E.R. game series by GSC Game World.
Improved version of the X-Ray Engine, the game engine used in the world-famous S.T.A.L.K.E.R. game series by GSC Game World.

OpenXRay OpenXRay is an improved version of the X-Ray Engine, the game engine used in the world-famous S.T.A.L.K.E.R. game series by GSC Game World. S

Aug 10, 2022
Minetest is an open source voxel game engine with easy modding and game creation

Minetest is an open source voxel game engine with easy modding and game creation

Aug 14, 2022
CRYENGINE is a powerful real-time game development platform created by Crytek.

CRYENGINE This repository houses the source code for CRYENGINE. Instructions on getting started with git can be found here, along with details on work

May 10, 2022
Game Engine that is being developed by a computer science student using C and OpenGL

Project LOGLE Contents About the Project Project Status Known Issues Setup ?? About Game Engine that is being developed by a computer science student

Jan 21, 2022
Intrinsic is a Vulkan based cross-platform game and rendering engine
Intrinsic is a Vulkan based cross-platform game and rendering engine

Intrinsic is a Vulkan based cross-platform game and rendering engine

Jul 31, 2022
Free, cross-platform 2D game engine powered by Haxe and OpenFL
Free, cross-platform 2D game engine powered by Haxe and OpenFL

flixel | addons | ui | demos | tools | templates | docs | haxeflixel.com Links Here are the most important links to get you started with HaxeFlixel: G

Aug 14, 2022
A cross-platform 2D game engine

nCine nCine is a cross-platform 2D game engine. It is released under the MIT License, Copyright (c) 2011-2021 Angelo Theodorou. For additional informa

Aug 10, 2022
CSEngine is a cross-platform 3D game engine.
CSEngine is a cross-platform 3D game engine.

CSEngine - Cross Platform C++ Game Engine CSEngine is a cross-platform 3D game engine. ?? As it is under development, it is not yet suitable for pract

Jun 27, 2022
The Atomic Game Engine is a multi-platform 2D and 3D engine with a consistent API in C++, C#, JavaScript, and TypeScript
The Atomic Game Engine is a multi-platform 2D and 3D engine with a consistent API in C++, C#, JavaScript, and TypeScript

The Atomic Game Engine is a multi-platform 2D and 3D engine with a consistent API in C++, C#, JavaScript, and TypeScript

Aug 16, 2022
Godot Engine – Multi-platform 2D and 3D game engine
Godot Engine – Multi-platform 2D and 3D game engine

Godot Engine 2D and 3D cross-platform game engine Godot Engine is a feature-packed, cross-platform game engine to create 2D and 3D games from a unifie

Aug 14, 2022
Flax Engine – multi-platform 3D game engine
Flax Engine – multi-platform 3D game engine

Flax Engine – multi-platform 3D game engine

Aug 10, 2022
CLUSEK-RT is a complex game engine written in C++ and the successor of the CLUSEK game engine
CLUSEK-RT is a complex game engine written in C++ and the successor of the CLUSEK game engine

CLUSEK-RT is a complex game engine written in C++ and the successor of the CLUSEK game engine. This engine has been designed with a cross-platform design in mind. Thanks to Vulkan API it delivers a next-gen experience with ray tracing to both Linux and Windows platforms

Jul 28, 2022
Ground Engine is an easy to use Game Engine for 3D Game Development written in C++
Ground Engine is an easy to use Game Engine for 3D Game Development written in C++

Ground Engine is an easy to use Game Engine Framework for 3D Game Development written in C++. It's currently under development and its creation will b

Aug 10, 2022
Rogy-Engine- - My 3D game engine source code.
Rogy-Engine- - My 3D game engine source code.

Rogy-Engine Development My 3D game engine. (NOT THE FINAL VERSION- Windows only) Features: PBR shading and reflection probes with parallax correction.

Jun 18, 2022