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 !
![](../../_images/bsf/1/miniature_9.jpeg)
![](../../_images/miniature_mini_shader.png)
Voici la première version stable (0.1) de Soya 3D 3 ! Soya est un moteur 3D pour Python 3.
Les nouveautés les plus marquantes sont les suivantes :
Support de Python 3.4 et Blender 2.70
Vertex shaders et pixel shaders ( plus d'information ici)
Meilleurs performances : le processus de rendu a été entièrement réécrit, en utilisant les 'vertex buffer object' (VBO)
Éclairage et cell-shading par pixel
Antialiasing plein écran (Fullscreen antialiasing)
Licence GPL v3
Soya 3D version 3 sur Bitbucket !
![](../../_images/bsf/1/miniature_4.jpeg)
![](../../_images/miniature_mini_shader.png)
Soya est un moteur 3D pour Python. La première version de Soya a été utilisée dans plusieurs jeux et notamment Slune, Balazar et Balazar Brother. Plusieurs tentatives de seconde version n'ont pas donné grand chose, principalement faute de temps. Aujourd'hui, voici venir la version 3 dont les sources sont disponibles sur Bitbucket !
Les nouveautés les plus marquantes sont les suivantes :
Support de Python 3.4 et Blender 2.70
Vertex shaders et pixel shaders : Soya divise les shaders en pas moins de 20 'mini-shaders', ce qui permet de modifier une partie spécifique du rendu sans avoir à s'occuper du reste; de plus Soya accepte une syntaxe pythonique pour l'écriture des shaders !
Meilleurs performances : le processus de rendu a été entièrement réécrit, en utilisant les 'vertex buffer object' (VBO)
Éclairage et cell-shading par pixel
Antialiasing plein écran (Fullscreen antialiasing)
Licence GPL v3
Voici un exemple de mini-shader permettant de déformer un modèle 3D avec des "vagues" verticales. La déformation se fait dans le système de coordonnées de la caméra, c'est donc un "camera-space deform mini shader" selon la terminologie de Soya. La déformation dépend du paramètre temps (self.time) qui est mis à jour automatiquement par Soya.
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) """) my_body.add_mini_shader(wavy_mini_shader())
Ces mini-shaders permettent de réécrire une étape bien spécifique du rendu, Soya se chargeant ensuite de les rassembler pour créer les vertex et pixel shaders, ainsi que de les compléter avec les morceaux manquants si nécessaires (En effet, OpenGL ne permet normalement pas de réécrire qu'une partie du processus de rendu -- soit vous n'y touchez pas, soit vous réécrivez tout !). La série de tutoriels "mini-shader-xxx" dans les sources de Soya proposent d'autres exemples.
Les sources de la version de développement de Soya 3 sont disponibles sur Bitbucket. Cette version n'a pour l'instant été testée que sous Linux ; elle devrait cependant pouvoir se compiler sur les principales plateformes. Enfin, les premières images d'un projet secret de jeu utilisant Soya 3 peuvent être vues ici : Projet secret.
Projet secret
Serait-ce les premières images d'un projet secret ? Un nouveau jeu avec le moteur Soya 3D peut-être...?
![](../../_images/bsf/1/miniature_1.jpeg)
![](../../_images/bsf/1/miniature_2.jpeg)
![](../../_images/bsf/1/miniature_7.jpeg)
![](../../_images/bsf/1/miniature_9.jpeg)
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) """) my_body.add_mini_shader(wavy_mini_shader())
![../../_images/mini_shader.png](../../_images/mini_shader.png)
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: http://hg.tuxfamily.org//mercurialroot/oomadness/soya2.
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 0.9.6.2 (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 speed-1.py tuto
Fog was activated by error on partial camera with no atmosphere
Fix descender computation in font
Fix ODE on terrain (tuto ode-collision-8-terrain.py)
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 :
![](../../_images/miniature_gui1.png)
![](../../_images/miniature_gui2.png)
![](../../_images/miniature_gui3.png)
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