Very impressive work dude!
The engine is based on OpenGL. Version 1.5 is better to access some advanced features, but 1.1 should be supported as well. The renderer uses some common OpenGL extensions to improve the rendering speed though none of them are required. Be sure to install the latest OpenGL drivers for your accelerated graphic card: Almost the totality of the problems you can experience with APOCALYX is caused by old drivers rather than my code.
The OpenGL Shading language (GLSL) is fully supported. Almost every kind of object that appears on the scene may be rendered with vertex and fragment programs or the more advanced vertex and fragment shaders. When the graphic card does not support those features, multi-pass meshes with diffuse, gloss, environment and bump mapping is still possible.
Skies and Cloud Layers
The engine includes methods to render skies and cloud layers. Sky Boxes, Half Sky Boxes, Mirrored Sky Boxes, dynamic Sky Domes and Star Fields are available. Several backgrounds may be attached to the world at the same time specifying the required blending and orientation.
When it’s necessary to simulate the real night sky, it’s possible to use the functions of the Stellarium library. This planetarium applies astronomic algorithms to compute the position os stars and planets, improving the realism of scenes where an orientation based on real star positions is required.
The engine supports sun lens flares to improve the realism of outdoor scenes. This effect takes into account any occlusion, that prevents the sun to be seen by the camera, reading the Z buffer, so there is no need of particular object management to show or hide the lens flare.
The engine renders a simple kind of flat terrain. It can be opaque, transparent or reflective and animated textures may be attached to it.
Height Field Terrains
The engine includes also a more realistic kind of terrain realized through the use of height fields. The heights are defined using grayscale images. Two textures are applied: One that specifies the overall color of the complete surface, including shadows, and a detailed one that is tiled throughout. Height fields may increase their transparency downwards and a plane can trim the lowest triangles to create mirrored surfaces. A simple level of detail (LOD) is implemented.
The engine even includes a kind of terrain larger than height fields. Its pattern is repeated to fill a virtually infinite world. The heights are again defined using grayscale images with two applied textures perturbed by noise (two levels of detail for the terrain surface) and a color grid to specify overall color and shadowing.
The engine includes also a flat terrain that can be tiled with seamless textures. The pattern may be designed to repeat and fill a virtually infinite world.
The engine support a particular kind of terrain that simulates the presence of ocean waves. The renderer uses a technique based on FFT to compute the waves in a fast and realistic way.
Overlay with Multiple Viewports
An overlay is superimposed to the window opened on the main 3D world. The overlay can render texts, sprites and other 2D objects including viewports showing 3D worlds different from the main one.
Graphical User Interface
The engine includes three GUIs:
- “AntTweakBar” is a library that renders simple widgets useful to tweak variables and personalize several aspects of the scene;
- “GLGooey” is a library that implements a complete in-game graphical user interface;
- “IUP” is a library that implements a complete native graphical user interface.
The engine adds all the objects to be rendered to a scene graph and orders them according to their distance from the camera. The ordering is important to render opaque and transparent objects in a fast and safe way. When a BSP level is loaded, objects are rendered according to their position in the BSP tree for optimal performances.
The engine includes the possibility to render objects linked to each other. The definition of a hierarchy makes possible the articulation of complex movements. In particular MD2, MD3, MDL, Cal3D, and MS3D models provide support for easy animation.
The engine defines different types of textures, in particular collection of textures, that can be easily animated, cube maps and 3D textures.
Textures can be created procedurally applying a set of algorithms based on perlin noise.
Scene, AVI and Graphics Render to Texture
Textures can also be created from 3D scenes, AVI movies or even from scratch thanks to graphic primitives drawing functions. Textures built using these methods are not static but may be modified frame by frame or efficiently frozen to show a specific frame.
The engine defines the properties of different materials. You can specify ambient, diffuse, emissive and specular colors, and diffuse (texture for the diffuse color), gloss (texture that specify the reflection properties of the surface), environment (texture that reflects the environment around the mesh) and bump (texture that defines the bumpiness of the surface) mappings. In alternative, more complex programmable materials can be defined through the use of vertex and fragment program or GLSL vertex and fragment shaders.
As a heritage of the past, the engine supports also a basic form of bump mapping called emboss bump mapping. It is not a very realistic technique but it is fast on slower graphics card. The bumpiness is computed taking into account the nearest light source.
Sprites & Billboards
The engine renders couple of textured triangles is several ways according to their position in front of the camera. There are sprites, that always face the camera, and billboards that always face the camera rotating around a fixed axis. A particular type of billboard, the tree, adds a streching movement to simulate wind effects.
The engine includes two particle systems.
The simpler can interpolate, according to the life of a particle, parameters like: speed, acceleration, color, transparency and size, plus a circular movement for particular effects. A texture, even animated, the life length and a speed random factor are other parameters that can be specified.
Then, also the more complex Particle library is included in the engine. It provides a wide range of parameters, effects and several ways to render the particles.
3DS and OBJ Models Loader
The engine includes a loader for 3DS and OBJ files and converts them to static meshes.
MD2 Models Loader and Animator
The engine includes a loader for MD2 files (Quake2 animated models format) and can animate them.
MD3 Models Loader and Animator
The engine includes also a loader for MD3 files (Quake3 animated models format) and can animate them. Animation can be played even in reverse order.
Cal3D Models Loader and Animator
The engine supports skeletal animated models in Cal3D format thanks to the Character Animation Library included.
MDL Models Loader and Animator
The engine includes a loader for MDL files (Half-Life 1 animated models format) and can animate them. Animation can be played also in reverse order.
MS3D Models Loader and Animator
Also skeletal animated models in MS3D format are supported.
The engine renders planar shadows generated by a directional light shining on meshes and animated models.
BSP Levels Loader
The engine includes in addition a loader of BSP files (Quake3 levels format). The Quake3 shaders and the animated meshes of the scenes are not supported, but visibility information, light maps, light volumes, transparent textures and the bsp-tree collisions are.
Particle-Based Physics Simulator
The engine supports a particle based physics engine suitable for the simulation of flags, cloths, articulated, soft or rigid bodies.
ODE Physics Simulator
The engine supports a more traditional physics engine suitable for the simulation of articulated rigid bodies thanks to the Open Dynamics Engine included.
The engine detects collision between meshes thanks to the ColDet collision detection library.
The engine includes basic functions that perform 3D math computations.
The engine supports the LUA language (version 5.1) through an interface that expose all the most important functions of the engine. The LUA interface is the main way to access the engine functionalities, so no recompilation is needed to produce demos, games or 3D applications.
The engine includes the Tiny C compiler. It performs a very fast compilation of ANSI C sources, so time critical code can be loaded and compiled on the fly for fast execution just like a script is loaded and then more slowly interpreted.
In the speed of compiled C code or the instructions of the Tiny C inline assembler are not enough, the engine can load ELF object modules written with the flat assembler, a fast assembler with interesting features.
The engine supports also the C Scripting Language (CSL), the AngelScript language and the SMALL language. The latter manages the allocated memory and run step by step the scripts for a fine control of the execution. This features makes the development of Programming Games very easy. In particular, the bots’ AI can access the properties of the world in a fair way and matches that involve several teams can be replayed with the same exact results providing only the original seed for random numbers generation.
The engine includes a console from which it’s very easy to compile, execute and read the output of LUA scripts.
The MicroPather library is included to provide easy access to path finding using the A* algorithm.
The OperSpeer library is provided to implement steering and flocking behaviors.
Finite State Machines
The engine includes a mechanism to define and control Finite State Machines.
Networking functions are available through WinSock2, LuaSocket or Etwork.
Thanks to OpenAL, spatialized 3D sound is supported. The engine adds the capability to select the sounds to be played according to their loudness and distance from the listener. OpenAL supports also the functions to perform sound capture. In alternative, a version of the engine based on FMOD is available on request.
MIDI or OggVorbis soundtracks and MP3 playback are supported.
Thanks to eSpeak, text to speech is supported.
Simple DirectMedia Layer
The interface to SDL permits the access to CD-Rom drives (for audio CD playback) and joysticks.
Compressed Data Management
Thanks to ZLIB, the engine reads data from compressed archives and creates ZIP files.
JPG, PNG, TGA Image Loader
Thanks to JPEGlib and PNGlib, the engine reads JPEG, PNG and TGA images from which several kind of textures can be created.
Unicode True Type Fonts
Thanks to OGLFT and FTGL, the engine renders True Type fonts and the text may be specified also in unicode format.
Demos apart, a complete game is based on APOCALYX: The GUN-TACTYX Programming Game, a CROBOTS-like game with QUAKE3-style graphics.