Release Notes for Build 112
Jump to navigation Jump to search
Revision as of 09:24, 9 May 2020 by Eric Lengyel (Created page with "__NOTOC__ '''Release date:''' October 15, 2005 * This build includes a heavily commented sample game module called "Skeleton" that represents nearly the minimum amount of cod...")
Release date: October 15, 2005
- This build includes a heavily commented sample game module called "Skeleton" that represents nearly the minimum amount of code that needs to be written to have a working game module. You can tell the engine to load this game module by editing the file
Data/CFG/Variables.cfgand changing the value of the variable
$applicNameto "Skeleton". To get the primary game module back, change
$applicNameto "Game" again.
- Implemented a large amount of new collision detection functionality. The existing function
World::DetectCollision()is still present and should continue to be used for line-of-sight tests and sphere-environment collision tests. There is now a new function for capsule collisions,
World::DetectCapsuleCollision(), and it detects collisions between an arbitrary swept capsule and the environment. Both of these functions are precise to the polygon level and are implemented using continuous techniques (as opposed to iterative techniques). This means the collision detection is tunnel-proof.
- For most types of moving objects, it is now best to use the new
Colliderclass for collision detection instead of calling the above functions directly. The
Colliderclass has two subclasses,
CapsuleCollider. Each controller class corresponding to a moving object should inherit from one of these two
Collidersubclasses. Then the controller's
Move()function simply specifies the starting position and delta for the current frame. After all controllers have moved, the collision detection among all colliders is performed, and then the
Travel()function of each collider class is called. At this point, the
Colliderclass contains a collision state that indicates whether a collision occurred and, if so, whether it was with the environment or another collider. The implementation of the
Travel()function can do whatever it wants in response.
- See the
BallControllerclass in the
Skeleton.*files for an example showing how to use the new collision system. To see a cool stress test, load the world called "Test" while running the Skeleton application module by entering
load testin the command console. (Nothing will happen in this room if running the big game module.)
- The engine module now contains stock controller base classes for basic projectiles and characters. The
ProjectileControllerclass is subclassed from
SphereColliderand handles the motion of simple projectiles under the influence of gravity and/or through a resistive medium. The
CharacterControllerclass is subclassed from
CapsuleColliderand handles things like gravity, falling off of things, sliding against walls, and climbing ramps.
- Updated the sample game module to use the new collision system and controller base classes. Projectiles will now hit each other, so it's possible to shoot down rockets, etc. The game module class
FighterControlleris now in a clean state and handles player movement, character collisions, weapon firing, and projectile hits.
- The game module contains a class called
FighterControllerthat is a subclass of the
CharacterControllerand handles more details of the player movement. It's pretty functional right now, but is still a work in progress in some ways. In particular, it doesn't currently spend any time trying to detect whether the character is climbing stairs, but some research is being done to determine whether this is practical and worth the extra computational expense. Right now, it's best to cover stairs with an invisible ramp for smooth character movement.
FighterControllerdoesn't currently implement client prediction for multiplayer games, but it will soon. The previous code, which was very hacky, has been removed.
- Added shader level of detail for parallax mapping. When enabled, the scale of the parallax effect will gradually decrease to zero at the transition point from level 0 to level 1, and parallax mapping is reduced to ordinary bump mapping in level 1 and above.
- Implemented full support for Cook-Torrance specular reflection via the MicrofacetAttribute material attribute. Both isotropic and anisotropic microfacet distributions are supported, but the geometrical attenuation factor has been omitted because it almost always makes an unnoticeable difference. Note: Microfacet shading has been disabled for all types of lights except infinite lights due to some pending changes in the shader building code. It will be fully functional in the next release.
- Added the
$featureDisableMaskpermanent system variable. This has 1-bits for any graphics features that are explicitly disabled by the user. Updated the graphics settings dialog to allow parallax mapping and microfacet shading to be turned on/off.
- Added the
kShaderCubeLightInhibitshader flag that prevents a cube light projection from being rendered on a geometry. This is useful when applied to the geometry surrounding a cube light source (that is actually casting the projected shadow) so that it doesn't receive its own shadow.
- Updated the Sound Player tool. It now displays the wave being played as it used to under the old windowing system, and there is a volume control.
- The sound mixer now supports 22.05 kHz stereo sounds, both streaming and non-streaming. All mono and stereo sounds that are either 22.05 kHz or 44.1 kHz are now supported.
- Modified the free camera tool in both the World Editor and Model Viewer so that the camera accelerates like the spectator camera does.
- Added the
PropertyObjectclass. This serves as a shared container for an arbitrary list of properties, and it can be attached to nodes just like material objects. Thus, changing any of the properties affects all nodes using the property object. There's currently no interface for this in the World Editor, but it will be present in a later release.
- Added the
Collectionnode. This is a container that holds a set of key/node pairs. There's currently no interface for this in the World Editor, but it will be present in a later release.
- There is now a new
EnvironmentMapAttributethat can specify a texture map that will override the environment map assigned to the zone containing an object. This attribute should be applied in addition to the
EnvironmentAttributeto take effect. It can be specified in the Textures pane in the World Editor's material manager.
- Added a constructor and
Set()overload for the
Vector4Dclass that take a
Point3D. These are interpreted as the normal direction of a plane and a point lying in that plane. The normal is copied into the
x, y, and
zcomponents, and the
wcomponent is given the value
- All of the random number functions have been moved into the
Mathnamespace. This includes
Random(), RandomFloat(), RandomUnitVector(), RandomUnitQuaternion(), GetRandomSeed(),and
SetRandomSeed(). These functions either need to be qualified with
Math::or the statement using namespace
C4::Math;needs to appear in any source file that uses them.
- Defined an integer type called
naturalthat corresponds to the natural register width on the target machine. This type should be used for variables which are expected to be kept in CPU registers so that arithmetic is performed on them at the machine's natural size, avoiding extra sign extensions or high-word clears. Defining the natural type is primarily a performance optimization for the 64-bit PowerPC architecture.
- Made lots of various minor additions and improvements to the primary game module.
- The Visual Studio project files have been updated to be easier to move to different machines and easier to convert to later versions.
- This release contains temporary plugins for Maya, but these are going to be replaced by the Collada format in the next release.
- The source texture map for the terrain in the demo is included in this release. It's path is