Soya 3D is an object oriented “high level” 3D engine for Python. Somehow, Soya is to 3D what Python is to programming: an ‘avant garde’ 3D engine, a kind of ‘UFO’ in the 3D world :-). Soya allows to develop very rapidly games of other 3D apps, entirely in the Python language (contrary to most of the other engine, in which Python is limited to scripting tasks).

Moreover, Soya is easy to learn and offers pretty good performances.

Soya is used successfully in 3D games, but also in demos, scientific simulations, or educational programs (see application using Soya for screenshots).

Soya offers the features one can expect from a 3D engine, like basic scene management, cell-shading, shadows, particles systems,... as well as some unique features aiming at making 3D development easier and more rapid (see Soya’s feature).

Soya is Free Software, under the GNU GPL. Soya is written in Cython (a mix of C and Python) and in Python.

It requires :


Soya 3D 3-0.1!

Here is the first stable release (0.1) of Soya 3D 3! Soya is a 3D engine for Python 3.

The most strinking new features are:

  • Support for the latest Python 3.4 and Blender 2.70
  • Vertex shaders and pixel shaders (more information here)
  • Improved performance: the rendering process has been entirely rewritten, using vertex buffer object (VBO)
  • Fullscreen antialiasing
  • Per-pixel lighting and cellshading
  • GPL v3 license

Download Soya 3D 3-0.1!

Soya 3D version 3 on Bitbucket!

Soya is a 3D engine for Python. The first version of Soya was used in several games including Slune, Balazar and Balazar Brother. Several attempts for writing a second version failed, mainly due to lack of time. Today, the new upcoming version 3 is now available on Bitbucket!

The most strinking new features are:

  • Support for the latest Python 3.4 and Blender 2.70
  • Vertex shaders and pixel shaders : Soya divides shaders in no less than 20 mini-shaders, allowing to modify a specific part of the rendering without bothering with the rest; additionaly a Pythonic syntax can be used for writing shaders!
  • Improved performance: the rendering process has been entirely rewritten, using vertex buffer object (VBO)
  • Fullscreen antialiasing
  • Per-pixel lighting and cellshading
  • GPL v3 license

The development version of Soya 3 can be found on Bitbucket. This version has been tested only under Linux, but it should compile under all major platforms. First screenshots of a secret game project using Soya 3 can be seen here: Secret project.

Secret project

Is it the first images of a secret game project ? Possibly using the Soya 3D engine ?

Towards Soya 2.0

Soya 2.0 is coming!

The most striking feature of Soya 2.0 is mini shaders. They allow to write Open GL / GL SL shaders so easily! With GL SL, you have to rewrite the entire rendering pipeline, even if you want to modify only a small part of it...

On the contrary, with Soya’s mini shaders, you can write a mini shader that overrides a part of the rendering pipeline (ex customizing the lighting computation), or that adds an extra step in the rendering (ex deforming the model geometry). Then Soya assembles all mini shaders, adds the missing pieces of the rendering pipeline, and generates a GL SL shader.

Additionally, Soya’s mini shaders can be written with a Python-like syntax ;)

Soya provides 16 classes mini shaders, each corresponding to a specific part of the rendering pipeline. Here is an example of a “camera-space deform” mini shader, which deforms the model’s geometry in camera space:

