Release Notes for Build 116
Release date: February 28, 2006
- The Get Info dialog in the World Editor has been expanded to include controller and texture mapping settings that used to be shown in separate windows. The Get Info dialog now has multiple tabs, and the Controller tab is always present. Geometries now have tabs for geometry building flags, rendering flags, collision properties, and texturing settings.
- There are now a few additional tabs in the Get Info dialog: General, Properties, and Connectors. The General settings pane allows you to set the name of any node and, for certain types of node, to specify whether it is initially disabled. The Properties pane lets you assign any kind of properties defined by a game to a node. (More about properties below.) The Connectors pane lets you define a list of connectors that can be linked to other nodes. (Connectors are described in the next item.)
- Implemented a general node connecting interface in the World Editor. There is now a "Select and Connect" tool that causes available connection sites for a node to be displayed along with connectors that point to their targets. Several types of nodes have built-in connectors that can be linked to other nodes for specific purposes, and any node can have an unlimited number of custom connectors defined for it in the Connectors pane of the Get Info dialog. Connectors are identified by a 32-bit (four character) identifier. The built-in connectors are as follows:
- A zone has two connectors: one called AMBT that connects to an ambient space, and one called FOG that connects to a fog space.
- A portal has one connector called ZONE that connects to the portal's destination zone.
- A light has one connector called SHAD that connects to a shadow space.
- A trigger has one connector called TARG that can connect to any type of node.
- To specify the target of a connector, click on the Select and Connect tool (or press 5) and then select a node for which you want to set an outgoing connection (but don't select the target yet). The available connectors will appear in little boxes containing their identifiers with icons showing what types of node they can be connected to. Click in a box to select a connector, and it will change color and get a thicker outline to indicate that it's selected. Then select the target node and choose Connect Node from the Node menu (or just hit Ctrl-L). You will see a yellowish line with arrowheads pointing from the connector to the center of its target. Connectors from multiple nodes (one connector each) can be selected by using the shift key. This can be useful if, for instance, you want to connect a bunch of zones to the same fog space. (You don't have to use the shift when selecting the zones, but just when selecting the connectors in the zones.) A connector can be broken by selecting it and choosing Unconnect Node from the Node menu (or hitting Ctrl-U).
- There is now a connection marker that can be used simply as a container that holds connectors. This could be useful in cases such as when multiple triggers need to activate the same script. (This replaces the collection node mentioned in the notes for build 112.)
- Added a reference marker node type that lets you reference an external world resource from within a scene graph. In the world editor, the reference marker is represented by a world icon with crosshairs running through it. The position where the crosshairs meet determines where the origin of the external world in placed. The referenced world resource is set in the Get Info box for the reference marker.
- When a world is loaded, reference markers cause external worlds to be brought in as nonpersistent nodes so that they are not saved as part of the referencing world. If the same world is referenced by multiple reference markers, then they share the same object storage; that is, they are instanced. Reference inclusion is not recursive—referenced worlds within referenced worlds will not be expanded. This avoids problems with cyclic references, etc.
- There is a toggle button in the World Editor that shows or hides referenced worlds. When it's off, you just see the reference markers. When it's on, you see the reference markers and the instances of the worlds that they reference. Moving or rotating the reference marker also affects the included world (because the included world is attached to the marker as a subtree). You cannot select any part of a referenced world because it doesn't really belong to the world that references it. Changes to referenced worlds must be made in the original file. If you change a referenced world while another world referencing it is also open, you can toggle the referenced world button off and back on again to see the updated version.
- Implemented a general scripting architecture. The scripting system is not based on a scripting language, but is instead designed to execute a tree of operations called methods that can be assembled graphically in the World Editor. A script is assigned to a node by selecting the script controller in the Get Info dialog and then opening the script editor. Details about the script editor can be found on the Graphical Scripting Language page.
- A script is normally executed through the activation of the script controller. It is also possible to make a script run immediately upon loading a world by checking a box in the Controller pane of the Get Info dialog.
- By default, a script runs on all machines in a multiplayer game. It can be made to run only on the server, but then each of the script methods must somehow communicate any actions that need to take place on the client machines. This is normally done by sending controller messages from within custom script methods.
- This is only the first version of the scripting system, and additional features will be added in future releases. In particular, conditional execution is script methods is not present, but will be added later. The current scripting system is very extensible because it's possible for the Game Module to define custom script methods, and these appear in the script editor. There is also a new mechanism for accessing controller functionality from within scripts by calling "function" objects, described next.
- Added the ability for controllers to define subclasses of the
Function
class that expose various kinds of functionality that can be accessed from a script. There is a script method named "Call Function" that lets you select a function belonging to the controller attached to the method's target node. When you select a function, its configurable settings appear, and these act as the function's parameters.
- Trigger node functionality has been enhanced. A trigger will now call its target controller's
Activate()
function whenever it transitions from the unactivated to activated state, and it will call its target controller'sDeactivate()
function whenever it transitions from the activated to unactivated state. A trigger can be set to automatically disable itself that first time it is activated, and in this case theDeactivate()
call is not made. It's also possible to specify that a trigger is to be continuously activated as long as an eligible node intersects it, in which case theActivate()
function is called every frame until the trigger is unactivated.
- The Game Module can now define
Property
subclasses for whatever reason it needs to, and these can be exposed in the World Editor under the Properties tab of the Get Info dialog.
- Finished implementing the
Configurable
base class. Different types of classes that are capable of displaying a configuration interface in the World Editor are subclassed fromConfigurable
. Currently, the classes that have the configurable functionality areController, Property, Method,
andFunction
. A configurable class specifies that it has one or more settings that need to be presented to the user at the appropriate time. There are several types of built-in settings: a boolean (check box) setting, integer/float (slider) settings, a text box, a popup menu, a color box, and a resource picker. New types of settings can be defined by the Game Module.
- Added a movie controller that plays a QuickTime movie into any of the texture map material attributes. The
MovieController
class exposes twoFunction
objects that can be used to play or stop movies from a script. A movie can also be played immediately upon loading a level or it can be played in response to a trigger activating the movie controller.
- Added the
MovieElement
class that plays a QuickTime movie into an interface element.
- The
Source
node has been updated with more complete functionality. Sound sources can now be placed in a world in a dormant state until they are explicitly played. There are two script methods, "Play Sound Source" and "Stop Sound Source" that play/stop a source node connected to the script's owning node.
- Implemented a particle rendering technique that I call "sprite quads". This allows the sprite rendering hardware to be used to render an arbitrarily-oriented quad inside a screen-aligned point sprite. The benefit is that only one quarter of the vertex information needs to be transferred to the GPU for each quad. The expense is a small increase in fill, but this can be alpha-tested to avoid the final write. This technique was used with excellent results in a PS3 technology demo, and it works very well on Nvidia hardware. Unfortunately, the OpenGL spec requires that point sprites be entirely clipped if their centers go outside the view frustum. Nvidia has ignored this requirement (which is good), but ATI adheres to it by clipping point sprites in software (which also means they perform the vertex transform in software). This could make the whole sprite quad technique somewhat useless unless an OpenGL extension can be agreed upon to allow point sprites to be clipped as if they were quads. Of course, with the forthcoming geometry shaders, none of this will really matter.
- Made several improvements to the joystick support in the Input Manager. More to come, including direct access to the Xbox 360 controller data.
- Added the
SetMousePosition()
function to the Interface Manager.
- Added a "world time multiplier" to the Time Manager that can be used to control the rate at which time passes in a game world. The multiplier is initially 1.0 and can be changed by calling the
TimeMgr::SetWorldTimeMultiplier()
function. The functionsTimeMgr::GetDeltaTime()
andTimeMgr::GetFloatDeltaTime()
now return world time, which is the actual time that has passed multiplied by the world time multiplier. You can still get the unaltered actual time that has passed using the newTimeMgr::GetSystemDeltaTime()
and TimeMgr::GetSystemFloatDeltaTime()
functions.
- Removed the
GeometryController
class. A controller which can be assigned to a geometry node no longer needs to be subclassed fromGeometryController
.
- Settings for the fluid controller and cloth controller can now be accessed in the Controller pane of the Get Info dialog.
- Added the
MoveSubtree()
andDescendant()
functions to theTree
class.
- Added the Strong AA check box to the Font Generator tool. This causes partially filled pixels to be weighted more heavily so that small font sizes can be made more clear.
- If the
GL_EXT_timer_query
extension is available (currently, only on Nvidia hardware), then the frame rate window will now display a second graph that shows the amount of time spent rendering on the GPU. This shows the actual GPU load regardless of whether vertical sync is on or off, and it can highlight time spikes that happen only on the CPU.