wavy_mini_shader = soya.MiniShader("wavy", """
uniform float self.time
def void cameraspace_deform_mini_shader():
  current_vertex.x = current_vertex.x + 0.2 * sin(0.2 * self.time + 3 * current_vertex.y)


Mini shaders can be associated to any object: a Model, a Body (an instance of Model), a World (a group of other 3D object) or a Material. When associating a mini shader to a World, it is inherited by all objects inside this World, and automagically combined with objects’ own mini shaders. For more details about mini shaders, see the mini-shader-* tutos!

Want to try and start hacking with Soya 2? You’re welcome! The development version can be obtained on this mercurial repository:

Other new features include:

  • Support both Python 2.7 and 3.3,
  • Open GL SL shader support,
  • new exporters for Blender 2.6x, with a bugfixed Blender => Cal3D exporter, able to take into account vertex location, normal and texture coords when merging vertices,
  • LOD support for models,
  • pre-rendered background, usefull for slow computer or old-style games,
  • Partial Open GL ES support (not yet finished).

Soya 0.15rc1 is out !

Soya 0.15rc1 is out !

Here is the Changelog :

  • January 2009 : Soya3D 0.15rc1
  • ODE 10 compatibility (required)
  • New collide property for lazer.
  • Quiet mode for soya initialisation and quit
  • New event management system. round event are now stored in main_loop.event and main_loop.raw_event.
  • New round_task attribut for main_loop.
  • Allow screenshot from backbuffer.
  • Allow to use WorldStep instead of WorldQuickStep for ODE iteration.
  • Allow None as angular_velocity, linear_velocity, torque, or force.
  • Allow None as hi_stop, lo_stop
  • Bugfixes
  • Fix delta_x and delta_y in coalesced event
  • Fix AngularMotorJoint API
  • soya initialisation now write in the common stdout and stderr
  • Fix font related segfault when soya wasn’t initialised
  • Fix Pudding MainLoop (thanks David Martinez)
  • Work-around for OpenAL bug for absolute sound sources

Soya 0.14 is out !

The new version of Soya, 0.14, is out. Here is the complete changelog for 0.14:

  • August 2008 : Soya3D 0.14
  • Improved the cell-shading algorithm, by anti-aliasing outlines and disabling normal lighting when cell-shading is used
  • Bugfixes:
  • When re-starting a MainLoop, define it as the current MainLoop (aka. soya.MAIN_LOOP)

Soya 0.14rc1 is out !

A new version of Soya, 0.14rc1, is out. This release includes many bugfixes and has been updated for latest release of Pyrex. It also includes a new GUI module called soya.gui (see the gui-* tutos for demo).

Here is the complete changelog:

  • January 2008 : Soya3D 0.14rc1
  • Allow the centre of mass of a Body to be anywhere in its local coordinate system (thanks Greg Ewing)
  • Improve tutorial README (thanks Jacques Rebourcier)
  • Update for Pyrex (thanks Greg Ewing)
  • Blender => Cal3D can now run with Python 2.3 (thanks Greg Ewing)
  • New GUI module soya.gui
  • Bugfixes:
  • Fix the weird segfaulting bug in terrain (thanks Souvarine)
  • Fix GL_INVALID_ENUM crash with the OSS ATI DRI driver (thanks Zoltan Dome)
  • Fix data/worldS and data/blender in the yet-in
  • Fix tuto
  • Fog was activated by error on partial camera with no atmosphere
  • Fix descender computation in font
  • Fix ODE on terrain (tuto

New Soya’s GUI preview

I’m currently working on a new widget system for Soya.

It will feature advanced widgets such as scroll panes or flying windows, as well as a nice automatic dimensioning system, even better than GTK and Tk ones !

For now, I’m focusing on the widget’s logic, and not on their graphical aspect.

The final goal being to add Soya’s support to EditObj 2, in order to be able to generate dialog boxes in Soya for editing various game objects. Can be usefull for game editor but also for many complex games (roleplaying games, strategy games,...). I’m precisely thinking about new game projects in that area.

Here are some screenshots using various styles :

Soya 0.13

Here is the final release of Soya 0.13 !

It is the first version that includes the works of our two Google Summer of Code student, Marmoute and Palle. I’ve also integrated the soya guide (the “Yet-in”) in the tutorial pack (since i’ve changed the licence to FDL without invariant, there is no longer any problem with reguard to Debian).

Changelog :

  • New ODE integration (thanks Marmoute!)

  • New Blender -> Cal3D exporter (thanks Palle!) The new exporter is now automatically used by the auto-exporter. It REQUIRES Blender >= 2.42

  • BSP system (work in progress, thanks Souvarine!)

  • CoordSyst.solid is no longer boolean, but a 32-bit-length bitfield (thanks Souvarine!)

  • Add RaypickContext.get_item() (thanks Souvarine)

  • Better font loading under MacOS X (thanks Greg Ewing)

  • Tofu integrated

  • CoordSystSpeed added

  • CoordSystState now support automatic coordinate system conversion (when used with interpolate()), and has a convert_to() method

  • Bugfixes:

    • Fixes crash on keycodes > 255, and allows Delete as well as Backspace for erasing characters, in pudding (thanks Greg Ewing)
    • Severals memory leaks have been fixed (in particular on Terrains and CoordSystStates)
    • soya.widget.default_font can now be saved as any other fonts
    • Mesh deformation were buged on cellshaded models
    • Compile with -fsigned-char because on Mac, chars are by default unsigned
    • The file caching neighbors was not cleaned when animated models were modifed